Numpy AKS 素数函数
Numpy AKS primality function
我正在使用 Numpy 实施 AKS-primality 测试。具体来说,我使用 Numpy 的多项式功能来查找方程 (x - 1)^n - (x^n - 1) 的系数,如果所有这些系数都可以被主要候选者整除,则返回 True。
def isPrime(n):
if n < 2:
return False
poly1 = np.polynomial.polynomial.polypow([1, -1], n)
poly2 = np.zeros(n + 1, dtype=int)
poly2[0] = 1
poly2[-1] = -1
coefficients = np.polysub(poly1, poly2)
divisibility_test = lambda x : x % n != 0
non_divisibles = filter(divisibility_test, coefficients)
try:
_ = next(non_divisibles)
return False
except StopIteration:
return True
我知道我这里没有最高效的解决方案。我很困惑为什么这个实现只对低于 59 的输入产生正确答案。它无法识别任何大于 53 的素数。
编辑:
演示结果的简单方法如下所示:
print(list(filter(isPrime, range(100))))
要使用 python 的任意精度整数,您可以在构造系数列表时指定 dtype=object
到适当的方法,即
poly1 = np.polynomial.polynomial.polypow(np.array([1, -1], dtype=object), n)
poly2 = np.zeros(n + 1, dtype=object)
我正在使用 Numpy 实施 AKS-primality 测试。具体来说,我使用 Numpy 的多项式功能来查找方程 (x - 1)^n - (x^n - 1) 的系数,如果所有这些系数都可以被主要候选者整除,则返回 True。
def isPrime(n):
if n < 2:
return False
poly1 = np.polynomial.polynomial.polypow([1, -1], n)
poly2 = np.zeros(n + 1, dtype=int)
poly2[0] = 1
poly2[-1] = -1
coefficients = np.polysub(poly1, poly2)
divisibility_test = lambda x : x % n != 0
non_divisibles = filter(divisibility_test, coefficients)
try:
_ = next(non_divisibles)
return False
except StopIteration:
return True
我知道我这里没有最高效的解决方案。我很困惑为什么这个实现只对低于 59 的输入产生正确答案。它无法识别任何大于 53 的素数。
编辑: 演示结果的简单方法如下所示:
print(list(filter(isPrime, range(100))))
要使用 python 的任意精度整数,您可以在构造系数列表时指定 dtype=object
到适当的方法,即
poly1 = np.polynomial.polynomial.polypow(np.array([1, -1], dtype=object), n)
poly2 = np.zeros(n + 1, dtype=object)