測試一個大數是否是素數

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

發佈了55 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章