(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
闲话:
问题引入:对于两个1e18大小的数字,要求其乘积,或者mod一个1e18的数。
如果你有大数模板或者有时间手敲一个那就请忽略吧
&mep;直接相乘肯定会爆long long呀。怎么办呢?那就每次只乘2呗。模拟快速幂写一个快速乘咯。代码如下:
long long ksc(long long a, long long b, long long mod){
long long res = 0;
while(b){
if(b&1) res = (res + a)%mod;
(a<<=1)%=mod;
b >>= 1;
}
return res;
}
Miller-Rabin素数测试
这次素数测试中用到的乘法就是快速乘。不用快速乘的板子可能会溢出就会导致问题。
费尔马小定理:
如果p是一个素数,且0 < a < p, 则 a^(p-1) % p = 1
二次探测定理:
如果p是一个素数,且0 < x < p, 则方程x^2 % p = 1的解为: x = 1或 x = p-1
定理: 若n是素数, a是小于n的正整数, 则n对以a为基的Miller测试,结果为真
Miller测试进行k次,将合数当成素数处理的错误概率最多不会超过4^(-k)