p/2012/11/fibonacci-general-term-using-rational.html
-- + (1 / 2 + √5 / 2) ^ n - (1 / 2 - √5 / 2) ^ n を計算すると、有理数
--   項は打ち消しあって、√5 の項のみが残る。
--
fibonacci2 :: Int -> Integer
fibonacci2 0 = 0
fibonacci2 n = truncate . (* 2) . snd $ power f (1, 0) (1 % 2, 1 % 2) n
  where f (a1, b1) (a2, b2) = (a1 * a2 + 5 * b1 * b2, a1 * b2 + a2 * b1)

--
-- Lucas 数
--
lucasList :: [Integer]
lucasList = lucas' 2 1
  where lucas' a b = seq a $ a
fibonacci n = fst $ power calc (0, 1) (1, 0) n
  where calc (a, b) (c, d) = (a * (c + d) + b * c, a * c + b * d)

--
-- Fibonacci 数
--
-- +「ビネの公式」を使った方法
-- + 参考 :
--   http://labs.timedia.co.jp/2012/11/fibonacci-general-term-using-rational.html
-- + (1 / 2 + √5 / 2) ^ n - (1 / 2 - √5 / 2) ^ n を計算すると、有理数
--   項は打ち消しあって、√5 の項のみが残る。
--
fibonacci n = fst $ power calc (0, 1) (1, 0) n
  where calc (a, b) (c, d) = (a * (c + d) + b * c, a * c + b * d)

--
-- Fibonacci 数
--
-- +「ビネの公式」を使った方法
-- + 参考 :
--   http://labs.timedia.co.jp/2012/11/fibonacci-general-term-using-rational.html
-- + (1 / 2 + √5 / 2) ^ n - (1 / 2 - √5 / 2) ^ n を計算すると、有理数
--   項は打ち消しあって、√5 の項のみが残る。
--