【发布时间】:2012-08-03 17:36:14
【问题描述】:
我正在实施Wikipedia's Miller-Rabin algorithm,但似乎并没有得到非常恰当的结果。 7, 11, 19, 23 等被报道为复合材料。事实上,当 k>12 时,即使 5 也显示为复合。我已经阅读了 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;
}
【问题讨论】:
-
可惜我现在不在校园里,否则我会让米勒自己看一看。
-
你确定你没有读错输出吗?您究竟期望输出是什么以及您得到什么?
-
我看到至少一个问题;我会很快发布答案。
-
@DennisMeng :太棒了。但我想用实现错误来打扰他已经太多了。 :)
-
@another.anon.coward :我应该得到所有(可能)质数的 1 和复合数的 0。这就是我得到的:ideone.com/bYDjV