存个板子,应该是对的吧……没太试
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; }