米勒羅賓素性測試(Miller–Rabin primality test)
如何判斷一個素是素數 效率很高的篩法 打個表 (素數的倍數一定是合數) 就可以解決問題。
篩選法的效率很高,但是遇到大素數就無能為力了。
米勒羅賓素性測試是一個相當著名的判斷是否是素數的演算法
核心為費馬小定理:
假如a是整數,p是質數,且a,p互質(即兩者只有一個公約數1),那麼a的(p-1)次方除以p
的餘數恆等於1。
逆推一下即p的 a^(p-1)%p !=1 (0<a<p) ,它一定是合數。
如果 a^(p-1)%p ==1 (0<a<p) 則它可能是合數可能是素數。概率演算法的概率就在這個 a上體現。
具體過程:
1 隨機取一個 a
2 如果 它不滿足 a^(n-1)%n ==1
3 則它一定是 合數
4 退出
5 如果它滿足 a^(n-1)%n ==1
6 則它是一個素數的概率是1/2
7 回到 1
可以通過拉賓米勒素數測試的合數為偽素數與Carmichael(強偽素數)
Carmichael數是非常少的,在1~100000000範圍內的整數中,只有255個Carmichael數。
為此有二次探測定理以確保該數為素數:
如果p是一個素數,0<x<p,則方程x^2≡1(mod p)的解為x=1,p-1
說明:
Miller-Rabin是隨機演算法
如果對這個過程重複100次,每次都沒說它是合數,那這個數是素數的概率只有(1/2)^5100可能不是素數