Rabin-Miller素性测试算法

算法原理:

Th1 p为素数, 0<a<p  如果a^2 mod p = 1 则 a mod p =1或者 a mod p =-1即a mod p = p-1

证明:

a mod p =1或者 a mod p =-1
Th2 任何一个素数p都能用表示

根据费马小定理 对于素数p和1<a<p-1 有
所以
由此可以得到数列
(1)所有值都为1 或者
(2)有的值不为1 但是其平方后模p为1 所以该值为 -1mod p =p-1
如果一个数不满足上诉条件,则这个数一定为合数;
如果一个数满足上诉条件,则它可能是素数,也可能是合数,但它是素数的概率(0.75)大于
它是合数的概率。为了降低误判(将合数判为合数),多次运行该算法,降低错误率

算法实现:

bool millerRabinPrimeTest(unsigned long p,int cnt){//对于素数p进行检验 ,检验cnt次
	unsigned long  k=0;
	unsigned long  q= p-1;
	unsigned long r=0;

	if(q!=1&&q%2==1)return false;
	for (;q%2!=1;k++)q/=2;
	for (int i=0;i<cnt;i++){
		r=rand()%(p-1)+1;//从[1,p-1]随机选取一个数
		if(qe2(r,q,p)==1)continue;
		else{
			for (unsigned long  j=0;j<k;j++){
				if(qe2(r,pow(2,j)*q,p)==p-1)break;
				else if(j==k-1)return false;
			}
		}
	}
	return true;
}
unsigned long qe2(unsigned long x,unsigned long y,unsigned long n){//使用加法链实现的模幂函数  即 x^y mod n 
	unsigned long s,t,u;
	s=1;t=x;u=y;
	while(u){
		if(u&1)s=(s*t)%n;
		u>>=1;
		t=(t*t)%n;
	}

如果要求算法的错误率小于 t 则


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值