【发布时间】:2012-05-27 06:20:51
【问题描述】:
我正在研究 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
【问题讨论】:
-
对不起,它有效,由于 Stackoverflows“代码”输入模式,存在缩进错误。我现在就修复它
-
对不起,代码输入过程完全把我弄糊涂了,所以这里缩进正确的代码是:pastebin.com/R1NpMqgb
标签: python primes memoization