如果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,則會出現正確的結果