luogu【模板】线性筛素数 (Miller-Rabin素数测试模板)

这个感觉还是挺好理解的,就是复杂度证明看不懂~

Code: 

#include <cstdio> 
#include <algorithm> 
#include <cstring> 
#include <cmath>   
#define ll long long 
#define setIO(s) freopen(s".in","r",stdin)       
int array[10]={2,3,5,7,11,13,17,23};  
using namespace std;       
ll qpow(ll base,ll k,ll mod) 
{
	ll tmp=1; 
	for(;k;base=base*base%mod,k>>=1) if(k&1) tmp=tmp*base%mod; 
	return tmp; 
}
int prime(ll x)  
{     
	if(x<=1) return 0; 
	int i,j,k; 
	ll pre,a,cur;  
	for(i=0;i<8;++i) 
	{
		if(x==array[i]) return 1;          
		for(cur=x-1,k=0;cur%2==0;cur>>=1) ++k;              
		pre=a=qpow(array[i],cur,x);              
		for(j=1;j<=k;++j) 
		{  
			a=(a*a)%x;                 
			if(a==1&&pre!=1&&pre!=x-1) return 0; 
			pre=a;   
		}
		if(a!=1) return 0;    
	}   
	return 1;   
}
int main() 
{ 
	// setIO("input"); 
	int n,m; 
	scanf("%d%d",&n,&m); 
	for(int i=1;i<=m;++i) 
	{
		ll a; 
		scanf("%lld",&a),printf("%s\n",prime(a)?"Yes":"No");  
	}
	return 0; 
}

  

posted @ 2019-09-11 10:23  EM-LGH  阅读(226)  评论(0编辑  收藏  举报