miller——rabin

突然发现自己在线性筛素数中有这个,忘了好久;

#include<iostream> 
#include<cstdio>
using namespace std;
long long num[10]={0,2,3,5,7,11,13,17,19};
long long mul(long long a,long long b,long long p)
{
	long long ans=1;
	a=a%p;
	while(b)
	{
		if(b&1)
			ans=(ans*a)%p;
		b>>=1;
		a=(a*a)%p;
	}
	return ans;
}
bool test(long long a)
{
	if(a==2)
		return true;
	if(a%2==0||a==1)
		return false;
	for(int i=1;i<=8;i++) 
		if(a==num[i])
			return true;
	long long t=0,temp=a-1,now;
	while((temp&1)==0)
	{
		temp>>=1;
		t+=1;
	}
	for(int i=1;i<=8;i++) 
	{
		now=mul(num[i],temp,a);
		long long nxt=now;
		for(int i=1;i<=t;i++)
		{
			nxt=(now*now)%a;
			if(nxt==1&&now!=1&&now!=a-1)
				return false;
			now=nxt;
		}
		if(now!=1)
			return false;
	}
	return true;
}
int main()
{
	long long n,m;
	scanf("%lld%lld",&n,&m);
	long long pass;
	for(int i=1;i<=m;i++)
	{
		scanf("%lld",&pass);
		if(test(pass))
			printf("Yes
");
		else
			printf("No
");
	}
}
原文地址:https://www.cnblogs.com/Lance1ot/p/8970358.html