Pollard Rho 算法

news/2024/11/15 23:25:56/文章来源:https://www.cnblogs.com/zsk123qwq/p/18377009

Pollard Rho 算法

难评,看OI-WIKI吧。

引入

Pollard Rho 算法用于求快速找到一个正整数 \(n\) 的一个非平凡因数[1]

生日悖论

不考虑出生年份(假设每年都是365天),问:一个房间中至少多少人,才能使其中两个人生日相通的概率达到 \(50\%\)

解:假设一年有 \(n\) 天,房间中有 \(k\) 人,用 \(1\)\(k\) 给这些人编号。假定每个人的生日均与分布于 \(n\) 天之中,且两个人的生日相互独立。设 \(k\) 个人生日互不相同的时间为 \(A\),则 \(P(A)=\prod_{i=0}^{k-1}\frac{n-i}{n}\)。然后烂糟推一堆得出:

\[\exp(-\frac{k(k-1)}{2n})\le \frac{1}{2}\Rightarrow P(A)\le\frac{1}{2} \]

\(n=365\) 代入,解得 \(k \ge 23\)。所以一个房间中至少有 \(23\) 人,使其两人生日相同的概率达到 \(50\%\),但这个数学事实非常反直觉,故称之为一个悖论。当 \(k>56,n=365\) 时,出现两个人同一天生日的概率将大于 \(99\%\)

利用最大公约数求出一个约数

首先明确 \(n\) 和某个数的最大公约数一定是 \(n\) 的约数。我们可以通过 \(f(x)=(x^2+c)\bmod n\) 来生成一个序列 \({x_i}\):随机选取一个 \(x_i\),令 \(x_2=f(x_1),x_3=f(x_2),\dots,x_i=f(x_{i-1})\)。其中 \(c\) 是一个随机选取的常熟。

举个例子,设 \(n=50,c=6,x_1=1\)\(f(x)\) 生成的数据为 \(1,7,5,31,17,45,31,17,45,31,\dots\) 可以发现数据在 \(x_4\) 以后都在 \(31,17,45\) 循环。如果将这些数如下图一样排列起来,就发现他是一个这个玩意儿,长得像一个 \(\rho\),所以这个算法得名 rho。

Pollard-rho1.png (520×480) (oi-wiki.org)

选择 \(f(x)=(x^2+c)\bmod n\) 作为这个生成函数序列,是因为它有一个性质:\(\forall x \equiv y \pmod p,f(x)\equiv f(y)\pmod p\),其中 \(p \mid n\)

证明

\(x=y \pmod p\),则可以将它们表示为 \(x=k_1p+a,y=k_2p+a\),满足 \(k_1,k_2,a \in \mathbb{Z},a \in [0,p)\)

\(f(x)=(x^2+c)\bmod n\),因此 \(f(x)=x^2+c-kn\),其中 \(k\in\mathbb{Z}\)

\[\begin{align} f(x) & = x^2+c-kn\\ & = (k_1p+a)^2+c-kn\\ & = k_1^2p^2+2k_1pa+a^2+c-kn\\\ & \equiv a^2+c \end{align} \]

同理, \(f(y)\equiv a^2+c \pmod p\),因此 \(f(x) \equiv f(y) \pmod p\)

根据生日悖论,生成的序列中不同值的数量约为 \(\sqrt{n}\) 个。设 \(m\)\(n\) 的最小非平凡因子,显然有 \(m \le \sqrt{n}\)。将 \({x_i}\) 中每一项对 \(m\) 取模,我们得到了一个新序列 \({y_i}\),并且根据生日悖论可以得知新序列中不同值的个数约为 \(O(\sqrt m) \le O(n^{\frac{1}{4}})\)。因此,我们可以在期望 \(O(n^{\frac{1}{4}})\) 的时间内找到两个位置 \(i,j\),使得 \(x_i\ne x_j \&\& y_i=y_j\),这意味着 \(n \nmid |x_i-x_j| \&\& m\mid |x_i-x_j|\),我们可以通过 \(\gcd(n,|x_i-x_j|)\) 获得 \(n\) 的一个非平凡因子。

代码实现

#include <bits/stdc++.h>
#define int long longusing namespace std;
mt19937 wdz(time(0)); // 随机数
int N;
int gcd(int n, int m) {return m == 0 ? n : gcd(m, n % m);
}
int pollard(int n, int c) {int x, y, d, i = 1, k = 2;x = wdz() * wdz() % (n - 1) + 1; // 此处的 wdz() 是随机数y = x;while (1) {x = (x * x % n + c) % n;d = gcd((x - y + n) % n, n);if (1 < d && d < n) return d;if (x == y) return n;// x = y 说明构成了一个环,说明选定的 c 不好,那么重新来一遍if (++i == k) {k <<= 1;y = x;// 由于 y 不一定在环内,所以随时更新 y 的值,不然会死循}}return 23333333;
}
signed main() {scanf("%lld", &N);p = N;while (p >= N) {p = pollard(N, wdz() * wdz() % (n - 1) + 1);}// p 为 N 的一个因子printf("%lld\n", p);return 0;
}

