拉宾米勒算法

时间:2013-07-14 21:23:47

标签: algorithm

我想了解拉宾米勒算法,但我对一点点感到困惑。请帮助理解它。

我所理解的: 我们在2 ^ d * s中计算's',然后我们采用随机整数'a'并计算^ s%p,如果它等于1,则p可能是素数。否则如果对于任何'r'a ^(r * s)%p = -1那么我们将在下一个平方得到1,所以p是素数。 在第一次迭代中,如果x = 1;然后我们在if语句中检查它,但是在第一次迭代之后if语句的意义是什么,我没有得到它。请帮忙......

令人困惑的部分:

if(mod!=p-1 && temp%2==0){
                return false;
            }

Origingal Miller实施:

bool Miller(long long p,int iteration){
    if(p<2){
        return false;
    }
    if(p!=2 && p%2==0){
        return false;
    }
    long long s=p-1;
    while(s%2==0){
        s/=2;
    }
    for(int i=0;i<iteration;i++){
        long long a=rand()%(p-1)+1,temp=s;
        long long mod=modulo(a,temp,p);
        while(temp!=p-1 && mod!=1 && mod!=p-1){
            mod=mulmod(mod,mod,p);
            temp *= 2;
        }
        if(mod!=p-1 && temp%2==0){
            return false;
        }
    }
    return true;
}

1 个答案:

答案 0 :(得分:2)

M-R见证人的定义为aa**s != 1 (modulo p)a**(2**r * s) != -1 (modulo p)适用于所有r。当值mod的{​​{1}}满足a**(2**r * s)mod == 1 (modulo p)时,循环将终止。

如果mod == -1 (modulo p),那么作为MR证人的第二个属性就会得到满足,因为到目前为止mod == 1 (modulo p)的每个值都与a**(2**r * s)不一致,并且未来的值都不是一致,因为他们都是-1 (mod p)。鉴于第二个属性成立,第一个属性1 (mod p)保持当且仅当循环体至少执行一次时。最初为a**s != 1 (modulo p),最多为temp == s,第二属性为(p - 1)/2。当且仅当循环体至少执行一次时,我们才mod != p - 1