经典得判断伪素数

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值