我有一些简单的代码可以执行以下操作。
F
它使用 +-1 个条目迭代所有可能长度为 n 的列表。对于每一个,它都会遍历所有可能的长度2n
列表S
,其中包含 +-1 个条目,其中 $S$ 的前半部分只是后半部分的副本。该代码计算 的 与长度的F
每个子列表的内积。对于每个 F,S,它计算在第一个非零内积之前为零的内积。S
n
这是代码。
#!/usr/bin/python
from __future__ import division
import itertools
import operator
import math
n=14
m=n+1
def innerproduct(A, B):
assert (len(A) == len(B))
s = 0
for k in xrange(0,n):
s+=A[k]*B[k]
return s
leadingzerocounts = [0]*m
for S in itertools.product([-1,1], repeat = n):
S1 = S + S
for F in itertools.product([-1,1], repeat = n):
i = 0
while (i<m):
ip = innerproduct(F, S1[i:i+n])
if (ip == 0):
leadingzerocounts[i] +=1
i+=1
else:
break
print leadingzerocounts
正确的输出n=14
是
[56229888, 23557248, 9903104, 4160640, 1758240, 755392, 344800, 172320, 101312, 75776, 65696, 61216, 59200, 59200, 59200]
使用 pypy,对于 n = 14,这需要 1 分 18 秒。不幸的是,我真的很想为 16、18、20、22、24、26 运行它。我不介意使用 numba 或 cython,但如果可能的话,我想靠近 python。
非常感谢任何加快这一进程的帮助。
我将在这里记录最快的解决方案。(如果我错过了更新的答案,请告诉我。)
- n = 22 在 9m35.081s 由 Eisenstat (C)
- n = 18 在 1m16.344s 由 Eisenstat (pypy)
- n = 18 在 2m54.998s 由 Tupteq (pypy)
- n = 14 at 26s by Neil (numpy)
- n - 14 在 11m59.192s 由 kslote1 (pypy)