Pollard Rho 笔记【Miller Rabin】【素性检测】【分解质因数】

news/2025/2/25 22:06:37/文章来源:https://www.cnblogs.com/zhiyin123/p/18737386

参考

题解 P4718/论 Miller-Rabin 算法的确定性化 - 洛谷专栏

Miller Rabin 算法

该算法能够 \(O(\log^3p)\) 判定 \(p\) 是否是质数。

费马素性检测

定理:若 \(p\) 为素数,则 \(\forall a,1\leq a<p\),有 \(a^{p-1}\equiv 1\ (\operatorname{mod}\ p)\)

这个就是费马小定理

二次探测定理

定理:若 \(p\) 为素数,则关于 \(x\) 的方程 \(x^2\equiv 1\ (\operatorname{mod}\ p)\) 的解集为 \(x\equiv \pm 1\ (\operatorname{mod}\ p)\)

证明:因为 \(x^2\equiv 1\ (\operatorname{mod}\ p)\),所以 \(p\mid (x^2-1)\),因为 \(x^2-1=(x+1)(x-1)\),所以 \(p\mid x+1\)\(p\mid x-1\),这就能说明正确性了。

大致思路

于是,我们就有一个做法了。我们要不断地随机一些底数 \(a\) 来验证 \(p\) 是否是素数。

对于一个 \(a\),我们这么验证。首先,要满足 \(a^{p-1}\equiv 1\ (\operatorname{mod}\ p)\)。于是我们得到了 \(a^{t}\equiv 1\ (\operatorname{mod}\ p)\)(这里 \(t=p-1\))。

如果 \(t\) 是偶数,那么可以得到关于 \(a^{\frac{t}{2}}\) 的方程 \((a^{\frac{t}{2}})^2\equiv 1\ (\operatorname{mod}\ p)\),于是一定要满足 \(a^{\frac{t}{2}}\equiv \pm 1\ (\operatorname{mod}\ p)\)。如果 \(a^{\frac{t}{2}}\equiv -1\ (\operatorname{mod}\ p)\),那么就结束对于这个 \(a\) 的验证。否则,就有 \(a^{\frac{t}{2}}\equiv 1\ (\operatorname{mod}\ p)\),令 \(\displaystyle t\gets \frac{t}{2}\),于是又有 \(a^{t}\equiv 1\ (\operatorname{mod}\ p)\) 了,继续验证。

复杂度分析

如果进行 \(T\) 次随机选取底数 \(a\),则复杂度容易做到 \(O(T\log^2 p)\)(使用快速幂),如果实现精细,可以做到 \(O(T\log p)\)


这里有一个结论。如果承认广义黎曼猜想,则底数 \(a\) 只需要取遍前 \(O(\log^2 p)\) 个自然数即可。所以复杂度可以做到 \(O(\log^3p)\)


如果不随机选取 \(a\) 的值,则 \(a\) 被推荐取遍下表中的值。

\(p\) 不超过的值 推荐取值 记忆
\(2^{31}\) \(\{2,7,61\}\) 不推荐记忆
\(2^{64}\) \(\{2,325,9375,28178,450775,9780504,1795265022\}\) 不推荐记忆
\(2^{78}\) \(\{2,3,5,7,11,13,17,19,23,29,31,37\}\) \(12\) 个素数

Pollard Rho 算法

该算法能期望 \(O(N^{\frac{1}{4}})\) 获取合数 \(N\) 的一个因子。

生日悖论

问题:给定正整数 \(V\),初始集合 \(S\),执行下过程:

  • 在集合 \([V]\) 中等概率随机选取一个数 \(x\),若 \(x\not\in S\),则将 \(x\) 加入集合 \(S\),并重新执行本过程;否则停止执行。

问集合 \(|S|\)期望


结论\(|S|\) 的期望为

\[\boxed{O(\sqrt V)} \]


不会证捏。

大致思路

下文中,我们要分解的数为 \(N\)

Pollard Rho 的大致思路为,先构造一个随机函数 \(f\),然后不断生成随机数。对于生成的随机数 \(a,b\),若 \(d=\gcd(|a-b|,N)\)\((1,N)\) 之中,则 \(d\)\(N\) 的一个因数。

\(d\in (1,N)\) 仅当存在一个质数 \(p\mid N\) 满足

\[a\equiv b\ (\operatorname{mod}\ p) \]

