Project Euler 5 - 7

Problem 5

http://projecteuler.net/index.php?section=problems&id=5

最大公約数を求める。Haskellには最初からlcmが用意されている。


main = print(foldl lcm 1 [ 1..20 ])

Problem 6

http://projecteuler.net/index.php?section=problems&id=6

特に難しいことはない。


n = 100
s = sum [ 1..n ]
s2 = sum [ n * n | n <- [ 1..n ] ]
main = print(s * s - s2)

Problem 7

http://projecteuler.net/index.php?section=problems&id=7

素数を求める。どこで見たか忘れたが、これでエラトステネスのふるいができる。


n = 10001
sieve (p:ps) = p : sieve [ n | n <- ps, mod n p /= 0 ]
main = print(head(reverse(take n (sieve [ 2.. ]))))

最初にpが2でpsが[ 3.. ]になる。2で割り切れないもののみ残って、再びふるいにかけられる。
しかし、これは非常に遅い。ふつうに一つずつ素数を求めたほうが速い。


n = 10001
is_prime m = all (\p -> mod m p /= 0) (takeWhile (\p -> m >= p * p) primes)
primes = 2:[ m | m <- [3,5.. ], is_prime m ]
main = print(head(reverse(take n primes)))

allは全てTrueならTrue、そうでなければFalseを返す関数。