Miller Rabin素數檢測演算法 acm模板

2021-09-26 20:16:37 字數 2527 閱讀 3209

其基於以下兩個定理。

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 ...