Drkcore

18 09 2008 euler Tweet

Project Euler Problem 50

連続する素数リスト和が素数になるもののうち、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

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021