Miller Rabin質數測試

2021-07-29 10:54:01 字數 2039 閱讀 4099

這種質數演算法是基於費馬小定理的乙個擴充套件。

費馬小定理:對於質數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)

偽**:

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

//依次次檢查每乙個相鄰的 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

寫成 c++ **:

//

快速判斷是否為質數

#include #include

#include

#define ss 100

#define ll long long

using

namespace

std;

ll mod_mul(ll a, ll b, ll n)

return

res;}//

快速冪 (a^b)%n

ll mod_exp(ll a, ll b, ll n)

return

res;

}bool

millerrabin(ll x)

if(xx!=1) return

false

; }

return

true;}

intmain()

return0;

}

view code

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質數測試

本文主要討論使用miller rabin演算法編寫素數的判定演算法,題目 於hihocoder。時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述 使用miller rabin演算法進行質數素數測試,要求輸入乙個數字,對其是否是素數進行判定,並列印出相對應的結果。輸入 第...