【Miller-Rabin算法】

存个板子,应该是对的吧……没太试

http://www.cnblogs.com/Norlan/p/5350243.html

Matrix67写的

根据wiki,取前9个素数当base的时候,long long内仅有一个强伪素数 382512305654641305 。

#include<cstdio>
using namespace std;
typedef long long ll;
const int BASE[]={2,3,5,7,11,13,17,19,23};
ll Quick_Mul(ll a,ll p,ll MOD)
{
    if(!p){
    	return 0;
    }
    ll ans=Quick_Mul(a,p>>1,MOD);
    ans=(ans+ans)%MOD;
    if((p&1)==1){
    	ans=(ans+a%MOD)%MOD;
    }
    return ans;
}
ll Quick_Pow(ll a,ll p,ll MOD)
{
    if(!p){
    	return 1;
    }
    ll ans=Quick_Pow(a,p>>1,MOD);
    ans=Quick_Mul(ans,ans,MOD);
    if((p&1)==1){
    	ans=(a%MOD*ans)%MOD;
	}
    return ans;
}
bool test(ll n,ll a,ll d){
	if(n==2){
		return 1;
	}
	if(n==a){
		return 0;
	}
	if(!(n&1)){
		return 0;
	}
	while(!(d&1)){
		d>>=1;
	}
	ll t=Quick_Pow(a,d,n);
	if(t==1){
		return 1;//要么一开始t就等于1,咋乘都是1 
	}
    while(d!=n-1 && t!=n-1 && t!=1){
		t=Quick_Mul(t,t,n);
		d<<=1;
	}
	return t==n-1;//要么t能变成n-1,那么下一次t肯定变成1,
				//再往后也没有卵用了,一直是1,就通过了测试 
}
bool Miller_Rabin(ll n){
	if(n==1 || n==3825123056546413051ll){
		return 0;
	}
	for(int i=0;i<9;++i){
		if(n==BASE[i]){
			return 1;
		}
		if(!test(n,BASE[i],n-1)){
			return 0;
		}
	}
	return 1;
}
int main(){
	for(int i=1;i<=100000;++i){
		if(Miller_Rabin(i)){
			printf("%d ",i);
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/autsky-jadek/p/6593780.html