原理是費馬小定理:如果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很大時,此種演...