Miller Rabin質數測試

2021-07-16 18:12:28 字數 1280 閱讀 5121

費馬小定理:對於質數p和任意整數a,有a^p ≡ a(mod p)(同餘)。反之,若滿足a^p ≡ a(mod p),p也有很大概率為質數。

將兩邊同時約去乙個a,則有a^(p-1) ≡ 1(mod p)

也即是說:假設我們要測試n是否為質數。我們可以隨機選取乙個數a,然後計算a^(n-1) mod n,如果結果不為1,我們可以100%斷定n不是質數。

否則我們再隨機選取乙個新的數a進行測試。如此反覆多次,如果每次結果都是1,我們就假定n是質數。

該測試被稱為fermat測試。需要注意的是:fermat測試不一定是準確的,有可能出現把合數誤判為質數的情況。

miller和rabin在fermat測試上,建立了miller-rabin質數測試演算法。

與fermat測試相比,增加了乙個二次探測定理:

如果p是奇素數,則 x^2 ≡ 1(mod p)的解為 x ≡ 1 或 x ≡ p - 1(mod p)
如果a^(n-1) ≡ 1 (mod n)成立,miller-rabin演算法不是立即找另乙個a進行測試,而是看n-1是不是偶數。如果n-1是偶數,另u=(n-1)/2,並檢查是否滿足二次探測定理即a^u ≡ 1 或 a^u ≡ n - 1(mod n)。

舉個matrix67 blog上的例子,假設n=341,我們選取的a=2。則第一次測試時,2^340 mod 341=1。由於340是偶數,因此我們檢查2^170,得到2^170 mod 341=1,滿足二次探測定理。同時由於170還是偶數,因此我們進一步檢查2^85 mod 341=32。此時不滿足二次探測定理,因此可以判定341不為質數。

將這兩條定理合起來,也就是最常見的miller-rabin測試。

#include #include #include #include #include #include #include #include #include #define maxn 50005

#define inf 1e18

using namespace std;

typedef long long ll;

ll solve1(ll a, ll b, ll n)

return ans;

}ll solve2(ll a, ll b, ll n)

return ans;

}bool is_prime(ll n)

if(p != 1)

return false;

} return true;

}int main()

}return 0;

}

Miller Rabin質數測試

1.費馬小定理 費馬小定理 對於質數p和任意整數a,a p 1 mod 1不滿足的一定是合數,滿足的大概率是素數。2.miller rabin質數測試 如果滿足費馬小定理,則進一步驗證如果p是奇素數,則 x 2 1 mod p 的解為 x 1 或 x p 1 mod p 乙個例子 舉個matrix6...

Miller Rabin質數測試

這種質數演算法是基於費馬小定理的乙個擴充套件。費馬小定理 對於質數p和任意整數a,有a p a mod p 同餘 反之,若滿足a p a mod p p也有很大概率為質數。將兩邊同時約去乙個a,則有a p 1 1 mod p 也即是說 假設我們要測試n是否為質數。我們可以隨機選取乙個數a,然後計算a...

Miller Rabin質數測試

本文主要討論使用miller rabin演算法編寫素數的判定演算法,題目 於hihocoder。時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述 使用miller rabin演算法進行質數素數測試,要求輸入乙個數字,對其是否是素數進行判定,並列印出相對應的結果。輸入 第...