公尺勒羅蘋素數檢測法

2021-09-25 19:27:20 字數 1194 閱讀 6653

原理是費馬小定理:如果p是素數,則a ^ (p-1)%p == 1,加上二次探測定理:如果p是乙個素數,則x^2%p==1的解為,則x=1或者x=n-1。

一次檢測中:

主要是把乙個數n的n-1分解成d*2^ r的形式,其中d為奇數,正向過程是a^ n%p如果是1,就繼續分解

a^ (n/2)%p,(a為乙個與n互素的數)看是否為1,;如果是n-1就停止分解,說明至此無法判斷是否為素數;如果不等於這兩個值,則一定為合數。而在寫**過程是這個過程的逆向過程,先分解到底,看最後這個a^d%p是否為1或n-1,如果是說明已經分解到底了,也就是通過了此次素性測試。如果不是,說明在正向過程**現了要麼a的某次方為n-1,根據演算法停止了檢測過程;要麼就是中間的某乙個結果不等於這兩個數,那麼就是合數。就從最後往前面推,每一步看滿不滿足上述條件。直到判斷為合數或者終止檢測的那一步。

詳細步驟:

(1)計算奇數m,使得n=2^r * m + 1;

(2)選擇隨機數a(3)對於任意i(4)或者,若a^m mod n = 1,則n通過隨機數a的測試;

(5)讓a取不同的值對n進行行多次測試(一般要求5~ 10次,有較高要求的話可以進行20~30次),若全部通過則判定n為素數;

模板:

#include

using namespace std;

typedef long long ll;

ll q_mul

(ll a,ll b,ll p)

return ans;

}ll q_pow

(ll a,ll b,ll p)

return ans;

}bool miller_rabin

(ll n)

srand

(100);

while

(t--)if

(tmp!=1)

return

false;}

return

true

;}

附乙個講素數講的巨好的文章:

公尺勒拉賓素數檢測

是一種隨機化素數檢測演算法 基於下面的定理 費馬小定理的逆命題 如果 a equiv 1 bmod p 成立,那麼 p 是乙個素數且 a 不是 p 的倍數 可以確定費馬小定理的逆命題不一定成立。那麼對於乙個數,如果不滿足 a equiv 1 bmod p 那麼一定不是素數,如果滿足,那麼有可能是素數...

檢驗大素數 公尺勒隨機測試

miller rabin 概率演算法,能處理10 19範圍數 include include include include include includeusing namespace std const int s 20 隨機演算法判定次數,s越大,判錯概率越小 計算 a b c.a,b都是lo...

素數與素數檢測

一.試除法 根據素數的定義,假設要判斷的自然數為n,那麼最簡單的方法便是用2 n 1 之間的數字依次列舉試除一遍,如果能整除,那說明這個數不是素數,顯然,此種演算法的效率極低。初學c語言的人會使用另一種改進的試除法,那便是除數不用取遍2 n 1 而是取2 int sqrt n 但是當n很大時,此種演...