-- Fibonacci 数列のリスト
--
-- + "seq" を使うと速くなる
--
fibonacciList :: [Integer]
fibonacciList = fib' 0 1
    where fib' a b = seq a $ a : fib' b (a + b)

--
-- Fibonacci 数
--
-- + 「Gosper & Salamin のアイデア」を使用。
-- + from 『フィボナッチ数とリュカ数の計算法』
--
fibonacci :: Int -> Integer
fibonacci 0 = 0
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 数
--
-- +「ビネの公式」を
fibonacciList :: [Integer]
fibonacciList = fib' 0 1
    where fib' a b = seq a $ a : fib' b (a + b)

--
-- Fibonacci 数
--
-- + 「Gosper & Salamin のアイデア」を使用。
-- + from 『フィボナッチ数とリュカ数の計算法』
--
fibonacciList = fib' 0 1
    where fib' a b = seq a $ a : fib' b (a + b)

--
-- Fibonacci 数
--
-- + 「Gosper & Salamin のアイデア」を使用。
-- + from 『フィボナッチ数とリュカ数の計算法』
--