Miller–Rabin 素性测试

判断一个数p是否为素数(p首先得为大于等于2的正整数才有可能为素数),首先判奇偶,若为偶数只有2为素数,若为奇数(这里可以考虑去掉 3甚至5的倍数),则先求出d。对于每一个底a,让d不断乘以2直到为(p-1)/2,在此过程中(包括原本的d与d=(p-1)/2时的情况),设t为a的d次方模p的余数。

(1)当t=-1时跳出,声明p有可能为素数;

(2)当t=1时,若d为奇数,跳出声明p有可能为素数,否则跳出声明p必为合数;

(3)当d=(p-1)/2时跳出,声明p必为合数。

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
LL a;
LL pow_mod(LL a,LL b,LL m)
{
	LL r=1;
	while(b)
	{
		if(b&1)r=(r*a)%m;
		a=(a*a)%m;
		b>>=1;
	}
	return r;
}

bool M_R(LL a,LL num)
{
  LL d=num-1;
  while((d&1)==0)d=(d>>1);
  LL p=pow_mod(a,d,num);
  if(p==1 || p==num-1) return true;
  else 
  {
    LL t=(num-1)/2;
    while(d!=t)
    {
      d=(d<<1);
      if(pow_mod(a,d,num)==num-1)
			 return true;
    }
    return false;      
  }        
}

bool check(LL p)
{
  if(p==2||p==3||p==5||p==7||p==11)return true;
  if((p&1)==0 || p%3==0 || p<2)return false;
  if(M_R(2,p)&&M_R(3,p)&&M_R(5,p)&&M_R(7,p)&&M_R(11,p))
	  return true;
  else return false;
}

int main()
{
	cin>>a;
	if(check(a))cout<<"Yes";
	else cout<<"No";
	return 0;
}
/*
Wenn n < 1.373.653, ist es ausreichend a = 2 und 3 zu testen,
wenn n < 9.080.191, ist es ausreichend a = 31 und 73 zu testen,
wenn n < 4.759.123.141, ist es ausreichend a = 2, 7, und 61 zu testen,
wenn n < 2.152.302.898.747, ist es ausreichend a = 2, 3, 5, 7, und 11 zu testen,
wenn n < 3.474.749.660.383, ist es ausreichend a = 2, 3, 5, 7, 11, und 13 zu testen,
wenn n < 341.550.071.728.321, ist es ausreichend a = 2, 3, 5, 7, 11, 13, und 17 zu testen.
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值