Preface
为什么是复习小记?因为忘了个精光QAQ
Miller Rabin
素数测试基于以下两个原理:
费马小定理
若 ( a , p ) = 1 (a,p)=1 (a,p)=1且 p p p是质数,则 a p − 1 ≡ 1 ( m o d p ) a^{p-1}≡1\ (mod\ p) ap−1≡1 (mod p),反之不一定成立
二次探测定理
若
p
p
p是素数,则
x
2
≡
1
(
m
o
d
p
)
x^2≡1\left(\mod p \right)
x2≡1(modp) 的解只有
x
=
1
x=1
x=1 或
x
=
p
−
1
(
−
1
)
x=p-1(-1)
x=p−1(−1)
也即如果
x
2
≡
1
(
m
o
d
p
)
x^2≡1 \left(\mod p\right)
x2≡1(modp) 且
x
≠
1
,
x
≠
p
−
1
x\neq1,x\neq p-1
x=1,x=p−1,则
p
p
p 必定是合数
步骤
- 令 p − 1 = 2 t ∗ u p-1=2^t*u p−1=2t∗u
- 随机一个 a ∈ [ 2 , p − 1 ] a\in[2,p-1] a∈[2,p−1]
- 从 x = a u x=a^u x=au开始对 x x x平方 t t t次。同时对 x x x检验二次探测定理。
- 最后检验 x x x是否等于 1 1 1(费马小定理),并回到操作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;
}