· 欧拉筛法
//O(n)
#define N 200000 //范围
int su[N],cnt,u[N]; //u[i]==0是素数,su[]是素数表
void oula(){
for(int i=2;i<N;i++){
if(!u[i])
su[++cnt]=i;
for(int j=1;j<=cnt&&i*su[j]<N;j++){
u[i*su[j]]=1;
if(i%su[j]==0)break; //prime[j]是i的最小质因子
}
}
}
· Miller_Rabin随机数测试算法(判断大数是不是素数)
ll qpow(ll x,ll e,ll mod){
ll re=1;
while(e){
if(e&0x01){
re=re*x%mod;
}
x=x*x%mod;
e>>=1;
}
return re%mod;
}
ll qmul(ll a,ll b,ll mod){
ll re=0;
while(b){
if(b&1)re=(re+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return re;
}
bool Miller_Rabin(ll x){
if(x==2) return 1;
if(!(x&1)||x==1) return 0;
bool pass;
ll d=x-1,m;
while(!(d&1)) d>>=1;ll tmp=d;
for(int i=1;i<=10;++i){
d=tmp;pass=0;
m=qpow(rand()%(x-2)+2,d,x);
if(m==1) continue;else
for(;d<x&&d>=0;m=qmul(m,m,x),d<<=1)
if(m==x-1){pass=1;break;}
if(!pass) return 0;
}
return 1;
}