脚注


  1. 平凡约数(平凡因数):对于整数 \(b \ne 0\)\(\pm1\)\(\pm b\)\(b\) 的平凡约数。当 \(b=\pm1\) 时,\(b\) 只有两个平凡约数。非平凡约数就是指 \(b\) 的所有约数中,除了 \(\pm1\)\(\pm b\) 的其他约数。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786248.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史上最牛的 权限系统,如何设计? 来了一个 Sa-Token学习圣经

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

POLIR-政治-真实社政: 理论与事实的统一与颠倒 : “改革”与“政治民主+经济市场” VS 特权集团为“既得利益”以“集权和垄断”的“假改革”忽悠人

改革有两个永恒的目标:经济的市场化 和 政治的民主化。 特权阶层和既得利益者, 为了“保住特权和既得利益”会拼力地“反对这两个目标“, 他们用“集权和垄断”的“假改革”来忽悠人们,实际上是开历史倒车。吴敬琏(经济学家)

软件工程进度报告——第八周

本周尝试练习了飞机购票问题样例1样例2

RK3588 HDMI IN调试

HDMI RX控制器配置:/* Should work with at least 128MB cma reserved above. */&hdmirx_ctrler {status = "okay";/* Effective level used to trigger HPD: 0-low, 1-high */hpd-trigger-level = <1>;hdmirx-det-gpios = <&gpio1 RK_PD5 GPIO_ACT…

阿里云服务器很久未用,服务访问异常

很久(大概一两个月)都没在使用自己的个人阿里云服务器,当自己再次访问时,竟然报错无法访问,这让自己很是意外!! 然后自己开始排查问题。 登录服务器查看docker服务,发现全部正常。 可是当自己打算重新启动时发现问题,竟然无法重启,这就很奇怪了,服务不都好好的嘛,怎么…

程序设计语言基础-有限自动机+正规式

不确定的有限自动机 NFA 该状态机在任何一个状态,基于输入的字符都不能做成一个确定的状态转换,这里分为两种状况。对于一个输入,它有两个状态可以转换。 存在ε的情况,即没有任何字符输入的情况下,NFA可以从一个状态迁移到另一个状态。确定的有限自动机 DFA 该状态机在任…

程序设计语言基础-编译过程概述+表达式

程序设计语言分类 面向机器的语言 由0、1组成的机器指令序列或汇编语言(如:move ax,bx),可读性差,难以修改和维护。 面向应用程序的语言 如,Java、C、C++、Python、Delphi、PASCAL等,更接近人类语言,提高程序设计效率。 程序设计语言分类生成目标代码过程编译程序 词法分…

微软RDL远程代码执行超高危漏洞(CVE-2024-38077)漏洞检测排查方式

漏洞名称:微软RDL远程代码执行超高危漏洞(CVE-2024-38077) CVSS core: 9.8漏洞描述: CVE-2024-38077 是微软近期披露的一个极其严重的远程代码执行漏洞。该漏洞存在于Windows远程桌面许可管理服务(RDL)中,攻击者无需任何权限即可实现远程代码执行,获取服务器最高权限…

人生的意义

人生的意义。(一) 人生的意义:美好的事物吸引(使)美好的人去爱。爱一个事物后,就在意这个事物,想和这个事物在一起,依恋这个事物(不想和这个事物分开),想充分感受和体验这个事物,追求和得到这个事物,关心和守护这个事物,让这个事物幸福,等等很多情感。 俗话说“…

明明存在InterSystems ODBC,但IIS站点的程序连接数据库时却提示ERROR [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

这是因为InterSystems ODBC只提供了32位版本的支持 而我们的web程序部署到IIS上后默认没有开启32位应用程序支持 需要在IIS应用程序池.高级设置中,将[启用32位应用程序]选项设置为true

你每天的销售数据日报需要多少时间处理?如果有办法能30秒出报表,你怎么选?

每天的销量数据的获取对于品牌连锁企业来说,是商品管理部门、营运部门同事或者企业领导每天早上的必做事情之一。因此,对于如何准确,快速,低代价的获取销量信息,是一门艺术。据观察了解,目前来说各企业获取每日销量数据的方式参差不齐,大致来说主要分为两类:①、每日销…