クリスチャン・ゴールドバッハは全ての奇数の合成数は素数と平方数の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
