POJ Pseudoprime numbers( Miller-Rabin素数测试 )
**链接:****传送门 **
题意:题目给出费马小定理:Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). 我们知道Miller-Rabin素数测试的算法原理就是基于费马小定理的,因为我们在测试底数的时候只是随机一些 a ,所以可能有的合数就脸一白通过了测试,于是就产生了伪素数这一概念,现在给你一对 p and a,判断 p 是否是以 a 为基的伪素数
思路:****对于素数来说是不存在伪素数这一说的,只有合数才可能出现伪素数,所以当 p 为合数 且满足式子:ap = a (mod p).则 p 是以 a 为基的伪素数
/*************************************************************************
> File Name: poj3641.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年05月22日 星期一 14时56分11秒
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define TIME 1000 // 米勒测试次数上限
#define ll long long
ll RDM(ll n){ // 生成随机底数随机底数范围在[ 1 , n ]
return (ll)( (double)rand()/RAND_MAX * n + 0.5 );
}
ll quick_pow(ll a,ll x,ll m){ // O(logx)
ll ret = 1;
while(x){
if( x&1 ) ret = ( (ret%m) * (a%m) ) % m;
a = ( (a%m) * (a%m) ) % m;
x >>= 1;
}
return ret;
}
bool Mille_Rabin(ll n){ // 复杂度大约为O(TIME) PS:除非脸黑成功避过TIME次测试
for(int i = 1 ; i <= TIME ; i++){
ll a = RDM(n-2) + 1; // 随机底数
if( quick_pow(a,n-1,n) != 1 )
return false;
}
return true;
}
bool Pseudo_Prime(ll p,ll a){
return quick_pow(a,p,p) == a ? true : false;
}
int main(){
ll p , a;
while(~scanf("%lld%lld",&p,&a)){
if( p == 0 && a == 0 ) break;
if( Mille_Rabin(p) ){
printf("no\n");
}
else{
if( Pseudo_Prime(p,a) ) printf("yes\n");
else printf("no\n");
}
}
return 0;
}
POJ Pseudoprime numbers( Miller-Rabin素数测试 )的更多相关文章
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- HDU1164_Eddy's research I【Miller Rabin素数测试】【Pollar Rho整数分解】
Eddy's research I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
- POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- poj 3641 Pseudoprime numbers 快速幂+素数判定 模板题
Pseudoprime numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7954 Accepted: 3305 D ...
- POJ3641 Pseudoprime numbers(快速幂+素数判断)
POJ3641 Pseudoprime numbers p是Pseudoprime numbers的条件: p是合数,(p^a)%p=a;所以首先要进行素数判断,再快速幂. 此题是大白P122 Car ...
- poj 1811 Prime Test 大数素数测试+大数因子分解
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 27129 Accepted: 6713 Case ...
- Miller Rabin素数检测
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #inclu ...
随机推荐
- AlterDialog 经常使用的样式
使用AlerDialog 创建对话框 : AlertDialog.Builder builder = new AlertDialog.Builder(this); 1.设置简单的对话框 builder ...
- Fitnesse Page 简单使用
more information- http://www.fitnesse.org/FitNesse.UserGuide 1.1 Edit 点击该按钮,则可以开始编辑(如果该按钮没有出现,则这个页 ...
- 单点登录 SSO 的实现原理 SESSION COOKIE Memcache
单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...
- Ubuntu使用ssh方法连接不上
查看远程机器是否安装ssh服务(ubuntu 没有默认安装ssh) 命令:ssh host (图中没有安装) 安装ssh 命令 sudo apt-get install openssh-serve ...
- AWS S3 对象存储服务
虽然亚马逊云非常牛逼,虽然亚马逊云财大气粗,虽然亚马逊用的人也非常多,可是这个文档我简直无法接受,特别是客服,令人发指的回复速度,瞬间让人无语,可是毕竟牛逼.忍了,躺一次坑而已 1.图片上传 1.1 ...
- PIE加载自定义服务数据详细介绍
这段时间我一直在研究如何用PIE加载在线地图服务,遇到了许多问题,多亏了技术员小姐姐的帮助,才让我能正确加载ArcGIS Online在线服务.天地图在线地图和谷歌在线地图.我是根据博客园PIE官方博 ...
- Eigen3
Eigen用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用. Eigen: C++开源矩阵计算工具——Eigen的简单用法 http://blog.csdn.net/aug ...
- JS实时获取浏览器窗口尺寸 .
给div实时设置宽度 <div id="detail" style="width: 100%; overflow: scroll;"> </d ...
- java中的数组的Arrays工具类的使用
package day04.d1.shuzu; import java.util.Arrays; /** * Arrays 工具类 * @author Administrator * */public ...
- 第一个Hibernate程序
一 新建一个Java工程(Hibernate) 在src目录下创建一个名为"hibernate.cfg.xml"的文件并配置好各个属性,如下: <?xml version=& ...