Preface
为什么是复习小记?因为忘了个精光QAQ
Miller Rabin
素数测试基于以下两个原理:
费马小定理
若(a,p)=1(a,p)=1(a,p)=1且ppp是质数,则ap−1≡1 (mod p)a^{p-1}≡1\ (mod\ p)ap−1≡1 (mod p),反之不一定成立
二次探测定理
若ppp是素数,则 x2≡1(mod p)x^2≡1\left(\mod p \right)x2≡1(modp) 的解只有 x=1x=1x=1 或x=p−1(−1)x=p-1(-1)x=p−1(−1)
也即如果 x2≡1(mod p)x^2≡1 \left(\mod p\right)x2≡1(modp) 且 x≠1,x≠p−1x\neq1,x\neq p-1x=1,x=p−1,则 ppp 必定是合数
步骤
- 令p−1=2t∗up-1=2^t*up−1=2t∗u
- 随机一个a∈[2,p−1]a\in[2,p-1]a∈[2,p−1]
- 从x=aux=a^ux=au开始对xxx平方ttt次。同时对xxx检验二次探测定理。
- 最后检验xxx是否等于111(费马小定理),并回到操作2执行多次
板子
bool check(ll n,ll p,ll u,ll t)
{
ll x=qmi(n,t,p);
fo(i,1,u)
{
ll nxt=qmul(x,x,p);
if(nxt==1 && x!=1 && x!=p-1) return 0;
x=nxt;
}
return x==1;
}
bool miller_rabin(ll p)
{
if(p==2) return 1;
if(p<2 || !(p&1)) return 0;
ll u=0,t=p-1;
for(;t%2==0;t/=2) u++;
fo(i,1,10)
{
ll n=rand()%(p-2)+2;
if(!check(n,p,u,t)) return 0;
}
return 1;
}