Problem 45
http://projecteuler.net/index.php?section=problems&id=45
六角数は三角数なので、三角数は無視できる。五角数と六角数を並べて比較していくだけ。
polygonal p = [ div (n * ((p - 2) * n - (p - 4))) 2 | n <- [1..] ]
equal (p:ps) (h:hs) | p == h = [p] ++ (equal ps hs)
| p < h = equal ps (h:hs)
| p > h = equal (p:ps) hs
main = print(last (take 3 (equal (polygonal 5) (polygonal 6))))
Problem 46
http://projecteuler.net/index.php?section=problems&id=46
素数と降順の平方数の2倍を並べて、足して指定の数になる組合せを探す。
equal n ps [] = False
equal n [] qs = False
equal n (p:ps) (q:qs) | p + q == n = True
| p + q < n = equal n ps (q:qs)
| otherwise = equal n (p:ps) qsis_prime n = all (\p -> mod n p /= 0) (takeWhile (\p -> p * p <= n) primes)
primes = 2:(filter is_prime [3..])
twice_squares = [ 2 * n * n | n <- [0..] ]is_GoldBach n = equal n primes (reverse (takeWhile (
not (is_GoldBach n)) [3,5..]))