miller_rabin 证明与实现
143. 質數判定__模板題鏈接
前置知識
費馬小定理:ppp是質數,則對于任意的aaa,aaa與ppp互質,則有ap?1≡1(modp)a ^ {p - 1} \equiv 1 \pmod {p}ap?1≡1(modp)。
二次探測定理:如果ppp是一個質數,x2≡1(modp)x ^ 2 \equiv 1 \pmod px2≡1(modp),則有解為x1=1,x2=p?1x_1 = 1, x_2 = p - 1x1?=1,x2?=p?1,推理如下
?x2?1≡0(modp)\Rightarrow x ^ 2 - 1 \equiv 0 \pmod p?x2?1≡0(modp)
?p∣x2?1\Rightarrow p \mid x ^ 2 - 1?p∣x2?1
?p∣(x?1)(x+1)\Rightarrow p \mid (x - 1)(x + 1)?p∣(x?1)(x+1)
?x1=1,x2=p?1\Rightarrow x_1 = 1, x_2 = p - 1?x1?=1,x2?=p?1
同樣的我們即可反證:如果x2≡1(modp)x ^ 2 \equiv 1 \pmod {p}x2≡1(modp),并且x!=1,x!=n?1x != 1 , x != n-1x!=1,x!=n?1,那么我們一定可以認定ppp不是質數。
miller_radin的實現
對于一個質數ppp,我們顯然可以得到p?1=2sdp - 1 = 2 ^ s dp?1=2sd的形式,ddd是奇數。
我們在[2,n)[2,n)[2,n)中隨機選取一個數aaa,顯然有ap?1=a2sd=((((ad)2)……)2)a ^ {p - 1} = a ^ {2 ^ s d} = ((((a ^ d) ^ 2 )^ {……}) ^ 2)ap?1=a2sd=((((ad)2)……)2)。
所以我們可以從ada ^ dad開始,做sss次二次探測,如果二次探測失敗,我們直接得到這個數不止質數,當二次探測完成時,我們再做一次費馬小定理的特判,判斷該數是不是質數。
miller_rabin 模板代碼
ll quick_mult(ll a, ll b, ll mod) {ll ans = 0;while(b) {if(b & 1) ans = (ans + a) % mod;a = (a + a) % mod;b >>= 1;}return ans; }ll quick_pow(ll a, ll n, ll mod) {ll ans = 1;while(n) {if(n & 1) ans = quick_mult(ans, a, mod);a = quick_mult(a, a, mod);n >>= 1;} return ans; }bool miller_rabin(ll n) {if(n == 2) return true;if(n < 2 || !(n & 1)) return false;ll s = 0, d = n - 1;while(!(d & 1)) {d >>= 1;s++;}srand(time(0));for(int i = 1; i <= 5; i++) {ll a = rand() % (n - 2) + 2;ll now = quick_pow(a, d, n), pre = now;for(int j = 1; j <= s; j++) {now = quick_mult(now, now, n);if(now == 1 && pre != 1 && pre != n - 1) return false;pre = now;}if(now != 1) return false;}return true; }總結
以上是生活随笔為你收集整理的miller_rabin 证明与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧拉筛模板
- 下一篇: 无线键盘失灵了无线键盘失灵了什么情况