Python 中的 AKS Primes 算法
Posted
技术标签:
【中文标题】Python 中的 AKS Primes 算法【英文标题】:AKS Primes algorithm in Python 【发布时间】:2010-09-25 18:10:44 【问题描述】:几年前,证明PRIMES is in P。有没有在 Python 中实现their primality test 的算法?我想用一个简单的生成器运行一些基准测试,并亲眼看看它有多快。我会自己实现它,但我对论文的理解还不够。
【问题讨论】:
AKS 具有重要的理论意义,但它的性能很糟糕(米勒拉宾要好得多)。在 Python 中实现了许多素性测试。 很抱歉让您失望了,这里有一点数学上的误解!虽然我们还没有正式确定P == NP
,但是即使P != NP
,也不能跟P == Fast
!
【参考方案1】:
快速回答:不,AKS 测试不是测试素性的最快方法。有许多更快的素性检验,它们要么假设(广义)黎曼假设和/或随机化。 (例如,Miller-Rabin 实现起来既快速又简单。)该论文的真正突破是理论上的,证明存在用于测试素性的确定性多项式时间算法,而无需假设 GRH 或其他未经证实的猜想.
也就是说,如果您想理解并实施它,Scott Aaronson's short article 可能会有所帮助。它没有详细介绍所有细节,但您可以从第 10 页(共 12 页)开始,它已经提供了足够的信息。 :-) 这里还有一个list of implementations(主要是C++)。
此外,对于优化和改进(几个数量级),您可能需要查看this report,或(旧版)Crandall and Papadopoulos's report,或(更旧版)Daniel J Bernstein's report。它们都有相当详细的伪代码,非常适合实施。
【讨论】:
更新:Terence Tao 对数学的另一个很好的阐述,这里:terrytao.wordpress.com/2009/08/11/the-aks-primality-test AKS 测试不是最快的方法,但它是第一个针对素数的万无一失的测试。 @Progo:更准确地说,这是我们可以证明是万无一失的和多项式时间的第一个测试。还有其他我们坚信是的测试实际上是完全万无一失的(例如,因为可以证明它们假设像黎曼假设这样的可靠猜想),还有其他测试我们可以prove 完全是万无一失的,并且几乎总是运行得很快,但我们不能 prove 是多项式时间的。 AKS 的突破是两者兼而有之。 @Progo,显然您观看了 numberphile 视频,这非常具有误导性。它不是最快的方法,不是第一个防呆测试,也不是最快的防呆测试,等等。它是确定性多项式时间,在没有假设 ERH 的情况下我们以前没有。我们有(并且今天仍在使用)APR-CL,它是我们将要计算的任何输入的有效多项式时间。我们有并且仍在使用 ECPP,它是预期的多项式时间(但由于随机性可能运行缓慢)。两者都是“万无一失”的方法,而且速度更快。【参考方案2】:是的,去rosettacode.org上查看AKS test for primes页面
def expand_x_1(p):
ex = [1]
for i in range(p):
ex.append(ex[-1] * -(p-i) / (i+1))
return ex[::-1]
def aks_test(p):
if p < 2: return False
ex = expand_x_1(p)
ex[0] += 1
return not any(mult % p for mult in ex[0:-1])
print('# p: (x-1)^p for small p')
for p in range(12):
print('%3i: %s' % (p, ' '.join('%+i%s' % (e, ('x^%i' % n) if n else '')
for n,e in enumerate(expand_x_1(p)))))
print('\n# small primes using the aks test')
print([p for p in range(101) if aks_test(p)])
输出是:
# p: (x-1)^p for small p
0: +1
1: -1 +1x^1
2: +1 -2x^1 +1x^2
3: -1 +3x^1 -3x^2 +1x^3
4: +1 -4x^1 +6x^2 -4x^3 +1x^4
5: -1 +5x^1 -10x^2 +10x^3 -5x^4 +1x^5
6: +1 -6x^1 +15x^2 -20x^3 +15x^4 -6x^5 +1x^6
7: -1 +7x^1 -21x^2 +35x^3 -35x^4 +21x^5 -7x^6 +1x^7
8: +1 -8x^1 +28x^2 -56x^3 +70x^4 -56x^5 +28x^6 -8x^7 +1x^8
9: -1 +9x^1 -36x^2 +84x^3 -126x^4 +126x^5 -84x^6 +36x^7 -9x^8 +1x^9
10: +1 -10x^1 +45x^2 -120x^3 +210x^4 -252x^5 +210x^6 -120x^7 +45x^8 -10x^9 +1x^10
11: -1 +11x^1 -55x^2 +165x^3 -330x^4 +462x^5 -462x^6 +330x^7 -165x^8 +55x^9 -11x^10 +1x^11
# small primes using the aks test
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
【讨论】:
这不是 AKS 算法;这是一个指数时间算法,它实现了 AKS 算法背后的基本思想,没有任何使其成为多项式时间的思想。【参考方案3】:我使用二项式展开简化,
from math import comb
def AKS(n):
if (n ^ 1 == n + 1): # check if it's even
if n == 2:
return True
return False
for i in range(3,n//2):
if comb(n,i)%n != 0: # check if any coefficient isn't divisible by n
return False
return True
【讨论】:
以上是关于Python 中的 AKS Primes 算法的主要内容,如果未能解决你的问题,请参考以下文章
Sum All Primes-freecodecamp算法题目
GMP库生成素数用啥算法,要说具体点,demos里面的那个primes.c的算法也是一样的么?