这里 \(a\)\(b\) 在模 \(p\) 意义下相同,这使得我们可以猜想,只需要期望生成 \(O(\sqrt p)\)(因为 \(O(p)=O(\sqrt N)\),故为 \(O(N^{\frac{1}{4}})\))个随机数就能达到目的。

Pollard Rho 的随机函数

Pollard Rho 使用的随机函数为(其中 \(c\) 为某常数)

\[f(x)=(x^2+c)\bmod N \]


性质:对于正整数 \(p\mid N\),若 \(x\equiv y\ (\operatorname{mod}\ p)\),则 \(f(x)\equiv f(y)\ (\operatorname{mod}\ p)\)

证明:由于 \(p\mid N\),所以在模 \(p\) 意义下,\(f(x)=(x^2+c)\bmod p\)。由于 \(x\equiv y\ (\operatorname{mod}\ p)\),所以 \(0\equiv x-y\equiv (x-y)(x+y)+c-c\equiv x^2+c-(y+c)\ (\operatorname{mod}\ p)\),所以 \(x^2+c\equiv y^2+c\ (\operatorname{mod}\ p)\)。这样就说明了性质的正确性。


这一性质使得,当我们生成了 \(n\) 个随机数时,可能只需要 \(O(n)\) 次计算就能检验是否应该停止生成随机数了。

Floyed 判环

大多数时候(或许时所有的时候),\(f\) 生成的随机数会产生混循环,所以需要判断是否进入了混循环,并考虑跳出。

可以使用 Floted 算法判环。在一个 \(\rho\) 形图中,可以使用两个指针 \(x,y\),每次让 \(x\) 前进一步,\(y\) 前进两步,如果 \(x\)\(y\) 重合了,就说明有环。这样复杂度是 \(O(\)环长\()\) 的。

并且,求 \(\gcd\) 时也可以顺便求 \(x\)\(y\) 之间的。

分组求 gcd

直接做复杂度是 \(O(N^{\frac{1}{4}}\log N)\) 的(要求 \(O(N^{\frac{1}{4}})\)\(\gcd\)),能否去掉 \(\log N\) 呢?

可以将 \(O(N^{\frac{1}{4}})\) 个数分为 \(O(\log N)\) 组,每组求一次 \(\gcd\),复杂度就是 \(O(N^{\frac{1}{4}})\) 的啦。

伪代码

  • \(\text{ctz}(x)\) 表示正整数 \(x\)二进制下,最低位连续 \(0\) 的个数。
  • \(M\in \mathbb{N}^{+}\)
  • function \(\text{mul}(x,y)\)
    • return \(xy\bmod M\)
  • function \(\text{isprime}(p)\)
    • 静态数组 \(\text{prime}=(2,3,5,7,11,13,17,19,23,29,31,37)\)
    • if \(p\leq 40\) then
      • return \([p\in \text{prime}]\)
    • \(M\gets p\)
    • let \(t=p - 1, u = \text{ctz}(t)\)
    • \(\displaystyle t\gets t\times \frac{1}{2^u}\)
    • for \(a\in \text{prime}\) do
      • let \(x = a ^ t\)
      • if \(x = 1\) or \(x = p - 1\) then
        • continue
      • let \(\text{ok} = \textbf{false}\)
      • for \(i \in (1,2,\dots,u-1)\) do
        • \(x \gets \text{mul}(x, x)\)
        • if \(x = p - 1\) then
          • \(\text{ok} \gets \textbf{true}\)
          • break
      • if \(\text{ok} = \textbf{false}\) then
        • return \(\textbf{false}\)
    • return \(\textbf{true}\)
  • \(c = 1\)
  • function \(f(x)\)
    • return \((\text{mul}(x,x)+c)\bmod M\)
  • \(B = 64\)
  • function \(\text{rho}(N)\)
    • if \(N \bmod 2 = 0\) then
      • return \(2\)
    • \(M\gets N\)
    • let \(x = 0, y = 0, z = 0, \Pi = 1\)
    • for \(\displaystyle i\in (\lfloor\frac{B}{2}\rfloor,\lfloor\frac{B}{2}\rfloor+1,\lfloor\frac{B}{2}\rfloor+2,\dots)\) do
      • if \(x = y\) then
        • \(z\gets z + 1\)
        • \(x \gets z\)
        • \(y \gets f(x)\)
      • let \(t = \text{mul}(\Pi, |x - y|)\)
      • if \(t\neq 0\) then
        • \(\Pi\gets t\)
      • if \(i\bmod B = 0\) then
        • let \(d = \gcd(\Pi,N)\)
        • if \(1 < d\) then
          • return \(d\)
      • \(x\gets f(x)\)
      • \(y\gets f(f(x))\)

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

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

