Pseudoprime numbers
Time Limit: 1000MS Memory limit: 65536K
题目描述
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 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, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.)
Given 2 < p ≤ 1,000,000,000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.
输入
Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.
输出
For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".
示例输入
3 2 341 2 0 0
示例输出
no yes
#include<stdio.h>
#include<math.h>
long exp_mod(long a,long n,long m)
{
long k;
if(n==0)
return 1%m;
if(n==1)
return a%m;
k=exp_mod(a,n/2,m);
k=k*k%m;
if(n%2==1)
k=k*a%m;
return k;
}
int main()
{
int a,i,flag;
long p,t,g;
while(~scanf("%ld %ld",&p,&a)&&(p!=0&&a!=0))
{
t=p;flag=0;
for(i=2;i<=sqrt(t);i++)
if(t%i==0)
{
flag=1;
break;
}
g=exp_mod(a,p,p);
if(flag==1&&a==g)
printf("yes\n");
else
printf("no\n");
}
return 0;
}