为什么我执行的 aks prime test 比我执行的 naive 版本慢?

Why my implementation of aks prime test is slower than my implementation of the naive version?

我尝试比较多种算法以找到“i”下的最大质数。 但是当我测试实现时,“aks”比我的天真实现慢。 我在想 aks 是素数测试的更好实现,我是不是弄错了?

 def expand_x_1(n): 
    c =1
    for i in range(n//2+1):
        c = c*(n-i)//(i+1)
        yield c
 
def aks(p):
    if p==2:
        return True
 
    for i in expand_x_1(p):
        if i % p:
            return False
    return True

def all_factors(x): # naive version
    i = 2
    s = int(x ** 0.5)
    while i < s:
        if x % i == 0:
            return False
        i += 1
    return True

def find(i, func) :
    while not func(i) :
        i -= 1
    print(i)

%time find(2**16, aks)
%time find(2**16, all_factors)

我尝试比较两者并获得:

65521
CPU times: user 1.7 s, sys: 3.24 ms, total: 1.7 s
Wall time: 1.7 s
65521
CPU times: user 81 µs, sys: 0 ns, total: 81 µs
Wall time: 83.9 µs

当输入是素数时,expand_x_1(n) 最终会产生所有可能的 n//2+1 结果,但是 all_factors(n) 中的循环只进行了大约 sqrt(n) 次。那是一个巨大的差异。

但也很有用:

c = c*(n-i)//(i+1)

在迭代中不受限制地增长。添加

            print(c.bit_length())

yield 之前,您会看到 find(65521, aks) 在完成之前对超过 65000 位宽的整数进行算术运算。这也比 16 位算术 find(65521, all_factors) 可以。

注意:在实践中,没有人使用 AKS 素数测试,因为即使是经过世界-class 数学家大规模优化的版本也比替代方案慢。有关详细信息,请参阅 AKS Primes algorithm in Python