有一类问题,要求我们将一个正整数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. Python3 字符串(七)

    字符串是 Python 中最常用的数据类型.我们可以使用引号( ' 或 " )来创建字符串. 创建字符串很简单,只要为变量分配一个值即可. python中单引号和双引号使用完全相同. 使用三 ...

  2. IOS下使用多线程

    ios有三种主要方法:1.NSThread.2.NSOperation.3.GCD. 1.  NSThread: 调用方法如下:如果需要函数参数的话,可以通过Object传递. 1.1:[NSThre ...

  3. myeclipse单步调试

    如何进行myclipse的单步调式与跟踪?希望大虾们详细点,多谢. 打断点,然后运行,进debug试图,按F6执行一行,按F5是钻进去执行 追问 朋友,能详细点吗? 本人是初学 回答 如图 如若成功请 ...

  4. 5.2离线使用xadmin包

    把xadmin包放到项目目录下,便于修改xadmin中的代码. 首先解压下载好的 xadmin-django2.zip 压缩包,拷贝子文件夹中的xadmin文件夹,到项目中新建extra_apps文件 ...

  5. tensorflow中协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners

    TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行.在Session中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止 ...

  6. 将 UWP 中 CommandBar 的展开方向改为向下展开

    在 UWP 中使用 CommandBar 来迅速添加一组功能按钮是非常迅速的,是 UWP 中推荐的交互方案之一.也许你能见到 CommandBar 按你所需向下展开,不过可能更多数情况会看到 Comm ...

  7. asp.net 操作word 权限

    1.先安装office 2.在“DCOM配置”中,为IIS账号配置操作Word(其他Office对象也一样)的权限: 开始>运行>输入  dcomcnfg  >确定 具体操作:“组件 ...

  8. 《DSP using MATLAB》Problem 3.1

    先写DTFT子函数: function [X] = dtft(x, n, w) %% --------------------------------------------------------- ...

  9. Jenkins搭建windows service自动编译发布环境

    类库项目(Task)部署 前面搭建了Web站点的环境,类库项目发布不同于站点项目,它只需要将MSBuild编译出来的dll复制到目标服务器上即可,而不需要通过Web Deploy,下面来说一下如何发布 ...

  10. 利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

    [先上一张效果图]: 一.原理: 其实原理很简单: 1.手机投屏到电脑: 2.截取投屏画面的题目部分,进行识别,得到题目和三个答案: 3.将答案按照一定的算法,进行搜索,得出推荐答案: 4.添加了一些 ...