POJ 3641 Pseudoprime numbers(费马小定理,快速幂,数论)

来源:互联网 发布:kord机枪 知乎 编辑:程序博客网 时间:2024/05/17 05:05
Pseudoprime numbers
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 8643 Accepted: 3630

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 210 3341 2341 31105 21105 30 0

Sample Output

nonoyesnoyesyes

Source

Waterloo Local Contest, 2007.9.23


参考:费马小定理,点击进入百度词条

思路:
p 是素数时不满足条件;
满足条件的 p 是否满足 a^p%p=a ? 


参考代码:
#include<cstdio>#include<stdlib.h>#include<string.h>#include<math.h>#include<algorithm>#define MYDD 1103typedef long long ll;using namespace std;ll MOD(ll x,ll n,ll mod) {ll ans;if(n==0)return 1;ans=MOD(x*x%mod,n/2,mod);//采用递归if(n&1)//用于判断 n 的二进制最低位是否为 1ans=ans*x%mod;return ans;}ll issu(ll x) {//素数的判断if(x<2)return 0;//不是素数:返回 0for(ll j=2; j<=sqrt(x); j++)if(x%j==0)return 0;return 1;}int main() {ll p,a,Q_mod;while(scanf("%lld%lld",&p,&a)&&(p||a)) {if(issu(p)) {puts("no");//如果 p 是素数,直接输出} else {Q_mod=MOD(a,p,p);//快速幂 a^p%p 的结果 if(Q_mod==a) {puts("yes");} elseputs("no");}}return 0;}



0 0