Miller Rabin演算法詳解

2022-09-23 03:30:12 字數 2012 閱讀 1231

原文

判斷乙個數是否是素數

如果p是素數,且整數a不是p的倍數有:

\[a^\equiv 1 \pmod p

\]費馬定理只是n是素數的必要條件。即費馬定理不成立,n一定是合數;費馬定理成立,n可能是素數。

性質 1:$p-1$個整數 $a,2a,3a,...(p-1)a$中沒有乙個是 $p$的倍數 

性質 2:$a,2a,3a,...(p-1)a$中沒有任何兩個同餘與模 $p$的

所以 $a,2a,3a,...(p-1)a$對模 $p$的同餘既不為零,也沒有兩個同餘相同

因此,這 $p-1$個數模 $p$的同餘一定是 $a,2a,3a,...(p-1)a$的某一種排列

即 $a*2a*3a*...*(p-1)a \equiv \pmod p$

化簡為$a^*(p-1)! \equiv ! \pmod p$

根據威爾遜定理可知 $(p-1)!$與 $p$互質,所以同時約去 $(p-1)!$

即得到 $a^\equiv 1 \pmod p$

若 \(p\)為素數,a為任意整數有:

\[a^\equiv 1 \pmod p

\]易得

\[a\equiv \pm 1 \pmod p

\]

$a^\equiv 1 \pmod p$

$a^-1\equiv 0 \pmod p$

$(a+1)*(a-1)\equiv 0 \pmod p$

那麼$(a+1)\equiv 0 \pmod p$

或者$(a-1)\equiv 0 \pmod p$

(此處可根據唯一分解定理證明)

即$a\equiv \pm 1 \pmod p$

$a^\equiv 1 \pmod p$

$a^-1\equiv 0 \pmod p$

$(a+1)*(a-1)\equiv 0 \pmod p$

那麼$(a+1)\equiv 0 \pmod p$

或者$(a-1)\equiv 0 \pmod p$

(此處可根據唯一分解定理證明)

即$a\equiv \pm 1 \pmod p$

首先,根據 miller rabin 演算法的過程

假設需要判斷的數是 \(p\)

我們把 \(p-1\)分解為 \(2^k*t\)的形式

當 \(p\)是素數,有 \(a ^ \equiv 1 \pmod p\)

然後隨機選擇乙個數 \(a\),計算出 \(a^t \pmod p\)

讓其不斷的自乘,同時結合二次探測定理進行判斷

如果我們自乘後的數 \(\pmod p = 1\),但是之前的數 \(\pmod p \not = \pm 1\)

那麼這個數就是合數 (違背了二次探測定理)

這樣乘 \(k\)次,最後得到的數就是 \(a^\)

那麼如果最後計算出的數不為 \(1\),這個數也是合數 (費馬小定理)

老祖宗告訴我們,若 \(p\)通過一次測試,則 \(p\)不是素數的概率為 \(25\)%

那麼經過 \(t\)輪測試,\(p\)不是素數的概率為 \(\dfrac }\)

我習慣用 \(2,3,5,7,11,13,17,19\)這幾個數進行判斷

在資訊學範圍內出錯率為 \(0\)%(不帶高精)

注意在進行素數判斷的時候需要用到快速冪。。

#include#define ll long long 

inline int read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}int n, m, test[10] = ;

int pow(int a, int p, int mod)

bool query(int p)

if(a != 1) return 0;

}return 1;

}main()

Miller Rabin演算法詳解

目錄 基本引理 1,費馬定理 2,二次探測定理 作用 證明 實現 目錄 基本引理 1,費馬定理 2,二次探測定理 費馬定理的證明鏈結 二次探測定理的證明鏈結 有效的檢測大整數是否為素數。由費馬定理,可以排除大部分非素數的情況 滿足費馬定理是素數的必要條件 給出乙個奇素數n,顯然n 1為乙個偶數,存在...

數論 Miller Rabin演算法

在我們需要判斷乙個數是否是素數的時候,最容易想到的就是那個熟悉的o n 的演算法。那個演算法非常的簡單易懂,但如果我們仔細想想,當n這個數字很大的時候,這個演算法其實是不夠用的,時間複雜度會相對比較高。怎麼解決呢?我們先來了解一下 費馬小定理 假設我們有乙個素數p,且另乙個數a和p互素,就可以得到a...

素數判定 Miller Rabin 演算法

談到素數判定,首先想到的兩種便是暴力判定與篩法,實現非常簡單,在此不提。但在分解大質數時,由於數字過大,使得暴力判定會超時,篩法會超空間 可使用有技巧的限制空間篩法,但數字過大仍然過不了 這時,我們就要引入非完美大質數判定演算法 miller rabin演算法。下面一段引自sunshine cfbs...