POJ 1811 大整数素数判断 Miller_Rabin
#include <cstdio>
#include <cstring>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std; #define ll long long
const int S = ;
ll ans; ll gcd(ll a,ll b){
if(a < ) return gcd(-a , b);
if (b==) return a;
return gcd(b , a%b);
} ll multi_mod(ll a , ll b , ll k) //a*b%k
{
a %= k;
b %= k;
ll ret = ;
//这里因为是长整数,for(i=0->b)循环一个个加太耗时,需要采用这种logn复杂度的方法
while(b){
if(b & ){
ret += a;
ret %= k;
}
a <<= ;
a %= k;
b >>= ;
}
return ret;
} ll pow_mod(ll a, ll b, ll mod) //求(a^b)%mod
{
if(b == ) return a%mod;
int bit[] , t = ;
while(b){
bit[t++] = b&;
b>>=;
}
//类似矩阵快速幂
ll ret = ;
for(int i = t- ; i>= ; i--){
ret = multi_mod(ret , ret , mod);
if(bit[i]) ret = multi_mod(ret , a , mod);
}
return ret;
}
//n = x*2^t , 这里以a为底 , 检验n是否为合数
bool check(ll a , ll n , ll x , ll t)
{
ll ret = pow_mod(a , x , n);
ll last = ret; //last记录上一次的数据,保证最后结果模1时,检查到last不为n-1或1,就表示为合数
for(int i = ; i<=t ; i++){
ret = multi_mod(ret,ret,n);
if(ret == && last!= && last!=n-) return true;
last = ret;
}
//始终无法找到余数为1的结果,则表示n为合数
if(ret!=) return true;
return false;
}
//n为合数返回true
bool miller_rabin(ll n)
{
ll x = n- , t = ;
while((x&) == ){
x>>=;
t++;
}
bool flag = true; //保证最后得到的 x^2 mod p = 1 只有x=1或x=p-1两个解,才满足二次探测,否则有其他解就直接证明不是素数
if(t >= && (x&)){
//miller_robin是一种取随机测试数据的算法,这里S=20,给定20组测试数据,当然数据组数越多,正确率越大
for(int i = ; i<S ; i++){
ll a = rand()%(n-)+;
//二次探测在check中检测
if(check(a,n,x,t)){
flag = true;
break;
}
flag = false;
}
}
if(!flag || n==)
return false;
else return true;
} //长整数利用随机数找到其中一个因子
ll Pollard_rho(ll x,ll c){
ll i=,x0=rand()%x,y=x0,k=;
while (){
i++;
x0=(multi_mod(x0,x0,x)+c)%x;
ll d=gcd(y-x0,x);
if (d!=&& d!=x){
return d;
}
if (y==x0) return x;
if (i==k){
y=x0;
k+=k;
}
}
} //不断利用Pollard_rho递归来查找到n的所有素数因子
void find_factor(ll n)
{
if(!miller_rabin(n)){
ans = min(ans , n);
return;
}
ll p = n;
while(p >= n)
p = Pollard_rho(p , rand() % (n-) + );
find_factor(p);
find_factor(n / p);
} int main()
{
srand(time(NULL));
int T;
scanf("%d" , &T);
while(T--){
ll n;
scanf("%lld" , &n);
bool flag = miller_rabin(n);
if(!flag) printf("Prime\n");
else{
ans = n;
find_factor(n); printf("%lld\n" , ans);
}
}
return ;
}
POJ 1811 大整数素数判断 Miller_Rabin的更多相关文章
- POJ 1811 大素数判断
数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #inc ...
- POJ 1503 大整数
之前做的大整数,都是一位一位操作. 优化方案:压缩方案. 模板: + - * 操作符重载 #include<cstdio> #include<iostream> #inclu ...
- POJ 1811 Prime Test
题意:对于一个大整数,判断是否质数,如果不是质数输出最小质因子. 解法:判断质数使用Miller-Rabin测试,分解质因子使用Pollard-Rho,Miller-Rabin测试用的红书模板,将测试 ...
- 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429
素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...
- POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...
- 【转】大素数判断和素因子分解【miller-rabin和Pollard_rho算法】
集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646 ...
- POJ 1811 Prime Test( Pollard-rho整数分解经典题 )
链接:传送门 题意:输入 n ,判断 n 是否为素数,如果是合数输出 n 的最素因子 思路:Pollard-rho经典题 /************************************** ...
- POJ 1001 解题报告 高精度大整数乘法模版
题目是POJ1001 Exponentiation 虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...
- POJ C++程序设计 编程题#1 大整数的加减乘除
编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...
随机推荐
- javascript实现页面跳转
这里指的页面跳转是将浏览器标签页转到新的网址. 只需要使用 window.location.href="url" 就行了 示例 <!DOCTYPE html> < ...
- tfs
安装Team Foundation Server 2012过程截图 专题图 1,下载Team Foundation Server 2012 官方下载: http://www.microsoft.co ...
- 虚拟机安装cenos7后ifcfg看网卡无inet地址掩码等信息
在虚拟机安装centos7,进入系统使用ifconfig命令时,只有lo网卡( 127.0.0.1的ip地址)和eno16777736网卡,而且此网卡没有inet地址.掩码等信息. 这时候查看/etc ...
- spring 嵌套事务问题
嵌套事物总结 事物成功总结 1.内外都无try Catch的时候,外部异常,全部回滚. 2.内外都无try Catch的时候,内部异常,全部回滚. 3.外部有try Catch时候,内部异常,全部回滚 ...
- 用SpringMVC实现的上传下载
1.导入相关jar包 commons-fileupload.jar commons-io.jar 2.配置web.xml文件 <?xml version="1.0" enco ...
- 列表框、分组列表框、标签(label)、分组框(fieldset)、框架(frameset)
列表框(select) 下拉列表,用户可以从一些可选项中选择. 示例:简单的下拉列表 <select name="country"> <option value= ...
- C# 相关概念
解决方案 在磁盘上由 .sln 文件表示,是一个或多个相关项目的容器. 例如,如果为 Python 应用程序编写 C++ 扩展,该 C++ 项目可以驻留在同一解决方案中. 解决方案还可以包含 Web ...
- linux创建ftp用户以及指定目录问题
linux创建ftp用户以及指定目录问题 创建用户命令:如我的目录是根目录下的 MyWeb 用户名:xdh2571 #useradd -G ftp -d /MyWeb -M xdh2571#passw ...
- EF CodeFirst 不得不说的Where与OrderBy
先来聊上5毛钱的“排序” Code: using (ApplicationDbContext Db=new ApplicationDbContext()) { var res = Db.Threes. ...
- navicat创建存储过程报错
搞了半天这个恶心的报错,最后发现竟然是存储过程的一个varchar类型的参数没给长度,如varchar(64)长度必须指定不然就会报错: mark一记