gpt4 book ai didi

c - Miller-Rabin 实现中的错误

转载 作者:行者123 更新时间:2023-12-04 18:15:35 26 4
gpt4 key购买 nike

我正在实现 Wikipedia's Miller-Rabin algorithm但似乎没有得到甚至模糊恰当的结果。 7, 11, 19, 23 等被报道为复合 Material 。事实上,当 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;
}

最佳答案

如果基数与候选者不互质,则强费马检查总是返回“不是可能的素数”。

带着你的错误

a=(int)(rand()*(n-1))+1;

素数 p , 底数与 p 不互质( p 的倍数),当且仅当 rand() 的结果有形式
k*p + 1

对于小素数,即使迭代很少,这实际上也可以保证发生。

基数应介于 2 ans n/2 之间(选择大于 n/2 的基数是不必要的,因为 a 是复合性的见证当且仅当 n - a 是一个),所以你想要类似的东西
a = rand() % (n/2 - 2) + 2;

如果您不介意随机数生成中偏向小余数的模偏差,或者
a = rand() /(RAND_MAX + 1.0) * (n/2 - 2) + 2;

如果您想在整个可能范围内分配偏差。

关于c - Miller-Rabin 实现中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11800596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com