素数判定プログラム
shorの因数分解アルゴリズムが存在する今日、
量子コンピューター手に入れることはできないので、いかに素数であるかを条件分岐することが最速だと思われる。
まず簡単に
1、偶数は無視(2は素数なので別処理)
2、整数nの平方根までの整数で剰余判断。
まずはこんなもので、以下(今の私のtwitter bot のプログラムw 44211790234832169331これは1018番目の素数なのだが30秒で強制kill・・・)
これはいけた。3475385758524527 1014番目16桁。実行時間36.828640937805秒
<br />
<?php<br />
$sum = ****; //整数n<br />
if($sum%2 == 0){ //0(mod2)の場合<br />
if($sum==2){ //2の場合<br />
$mes = $sum . "は素数である。";<br />
}else{<br />
$mes = $sum . "は素数ではない。";<br />
}<br />
}else{<br />
$amari_flag = 0; //余りの有無フラグ0:有1:無<br />
for($i=3; $i<sqrt($sum); $i+=2){ //3から2づつ加えてのforループ<br />
if($sum%$i==0){<br />
$amari_flag = 1;break; //余り無し、すなわち素数ではないことを表すフラグ<br />
}<br />
}<br />
if($amari_flag == 0){<br />
$mes = $sum . "は素数である。";<br />
}else{<br />
$mes = $sum . "は素数ではない。";<br />
}<br />
}<br />
?><br />
今後条件にプラスしていきたいもの
3、メルセンヌ素数 2n-1 これだと2進数で1111111・・・・・の形を現す。
4、フェルマーの小定理 ap-1 ≡ 1 (mod p)
5、自然数は、6n-1、6n、6n+1、6n+2、6n+3、6n+4で表せる、
ここで、6、6n+2、6n+3、6n+4は明らかに素数ではない
5以上の素数は6n+1、6n-1で表せる。
(6n±1)2>=36n2±12n+1=12(3n2±n)+1≡1(mod12)
以上などを条件に組み込み高速化できないかを、できたらやっていこう・・・
一般の整数に対する判定法:APR-CL、ECPP、AKSなども調べていきたいです。
個人的にはフェルマーの小定理あたりが食いつきたいところですね。中国人の剰余定理とかも絡ませたいわ~

3 トラックバック(s)