Life Goes On

まあまあだけど楽しんでる方です

100問目

http://projecteuler.net/index.php?section=problems&id=100
青いディスク 15 枚、赤いディスク 6 枚、計 21 枚のディスクの中から 2 枚のディスクを無作為に取り出すとき、青いディスクを 2 枚取り出す確率は
P(BB) = (15/21)(14/20) = 1/2 となる。
青いディスクを 2 枚取り出す確率が 1/2 となるような 組合せのうち、全体のディスク枚数が 1012 を超えるような最初の組合せについて、青いディスクの枚数を求める。
全体の枚数を d, 青いディスクの枚数を n とおくと n(n-1)/d(d-1) = 1/2 で、
これはペル方程式 x2 - 2y2 = -1 に帰着します。

main = print $ euler100 (10^12)

euler100 :: Integer -> Integer
euler100 m = snd $ head $ filter ((> m) . fst) pbbs

pbbs :: [(Integer, Integer)]
pbbs = iterate next (4, 3)
    where next (a, b) = (3*a+4*b-3, 2*a+3*b-2)