首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Miller-Rabin素性检验给出错误答案

Miller-Rabin素性检验给出错误答案
EN

Stack Overflow用户
提问于 2015-12-14 04:56:52
回答 1查看 293关注 0票数 0

我在试着做一个RSA算法。为此,我需要rabin-miller+见证者+模幂运算(至少我需要使用它)。当我生成随机数与rabin miller检查它们是否是质数时,问题就来了,结果是对于rabin-miller算法来说,非质数是质数。有没有人能帮我看看我哪里失败了。提前谢谢。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2015-12-14 07:55:58

我没有看过所有的代码,但是您的mod_exp函数肯定是不正确的。(d*d)%n(d*a)%n这两个表达式都容易溢出,如果发生溢出,您将得到不正确的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34256244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档