首页 > 编程语言 >素性测试算法

素性测试算法

时间:2024-07-23 09:42:56浏览次数:6  
标签:素性 Miller 质数 算法 测试 log

素数拥有许多特殊的性质,这让它在计算机科学中被广泛应用。

例如,著名的 RSA 加密算法基于两个质数的乘积的难分解性;同时,其正确性基于质数的费马小定理和一些推论。

因此,快速判定一个大整数是否是质数是重要的课题。

试除法

由于质数 \(p\) 只有 \(1\) 和 \(p\) 两个正因数,对于正整数 \(n\),我们可以暴力检验 \([2,n-1]\) 内的数是否是。

不过,由于一个大于 \(\sqrt{n}\) 的因数必定对应一个小于 \(\sqrt{n}\) 的因数,我们可以将算法优化到检验 \([2,\sqrt{n}]\) 间的整数。

这样,考虑到两个 \(O(n)\) 位的大整数作除法最快大约是 \(O(n\log^2n\log\log n)\),试除法的时间复杂度为 \(O(\sqrt{n}\log n\log^2\log n\log\log\log n)\)。

对于小整数(小于 \(2^{64}\)),我们可以忽略除法的时间复杂度,\(O(\sqrt{n})\) 勉强可以接受。

但对于 RSA 算法要求的大整数,这样的速度实在太慢。

素性测试

素性测试是在不分解给定数字的前提下,判断数字是否是质数的算法。

通常将素性测试分为两种:

  • 确定性测试:如 AKS 算法、椭圆曲线素性证明。
  • 概率性测试:如 Miller-Rabin 素性测试、Baillie–PSW 素性测试、Solovay–Strassen 素性测试等。这类算法返回 false 时,表明输入是合数;反之,说明可能是质数。

Fermat 测试

最早用于测试素数的可能是 Fermat 小定理 i.e. 若 \(p\) 是质数:

\[a^p\equiv a\pmod{p} \]

因此,我们可以在 \([2,n-1]\) 随机取值(记为 \(a\)),验证 \(a^{n-1}\equiv 1\pmod n\) 是否成立。

然而,Fermat 小定理的逆定理实际并不成立,例如对于 \(n=341=31\times 11,a=2\),有 \(a^{340}\equiv 1\pmod {341}\)。

更可怕的是,存在一类数 \(n\),对于任意 \(a\perp n\),满足 \(a^{n-1}\equiv 1\pmod n\)。这种数被称作 Carmichael 数。Carmichael 数有无穷多个。

Miller-Rabin 素性测试

这是 Fermat 测试的改进,基于另一个关于质数的定理:对于质数 \(p\),在模 \(p\) 意义下,\(1\) 的平方根有且只有 \(\pm 1\)。

因此,我们将指数 \(n-1\) 写成 \(2^sd\) 的形式,其中 \(s\) 为正整数而 \(d\) 为奇数。

那么,若下列条件有一个成立,称 \(n\) 的素性被 \(a\) 验证:

  • \(a^d\equiv 1\pmod n\)
  • \(a^{2^rd}\equiv -1\pmod n\),对于某个 \(0\le r<s\)

值得庆幸的是,不存在一个合数 \(n\) 能通过所有基数的验证。更进一步地,假设 GRH(广义黎曼猜想)成立,只需检查 \([2,\min(n-2,\lfloor2\ln^2n\rfloor)]\) 内地所有整数即可确定 \(n\) 的素性。

实际上,Miller-Rabin 的确定性版本最早在 1976 年由 Gary L. Miller 提出,但由于其正确性依赖于未经证明的 GRH,尽管后者被相信是成立的,前者仍不被承认为一个确定的素性判断算法。

1980 年,Michael O. Rabin 将其修改为无依赖条件的概率算法。

使用 FFT 优化大整数乘法时,\(k\) 轮 Miller-Rabin 的时间复杂度为 \(O(k\log^2n\log\log n\log\log\log n)\),此时判定错误的概率为 \(4^{-k}\)。我们可以测试足够多轮直到错误的概率低于 \(2^{-100}\),这意味着更可能出现计算机的硬件错误而非算法判定错误。

ASK 算法

无论如何是要提一句的。

在 2002 年 8 月 6 日,Manindra Agrawal、Neeraj Kayal 和 Nitin Saxena 发表的论文《PRIMES is in P》注定被载入史册。

这是首个在多项式时间内确定给定数字是否为质数的算法,不依赖于任何未证明的猜想。至此,我们知道了判定质数问题属于 P 问题。

AKS 是第一个同时具有一般性、多项式时间、确定性和无条件正确的原始性证明算法。以前的算法已经开发了几个世纪,最多实现了其中的三个属性,但不是全部四个。

  • AKS 算法可用于验证给定的任何一般数的素数。已知许多快速素数检验仅适用于具有某些性质的数字。例如,Lucas-Lehmer 检验仅适用于梅森数,而 Pépin 检验仅适用于费马数。
  • 算法的最大运行时间可以由目标数字中的位数上的多项式来限制。ECPP 和 APR 最终证明或反驳给定数是质数,但不知道所有输入都有多项式时间界限。
  • 该算法保证可以确定性地区分目标数是素数还是合数。随机检验,如 Miller-Rabin 和 Baillie-PSW,可以在多项式时间内测试任何给定数字的素数,但已知只能产生概率结果。
  • AKS 的正确性不以任何未经证实的辅助假设为条件。相比之下,Miller 版本的 Miller-Rabin 检验是完全确定性的,并且在所有输入的多项式时间内运行,但其正确性取决于尚未证明的广义黎曼假设的真实性。

