連続する素数リスト和が素数になるもののうち、100万までのなかからその並びが最も大きいものを探す。
2,3,5...と和をとって100万までの素数の最大値を超えたところが並びの最大。ここからwindowをずらして和をもとめ素数が見つかったらそれが最大。見つからなかったらwindowサイズを一つ小さくしながら同じ事を繰り返す。
def make_primes(n):
primes = [2]
nums = range(3,n+1,2)
while 1:
prime = nums[0]
if prime ** 2 > n:
primes += nums
return primes
else:
primes.append(prime)
nums = [x for x in nums if x%prime != 0]
return primes
def c_sum(i,n):
return reduce(lambda x,y:x+y,primes[i:i+n+1])
def check_max():
for i in range(1,len(primes)):
if c_sum(0,i) > primes[-1]:
return len(primes[:i])
if __name__ == "__main__":
primes = make_primes(1000000)
print "primes are %d" % len(primes)
cm = check_max()
print "max windowsize %d" % cm
max = 0
pl = cm
for x in range(1,pl):
window = pl - x
print "checking length %d..." % window
for j in reversed(range(x)):
num = c_sum(j,window)
if num in primes:
max = num
print num
print primes[j:j+window+1]
if max > 0: break
if max > 0: break