有一类问题,要求我们将一个正整数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. BZOJ1718: [Usaco2006 Jan] Redundant Paths 分离的路径【边双模板】【傻逼题】

    LINK 经典傻逼套路 就是把所有边双缩点之后叶子节点的个数 //Author: dream_maker #include<bits/stdc++.h> using namespace s ...

  2. BZOJ3270: 博物馆【概率DP】【高斯消元】

    Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n间房间,并且满足可以从任何一 ...

  3. [CF125E]MST Company

    codeforces description 给出一张\(n\)点\(m\)条边的无向图,求一棵满足\(1\)号点度数恰好为\(k\)的最小生成树,并输出方案. \(1\le k\le n\le500 ...

  4. prisma middleware 简化 graphql resolver 编写的类库

      prisma 推出middleware 的目的就是保持resolver 的简洁 作用: 输入参数访问同一个resolver 决定resolver 最终的返回值 在resolver 连中捕获异常以及 ...

  5. 在 Windows 下安装 Oracle 11g XE (Express Edition)

    Oracle 11g XE 是 Oracle 数据库的免费版本,支持标准版的大部分功能,11g XE 提供 Windows 和 Linux 版本. 做为免费的 Oracle 数据库版本,XE 的限制是 ...

  6. SublimeText设置在浏览器打开 快捷键

    这里插入一下安装"view in browser"官方版的说明:(前提是得先安装package control插件) 1.通过"ctrl+shift+p"打开命 ...

  7. Linux之 linux7防火墙基本使用及详解

    1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld  停止: systemctl disab ...

  8. 归并排序算法-python实现

    #-*- coding: UTF-8 -*- import numpy as np def Merge(a, f, m, l): i = f j = m + 1 tmp = [] while i &l ...

  9. 【python】函数名存在变量中

    变量函数:意思就是将函数名存在变量中,然后根据变量值动态的调用需要的函数. LOGIN = 'xxxx' PASSWD = "xxx" URL = 'xxxxx' def hand ...

  10. vim自定义配置之常规设置

    vimConfig/plugin/general-operation.vim "快速关闭 map <S-Q> :q<CR>:q<CR>:q<CR&g ...