相关文章

14 Java的Stream流详解

Stream是[Java 8](https://so.csdn.net/so/search?q=Java 8&spm=1001.2101.3001.7020) API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)Stream流是从支持数据处理操作的源生成的元素…

作业1:自我介绍+软工五问

项目 内容这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13325这个作业的目标 熟练掌握github、git、markdown和博客园的使用1.…

基于电压电流双闭环控制的三相整流器系统simulink建模与仿真

1.课题概述 基于电压电流双闭环控制的三相整流器系统simulink建模与仿真。2.系统仿真结果 (完整程序运行后无水印)3.核心程序与模型 版本:MATLAB2022a4.系统原理简介三相整流器作为电力电子变换的核心部件,广泛应用于各种工业及能源系统中,其性能直接影响到整个系统的效率…

[BUUCTF]刷题记录PWN——ez_pz_hackover_2016

静态分析比较重要的函数,一个strlen可以利用\x00来绕过,然后对输入的字符串进行检查,最后进入vulnmemcoy: C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。也就是说,vuln里的memcpy函数会把,我们输入的内容取…

基于信息论的高动态范围图像评价算法matlab仿真

1.程序功能描述 基于信息论的高动态范围图像评价算法matlab仿真,利用一种自然图像的概率模型对图像的熵与成像动态范围之间的关系进行了数值模拟,得到了具有普遍意义上的理想成像动态范围的计算公式,公式指出了对自然景物完善成像所需的最大动态范围;给出了图像熵与动态…

BloomFilter详解

目录BloomFilter 原理:问题引入:黑名单管理程序哈希、哈希函数BloomFilter :3.4 BloomFilter 的缺陷、改进:代码实现黑名单blacklist.py:普通的实现方法set.py:哈希函数hash.py:4.4 BloomFilter 实现方法bloomfilter.py: BloomFilter 原理: ​ 我们将从哈希函数开始…

【ABP】项目示例(4)——领域服务

领域服务 在上一章节中,已经完成了仓储的设计,在这一章节中,实现领域服务,即业务的核心逻辑 领域服务主要处理特定领域的业务逻辑,对内协调和整合聚合根与各个实体的业务关系,对外作为业务的边界,供应用服务组合来提供完整复杂的功能 规约 在名称为General.Backend.Doma…

YOLOv10 解析与地平线 征程 6模型量化

一,YOLOv10 解析 1.简介 近些年来,研究人员对 YOLO 的架构设计、优化目标、数据增强策略等进行了探索,取得了显著进展。然而,后处理对非极大值抑制(NMS)的依赖阻碍了 YOLO 的端到端部署,并对推理延迟产生不利影响。此外,YOLO 中各个组件的设计缺乏全面彻底的检查,导致…

SemanticKernel之Chat

去年写过几过几篇关于SemanticKernel的文章,由于正式发布的版本与之前的版本变化较大,加上前的东京《生成式AI应用开发》活动,想把演示的Demo逐一分享出来,的以再次开启SemanticKernel系统。下面是一个Chat的例子,用户提问,如果本地有固定数据能对应,直接返回,如果没有…

7、添加特效

去除画面logo 复制一份 拖动模糊特效到复制的片段中 右键分离音频或者快捷键【ctrl+shift+s】 删除音频 添加原创特效,特效随机 有音乐的去除音乐 适当拖动放大 调整透明度 开幕特效 三秒 调整参数后,复制双份 画面特效和人物特效二选一 画面特效需要修改参数

Prompt升级

前两篇关于Prompt的文章分别从提示词规则建议和具体框架角度说明了一下Prompt的使用技巧,接下来可以说是对框架式提示词的的进一步升级——结构化提示词。 结构化定义: 对信息进行组织,使其遵循特定的模式和规则,从而方便有效理解信息。 结构化提示词语法:这个结构支持 Mark…

Spring复习-事务

事务概述 Spring事务编程概述 事务是开发中必不可少的东西,使用JDBC开发时,我们使用connnection对事务进行控制,使用MvBatis时,我们使用SqlSession对事务进行控制,缺点显而易见,当我们切换数据库访问技术时,事务控制的方式总会变化,Spring 就将这些技术基础上,提供了统…