這種質數演算法是基於費馬小定理的乙個擴充套件。
費馬小定理:對於質數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):寫成 c++ **: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
//view code快速判斷是否為質數
#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;
}
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演算法進行質數素數測試,要求輸入乙個數字,對其是否是素數進行判定,並列印出相對應的結果。輸入 第...