Answers:
快速解答:切勿,出于实际目的。当前它没有任何实际用途。
首先,让我们从原始性证明中分离出“实用”的综合性测试。前者对于几乎所有目的都足够好,尽管人们认为适当的测试水平不同。对于2 ^ 64以下的数字,确定性答案最多需要7个Miller-Rabin检验或一个BPSW检验。这将比AKS快得多,并且在所有情况下都一样。对于2 ^ 64以上的数字,BPSW是一个不错的选择,另外一些随机基准的Miller-Rabin测试增加了一些额外的信心,而费用却很少。几乎所有的证明方法都将以这样的测试开始(或应该采用),因为它很便宜,这意味着我们只对几乎可以确定的质数进行艰苦的工作。
继续证明。在每种情况下,得到的证明都不需要推测,因此可以在功能上进行比较。APR-CL的“陷阱”不是很多项式,而ECPP / fastECPP的“陷阱”是可能存在比预期更长的数字。
在该图中,我们看到了两个开源的AKS实现-第一个来自v6论文,第二个包括Bernstein和Voloch的改进以及Bornemann的不错的r / s启发式方法。它们使用GMP中的二进制分段进行多项式乘法,因此效率很高,对于此处考虑的大小,内存使用不是问题。它们在对数-对数图上产生的斜率约为6.4的直线很不错。但是外推到1000位数字估计需要数十万到数百万年的时间,而APR-CL和ECPP只需几分钟。2002年的伯恩斯坦(Bernstein)论文可以做进一步的优化,但是我认为这不会从根本上改变现状(尽管直到实现之前,还没有得到证明)。
最终,AKS击败了审判部门。BLS75定理5(例如n-1证明)方法需要n-1的部分分解。这在小尺寸情况下效果很好,当我们很幸运并且n-1易于分解时,也很奏效,但最终我们将不得不分解一些较大的半素数。有更有效的实现,但是无论如何它实际上都不会扩展到100位以上。我们可以看到AKS将通过此方法。因此,如果您在1975年问这个问题(当时又有AKS算法),我们可以计算出AKS是最实用算法的分频点。但是到了1980年代后期,APR-CL和其他环行方法才是正确的比较,到1990年代中期,我们将必须包括ECPP。
APR-CL和ECPP方法都是开源实现。Primo(免费但不是开源ECPP)对于较大的数字会更快,而且我敢肯定曲线会更好(我尚未进行新的基准测试)。APR-CL是非多项式,但指数具有因数,有人打趣说“去无穷大,但从未观察到这样做”。这使我们相信,从理论上讲,对于我们的太阳熄灭之前,AKS将完成的n值,线不会交叉。ECPP是一种拉斯维加斯算法,因为当我们得到一个答案时,它是100%正确的,所以我们期望结果为推测(ECPP)或(“ fastECPP”)时间,但是数字可能需要更长的时间。因此,我们的期望是,对于几乎所有数字,标准AKS总是比ECPP慢(它肯定已经显示出来,因此对于25,000位以下的数字)。
AKS可能有更多的改进,有待发现,使其实用。Bernstein的Quartic论文讨论了基于AKS的随机算法,Morain的fastECPP论文引用了其他基于AKS的非确定性方法。这是一个根本性的变化,但显示了AKS如何开拓一些新的研究领域。但是,将近10年后,我还没有看到任何人使用此方法(甚至没有任何实现)。他在导言中写道:“ 新算法的时间是否小于时间查找椭圆曲线证书?我目前的印象是答案是否定的,但是进一步的结果可能会改变答案。”
这些算法中的某些可以很容易地并行化或分布。AKS非常容易(每个“ s”测试都是独立的)。ECPP并不难。我不确定APR-CL。
ECPP和BLS75方法生成的证书可以独立快速地进行验证。与AKS和APR-CL相比,这是一个巨大的优势,在AKS和APR-CL中,我们仅需信任实现它的实现和产生它的计算机。
的(渐近)最有效的确定性素性测试算法是由于伦斯特拉和Pomerance,在一次运行。如果您相信扩展黎曼假设,那么米勒算法的运行时间为〜O(log 4 n )。还有许多其他的确定性素性测试算法,例如米勒的纸具有一个〜ø(Ñ 1 / 7)算法,而另一个公知的算法是Adleman的-Pomerance-Rumley,在一次运行Ö (。
实际上,没有人使用这些算法,因为它们太慢了。取而代之的是,使用概率素数测试算法,主要是Miller–Rabin,它是上述Miller算法的另一种改进(另一个重要的算法是Solovay–Strassen)。米勒罗宾的每次迭代在时间用完,因此对于恒定误差概率(说2 - 80)在时间上的整个算法运行〜Ô(登录2 Ñ ),这比伦斯特拉快得多–Pomerance。
在所有这些测试中,内存不是问题。
在他们的评论中,jbapple提出了决定在实践中使用哪个素数测试的问题。这是实现和基准测试的问题:实现和优化一些算法,并实验确定哪个算法在哪个范围内最快。出于好奇,PARI的编码人员只是这样做了,他们提出了确定性函数isprime
和概率函数ispseudoprime
,这两种函数都可以在此处找到。使用的概率测试是Miller–Rabin。确定性的是BPSW。
这是Dana Jacobsen的更多信息:
自2.3版以来的Pari使用APR-CL素数证明isprime(x)
,以及BPSW可能素数测试(带有“几乎额外强”的Lucas测试)ispseudoprime(x)
。
他们确实采用了会改变行为的参数:
isprime(x,0)
(默认值。)使用组合(BPSW,快速Pocklington或BLS75定理5,APR-CL)。isprime(x,1)
isprime(x,2)
使用APR-CL。
ispseudoprime(x,0)
(默认值。)使用BPSW(MR为2,“几乎超强”的卢卡斯)。
ispseudoprime(x,k)
mpz_is_probab_prime_p(x,k)
Pari 2.1.7使用了更差的设置。 isprime(x)
只是MR测试(默认值为10),这会带来很多有趣的事情,例如isprime(9)
经常返回true。使用isprime(x,1)
将进行Pocklington证明,该证明适用于大约80位数字,然后变得太慢而无法普遍使用。
您还写了实际上,没有人使用这些算法,因为它们太慢了。 我相信我知道您的意思,但是我认为这取决于您的听众。当然,AKS非常慢,但是APR-CL和ECPP足够快,以至于有人使用它们。它们对于偏执的加密很有用,对做类似事情primegaps
或factordb
有足够时间想要证明素数的人有用。
[我对此的评论:当寻找特定范围内的质数时,我们使用一些筛分方法,然后进行一些相对较快的概率检验。只有到那时,我们才进行确定性检验。]
在所有这些测试中,内存都不是问题。 这是AKS的问题。例如,请参阅此eprint。其中一些取决于实现。如果实施数字爱好者的视频所称的AKS(实际上是费马小定理的一种概括),则内存使用将非常高。使用v1或v6算法的NTL实现(如参考论文)将导致愚蠢的大量内存。良好的v6 GMP实施对于1024位素数仍将使用〜2GB,这很多这么小的内存。使用Bernstein的某些改进和GMP二进制分段可以带来更好的增长(例如,对于1024位,约为120MB)。这仍然比其他方法所需的要大得多,不足为奇的是,它将比APR-CL或ECPP慢几百万倍。
openssl pkeyparam -text
使用PARI isprime
(如上所述的APR-CL)验证OpenSSL生成的2048位DSA可能素数(用于提取十六进制字符串)所需的时间:在快速笔记本上大约80秒钟。作为参考,Chromium对于我的Frobenius测试的 JavaScript演示实现的每次迭代都需要略微超过0.25s (比MR强得多),因此APR-CL当然是偏执狂但可行的。
这是一个复杂的问题,因为与不同算法效率之间的变化相关的所谓“大/银河常数”。换句话说 与每种不同算法关联的代码可以隐藏非常大的常量,从而提高效率 在另一个 基于渐近/功能复杂性,只有在很大的情况下才能“介入” 。我的理解是,AKS仅在“更大”时才“比其他算法更高效””超出了当前的实际使用范围(而且 实际上很难准确地计算出),但是对算法实现的理论改进(某些人积极寻求)可能会在将来改变这种情况。
看过最近一篇有关arxiv的论文,该论文深入/详细地分析了这个主题,不确定人们对此的看法,到目前为止还没有听到任何反应,这似乎是由学生创建的论文,但可能是其中最详细/最全面的分析之一该算法的实际用法可用。
确定性原始性测试-了解AKS算法 Vijay Menon
强大的算法太复杂,无法实现 tcs.se