随机拆分,简直机智。

关于过程可以看http://wenku.baidu.com/link?url=JPlP8watmyGVDdjgiLpcytC0lazh4Leg3s53WIx1_Pp_Y6DJTC8QkZZqmiDIxvgFePUzFJ1KF1G5xVVAoUZpxdw9GN-S46eVeiJ6Q-zXdei

看完后,觉得随机生成数然后和n计算gcd,可以将随机的次数根号一下。思想很叼。

对于里面说的birthday trick,在执行次数上我怎么看都只能减一半。只是把平均分布,变成了靠近0的的分布。

不过怎么说,这个好像是大家都公认比较靠谱的。 所以,我就勉强相信了。

  1. /*****************************
  2. 大整数拆分模板(long long范围内)
  3. 调用Divide(n,222);
  4. 返回的结果在divsor中,因子最小值为dmi
  5. 注意:复杂度为n^(1/4),多次调用初始化dcnt,dmi
  6. *****************************/
  7.  
  8. #define INF 1e18
  9.  
  10. long long divsor[];
  11. int dcnt=;
  12. long long dmi=INF;
  13.  
  14. //输入一个long long 范围内的素数,是素数返回true,否则返回false。定义检测次数TIMES,错误率为(1/4)^TIMES
  15. #define TIMES 10
  16.  
  17. long long GetRandom(long long n)
  18. {
  19. //cout<<RAND_MAX<<endl;
  20. long long num = (((unsigned long long)rand() + )*rand())%n;
  21. return num+;
  22. }
  23.  
  24. long long Mod_Mul(long long a,long long b,long long mod)
  25. {
  26. long long msum=;
  27. while(b)
  28. {
  29. if(b&) msum = (msum+a)%mod;
  30. b>>=;
  31. a = (a+a)%mod;
  32. }
  33. return msum;
  34. }
  35.  
  36. long long Quk_Mul(long long a,long long b,long long mod)
  37. {
  38. long long qsum=;
  39. while(b)
  40. {
  41. if(b&) qsum=Mod_Mul(qsum,a,mod);
  42. b>>=;
  43. a=Mod_Mul(a,a,mod);
  44. }
  45. return qsum;
  46. }
  47.  
  48. bool Miller_Rabin(long long n)
  49. {
  50. if(n==||n==||n==||n==||n==) return true;
  51. if(n==||n%==||n%==||n%==||n%==||n%==) return false;
  52. int div2=;
  53. long long tn=n-;
  54. while( !(tn%) )
  55. {
  56. div2++;
  57. tn/=;
  58. }
  59. for(int tt=;tt<TIMES;tt++)
  60. {
  61. long long x=GetRandom(n-); //随机得到[1,n-1]
  62. if(x==) continue;
  63. x=Quk_Mul(x,tn,n);
  64. long long pre=x;
  65. for(int j=;j<div2;j++)
  66. {
  67. x = Mod_Mul(x, x, n);
  68. if(x==&&pre!=&&pre!=n-) return false;
  69. pre=x;
  70. }
  71. if(x!=) return false;
  72. }
  73. return true;
  74. }
  75.  
  76. long long gcd(long long a,long long b)
  77. {
  78. if(b==) return a;
  79. return gcd(b,a%b);
  80. }
  81.  
  82. long long pollard_rho(long long dn,long long dc)
  83. {
  84. long long x,y,d,i=,k=;
  85. x = GetRandom(dn-);
  86. y = x;
  87. while()
  88. {
  89. i++;
  90. x = (Mod_Mul(x, x, dn) + dc)%dn;
  91. d = gcd( y-x , dn );
  92. if( < d && d < dn )
  93. return d;
  94. if( y==x ) return dn;
  95. if( i==k )
  96. {
  97. y=x;
  98. k <<= ;
  99. }
  100. }
  101. }
  102.  
  103. void Divide(long long dn,int dk)
  104. {
  105. if(dn==) return ;
  106. if( Miller_Rabin(dn) == true )
  107. {
  108. divsor[dcnt++]=dn;
  109. dmi = min(dmi,dn);
  110. return ;
  111. }
  112. long long dtmp=dn;
  113. while(dtmp>=dn) dtmp = pollard_rho(dtmp,dk--);//随机寻找dn的因子,dtmp
  114. Divide(dtmp, dk);
  115. Divide(dn/dtmp,dk);
  116. }
  117.  
  118. /*
  119. int main() {
  120. int T;
  121. cin>>T;
  122. while(T--)
  123. {
  124. long long n;
  125. cin>>n;
  126. if( Miller_Rabin(n) ) printf("Prime\n");
  127. else
  128. {
  129. dmi=INF;
  130. dcnt=0;
  131. Divide(n,222);
  132. cout<<dmi<<endl;
  133. }
  134. }
  135. return 0;
  136. }
  137. */

