Project Euler – 問題46

クリスチャン・ゴールドバッハは全ての奇数の合成数は素数と平方数の2倍の和 で表せると提唱しました。9 = 7 + 2 * 1 ^ 2, 15 = 7 + 2 * 2 ^ 2, 21 = 3 + 2 x 3 ^ 2, 25 = 7 + 2 * 3 ^ 2, 27 = 19 + 2 * 2 ^ 2, 33 = 31 + 2 * 1 ^ 2

しかしこの予想は間違いでした。

奇数の合成数で素数と平方数の2倍の和で表せない最小のものを求めよ。

奇数のなかで素数でないものをfilterで選ぶことで奇数の合成数を求める。次 にgoldbach関数で予想を満たさないものをfilterし、headで最小の要素が求ま る。

goldbach関数では対象となる値より小さい素数を引いたリストを求め、その差 が平方数の2倍のリストの中にあれば条件を満たすというのをintersectを用い て求めている。

euler046 = head $ filter goldbach $ filter (not . isPrime) [3,5..]
    where squares2 = map (* 2) squares
          goldbach n = intersect (map (n -) ps) ss == []
              where ps = takeWhile (< n) primes
                    ss = takeWhile (< n) squares2