Miller_Rabin素数测试

费马小定理:若 p p p 为质数,则对于 a ∈ [ 1 , p − 1 ] a\in[1,p-1] a[1,p1] ,有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1\pmod p ap11(modp)
如果一个数 p p p,不满足 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1\pmod p ap11(modp),那么这个数一定不是一个素数
二次探测定理:若 p p p 为质数,那么 x 2 ≡ 1 ( m o d p ) x^2\equiv 1\pmod p x21(modp) 的解只有 x 1 = 1 , x 2 = p − 1 x_1=1,x_2=p-1 x1=1,x2=p1
证明: x 2 − 1 ≡ 0 ( m o d p ) x^2-1\equiv 0\pmod p x210(modp) ( x − 1 ) ( x + 1 ) ≡ 0 ( m o d p ) (x-1)(x+1)\equiv 0\pmod p (x1)(x+1)0(modp)所以 p ∣ ( x − 1 ) ( x + 1 ) p|(x-1)(x+1) p(x1)(x+1) , 又因 p p p 为质数,得到 x − 1 = p x-1=p x1=p x + 1 = p x+1=p x+1=p
同理若 p p p不满足上述条件, p p p不为质数
可以写出下述代码,选 30 30 30以内的质数做基, i n t int int范围为内的质数都不会错

int p[12]={11,2,3,5,7,11,13,17,19,23,29,31};
bool miller_rabin(int x)
{
	for(int i=1;i<=p[0];i++) if(x==p[i]) return true;
	if(x<=32||!(x&1)) return false;
	int t=x-1,s=0;
	while(!(t&1)) s++,t>>=1;
	for(int i=1,r,pre;i<=p[0];i++)
	{
		if(x%p[i]==0) return false;
		pre=r=ksm(p[i],t,x);
		for(int j=1;j<=s;j++)
		{
			r=1ll*r*r%x;
			if(r==1&&pre!=1&&pre!=x-1) return false;
			pre=r;
		}
		if(r!=1) return false;
	}
	return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值