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;
}
原文地址:https://www.cnblogs.com/372465774y/p/2579930.html