023Pollard-ρ 因子分解算法

Pollard-ρ 因子分解算法

破解密码:Pollard-ρ 算法的巧妙构思

算法 :Pollard's Rho Algorithm(Pollard-ρ 因子分解)
来源 :TAOCP 第2卷 第4.5.4节
文件pollard_rho.c


5W1H

Who(谁提出)

John M. Pollard,1975年在论文 "A Monte Carlo method for factorization" 中提出。他同年还提出了 Pollard p-1 算法,是数论算法的重要贡献者。Floyd 判圈算法由 Robert W. Floyd 独立发现(约1967年)。

What(是什么)

Pollard-ρ 是一种概率性整数因子分解算法:

  1. 选迭代函数 f(x) = (x² + c) mod n
  2. 用 Floyd 判圈法(龟兔赛跑)检测序列中的周期
  3. gcd(|tortoise - hare|, n) 落在 (1, n) 时,找到非平凡因子

名称来自算法轨迹在模图中呈现的 ρ(rho)字形:一段尾巴连接一个环。

When(何时使用)

  • 分解中等大小的整数(10⁶ 到 10¹²)
  • 密码学分析(RSA 小因子攻击)
  • 需要比试除法更快但不需要 GNFS 级别复杂度时

时间复杂度:O(n^(1/4)) 期望步数,远优于试除法的 O(n^(1/2))。

Where(在哪里重要)

TAOCP 4.5.4节"因子分解方法"中详细分析了该算法,并将其与 Lehman 方法、二次筛法进行比较。在密码学历史上,Pollard-ρ 是第一个实用的亚线性因子分解算法,推动了 RSA 密钥长度标准的提升。

Why(为什么有效)

基于生日悖论:在一个 p 个元素的集合中随机取值,约 O(√p) 步后就会出现碰撞。由于 n 的最小质因子 p 满足 p ≤ √n,算法期望在 O(p^(1/2)) ≈ O(n^(1/4)) 步内找到 p。

How(如何实现)

Floyd 判圈(龟兔赛跑)

复制代码
tortoise = f(tortoise)          // 走1步
hare     = f(f(hare))          // 走2步
d = gcd(|tortoise - hare|, n)
若 1 < d < n:找到因子 d
若 d == n:退化,换 c 重试

mulmod 防溢出

c 复制代码
// 使用 __int128 避免 a*b 超出 long long 范围
static ll mulmod(ll a, ll b, ll m) {
    return (ll)((__int128)a * b % m);
}

需求定义

功能需求

  1. mulmod(a, b, m) --- 安全模乘,使用 __int128 防溢出
  2. gcd(a, b) --- 迭代欧几里得算法
  3. is_prime(n) --- 试除法判素数(n < 10⁶ 范围高效)
  4. pollard_rho(n, c) --- 返回 n 的一个非平凡因子,失败返回 n
  5. factorize(n, factors[], *nfactors) --- 完全质因子分解
  6. factorize_helper --- 递归分解(内部)

非功能需求

  • 所有计算使用 long long(64位),乘法使用 __int128
  • 不使用 math.h,不链接 -lm
  • 编译无警告:gcc -std=c99 -Wall
  • 处理范围:n < 10⁹(测试范围),理论上支持到约 10¹⁵

约束

  • pollard_rho 最多迭代 1,000,000 步(防止死循环)
  • factorize_helper 尝试 c=1 到 c=19,若全部失败则退化处理
  • 因子列表最大 64 个(对于 n < 10¹⁵ 远够用)

验收标准

测试 输入 期望输出 说明
基础分解 15 3, 5 两个质因子
基础分解 35 5, 7 两个质因子
高次幂 1024 2×10 2^10
乘积验证 1234567 因子之积=1234567 完整性检验
质数判断 97 is_prime=true 第25个质数
合数判断 100 is_prime=false 4×25
mulmod 近10⁹的两数 正确模乘,无溢出 __int128验证

算法复杂度对比

方法 时间复杂度 适用范围
试除法 O(√n) n < 10⁸
Pollard-ρ O(n^(1/4)) n < 10¹⁵
二次筛 exp(O(√(ln n · ln ln n))) n < 10¹⁰⁰
GNFS exp(O((ln n)^(1/3))) 任意大整数

Pollard-ρ 是实用性与实现简单性的最佳平衡点。


历史意义

1994年,Peter Shor 提出量子因子分解算法(Shor算法),理论上能在多项式时间内分解任意整数,使 RSA 面临量子威胁。然而在量子计算机真正实用化之前,Pollard-ρ 仍是经典计算机上最重要的实用因子分解工具之一。


生成日期:2026-03-22
系列:The Art of Computer Programming 实现集

相关推荐
yuan1999728 分钟前
基于 MATLAB PSO 工具箱的函数寻优算法
开发语言·算法·matlab
YUANQIANG202432 分钟前
博弈论中势函数与势博弈构造:为什么看似 “先射箭后画靶”
算法·信息与通信
WBluuue41 分钟前
Codeforces 1096 Div3(ABCDEFGH)
c++·算法
wanzehongsheng1 小时前
基于天文算法的双轴太阳能追踪系统:从原理到工程实现
算法
basketball6161 小时前
Kadane算法 C++实现
java·c++·算法
handler011 小时前
【C++】二叉搜索树详解及其模拟实现(代码)
开发语言·c++·算法·c··二叉搜索树·搜索树
luj_17681 小时前
残熵算法的稳健防灾逻辑
c语言·开发语言·c++·经验分享·算法
玖釉-1 小时前
二叉树基础详解:TreeNode、buildTree、deleteTree 与 printTree 的实现原理(C++)
c++·windows·算法
Severus_black1 小时前
【初阶数据结构与算法】八大排序之非比较排序(计数排序),一次性讲清!
数据结构·算法·排序算法
罗西的思考1 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (4)--- 系统架构
人工智能·算法·机器学习