ジェネレータを使った素数あぶり出し
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
ジェネレータ関数を使った場合はその都度、ジェネレータを作成するので
ストリーム処理のような感じで処理できるらしいです。
今回は以上です。