米勒-拉宾素性测试给出了错误的答案
Miller-Rabin primality test gives wrong answer
我正在尝试制作RSA算法。为此,我需要rabin-miller+见证+模幂运算(至少我需要使用它)。当我生成随机数来与rabin-miller检查它们是否是素数时,问题就来了,结果是非素数对于rabin-meller算法来说是素数。有人能帮我看看我哪里失败了吗。提前谢谢。
int mod_exp(int a, int b, int n){
int d = 1,i,j=0;
int binary[15];
for(i=0;i<=15;i++){
binary[i] = -1;
}
i=0;
do{
binary[i]=(b%2);
if((b%2)==1)
b=(b-1)/2;
else
b=b/2;
i++;
}while(b!=0);
do{
d= (d*d)%n;
if(binary[i]==1)
d=(d*a)%n;
i--;
}while(i!=-1);
return d;
}
bool wittness(int a, int n){
int u=n-1,k=0;
long x, temp;
while(u%2== 0 ){
u=u/2;
k++;
}
x=mod_exp(a,u,n);
for(int i=1;i<=k;i++){
temp=x;
cout<< "primera x:"<<x<<endl;
x=long(x*x)%n;
cout<< "segunda x:"<<x<<endl;
if(x==1 && temp!=1 && temp != n-1)
return true;
}
if(x!=1)
return true;
return false;
}
bool miller_rabin(int n, int s){
int a,j;
srand(time(NULL));
for(j = 0; j<=s;j++){
a=rand()%s+1;
if(!wittness(a,n))
return false;
}
return true;
}
我还没有看过所有的代码,但您的mod_exp函数肯定是不正确的。两个表达式(d*d)%n
和(d*a)%n
都容易发生溢出,如果发生溢出,将得到不正确的结果。
相关文章:
- 递归求和任务的错误答案
- 为什么我在代码厨师的 CMPRSS 问题中得到 WA(错误答案)?
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 寻找最小楼梯成本的动态规划问题的错误答案
- 为什么可变大小的数组会导致Codechef出现错误答案
- 如何修复此代码对几个测试用例的错误答案?
- 使用幂函数的计算给出了大数字的错误答案
- 快速排序算法,一些特定输入序列的错误答案和分段错误
- 二分法程序的错误答案(C++)
- 无法理解绘图程序中的错误答案
- C++ - 整数除以整数返回错误答案
- 布尔函数的错误答案
- SPOJ FASTFLOW上的错误答案
- 代码的错误答案是在Java Camel案件和C 下划线标识符之间转换的错误答案
- 200万以下所有素数的总和,线程给出错误答案
- 0-1整数背包返回错误答案(动态编程)
- UVa 在线判断 - 3n + 1 - 错误答案
- 提升C++原始算法错误答案
- 二项式系数函数C++错误答案 n>13
- 需要帮助以避免 SPOJ 上的"错误答案"