poj 3641 伪素数
题目描述
根据以a为基的伪素数的定义,判断p是否是以a为基的伪素数。(2 < p ≤ 1000000000 and 1 < a < p )
输入格式
输入数据有多组,每组数据占一行,包含两个整数p和a,输入以“0 0”结束。
输出格式
如果p是以a为基的伪素数,则输出“yes”,否则输出“no”。
样例数据
样例输入
3 2
10 3
341 2
341 3
1105 2
1105 3
0 0
样例输出
no
no
yes
no
yes
yes
题目分析
Miller_Rabin的前奏,这题没什么意义
a为底伪素数定义:p不是素数且a^p≡a (mod p)。
伪素数得定义:
即a^p=a(mod)p && p不是质数
#include "iostream"
#include<cmath>
using namespace std;
#define LL long long
bool is_prime(LL k)
{
int flag=0;
if(k==1&&k==0)return false;
for(LL i=2;i<sqrt(1.0*k)+1;i++)//判断是否为素数,注意精确到小数点后一位
{
if(k%i==0) return false;
}
return true;
}
LL mi(LL a,LL b,LL m)
{
LL ans=1;
while(b>0){
if(b&1)
{
ans=(ans*a)%m;
}
a=a*a%m;
b>>=1;
}
return ans;
}
int main(int argc, char const *argv[]) {
int a,p;
while(scanf("%d %d",&a,&p )&&(a+p))
{
if(is_prime(p)){
printf("No\n" );
}
else{
LL ans=1;
ans=mi(a,p,p);//求a的p次方mod p
if(ans==a) printf("yes\n" );
else printf("no\n" );
}
}
return 0;
}