POJ 3641 Pseudoprime numbers

Pseudoprime numbers
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 4864   Accepted: 1872

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-a 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

Source

 
//给你一个数 p和一个数 a, 若p是素数输出no,a的p次方模p等于a输出yes,否则输出no
#include <iostream>

#include <stdio.h>

#include <cmath>

using namespace std;

bool is_prime(int n)

{

     int i,m=sqrt(double(n));

	 for(i=2;i<=m;i++)

		 if(n%i==0)

			 return 0;

	 return 1;

}

int main()

{

	int q,a,tq;

	__int64 ta,i;

    while(scanf("%d%d",&q,&a),q||a)

	{

		if(is_prime(q))

		{

			printf("no\n");continue;

		}

         tq=q; i=a;

	    for(ta=1;tq>0;tq=tq>>1,i=(i*i)%q)

		{ 

		   if(tq&1) ta=(ta*i)%q;

		}

		if(ta==a)

		   printf("yes\n");

		else

			printf("no\n");



	}

    return 0;

}

你可能感兴趣的:(number)