Pollard-Rho大整数拆分模板的更多相关文章

  1. POJ 1811 Prime Test (Pollard rho 大整数分解)

    题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...

  2. Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

    \(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...

  3. 整数(质因子)分解(Pollard rho大整数分解)

    整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...

  4. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  5. Pollard Rho大质数分解学习笔记

    目录 问题 流程 代码 生日悖论 end 问题 给定n,要求对n质因数分解 普通的试除法已经不能应用于大整数了,我们需要更快的算法 流程 大概就是找出\(n=c*d\) 如果\(c\)是素数,结束,不 ...

  6. C++ BigInteger 大整数类模板(转)

    #include <deque> #include <vector> #include <iostream> #include <string> #in ...

  7. C++大整数类模板

    参考 :http://172.21.85.56/oj/resource/reportdetail?report_id=1678 支持 =.abs().pow().+=.-= *=./=.%=.+.-. ...

  8. poj2389-Bull Math(大整数乘法)

    一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425  5 5 5  5 5 ...

  9. OpenJudge 2980 大整数乘法

    链接地址:http://bailian.openjudge.cn/practice/2980/ 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积 ...

随机推荐

  1. 机器学习中的范数规则化之 L0、L1与L2范数

    http://blog.csdn.net/zouxy09/article/details/24971995/ L1正则化及其推导 Laplace(拉普拉斯)先验与L1正则化 今天我们聊聊机器学习中出现 ...

  2. ieda常用快捷键

    Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...

  3. Java之JDBC学习

    (一),MySql数据库 1,MySql数据库的数据类型定义 2,完整性约束: 3,索引: 作用:唯一作用就是加快对表查询速度,索引通过快速路径方法访问来快速定位数据,从而减少磁盘的II/O; 缺点: ...

  4. [Apollo Server] Get started with Apollo Server

    Get started with apollo server with node.js: Install: npm install --save apollo-server graphql index ...

  5. IDEA如何打包可运行jar的一个问题

    转载:http://bglmmz.iteye.com/blog/2058785 背景: 有时候,我们会用IDEA来开发一些小工具,需要打成可运行的JAR包:或者某些项目不是WEB应用,纯粹是后台应用, ...

  6. JNI 函数注册与管理

    class<--> 一一对应so-->method     每个so对应于一个类对象 类中的每个native方法对应 于so中的一个native的function,对应关系涉及 {c ...

  7. call、aply、bind的常用方法总结

    类函数变为数组 function aaa (){ Array.prototype.slice(arguments); } 进一步操作它的每个元素 function bbb() { Array.prot ...

  8. mongoDB 删除某一字段、重新名字段

    批量删除字段: {multi:true}:查询到的所有记录都删除. db.collection_name.update({"target_field":{"$exists ...

  9. 倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零

    点击参数-参数一览,然后修改015为0(设置为绝对编码器方式),点击设定值变更,然后传送,EEP,将参数写入驱动器(保持USB线连接,重启驱动器并确认参数确是改成0了)   监视器-清除多圈数,清除之 ...

  10. Location配置与ReWrite语法

    1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {… } 首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是 ...