Miller Rabin質數測試

2022-04-29 19:48:10 字數 2686 閱讀 8162

miller-rabin素數測試演算法——forever_dreams

hihocoder #1287

非精確演算法警告

當我們需要判斷素數時,如果樸素\(o(\sqrt)\)演算法不能通過,那麼可以通過miller-rabin素數測試,來大概率地判斷其是否為素數。

(2)二次探測:如果 p 是乙個素數,0 < x < p, 則方程 \(x^\equiv 1(mod\ p)\) 的解為 x = 1 或 x = p - 1

費馬小定律&二次探測的證明

小hi:這種質數演算法是基於費馬小定理的乙個擴充套件,首先我們要知道什麼是費馬小定理:

費馬小定理:對於質數p和任意整數a,有a^p ≡ a(mod p)(同餘)。反之,若滿足a^p ≡ a(mod p),p也有很大概率為質數。

將兩邊同時約去乙個a,則有a^(p-1) ≡ 1(mod p)

也即是說:假設我們要測試n是否為質數。我們可以隨機選取乙個數a,然後計算a^(n-1) mod n,如果結果不為1,我們可以100%斷定n不是質數。

否則我們再隨機選取乙個新的數a進行測試。如此反覆多次,如果每次結果都是1,我們就假定n是質數。

該測試被稱為fermat測試。需要注意的是:fermat測試不一定是準確的,有可能出現把合數誤判為質數的情況。

miller和rabin在fermat測試上,建立了miller-rabin質數測試演算法。

與fermat測試相比,增加了乙個二次探測定理:

如果p是奇素數,則 x^2 ≡ 1(mod p)的解為 x ≡ 1 或 x ≡ p - 1(mod p)

如果a^(n-1) ≡ 1 (mod n)成立,miller-rabin演算法不是立即找另乙個a進行測試,而是看n-1是不是偶數。如果n-1是偶數,另u=(n-1)/2,並檢查是否滿足二次探測定理即a^u ≡ 1 或 a^u ≡ n - 1(mod n)。

舉個matrix67 blog上的例子,假設n=341,我們選取的a=2。則第一次測試時,2^340 mod 341=1。由於340是偶數,因此我們檢查2170,得到2170 mod 341=1,滿足二次探測定理。同時由於170還是偶數,因此我們進一步檢查2^85 mod 341=32。此時不滿足二次探測定理,因此可以判定341不為質數。

將這兩條定理合起來,也就是最常見的miller-rabin測試。

但一次mr測試仍然有一定的錯誤率。為了使我們的結果盡可能的正確,我們需要進行多次mr測試,這樣可以把錯誤率降低。

寫成偽**為:

miller-rabin(n):

if (n <= 2) then

if (n == 2) then

return true

end if

return false

end if

if (n mod 2 == 0) then

// n為非2的偶數,直接返回合數

return false

end if

// 我們先找到的最小的a^u,再逐步擴大到a^(n-1)

u = n - 1; // u表示指數

while (u % 2 == 0)

u = u / 2

end while // 提取因子2

for i = 1 .. s // s為設定的測試次數

a = rand_number(2, n - 1) // 隨機獲取乙個2~n-1的數a

x = a^u % n

while (u < n)

// 依次次檢查每乙個相鄰的 a^u, a^2u, a^4u, ... a^(2^k*u)是否滿足二次探測定理

y = x^2 % n

if (y == 1 and x != 1 and x != n - 1) // 二次探測定理

// 若y = x^2 ≡ 1(mod n)

// 但是 x != 1 且 x != n-1

return false

end if

x = y

u = u * 2

end while

if (x != 1) then // fermat測試

return false

end if

end for

return true

值得一提的是,miller-rabin每次測試失誤的概率是1/4;進行s次後,失誤的概率是4^(-s)。

小hi:那麼小ho,你能計算出這個演算法的時間複雜度麼?

小ho:恩,每一次單獨的mr測試,需要o(log n)的時間。一共要進行s次mr測試,也就是o(slog n)。

小hi:沒錯,這樣就能夠在很短的時間內完成質數的測試了。當然如果你還是不放心,可以把s的值設定的更高一點。

小ho:好!這樣就能夠順利的找到大質數了。

本題的提示參考了matrix67的blog和wikipedia的詞條。

matrix67的blog有更多的細節描寫。wiki中的偽**比上文中的簡潔一些,並且有介紹了一些小技巧:比如如果n<2^64(n<1e18),只用選取a=2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37做測試即可

Miller Rabin質數測試

費馬小定理 對於質數p和任意整數a,有a p a mod p 同餘 反之,若滿足a p a mod p p也有很大概率為質數。將兩邊同時約去乙個a,則有a p 1 1 mod p 也即是說 假設我們要測試n是否為質數。我們可以隨機選取乙個數a,然後計算a n 1 mod n,如果結果不為1,我們可以...

Miller Rabin質數測試

1.費馬小定理 費馬小定理 對於質數p和任意整數a,a p 1 mod 1不滿足的一定是合數,滿足的大概率是素數。2.miller rabin質數測試 如果滿足費馬小定理,則進一步驗證如果p是奇素數,則 x 2 1 mod p 的解為 x 1 或 x p 1 mod p 乙個例子 舉個matrix6...

Miller Rabin質數測試

這種質數演算法是基於費馬小定理的乙個擴充套件。費馬小定理 對於質數p和任意整數a,有a p a mod p 同餘 反之,若滿足a p a mod p p也有很大概率為質數。將兩邊同時約去乙個a,則有a p 1 1 mod p 也即是說 假設我們要測試n是否為質數。我們可以隨機選取乙個數a,然後計算a...