公尺勒拉賓素數檢測

2022-05-03 10:51:22 字數 844 閱讀 5452

是一種隨機化素數檢測演算法

基於下面的定理

費馬小定理的逆命題:如果\(a^ \equiv 1(\bmod\ p)\)成立,那麼\(p\)是乙個素數且\(a\)不是\(p\)的倍數

可以確定費馬小定理的逆命題不一定成立。

那麼對於乙個數,如果不滿足\(a ^ \equiv 1(\bmod \ p)\)那麼一定不是素數,如果滿足,那麼有可能是素數,取a = [1,p)的隨機數,在進行判斷,進行幾次即可,則為素數的可能性越大

但是對於卡麥可數,卡麥可數是乙個合數\(p,a\)不是\(p\)的倍數,但符合\(a^\equiv 1(\bmod \ p)\)

則需要每次判斷費馬小定理時,進行二次探測,排除卡麥可數

當\(p\)為2時為素數

當\(p\)小於\(2\)或偶數時不是素數

\(10\)次檢測,隨機化\(a \in [1,p)\)求出\(a^u \% n\),然後二次探測判斷

其中進行優化,使得進行二次探測時的冪小一點,然後在慢慢擴大,不然,如果直接計算\(p - 1\)次冪,可能會造成溢位的情況

#include #include #include #define ll long long

using namespace std;

ll mod_mul(ll a,ll b,ll p)

return ans;

}ll mod_exp(ll a,ll b,ll p)

return ans;

}bool miller_rabin(ll n)

if(x != 1)return 0;

}return 1;

}int main()

公尺勒羅蘋素數檢測法

原理是費馬小定理 如果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互素的數 看是否為...

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

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很大時,此種演...