Pollard-Rho大整数拆分模板
随机拆分,简直机智。
关于过程可以看http://wenku.baidu.com/link?url=JPlP8watmyGVDdjgiLpcytC0lazh4Leg3s53WIx1_Pp_Y6DJTC8QkZZqmiDIxvgFePUzFJ1KF1G5xVVAoUZpxdw9GN-S46eVeiJ6Q-zXdei
看完后,觉得随机生成数然后和n计算gcd,可以将随机的次数根号一下。思想很叼。
对于里面说的birthday trick,在执行次数上我怎么看都只能减一半。只是把平均分布,变成了靠近0的的分布。
不过怎么说,这个好像是大家都公认比较靠谱的。 所以,我就勉强相信了。
/*****************************
大整数拆分模板(long long范围内)
调用Divide(n,222);
返回的结果在divsor中,因子最小值为dmi
注意:复杂度为n^(1/4),多次调用初始化dcnt,dmi
*****************************/ #define INF 1e18 long long divsor[];
int dcnt=;
long long dmi=INF; //输入一个long long 范围内的素数,是素数返回true,否则返回false。定义检测次数TIMES,错误率为(1/4)^TIMES
#define TIMES 10 long long GetRandom(long long n)
{
//cout<<RAND_MAX<<endl;
long long num = (((unsigned long long)rand() + )*rand())%n;
return num+;
} long long Mod_Mul(long long a,long long b,long long mod)
{
long long msum=;
while(b)
{
if(b&) msum = (msum+a)%mod;
b>>=;
a = (a+a)%mod;
}
return msum;
} long long Quk_Mul(long long a,long long b,long long mod)
{
long long qsum=;
while(b)
{
if(b&) qsum=Mod_Mul(qsum,a,mod);
b>>=;
a=Mod_Mul(a,a,mod);
}
return qsum;
} bool Miller_Rabin(long long n)
{
if(n==||n==||n==||n==||n==) return true;
if(n==||n%==||n%==||n%==||n%==||n%==) return false;
int div2=;
long long tn=n-;
while( !(tn%) )
{
div2++;
tn/=;
}
for(int tt=;tt<TIMES;tt++)
{
long long x=GetRandom(n-); //随机得到[1,n-1]
if(x==) continue;
x=Quk_Mul(x,tn,n);
long long pre=x;
for(int j=;j<div2;j++)
{
x = Mod_Mul(x, x, n);
if(x==&&pre!=&&pre!=n-) return false;
pre=x;
}
if(x!=) return false;
}
return true;
} long long gcd(long long a,long long b)
{
if(b==) return a;
return gcd(b,a%b);
} long long pollard_rho(long long dn,long long dc)
{
long long x,y,d,i=,k=;
x = GetRandom(dn-);
y = x;
while()
{
i++;
x = (Mod_Mul(x, x, dn) + dc)%dn;
d = gcd( y-x , dn );
if( < d && d < dn )
return d;
if( y==x ) return dn;
if( i==k )
{
y=x;
k <<= ;
}
}
} void Divide(long long dn,int dk)
{
if(dn==) return ;
if( Miller_Rabin(dn) == true )
{
divsor[dcnt++]=dn;
dmi = min(dmi,dn);
return ;
}
long long dtmp=dn;
while(dtmp>=dn) dtmp = pollard_rho(dtmp,dk--);//随机寻找dn的因子,dtmp
Divide(dtmp, dk);
Divide(dn/dtmp,dk);
} /*
int main() {
int T;
cin>>T;
while(T--)
{
long long n;
cin>>n;
if( Miller_Rabin(n) ) printf("Prime\n");
else
{
dmi=INF;
dcnt=0;
Divide(n,222);
cout<<dmi<<endl;
}
}
return 0;
}
*/
Pollard-Rho大整数拆分模板的更多相关文章
- POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...
- Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...
- 整数(质因子)分解(Pollard rho大整数分解)
整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
- Pollard Rho大质数分解学习笔记
目录 问题 流程 代码 生日悖论 end 问题 给定n,要求对n质因数分解 普通的试除法已经不能应用于大整数了,我们需要更快的算法 流程 大概就是找出\(n=c*d\) 如果\(c\)是素数,结束,不 ...
- C++ BigInteger 大整数类模板(转)
#include <deque> #include <vector> #include <iostream> #include <string> #in ...
- C++大整数类模板
参考 :http://172.21.85.56/oj/resource/reportdetail?report_id=1678 支持 =.abs().pow().+=.-= *=./=.%=.+.-. ...
- poj2389-Bull Math(大整数乘法)
一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425 5 5 5 5 5 ...
- OpenJudge 2980 大整数乘法
链接地址:http://bailian.openjudge.cn/practice/2980/ 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积 ...
随机推荐
- 工具分享:GitHub的克隆工具Cl0neMast3r,轻松搞定各种测试
GitHub,相信大家并不陌生,咱搞技术的应该都会用到它,GitHub主要是进行代码工具的存储.下载等工作.今天介绍一款让我们操作GitHub相关工作变的更简单的工具, GitHub的克隆工具. Cl ...
- 查看Linux服务器CPU使用率、内存使用率、磁盘空间占用率、负载情况
[root@server script]# vi monitor.py #!/usr/bin/env python # -*- coding:utf-8 -*- #Author: nulige imp ...
- Java反射学习总结五(Annotation(注解)-基础篇)
Annotation(注解)简单介绍: 注解大家印象最深刻的可能就是JUnit做单元測试,和各种框架里的使用了. 本文主要简介一下注解的用法,下篇文章再深入的研究. annotation并不直接影响代 ...
- zabbix自定义触发器
zabbix中监控项仅负责收集数据,而通常收集数据的目的还包括在某指标对应的数据超出合理范围时给相关人员发送告警信息,"触发器"正式 用于为监控项所收集的数据定义阈值,每一个触发器 ...
- 使用HttpClient测试SpringMVC的接口
转载:http://blog.csdn.net/tmaskboy/article/details/52355591 最近在写SSM创建的Web项目,写到一个对外接口时需要做测试,接受json格式的数据 ...
- 排查 “Detected Tx Unit Hang”问题
实现功能: 使用自己已经分配的内存让skb->data指向,而不是使用alloc_malloc(). 部分代码如下: /* * build a new sk_buff */ //struct s ...
- Unity3D的三种坐标系
来自:http://blog.csdn.net/luxiaoyu_sdc/article/details/13168497 1, World Space(世界坐标): 我们在场景中添加物体(如:Cub ...
- TFS 设置(转)
一 参考以下两个链接进行相关软件的安装和用户权限配置: http://www.cnblogs.com/WilsonWu/archive/2011/11/24/2261674.html http://w ...
- axios 设置超时时间 timeout
this.$ajax.post('', {operate: type, ids: this.data.id.toString(), data_type: 'ips'}, {timeout: 60000 ...
- TCP/IP详解 卷一(第十二章 广播和多播)
广播和多播仅应用于UDP. 广播指的是一个主机向网上的所有其他主机发送帧,而 多播仅发送给属于多播组的多个主机. 为了弄清广播和多播,需要了解主机对由信道传送过来帧的过滤过程 1.首先,网卡查看由信道 ...