我正在實施Wikipedia's Miller-Rabin algorithm,但似乎沒有得到模糊的結果。據報道,7,11,19,23等組合。事實上,當k> 12時,甚至5顯示覆合。我讀過Miller-Rabin背後的數學知識,但對此並不十分理解,盲目依賴於算法。任何暗示我要去哪裏的錯誤?Miller-Rabin實施中的錯誤
這裏是我的代碼:
#include<stdio.h>
#include<math.h>
int modpow(int b, int e, int m) {
long result = 1;
while (e > 0) {
if ((e & 1) == 1) {
result = (result * b) % m;
}
b = (b * b) % m;
e >>= 1;
}
return result;
}
int isPrime(long n,int k){
int a,s,d,r,i,x,loop;
if(n<2)return 0;
if(n==2||n==3)return 1;
if(n%2==0)return 0;
d=n-1;
s=0;
while(d&1==0){
d>>=1;
s++;
}
for(i=0;i<k;i++){
loop=0;
a=(int)(rand()*(n-1))+1;
x=modpow(a,d,n);
if(x==1 || x==n-1){
continue;
}
for(r=1;r<=s;r++){
x=modpow(x,2,n);
if(x==1)return 0;
if(x==n-1){
loop=1;
break;
}
}
if(!loop)return 0;
}
return 1;
}
int main(){
int i,k;
scanf("%d",&k);
for(i=5;i<100;i+=2){
printf("%d : %d\n",i,isPrime(i,k));
}
return 0;
}
太糟糕了我現在不在校園裏,否則我會讓米勒自己偷看。 – 2012-08-03 17:46:18
你確定你沒有閱讀錯誤的輸出嗎?你究竟期待什麼產出?你得到了什麼? – 2012-08-03 17:49:54
我看到至少有一個問題;我會很快發佈一個答案。 – 2012-08-03 17:50:30