米勒-拉宾(MillerRabbin)素性测试算法模板

18 篇文章 0 订阅
13 篇文章 0 订阅

 算法原理详解:https://blog.csdn.net/holly_z_p_f/article/details/85197424

#include<bits/stdc++.h>
using namespace std;
#define ll long long

// 18位素数:154590409516822759
// 19位素数:2305843009213693951 (梅森素数)
// 19位素数:4384957924686954497

ll mul(ll a,ll b,ll mod) { //高精度
	a%=mod;
	b%=mod;
	ll c=(long double)a*b/mod;
	ll ans=a*b-c*mod;
	return (ans%mod+mod)%mod;
}
ll pow_mod(ll x,ll n,ll mod) { //快速幂
	ll res=1;
	while(n) {
		if(n&1)
			res=mul(res,x,mod);
		x=mul(x,x,mod);
		n>>=1;
	}
	return (res+mod)%mod;
}
bool Miller_Rabbin(ll a,ll n) {
	
	//把n-1  转化成 (2^r)*d
	ll s=n-1,r=0;
	while((s&1)==0) {
		s>>=1;
		r++;
	}

	//算出 2^d  存在 k 里
	ll k=pow_mod(a,s,n);

	//二次探测  看变化过程中是不是等于1 或 n-1
	if(k==1)return true;
	for(int i=0; i<r; i++,k=k*k%n) {
		if(k==n-1)
			return true;
	}
	return false;
}
bool isprime(ll n) {
	//这里可以随机取a值进行探测  探测次数可以自己定
	//我写了几个我喜欢用的探测数据
	ll times=7;
	ll prime[100]= {2,3,5,7,11,233,331};
	for(int i=0; i<times; i++) {
		if(n==prime[i])
			return true;
		if(Miller_Rabbin(prime[i],n)==false)
			return false;//未通过探测 返回假
	}
	return true;//所有探测结束 返回真
}

int main() {
	ll n;
	while(cin>>n)
	{
		if(n==1)
			cout<<0<<endl;
		else
			cout<<isprime(n)<<endl;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值