我正在研究 Project Euler Problem 50,其中指出:
素数 41 可以写成六个连续素数之和:
41 = 2 + 3 + 5 + 7 + 11 + 13 这是添加到小于 100 的素数的最长连续素数之和。
加到一个素数上的小于一千的连续素数的最长和包含 21 项,等于 953。
100 万以下的哪个素数可以写成最连续素数之和?
为了确定素数P中的项(如果它可以写成素数之和),我使用所有素数(按递增顺序)直到(但不包括)P的滑动窗口,并计算所有素数的总和这些窗口,如果总和等于所考虑的素数,我计算窗口的长度......
这适用于所有最高1000的素数,但对于最高10**6的素数,它非常慢,所以我希望memozation会有所帮助;在计算滑动窗口的总和时,做了很多双重工作......(对吧?)
所以我在网上找到了标准的 memoizaton 实现并将其粘贴到我的代码中,这是正确的吗?(我不知道它应该如何在这里工作......)
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