有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab。

  显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试。

  Pollard Rho是一个非常玄学的方式,用于在O(n^1/4)的期望时间复杂度内计算合数n的某个非平凡因子。事实上算法导论给出的是O(√p),p是n的某个最小因子,满足p与n/p互质。但是这些都是期望,未必符合实际。但事实上Pollard Rho算法在实际环境中运行的相当不错。

  Pollard Rho利用伪随机数生成公式来提供待测因子,其公式为xi=xi-1^2+c(mod n),其中c是开始时确认的随机常数。我们只要给出x1,利用这个公式可以生成一系列数值。由于每个数完全依赖于前一个数,因此数值的分布中必定含环,我们设t为环的路口,u为环的周长,那么有xt+i=xt+u+i。而整个数值分布就像一个ρ符号,因此该算法的后缀用Rho来表示。我们将该公式得出的序列视作随机序列。

  生日悖论中指出一个√d个学生的班级中,期望至少有一对人在同一天生日,其中d是一年中的日期,即365。同样一个√d个人的班级中,至少有一对人在同一天生日的概率大于50%。我们将n视作一年中的天数,而1~n-1中的每个值都对应一年中的日期,将x1,x2,...视作学生,那么序列中期望有两个有两个人相同,只需要序列的长度达到√n即可。因此我们可以认为ρ符号的尾部与环的周长的期望均为√n。

  假设n=ab,其中a与b均不是n的平凡因子,我们假设a<=b,可知a<=√n。我们记yi=xi(mod a)。可知:

$$ y_i=x_i\left(mod\ a\right)=\left(x_{i-1}^2+c\right)\left(mod\ n\right)\left(mod\ a\right)=\left(x_{i-1}^2+c\right)\left(mod\ a\right) $$ $$ =\left(\left(x_{i-1}\left(mod\ a\right)\right)^2+c\right)\left(mod\ a\right)\Rightarrow\left(y_{i-1}^2+c\right)\left(mod\ a\right)=y_i\left(mod\ a\right) $$

  我们依据a为模数建立了新的一个ρ型轨迹,且a的ρ型轨迹的环必然仅出现n的ρ型轨迹的环上的数值(模a的结果)。由同样的分析可得a的ρ型轨迹的环的尾部和环的长度的期望均为n^(1/4)。对于a的ρ型轨迹的环上的任意一点k,假设其对应的是两个不同的值xi与xj,即xi<>xj(mod n)但xi=xj(mod a)。此时可以知(xi-xj)=rp(mod n),而gcd(xi-xj, n)的结果必然是n的一个非平凡因子(且能被a整除)。我们可以利用一个特定的变量p先后在迭代到x1,x2,x4,x8,...时记录这些值,之后每次都校验gcd(xi-p, n)是否既非1又非n,如果满足则找到n的非平凡因子,否则继续迭代。之前说过a的ρ型轨迹的环的尾部和环的长度的期望均为n^(1/4),因此当我们p记录xh时,其中xh落在a的ρ型轨迹的环上且h大于等于环的周长时,此时我们会沿着a的ρ型轨迹的环进行周而复始的循环迭代,最终在修改p之前xi回到了xh的位置,此时借助gcd(xi-p, n)我们就找到了一个n的非平凡因子。h的期望应该为O(n^(1/4)),因此时间复杂度的期望应该为O(n^(1/4))。

  下面给出代码:

pollard_rho(x)
c = random()
xi = random()
i =
h =
xh = xi
while(true)
xi = (xi * xi + c) % n
f = gcd(x, abs(xi - xh))
if(f != && f != n)
return f
i = i +
if( i == h * )
h = i
xh = xi

Pollard Rho因子分解算法的更多相关文章

  1. 数学--数论--随机算法--Pollard Rho 大数分解算法 (带输出版本)

    RhoPollard Rho是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:MillerRabinMillerRabin素数测试. 操作流程 首先,我们先用MillerRabinMille ...

  2. 数学--数论--随机算法--Pollard Rho 大数分解算法(纯模板带输出)

    ACM常用模板合集 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll pr; ll pmod(l ...

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

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

  4. Pollard Rho算法浅谈

    Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...

  5. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  6. 初学Pollard Rho算法

    前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...

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

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

  8. BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho

    BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一 ...

  9. 浅谈 Miller-Robbin 与 Pollard Rho

    前言 $Miller-Robbin$ 与 $Pollard Rho$ 虽然都是随机算法,不过用起来是真的爽. $Miller Rabin$ 算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法, ...

随机推荐

  1. 安卓开发分享功能,分享到facebook网页上不显示图片的问题

    最近公司要上分享功能,分享的地方包括微信,qq,facebook,功能完成后,发现分享到facebook的内容只有文字可以显示,图片不显示,其中图片存储是使用七牛的服务器:而分享到微信和qq都可以正常 ...

  2. 配置java环境变量,实现一条命令自由切java7 或java8

    在多个java编译环境中,有时需要java 7,有时又需要java 8,怎么配置java 环境,可以快速自动切换呢?下面用mac演示在 /etc/bashrc 中配置的环境变量 # 设置 JDK ex ...

  3. Java SE 8 流库(一)

    1. 流的作用 通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决: 实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计 ...

  4. LTE-Advanced(4G)主要技术学习:CA、CoMp、HetNet

    CA:Carrier Aggregation,载波聚合 从LTE到LTE-Advanced演进过程中,更宽频谱的需求是影响演进的最重要因素,为此3GPP标准提出了载波聚合技术.简单地说,它可以将多个载 ...

  5. 转 How do GraphQL remote schemas work

    文章转自 prisma 官方博客,写的很不错 In this article, we want to understand how we can use any existing GraphQL AP ...

  6. C# List的深复制

    1.关于深拷贝和浅拷贝 C#支持两种类型:值类型和引用类型 值类型(Value Type):如 char, int, float,枚举类型和结构类型 引用类型(Reference Type):如Cla ...

  7. 【monkeyrunner】monkeyrunner 实例

    import time import os import re from com.android.monkeyrunner import MonkeyRunner as mr from com.and ...

  8. sublime text 2 卸载与重装

    很多同学使用 sublime text2 的时候,出现一些奇怪的bug,且重启无法修复. 于是,就会想到卸载 sublime text2 再重新安装. 然而,你会发现,重新安装后,这个bug任然存在, ...

  9. 关于 ImageLoader 说的够细了。。。

    简介ImageLoader(一) 分类: android 开源及第三方项目2014-05-30 12:14 14126人阅读 评论(0) 收藏 举报 ImageLoader 使用该开源项目的之前,先给 ...

  10. Spark在Windows下的环境搭建

    本文转载自:http://blog.csdn.net/u011513853/article/details/52865076 由于Spark是用Scala来写的,所以Spark对Scala肯定是原生态 ...