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

本文介绍了一种高效的素数判断算法,通过快速幂运算和Miller-Rabin素性测试来判断一个大整数是否为素数。文章详细解释了算法的原理,并提供了一个C++实现的例子。

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

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

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值