1. 程式人生 > >Miller-Rabin大數素性測試

Miller-Rabin大數素性測試

素性測試是檢驗一個給定的整數是否為質數的測試。

對於確定型演算法試除法,即嘗試從2到√N的整數是否整除N,若N較大,則演算法無法在如今大多數機器上一個可以忍耐的時間內結給出結果。使用隨機化演算法Miller-Rabin素性測試 則可以在極短的時間內得到一個較準確的結果,並且可以通過綜合多次隨機測試結果將錯誤概率降為可以忽略不計。

Miller-Rabin素性測試 基於費馬小定理

費馬小定理:假如p是質數,且gcd(a,p)=1,那麼 a^(p-1)≡1(mod p)
即:假如a是整數,p是質數,且a,p互質(即兩者只有一個公約數1),那麼a的(p-1)次方除以p的餘數恆等於1。

對於費馬小定理,其近似逆命題

若a^(p-1)≡1(mod p),且a屬於集合{1,2,3,…,p-1},則p為質數

幾乎成立。
若能判斷所有屬於集合{1,2,3,…,p-1}的a都滿足a^(p-1)≡1(mod p),即可確定p為質數,然而若p為合數,只有很少的a屬於集合{1,2,3,…,p-1}會使a^(p-1)≡1(mod p)成立。據此可以設計演算法:隨機選取a屬於集合{1,2,3,…,p-1},若a^(p-1)≡1(mod p)不成立,可 確定 p為合數,否則可以 幾乎確定 p為質數,多次隨機選取a增加判斷的準確率。

演算法實現:

int isPrime(long long x
,int times){ /* x為待測試數,times為測試次數 */ long long a,b,r; for (srand(x+rand()); times--;){ a = ((x-2)*rand()*1./RAND_MAX)+2; b = x - 1; for (r = 1; b; b >>= 1){ b&1?r=r*a%x:0; a=a*a%x; } if (r%x!=1) return 0; } return
1; }

該演算法實際執行時的準確率遠高於預期,測試結果:
100000000內資料測試100000000次單次測試times設為1錯誤率0%