GCD&&素筛&&快速幂 --A - Pseudoprime numbers

Posted zjydeoneday

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCD&&素筛&&快速幂 --A - Pseudoprime numbers相关的知识,希望对你有一定的参考价值。

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
本题用到快速幂,素数判定、二者结合;
题意:输入两个数p,a.先判断p是否为素数,如果是,输出no。否则,再判断a的p次方取余p是否为a,是则yes,反之
则no。
#include<iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
typedef long long ll;
int isprime(ll n)

    if(n<=3)  return n>1;
    int k; 
    k=sqrt(n);
    if(n%6!= 1 && n%6!=5)
        return 0;
    for(int i=5;i<=k;i+=6)
    
        if(n%i==0 || n%(i+2)==0)
            return 0;
    
    return 1;

ll qpow(ll a, ll n,ll mod)//计算a^n % mod

    ll re = 1;
    while(n)
    
        if(n & 1)//判断n的最后一位是否为1
            re = (re * a) % mod;
        n >>= 1;//舍去n的最后一位
        a = (a * a) % mod;//将a平方
    
    return re;

int main()

    ll p,a;
    while(cin>>p>>a&&a&&p)
    
        if(isprime(p))
        cout<<"no"<<endl;
        else
        
            if(a==qpow(a,p,p))
            cout<<"yes"<<endl;
            else
            cout<<"no"<<endl;    
        
        
    
    return 0;
 

typedef

typedef long long ll;

快速幂模板

ll qpow(ll a, ll n,ll mod)//计算a^n % mod

    ll re = 1;
    while(n)
    
        if(n & 1)//判断n的最后一位是否为1
            re = (re * a) % mod;
        n >>= 1;//舍去n的最后一位
        a = (a * a) % mod;//将a平方
    
    return re;

质数判定模板

int isprime(ll n)

    if(n<=3)  return n>1;
    int k; 
    k=sqrt(n);
    if(n%6!= 1 && n%6!=5)
        return 0;
    for(int i=5;i<=k;i+=6)
    
        if(n%i==0 || n%(i+2)==0)
            return 0;
    
    return 1;

 

 

注意输入用cin,用scanf会wa

以上是关于GCD&&素筛&&快速幂 --A - Pseudoprime numbers的主要内容,如果未能解决你的问题,请参考以下文章

数论——gcd&&lcm

gcd & lcm &exgcd

UVA 11426 (欧拉函数&&递推)

POJ 2429 GCD &amp; LCM Inverse (大数分解)

SPOJ4491. Primes in GCD Table(gcd(a,b)=d素数,(1&lt;=a&lt;=n,1&lt;=b&lt;=m))加强版

POJ2429_GCD &amp; LCM InverseMiller Rabin素数測试Pollar Rho整数分解