HSPに移植してみました。
といっても、アルゴリズムは理解できないし、Rubyはまるで知らないのですが(^_^;;
46,690までは正しく判定されるようですが、
46,691以降の素数の多くが合成数と判定されます。
1 何がいけないのでしょう?
(私の移植がまずいのか、乱数がまずいのか、Rubyの実装がまずいのか、
元々決定的アルゴリズムではないので、アルゴリズムの限界なのか。
でも、合成数を素数と判定する可能性はあっても素数を合成数と判定する
可能性はなさそうにみえる)
2 正しく判定させるように修正する方法があれば教えてください
#module "primemod" #defcfunc ModMathPow_ int base_, int power_, int mod base=base_ power=power_ result=1 repeat: if power<=0: break if power&1: result=result*base\mod base=base*base\mod power=power>>1 loop return result #defcfunc isprime int n if n<0: n=-n if n==2: return 1 if n==1: return 0 if (n&1)==0: return 0 d=n-1 repeat: if d&1: break d=d>>1 loop f=1 repeat 20 ;←20.times do a=rnd(n-2)+1 t=d y=ModMathPow_(a,t,n) repeat: if n-1==t: break if y==1: break if n-1==y: break y=y*y\n t=t<<1 loop if n-1!=y: if (t&1)==0: f=0: break loop return f #global ini=43000 add=(strlen(str(ini))+1)*8 x=0: y=0 repeat 4000,ini if isprime(cnt) { pos x,y mes cnt y+=16: if y+16>480: y=0: x+=add } loop stop