POJ3641(快速幂)

Pseudoprime numbers
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 8529   Accepted: 3577

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-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
思路:问p是不是伪素数。伪素数条件:①p不是素数。② ap = a (mod p)。
#include <iostream>
using namespace std;
typedef unsigned long long ull; 
ull a,p;
bool testPrime(ull x)
{
    for(ull i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            return false;
        }
    }
    return true;
}
ull mpow(ull x,ull n,ull mod)
{
    ull res=1;
    while(n>0)
    {
        if(n&1)
        {
            res=(res*x)%mod;
        }
        x=(x*x)%mod;
        n>>=1;
    }
    return res;
}
int main()
{
    while(cin>>p>>a)
    {
        if(a==0&&p==0)    break;
        if(testPrime(p))
        {
            cout<<"no"<<endl;
        }            
        else
        {
            if(mpow(a,p,p)==a%p)
            {
                cout<<"yes"<<endl;
            }    
            else
            {
                cout<<"no"<<endl;
            }
        }
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/program-ccc/p/5682630.html