Miller_Rabin素数测试

本文介绍了基于费马小定理和二次探测定理的Miller-Rabin素数测试方法。通过这种方法,可以判断一个数是否为素数。代码实现中选择30以内的质数作为基,确保在整数范围内判断的准确性。

费马小定理:若 ppp 为质数,则对于 a∈[1,p−1]a\in[1,p-1]a[1,p1] ,有 ap−1≡1(modp)a^{p-1}\equiv1\pmod pap11(modp)
如果一个数ppp,不满足 ap−1≡1(modp)a^{p-1}\equiv1\pmod pap11(modp),那么这个数一定不是一个素数
二次探测定理:若 ppp 为质数,那么 x2≡1(modp)x^2\equiv 1\pmod px21(modp) 的解只有 x1=1,x2=p−1x_1=1,x_2=p-1x1=1,x2=p1
证明:x2−1≡0(modp)x^2-1\equiv 0\pmod px210(modp)(x−1)(x+1)≡0(modp)(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) , 又因ppp 为质数,得到x−1=px-1=px1=px+1=px+1=px+1=p
同理若ppp不满足上述条件,ppp不为质数
可以写出下述代码,选303030以内的质数做基,intintint范围为内的质数都不会错

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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值