前言
(Miller-Rabbin) 素数测试可以判断比较大的数是不是素数。
但是判断的结果可能是伪素数。
前置知识
费马小定理:
[若p为素数是,满足 a^{p-1} equiv 1(mod p)
]
二次探测定理:
[若p为奇素数且 x^2 equiv 1(mod p);\则x equiv 1(mod p)或者 x equiv p-1(mod p)
]
思路
判断一个数 n 是不是素数,随机一个数 x (2 ≤ x < n),
先对 x 的 n-1 次方进行 n 取模
在运用二次探测定理判断结果是否为 1 或者 n-1,
满足则为素数。
其中当x=2时需要进行特判
代码
Code:
inline bool millerRabbin(ll n){
if(n<3)return n==2;
ll a=n-1,b=0;
while(a%2==0)a/=2,++b;
for(int i=0,j;i<testTime;++i){
ll x=rand()%(n-2)+2,v=binpow(x,a,n);
if(v==1||v==n-1)continue;
for(j=0;j<b;++j){
v=multi(v,v,n);
if(v==n-1)break;
}
if(j>=b)return false;
}
return true;
}