Fermat's theorem states that for any prime number p and for any integer a > 1, a p = a (mod p ). That is, if we raise a to the p th power and divide by p , the remainder is a . Some ( but not very many) non-prime values of p , known as base- apseudoprimes, 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- apseudoprime.
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
10 3
341 2
341 3
1105 2
1105 3
0 0
Sample Output
no
no
yes
no
yes
yes
no
yes
no
yes
yes
#include <stdio.h>
#include <math.h>
int main()
{
long long a,p,i;
long long powmod(long long p,long long a);
long long qwe(long long p);
scanf("%lld%lld",&p,&a);
while(a!=0&&p!=0)
{
if(powmod(p,a)==a&&qwe(p)) printf("yes\n");
else printf("no\n");
scanf("%lld%lld",&p,&a);
}
return 0;
}
long long powmod(long long p,long long a)
{
long long res=1,q=p;
while(p)
{
if(p&1) res =res*a%q;
a=a*a%q;
p>>=1;
}
return res%q;
}
long long qwe(long long p)
{
long long c,i,t=0;
c=sqrt(p);
if(c*c!=p)
{
for(i=2;i<=c;i++)
{
if(p%i==0) {
t=1;
break;
}
}
return t;
}
else return 1;
}
运用了求质数,和快速幂,主要是快速幂的求解方法。
long long res=1,q=p;
while(p)
{
if(p&1) res =res*a%q;
a=a*a%q;
p>>=1;
}
return res%q;