我有一些执行以下操作的简单代码。
它遍历所有可能的长度为n的列表F
和+-1个条目。对于每个条目,它都会迭代所有可能长度的2n
列表S
和+-1条目,其中$S$的前一半只是后半部分的副本。代码计算F
与长度为n
的S
的每个子列表的内积。对于每个F,S,它计算直到第一个非零的内积为零的内积。
下面是代码。
#!/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。
任何帮助加快这一进程的人都非常感谢。
我将在这里记录下最快的解决方案。(如果我错过了更新的答案,请告诉我。)
https://stackoverflow.com/questions/26960749
复制相似问题