日曜プログラミング

PHP好き集まれ〜!!

ジェネレータを使った素数あぶり出し

PHPでの素数判定はちょっと前ですがコードを書きました。
PHPで素数判定書いてみた。 - jaketaro blog

ただここでは最初の素数2と3についてはスムーズな定式化が出来ていませんでした。
今回は素数判定ではないですが、
「○○以下の素数を出力せよ」と言った問いに対して有効な解法を書きます。

方法として
1.とにかく素数2,3,5,7,‥と言った素数を作り出す関数を作ります
2.その関数の出力を制御します

このようなアルゴリズムで解きたいと思います。

今回は素数2の場合もうまく式に組み込まれており、前より綺麗なコードになった
と思います。

100以下の素数を出力します。

<?php
$i = 2;
$arr = [];
//$iの素数判定を行う関数
function is_prime($i, $arr){
	
	foreach($arr as $value){
                //$i=2の場合、$modはNULL値となるが、その場合は返り値はtrueとなる
		$mod = $i % $value;
		if($mod === 0){return false;} //素数でない
	}
	return true; //素数である
}
//ジェネレータ関数
$primes = function($i, $arr){
	while(true){
		if(is_prime($i, $arr)){
			yield $i;
		}
                $arr[] = $i;
		$i++;
	}
};
//出力
foreach($primes($i, $arr) as $value){
	if($value>100) break;
	echo $value . " ";
}
echo "\n";

//2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 


ジェネレータ関数を使った場合はその都度、ジェネレータを作成するので
ストリーム処理のような感じで処理できるらしいです。

今回は以上です。