首页 > 其他分享 >数论——Pollard-Rho 学习笔记

数论——Pollard-Rho 学习笔记

时间:2024-01-24 20:35:22浏览次数:18  
标签:数论 ll sqrt Pollard Rho mathcal 平凡

数论——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-算法

标签:数论,ll,sqrt,Pollard,Rho,mathcal,平凡
From: https://www.cnblogs.com/RainPPR/p/17985787/pollard-rho

相关文章

  • 数论——Fermat素性检验、Miller-Rabin素性检验
    数论——Fermat素性检验、Miller-Rabin素性检验试除法与素性测试试除法:所有的试除法,无论是\(\mathcalO(n)\)的还是\(\mathcalO(\sqrtn)\)的,其本质都相同:即找\(n\)可能存在的因子\(k\),判断\(k\midn\)。素性测试:旨在不用分解因数的方式,判断一个数是否为质数;素性......
  • 大数因数分解Pollard_rho
    大数因数分解Pollard_rho#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<map>usingnamespacestd;constinttimes=50;intnumber=0;map<long......
  • 海亮01/19数论专题
    海亮01/19数论专题个人题单T1P2522题意对于给出的\(n\)个询问,每次求有多少个数对\((x,y)\),满足\(a\lex\leb\),\(c\ley\led\),且\(\gcd(x,y)=k\),\(\gcd(x,y)\)函数为\(x\)和\(y\)的最大公约数。题解先差分下,问题改成计算\(\sum_{i=1}^n\sum_{j=1}^m[\gcd......
  • 数论
    狄利克雷卷积一种函数间的运算。假设有函数\(f\)和\(g\),\(f*g=h,h(n)=\sum\limits_{d|n}f(d)\timesg(\frac{n}{d})\)。如果其中一个是常函数\(1\),则称其为狄利克雷前缀和(后缀和就是枚举倍数)。可以用高维前/后缀和\(O(n\log\logn)\)处理。板子(前、后缀):for(inti=1;i<=p......
  • 【学习笔记】数论杂谈
    一.素数相关0.约定若无特殊说明,本部分做以下记号规定。\(p\in\mathbb{P}\),\(\mathbbP\)为质数集。\(\pi(n)\)表示\(1\)至\(n\)内的素数个数。\(P^{+}(n),P^-(n)\)分别表示\(n\)的最大/最小质因子。\(\nu_i\)表示\(i\)的可重质因子个数。1.素数定理\[\pi(......
  • 【学习笔记】数论函数与莫比乌斯反演
    一.数论函数基础数论函数:满足值域为整数的函数。本文下述的数若无特殊说明均为整数。若无特殊说明则钦定\(\displaystylen=\prod_{i=1}^kp_i^{e_i},p_i\in\mathbb{P}\)。\(\mathbb{P}\)表示质数集合,\(p_i\)互不相同。介绍几个常见的数论函数:\(I(n)\):恒等函数,无论\(n\)......
  • 【数学/数论】欧拉函数 - Phi
    引言自Mr.果讲了CF1900D之后,决定复习n月之前学习的知识:欧拉函数。\[\Large{{一、\underline{定义}}}\]\[\scriptsize\mathsf{一切的开始}\]欧拉函数,即\(\varphi(x)\)。\[\varphi(x)=\sum_{i=1}^{x}[\gcd(x,i)=1]\]它表示小于等于\(x\)的数中,与\(x\)......
  • 数论好题 CF900D
    前置推导令\(b_1=\frac{a_1}{x},b_2=\frac{a_2}{x},\dots,b_n=\frac{a_n}{x}\)。很显然\(b_i\)为整数,且\(b\)数组的全部元素互质,即\(gcd(b_1,b_2,b_3,\dots,b_n)=1\)。因为\[\sum_{i=1}^{n}a_i=y\]所以\[x\times\sum_{i=1}^{n}b_i=y\]\[\sum_{i=......
  • 数论好题 CF900D
    前置推导令\(b_1=\frac{a_1}{x},b_2=\frac{a_2}{x},\dots,b_n=\frac{a_n}{x}\)。很显然\(b_i\)为整数,且\(b\)数组的全部元素互质,即\(gcd(b_1,b_2,b_3,\dots,b_n)=1\)。因为\[\sum_{i=1}^{n}a_i=y\]所以\[x\times\sum_{i=1}^{n}b_i=y\]\[\sum_{i=......
  • 洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛 #7 &「RHOI」Round 2 赛后总结
    洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛#7&「RHOI」Round2赛后总结比赛链接:https://www.luogu.com.cn/contest/146495建议先看原题再看文章。A-Water(P10056)有\(n\)个杯子,每个杯子的容积是\(a\),且初始装有\(b\)体积水。你可以进行任意次操作,每次操作选择任......