1

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

我的理解:我们在 2^d*s 中计算 's',然后我们取一个随机整数 'a' 并计算 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;
            }

原始米勒实施:

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;
}
4

1 回答 1

2

MR 见证人的定义是a这样a**s != 1 (modulo p)a**(2**r * s) != -1 (modulo p)。当具有值的 满足orr时,循环退出。moda**(2**r * s)mod == 1 (modulo p)mod == -1 (modulo p)

如果mod == 1 (modulo p),则满足作为 MR 见证人的第二个属性,因为a**(2**r * s)到目前为止的每个值都不与 一致-1 (mod p),并且没有一个未来值是一致的,因为它们都是1 (mod p)。假设第二个属性成立,第一个属性 ,a**s != 1 (modulo p)当且仅当循环体至少执行一次时才成立。最初,temp == s,最多为(p - 1)/2,并且mod != p - 1由第二个属性。我们有temp % 2 == 0当且仅当循环体至少执行一次。

于 2013-07-14T21:54:03.683 回答