测试一个大数是否是素数

来源:互联网 发布:js面向对象教程 编辑:程序博客网 时间:2024/05/21 11:21

如果P是素数,且0 < A < P,那么AP-1≡1(mod P)。

利用这个定理判定N是否为素数,随机生成一个A,1 < A < N-1,如果得到余数不是1,则N不是素数。如果余数是1,则N很可能是素数。如果要降低错误率,需要添加额外的测试。还可以增加判定的次数。
如果P是素数且0< X < P,那么X2≡1(mod P)仅有的两个解为X=1,P-1。
witness算法运行一次有75%的可能是正确的。

int witness(const int & a,const int & i,const int & n){    if(i==0)        return 1;    int x=witness(a,i/2,n);    if(x==0)        return 0;    int y=(x*x)%n;    if(y==1&&x!=1&&x!=n-1)        return 0;    if(i%2!=0)        y=(a*y)%n;    return y;}int main(){    Random rand(1);    int n=561;    int trials=5;    for(int count=0;count<trials;++count)    {        //生成[2,n-1)间的随机整数        if(witness(rand.randomInt(2, n-1), n-1, n)!=1)            return 0;    }    return 1;}

如果没有额外的测试,很容易将561判定为素数。添加额外的测试或者增加判定次数为10,则会出现正确的结果

原创粉丝点击