前提・実現したいこと
ミラーラビンの素数判定法を用いて、素数判定のプログラムを実装しています。
ウィキペディアで調べたアルゴリズムを実装しようとしていますが、なかなかうまくいきません。
ミラーラビンの素数判定法(Wikipediaより)
入力: n > 1 → 素数判定対象の奇数の整数, k → 判定の正確度を指定するパラメータ 出力: n が合成数なら composite、さもなくば probably prime n - 1 を 2 のべき乗で割って、 2^s * d の形式にする。 以下を k 回繰り返す: [ 1, n - 1 ] の範囲から a をランダムに選ぶ。 a^d != 1 mod n で、かつ [0,s-1] の範囲の全ての r について a^{(2^r)*d} mod != -1 なら、composite を返す。 probably primeを返す。
該当のソースコード
php
1function assert_iterate($n, $s, $d) { 2 $a = mt_rand(1, $n - 1); 3 if((pow($a, $d) - 1) % $n !== 0) { 4 for($r = 0; $r <= $s-1; $r++) { 5 echo $x = pow(2, $r) * $d; 6 if($x % $n !== -1) { 7 return false; 8 } 9 } 10 } 11} 12 13function is_prime(int $n){ 14 if($n < 2){ 15 return false; 16 } 17 if($n >= 4 && $n % 2 === 0) { 18 return false; 19 } 20 if($n === 2) { 21 return true; 22 } 23 24 $s = 0; 25 $d = $n - 1; 26 while(($d % 2) === 0){ 27 $s ++; 28 $d = $d / 2; 29 } 30 31 $k = 10000; 32 while($k) { 33 assert_iterate($n, $s, $d); 34 $k--; 35 } 36 37 return true; 38} 39
###問題のある部分
ソースコードの問題点は、素数でテストをしてもfalseが返ってくることです(素数であれば、trueが返ってきます)。
is_primeの引数に13を入れて調べてみたところ、上の assert_iterate関数 の1回目のイテレートでfalseに入ってしまいました。
アドバイスをよろしくお願いします。????♂️
回答1件
あなたの回答
tips
プレビュー