数论——Pollard-Rho 学习笔记
数论——Pollard-Rho 学习笔记
非平凡因数:\(n\) 除了 \(1\) 和 \(n\) 以外的因数。
Pollard-Rho 算法是一种用于快速分解非平凡因数的算法。
Pollard-Rho 能在期望复杂度 \(\mathcal O(n^{1/4})\) 的时间内找到 \(n\) 的最小的非平凡因数。
而根据 Pollard-Rho,我们可以用来加速质因数分解。
递归计算 \(n'=n/p\),直到 \(n\) 为素数为止。
Pollard-Rho 的策略为:从 \([2,n)\) 中随机选取 \(k\) 个数 \(x_1,x_2,x_3,\dots,x_k\),求任意两个数 \(x_i,x_j\) 的差和 \(n\)
的最大公约数,如果 \(1<d<n\),则 \(d\) 为 \(n\) 的一个因子,直接返回 \(d\) 即可。
此时我们使用一个特殊的(并不随机的)随机函数来生成随机数:\(f(x)=(x^2+c)\bmod n\)。
这个函数生成的数是以一个环循环的,形如:
为什么用这个函数?根据生日悖论,生成的序列中不同值的数量约为 \(\mathcal O(\sqrt{n})\) 个。
设 \(m\) 为 \(n\) 的最小非平凡因子,显然有 \(m \le \sqrt n\)。
我们期望枚举 \(\mathcal O(\sqrt{m})\) 个 \(i\) 来分解出 \(n\) 的一个非平凡因子 \(\gcd(|x_i-x_j|,n)\)。
因此,Pollard-rho 算法能够在 \(\mathcal O(\sqrt{m})\) 的期望时间复杂度内分解出 \(n\) 的一个非平凡因子。
而 \(\mathcal O(\sqrt{m})\leq O(n^{1/4})\) ,那么 Pollard-rho 算法的期望时间复杂度为 \(\mathcal O(n^{1/4})\)。
代码:
mt19937 rd(time(0) * clock() + 19260817); inline ll Abs(ll x) { return x < 0 ? -x : x; } #define gcd(a, b) __gcd(a, b) ll Pollard_Rho(ll x) { ll s = 0, t = 0, val = 1, d; ll c = (ll)rd() % (x - 1) + 1; for (int goal = 1; ; goal *= 2, s = t, val = 1) { for (ll step = 1; step <= goal; ++step) { t = ((__int128)t * t + c) % x; val = (__int128)val * Abs(s - t) % x; if (!val) return x; if (step % 127 == 0) if ((d = gcd(val, x)) > 1) return d; } if ((d = gcd(val, x)) > 1) return d; } return -1; }
温馨提示:模板题 P4718 【模板】Pollard-Rho 并不是裸的模板。
但是也就是相当于再加上一道橙题难度的搜索就可以解决的。
Reference: https://oi-wiki.org/math/number-theory/pollard-rho/#pollard-rho-算法
本文来自博客园,作者:RainPPR,转载请注明原文链接:https://www.cnblogs.com/RainPPR/p/17985787/pollard-rho
如有侵权请联系我(或 2125773894@qq.com)删除。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战