经典得判断伪素数

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

 

发布了15 篇原创文章 · 获赞 9 · 访问量 4784
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览