私はプロジェクトオイラー問題50に取り組んでいます。
素数41は、6つの連続する素数の合計として記述できます。
41 = 2 + 3 + 5 + 7 + 11 + 13これは、100未満の素数に追加される、連続する素数の最長の合計です。
1000未満の連続する素数の最長の合計で、素数に追加され、21の項が含まれ、953に等しくなります。
最も連続した素数の合計として、100万未満のどの素数を書くことができますか?
素数Pの項を決定するために(素数の合計として記述できる場合)、 Pまでの(ただし含まない)すべての素数のスライディングウィンドウを(昇順で)使用し、すべての合計を計算しますこれらのウィンドウ、合計が考慮される素数に等しい場合、ウィンドウの長さを数えます...
これは1000までのすべての素数で問題なく機能しますが、 10 ** 6までの素数では非常に遅いので、メモが役立つことを期待していました。スライディングウィンドウの合計を計算するとき、多くの二重の作業が行われます...(右?)
だから私はネット上で標準のメモの実装を見つけて、それを私のコードに貼り付けました、これは正しいですか?(ここでどのように機能するのかわかりません...)
primes = tuple(n for n in range(1, 10**6) if is_prime(n)==True)
count_best = 0
##http://docs.python.org/release/2.3.5/lib/itertools-example.html:
## Slightly modified (first for loop)
from itertools import islice
def window(seq):
for n in range(2, len(seq) + 1):
it = iter(seq)
result = tuple(islice(it, n))
if len(result) == n:
yield result
for elem in it:
result = result[1:] + (elem,)
yield result
def memoize(function):
cache = {}
def decorated_function(*args):
if args in cache:
return cache[args]
else:
val = function(*args)
cache[args] = val
return val
return decorated_function
@memoize
def find_lin_comb(prime):
global count_best
for windows in window(primes[0 : primes.index(prime)]):
if sum(windows) == prime and len(windows) > count_best:
count_best = len(windows)
print('Prime: ', prime, 'Terms: ', count_best)
##Find them:
for x in primes[::-1]: find_lin_comb(x)
(ところで、素数のタプルは「きちんと」速く生成されます)
すべての入力に感謝します。私は単なる趣味のプログラマーなので、先に進まないでください。
ありがとうございました!
編集:これは、インデントを台無しにしない作業コードペーストです:http: //pastebin.com/R1NpMqgb