Description
Fermat ' s theorem states, the for any prime number p and for any integer a > 1, ap = A (mod p). That's, 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-a Pseudoprimes, has this property for Some a. (and Some, kn Own as Carmichael Numbers, is 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, the output "yes" if P is a base-a pseudoprime; Otherwise output "no".
Sample Input
3 2
3
341 2
341 3
1105 2
1105 3
0 0
Sample Output
No
no
Yes
no
Yes
Yes
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
BOOL Is_prime (int x)
{
int i,j;
for (i=2;i*i<=x;i++) if (x%i==0) return false;
return true;
}
ll Mod_pow (ll x,ll n,ll MoD)
{
ll res=1;
while (n>0) {
if (n&1) res=res*x%mod;
X=x*x%mod;
n>>=1;
}
return res;
}
int main ()
{
int a,p,i,j;
while (cin>>p>>a) {
if (p==0 && a==0) break;
if (Is_prime (p)) {
printf ("no\n");
Continue;
}
if (Mod_pow (a,p,p) ==a) printf ("yes\n");
else printf ("no\n");
}
return 0;
}