0
点赞
收藏
分享

微信扫一扫

poj-3641-Pseudoprime numbers【快速幂】


Pseudoprime numbers


Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu

Submit  ​​Status​​

Description


Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). That is, if we raise a to the pth power and divide by p, the remainder is a. Some (but not very many) non-prime values of p, known as base-pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.)

Given 2 < p ≤ 1000000000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.



Input

Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.

Output

For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".

Sample Input


3 2
10 3
341 2
341 3
1105 2
1105 3
0 0


Sample Output


no
no
yes
no
yes
yes



题解:大概意思就是 若p为素数,就输出no;若p不为素数,再判断a^p%p的值,若等于a,输出yes,否则输出no



编程语言:G++
#include<cstdio>
#include<math.h>
__int64 qpow(__int64 x,__int64 y,__int64 z)
{
__int64 base=x,ans=1;
while(y)
{
if(y&1)
{
ans=ans*base%z;
}
base=base*base%z;
y>>=1;
}
return ans;
}
bool f(__int64 n)/// 判断素数的函数 素数返回值为1 否则返回0
{
if(n<=1)
return 0;
for(__int64 i=2;i<=(__int64)sqrt(n+1);i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
__int64 a,p;
while(scanf("%I64d %I64d",&p,&a)&&(p||a))
{
if(f(p))
printf("no\n");
else
{
if( qpow(a,p,p)==a )
printf("yes\n");
else
printf("no\n");
}

}
return 0;
}



举报

相关推荐

0 条评论