Miller-Rabin素數測試演算法
阿新 • • 發佈:2020-07-18
由於收到某退役學長的鞭策,忽然就想學習一丟數論
來補充一下虎哥基礎數論中沒有出現的東西
本文轉載須聯絡作者,並標明出處
定義
Miller-Rabin素數測試,又稱米勒-拉賓素性檢驗,是一種素數判定法則,利用隨機化演算法判斷一個數是合數還是可能是素數。
卡內基梅隆大學的計算機系教授Gary Lee Miller首先提出了基於廣義黎曼猜想的確定性演算法,由於廣義黎曼猜想並沒有被證明,其後由以色列耶路撒冷希伯來大學的Michael O. Rabin教授作出修改,提出了不依賴於該假設的隨機化演算法。(摘自百度百科)
用處&背景
根據上面的定義可以顯然的看到,這個演算法的主要目的就是進行單個素數的判定
在前期學習當中,我們也學習過單個素數的判定
複雜度為\(O(\sqrt n)\)
bool isPrime(int x) {
if (x < 2) return false;
for (int i = int(sqrt(x+0.5)); i >= 2; --i) {
if (x % i == 0) return false;
}
return true;
}
那麼利用Miller-Rabin(簡稱MR)演算法
還有優秀的龜速乘(快速加)以及快速冪
複雜度可以達到O(klog_n)
MR的複雜度在百科中給出了一大堆\(log\)像這樣:
使用快速傅立葉變換能夠將這個時間推進到\(O(klog_nloglog_nlogloglog_n)=O(klog_n)\)
總之複雜度就是\(O(klog_n)\)
而且正確性也有一定的保障
經過證明(我不會)
每次檢測MR給出的錯誤結果的概率小於等於\(\frac 1 4\)
那麼進行k次檢測的錯誤概率可降低至\(O({\frac 1 4}^k)\)
實際使用效果要比理論值好不少
可以說是相當優秀了
證明
下面來看正確性的證明
需要用到的前置知識:費馬小定理,二次探測定理,Wilson定理。
不太好解釋,沒關係,我們一個一個來看
有個別不懂的演算法可以直接點選右側目錄去看