Project Euler 45,46

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) qs

is_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..]))