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

匿名 (未验证) 提交于 2019-12-03 00:02:01

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

#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;  } 

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!