虽然该算法在理论上具有巨大的重要性,但它并未在实践中使用,使其成为一种银河式算法。对于 64 位输入,Baillie-PSW 测试是确定性的,运行速度要快许多数量级。对于较大的输入,ECPP 和 APR 测试的性能(也是无条件正确的)远远优于 AKS。此外,ECPP 可以输出一个原始证书,该证书允许对结果进行独立和快速的验证,这是 AKS 算法无法实现的。

——译自英文维基

标签:素性,Miller,质数,算法,测试,log
From: https://www.cnblogs.com/weily09/p/18317575/prime

相关文章

  • 「代码随想录算法训练营」第十八天 | 二叉树 part8
    669.修剪二叉搜索树题目链接:https://leetcode.cn/problems/trim-a-binary-search-tree/题目难度:中等文章讲解:https://programmercarl.com/0669.修剪二叉搜索树.html视频讲解:https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web题目状态:没有思路,看题解过......
  • [UE 虚幻引擎] DTHmacSha 蓝图HMACSHA加密算法插件说明
    本插件可以在虚幻引擎中使用蓝图对字符串和文件进行HMACSHA加密。1.节点说明HMACSHA一共有5种加密方式,分辨是HMACSHA-1,HMACSHA-224,HMACSHA-256,HMACSHA-384,HMACSHA-512。本插件对每种加密方式提供3个节点,一般节点返回通用值,如7c4a8d09ca3762af61e59520943dc26494f8941b;t......
  • DC系列靶场---DC 2靶场的渗透测试(二)
    漏洞利用及探测rbash逃逸虽然我们现在已经可以执行切换路径命令了,但是发现还有是很多命令不能用。我想看看一下目标主机的所有用户,是不能执行的。那我们就用到了当前shell逃逸。第一种情况:/被允许的情况下;直接/bin/sh或/bin/bash第二种情况:能够设置PATH或SHELL时。e......
  • RapidAPI 在浏览器测试中工作,但在我的 IDE 中不工作
    我对API没有太多经验,所以这个问题的答案对某些人来说可能是显而易见的。我在一个项目中使用RapidAPI的SkyscannerAPI,每当我在RapidAPIAPI游乐场中测试端点时,它似乎工作得很好。但是,当我将代码(不进行任何更改)复制到IDE时,它会抛出一堆错误,特别是“证书验证失败”错误。......
  • 【视频】Python遗传算法GA优化SVR、ANFIS预测证券指数ISE数据-CSDN博客
    全文链接:https://tecdat.cn/?p=37060本文旨在通过应用多种机器学习技术,对交易所的历史数据进行深入分析和预测。我们帮助客户使用了遗传算法GA优化的支持向量回归(SVR)、自适应神经模糊推理系统(ANFIS)等方法,对数据进行了特征选择、数据预处理、模型训练与评估。实验结果表明,这些方法......
  • 计算机体系结构|| Tomasulo算法(5)
    实验5Tomasulo算法5.1实验目的(1)加深对指令集并行性及开发的理解。(2)加深对Tomasulo算法的理解。.(3)掌握Tomulo算法在指令流出、执行、写结果各阶段对浮点操作指令以及load和store指令进行什么处理。(4)掌握采用了Tomasulo算法的浮点处理部件的结构。(5)掌握保留站的结构。(6)给......
  • 算法——滑动窗口(day7)
    904.水果成篮 904.水果成篮-力扣(LeetCode) 题目解析:根据题意我们可以看出给了我们两个篮子说明我们在开始采摘到结束的过程中只能有两种水果的种类,又要求让我们返回收集水果的最大数目,这不难让我们联想到题目的另一层意思:求最长连续子数组,条件为不超过两种水果种类。......
  • 数据结构-绪论2(算法,时间复杂度)
    算法的基本概念算法是什么       程序=数据结构+算法算法的五个特性有穷性确定性可行性输入输出算法的复杂度时间复杂度算法时间复杂度事前预估算法时间开销T(n)与问题规模n的关系这里以一层,两层,多层循环为例一层循环for(inti=0;i<n;i++){i......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(1)第一场1001
    循环位移题解2024“钉耙编程”中国大学生算法设计超级联赛(1)题目:ProblemDescription定义字符串S=S0+⋯+Sn−1循环位移k次为S(k)=Skmodn+⋯+Sn−1+S0+⋯+S(k−1)modn。定义[A]=\setA(k),k∈N.给出T组串A,B,询问B有多少个子串在[A]中。Input第一行一个......
  • 灰度测试
    灰度测试的场景:生产系统部署了A版本,现在发布新版本B版本,希望生产环境只有部分流量或者特定流量访问B版本做生产验证,灰度系统验证通过后再大规模将老系统升级至新版本。灰度测试主要用来替换双活环境(生产发布时布置两套环境,以便新环境有误则回退至老环境)。 灰度测试的原理:通过......