POJ 3641 : Pseudoprime numbers - 米勒罗宾素数测试

题意:
输入p,a,两个数如果p是素数输出no,如果p不是素数,
根据以a为基的伪素数定义,判断p是否是以a为基的伪素数。
分析:
判断a^p%p==a是否成立,如果成立输出yes,否则输出no
只有当p是合数且a^p = a ( mod p ) 时,才输出yes。
直接应用素数测试定义进行判断。

**米勒罗宾素数测试   Miller_Rabin
算法原理及实现
     
     
LL random(LL n){...}
LL multi()//a*b%m
LL quick_mod()
bool miller_rabin(LL n){
 for(L i=1;i<=n;i++){
  LL a=random(n-2)+1;
  if(quick_mod(a,n-1,n)!=1) return false;
 }
 return true;
}



解题报告:16ms

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define LL long long

bool ifprime(LL n){
LL i;
int iffind=0;
if(n==2||n==1) return 1;
else{
for(i=2;i<=sqrt(n+0.0)+1;i++)
if(n%i==0){
iffind=1;
break;
}
if(iffind) return 0;
else return 1;
}
}

LL quick_mod(LL a,LL b,LL m)
{
LL ans=1;
while(b){
if(b&1){
ans=(ans*a)%m;
b--;
}
b/=2;
a=a*a%m;
}
return ans;
}

int main(){
LL n,a,b,p;
while(~scanf("%lld%lld",&p,&a)&&(p+a)){
if(ifprime(p))
puts("no");
else{
LL ans=1;
ans=quick_mod(a,p,p);
if(ans==a)
puts("yes");
else
puts("no");
}
}
return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值