您的位置:首页 > 其它

测试一个大数是否是素数

2017-08-20 20:49 211 查看
如果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,则会出现正确的结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: