#include<stdio.h>
#include<string.h>
#define maxn 100001
int prime[maxn],save[maxn],tot;
bool pan(int a,int p)
{
if(p<maxn)//直接判素
{
if(!prime[p])
return false;
}
else
{
int ok=1;
for(int i=1;save[i]*save[i]<=p;i++)//利用素数表判素
if(p%save[i]==0)
{
ok=0;
break;
}
if(ok)return false;
}
int s=1;
int mod=p,b=a;
while(p)//快速幂
{
if(p&1)
{
s=(long long)s*(long long)a%(long long)mod;
}
a=(long long)a*(long long)a%(long long)mod;
p>>=1;
}
if(s%mod==b)return true;
else return false;
}
void init()//建立素数表
{
tot=1;
for(int i=2;i<maxn;i++)
if(!prime[i])
{
save[tot++]=i;
for(int j=i+i;j<maxn;j+=i)
prime[j]=1;
}
}
int main()
{
int p,a;
init();
while(~scanf("%d%d",&p,&a)&&p)
{
if(pan(a,p))
printf("yes\n");
else
printf("no\n");
}
return 0;
}
PO3641 Pseudoprime numbers判伪素数与快速幂
最新推荐文章于 2019-08-22 21:09:50 发布