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

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

#include
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>n)
	{
		if(n==1)
			cout<<0<

 

你可能感兴趣的:(算法笔记,数论————,模板)