Project Euler – 問題50

素数41は次のように6つの連続した素数の和で表すことができる。41 = 2 + 3 + 5 + 7 + 11 + 13

これは100未満の素数で最長の連続した素数の和である。

1000未満の素数で最長の連続した素数の和になるものは953で、21項含んでいる。

1000000未満の素数で最長の連続した素数の和で表されるものを求めよ。

素数の和が1000000未満なので、500000未満の素数を対象に考える。連続した数 が最大のものを求めるわけだが、連続した素数の和が1000000未満で、少なくと も953は21の素数の和なので、ここでは550から20までの連続数について多いほ うから順番に調べていくことにする。

consecsは引数に渡された数の和が素数になるすべての場合を求める関数である。 連続する数が多いほうから順番に試して、一番最初に見つかったものが解とな る。consecsの処理は対象とするpsのすべての項からn個の和を求め、その中で 1000000未満でかつ素数であるものを求めている。

euler050 = head $ concat $ map consecs [550,549..20]
    where consecs n = filter isPrime $ takeWhile (< 1000000)
		      [sum $ take n $ drop i ps | i <- [0..]]
          ps = takeWhile (< 500000) primes