如果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,则会出现正确的结果
1万+

被折叠的 条评论
为什么被折叠?



