質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1154閲覧

素数判定の式を実装できません。。。

KK0618

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2020/07/26 10:49

編集2020/07/27 00:35

前提・実現したいこと

ミラーラビンの素数判定法を用いて、素数判定のプログラムを実装しています。
ウィキペディアで調べたアルゴリズムを実装しようとしていますが、なかなかうまくいきません。

ミラーラビンの素数判定法(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に入ってしまいました。

アドバイスをよろしくお願いします。????‍♂️

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/26 10:52

現状のコードの問題点は何でしょう。「うまくいかない」では何も伝わりませんので具体的に記載してください
KK0618

2020/07/26 10:57

コードの問題点は、素数でテストをしてもfalseが返ってくることです(素数であれば、trueが返ってきます)! is_primeの引数に13を入れて調べてみたところ、上の assert_iterate関数 の1回目のイテレートでfalseに入ってしまいました。
m.ts10806

2020/07/26 20:49

質問は編集できますので適宜追記願います
guest

回答1

0

ベストアンサー

アルゴリズム的なところは追ってませんが

php

1 while($k) { 2 assert_iterate($n, $s, $d); 3 $k--; 4 }

assert_iterateの結果を何も反映せず、素通りしてます。

投稿2020/07/27 00:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KK0618

2020/07/27 07:03

申し訳ありませんが、あまり理解できていません。。。 >```assert_iterate```の結果を何も反映せず、素通りしてます。 こちらは、そもそもwhile文の中に入れていない、ということを表していますでしょうか。
退会済みユーザー

退会済みユーザー

2020/07/27 07:10

該当の while は assert_iterate() の返り値をどこにも反映していないので、単純に $k を 10000 から 0 にするだけの処理になっています。
KK0618

2020/07/27 14:55

ご指摘ありがとうございます!! 勘違い部分:returnしていれば、全ての処理が終わる →これは、assert_iterate関数の処理が終わるだけでしたね,,,汗 while文の方で返り値を反映させたらできました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問