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位的非负整数的积 ...
随机推荐
- 机器学习中的范数规则化之 L0、L1与L2范数
http://blog.csdn.net/zouxy09/article/details/24971995/ L1正则化及其推导 Laplace(拉普拉斯)先验与L1正则化 今天我们聊聊机器学习中出现 ...
- ieda常用快捷键
Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...
- Java之JDBC学习
(一),MySql数据库 1,MySql数据库的数据类型定义 2,完整性约束: 3,索引: 作用:唯一作用就是加快对表查询速度,索引通过快速路径方法访问来快速定位数据,从而减少磁盘的II/O; 缺点: ...
- [Apollo Server] Get started with Apollo Server
Get started with apollo server with node.js: Install: npm install --save apollo-server graphql index ...
- IDEA如何打包可运行jar的一个问题
转载:http://bglmmz.iteye.com/blog/2058785 背景: 有时候,我们会用IDEA来开发一些小工具,需要打成可运行的JAR包:或者某些项目不是WEB应用,纯粹是后台应用, ...
- JNI 函数注册与管理
class<--> 一一对应so-->method 每个so对应于一个类对象 类中的每个native方法对应 于so中的一个native的function,对应关系涉及 {c ...
- call、aply、bind的常用方法总结
类函数变为数组 function aaa (){ Array.prototype.slice(arguments); } 进一步操作它的每个元素 function bbb() { Array.prot ...
- mongoDB 删除某一字段、重新名字段
批量删除字段: {multi:true}:查询到的所有记录都删除. db.collection_name.update({"target_field":{"$exists ...
- 倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零
点击参数-参数一览,然后修改015为0(设置为绝对编码器方式),点击设定值变更,然后传送,EEP,将参数写入驱动器(保持USB线连接,重启驱动器并确认参数确是改成0了) 监视器-清除多圈数,清除之 ...
- Location配置与ReWrite语法
1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {… } 首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是 ...