看了快两天的Miller_Rabbin素性判定算法和Pollard_rho质因数分解算法了。在博客上记录一下以免以后忘记。
代码中的ll
均为long long
,即typedef long long ll;
一:在学之前要用到的东西
1.快速乘法
原理可以见这里,基本思路就是二进制运算速度>>十进制的运算速度
直接上代码了:
ll mult(ll a, ll b, ll MOD) {
ll ret = 0;
while (b) {
if (b & 1) {
b--;
ret = (ret + a) % MOD;
}
else {
b >>= 1;
a = (a + a) % MOD;
}
}
return ret;
}
2.快速幂
能看到这篇的应该都会,直接上代码:
ll Pow(ll a, ll b, ll MOD) {
ll ret = 1;
while (b > 0) {
if (b & 1)
ret = mult(ret, a, MOD) % MOD;
a = mult(a, a, MOD) % MOD;
b >>= 1;
}
return ret;
}
3.欧几里得算法
能看到这篇的应该都会,直接上代码:
ll gcd(ll a, ll b) {
if (a < b) {
ll t = a;
a = b;
b = t;
}
if (b == 0)
return a;
return gcd(b, a % b);
}
二:Miller_Rabbin素性判定
1.费马小定理
先说一下定理的内容:
假如p为质数,且gcd(a,p)=1,则ap−1≡1(modp)
其中的一个特例就是:当p为质数时,就有
ap≡a(modp)
(之所以要写出来不仅时因为这个定理非常重要,还因为自己以前一直以为那个特例是费马小定理。)
证明方法的话网上有好多(太高端了我也看不懂)。在某博客上看到一个妙不可言的证明方法。感受到人类智慧恐怖。
2.一个引理
先说引理内容:
如果p是素数,且0<x<p,x∈N,则x=1或x=p−1
基于这个引理,就可以优化费马小定理,得到下面的Miller_Rabbin算法二次探测优化。
3.Miller_Rabbin算法二次探测优化
引用一下在这里看到的Miller_Rabbin算法。基本内容就是
要判断