Python Numpy-AKS素性函数

Python Numpy-AKS素性函数,python,numpy,primes,primality-test,Python,Numpy,Primes,Primality Test,我正在使用Numpy实现测试。具体地说,我使用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]

我正在使用Numpy实现测试。具体地说,我使用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

要使用python的任意精度整数,可以在构造系数列表时将
dtype=object
指定给适当的方法,即

poly1=np.polynomy.polynomy.polypow(np.array([1,-1],dtype=object),n)
poly2=np.zero(n+1,dtype=object)

我认为这与整数溢出有关。将某个值提高到59次方将导致非常大的值。@Kevin对dtype=floatTry
dtype=object
@PresidentJamesK.Polk得出相同的结果,这同样将主输出限制为不超过数字53。虽然dtype是零的可选参数,但它不是polypow的参数。@DanaJ问题是为什么Numpy会表现出某些行为。这里的“工作”有助于我了解为什么我会遇到这样的约束。了解答案并不意味着这个实现在算法上完全正确。
print(list(filter(isPrime, range(100))))