1.費馬小定理:
費馬小定理:對於質數p和任意整數a,a^(p-1) mod=1
不滿足的一定是合數,滿足的大概率是素數。
2.miller-rabin質數測試
如果滿足費馬小定理,則進一步驗證如果p是奇素數,則 x^2 ≡ 1(mod p)的解為 x ≡ 1 或 x ≡ p - 1(mod p)
乙個例子:舉個matrix67 blog上的例子,假設n=341,我們選取的a=2。則第一次測試時,2^340 mod1.對於341=1。由於340是偶數,因此我們檢查2^170,得到2^170 mod
341=1,滿足二次探測定理。同時由於170還是偶數,因此我們進一步檢查2^85 mod
341=32。此時不滿足二次探測定理,因此可以判定341不為質數。
將這兩條定理合起來,也就是最常見的miller-rabin測試。
(a*b)%c
這裡的a,b,c都是非常大的數因此會產生爆乘,因此不能將a*b直接運算。
2.對於(a^b%c)
這裡可以使用快速冪的思想,將指數變成二進位制,然後二分的思想。
ac**
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
ll multmod(ll a, ll b, ll c)
tmp <<= 1;
if (tmp>c) tmp -= c;
b >>= 1;
}return res;
}ll modpow(ll base, ll exponent, ll modulus)
return result;
}bool miller_rabin(ll n)
if (n % 2 == 0)return
false;
ll u = n - 1;
while (!(u & 1))u = u >> 1;
int s = 1000;//s為測試次數
ll x, y;
for (int i = 1; i <= s; i++)
if (x != 1)return
false;
}return
true;
}int main()
return
0;}
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 n 1 mod n,如果結果不為1,我們可以...
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演算法進行質數素數測試,要求輸入乙個數字,對其是否是素數進行判定,並列印出相對應的結果。輸入 第...