次のことを行う簡単なコードがあります。
F
+-1 のエントリを持つすべての可能な長さ n リストを反復処理します。2n
それぞれについて、+-1 エントリを使用してすべての可能な長さリストを繰り返し処理しS
ます。ここで、$S$ の前半は単に後半のコピーです。このコードは、 lengthF
の各サブリストを使用しての内積を計算します。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 at 9m35.081s by Eisenstat (C)
- n = 18 at 1m16.344s by Eisenstat (pypy)
- n = 18 at 2m54.998s by Tupteq (pypy)
- n = 14 at 26s by Neil (numpy)
- n - kslote1 (pypy) による 11m59.192s の 14