其基於以下兩個定理。
fermat小定理
若n是素數,則∀a(
a̸≡0
(mod
n)
)\forall a(a \not\equiv 0 \pmod)
∀a(a̸
≡0(m
odn)
),有an−
1≡1(
modn
)a^ \equiv 1 \pmod
an−1≡1
(mod
n).二次探測定理
若n是素數,則x2≡
1(mo
dn
)x^2 \equiv 1 \pmod
x2≡1(m
odn)
只有平凡根x=±
1x=\pm1
x=±1
,即x =1
,x=n
−1
x=1,x=n-1
x=1,x=
n−1.
費馬小定理鼎鼎有名,而二次探測定理由z
pz_p
zp是域,域中無零因子容易得到。
注意這兩個定理都是敘述了素數的必要條件,而miller-rabin對於要檢驗的n,是選取若干個a,檢驗是否滿足這兩個必要條件。顯然,如果某個必要條件不滿足,那麼斷言不是素數是正確的。但是,選了好幾個a,都滿足這兩個必要條件,n是質數還是合數是無法確定的,但是miller-rabin演算法選擇忽略這一點,直接斷言n是素數。
換句話說,miller-rabin演算法斷言乙個數不是素數一定是正確的,斷言乙個數是素數,則可能是錯誤的。但是,實際上,會被誤判為素數的合數,是很少的。而且每選取乙個符合條件的a,通過檢驗出錯的概率不超過1
2\frac
21.因此實際應用中使用miller-rabin演算法是可行的。
實際上,選取乙個a,僅僅基於費馬小定理給出的必要條件做斷言的檢測演算法,被錯誤斷言為素數的合數稱作基於a的偽素數。
而通過選取各個符合條件的a,僅僅基於費馬小定理,進行斷言的檢測演算法,被錯誤斷言為素數的偽素數就是卡麥可數。
假設n
nn是奇數,令n=m
×2q(
q≥1)
n=m \times 2^q (q \geq 1)
n=m×2q
(q≥1
),其中m
mm是奇數.
對於序列amm
odn,
a2mm
odn,
a4mm
odn,
…,a2
q×mm
od
na^m \bmod n, a^ \bmod n, a^ \bmod n,\ldots,a^ \bmod n
ammodn
,a2m
modn
,a4m
modn
,…,a
2q×m
modn
.最後一項就是費馬小定理中的an−
1a^
an−1
, 並且每一項都是前一項的平方。
我們一項一項往後計算。
當然,如果第一項是1,由於不存在二次探測的方程,所以不檢驗前面一項(或者認為前面一項符合條件)。
使用了快速冪模和快速冪加模板mod_sys。下面**只是miller-rabin核心**。
// 如果只是int範圍內,可以將pow_v2改為pow,mlt改為普通乘法
bool
miller_rabin
(ll a, ll n, ll q, ll m, mod_sys& mod)
else
}return
(a==1)
&&(is_ordinary)
;// 最後一項
}// 使用miller_rabin檢測是否是素數
const
int kcheckcnt =8;
// 為了隨機數
random_device rd;
mt19937_64 gen(rd
());
bool
miller_rabin
(ll n)
while
(m&1^1
);// 隨機數生成,[1,n-1] 均勻分布
uniform_int_distribution<
>
dis(
1, n-1)
; mod_sys mod;
mod.
set_mod
(n);
for(
int i =
0; i < kcheckcnt;
++i)if(
!miller_rabin
(dis
(gen)
, n, q, m, mod)
)return
false
;return
true
;}
模板題推薦hdu2138 Miller Rabin素數快速檢測
update 2017 03 26 滿足費馬小定理 a n 1 1 mod n 偽素數 對於所有a belong zn 總存在滿足的合數n,稱為carmichael數 miller rabin 1.隨機找多個s個a 2.二次探測定理 如果p是奇素數,則 x2 1 mod p 的解為 x 1 x p ...
Miller Rabin素數檢測演算法
對於給定的不小於3的奇數n,驗證次數t,miller rabin演算法如下 millerabin n,t 1.計算r,s,使滿足n 1 2的s次方 r 其中r是奇數 2.迴圈t次 1 隨機選取整數a,2 a n 2 2 計算y a的r次方 mod n 3 if y 1 y n 1 then j 1 ...
Miller Rabin素數檢測演算法
今天看了一下miller rabin素數檢測的演算法,總結了一下,希望這篇部落格對你們有幫助。先說幾個理論基礎 1.費馬小定理 假如p是質數,a是整數,且a p互質,那麼a的 p 1 次方除以p的餘數恆等於1,即 a p 1 1 mod p 但是反過來卻不一定成立,就是說,如果a p互質,且a p ...