[Haskell-cafe] speeding up fibonacci with memoizing

Felipe Almeida Lessa felipe.lessa at gmail.com
Sun Feb 18 14:58:50 EST 2007


On 2/18/07, Yitzchak Gale <gale at sefer.org> wrote:
> Besides memoizing, you might want to use the fact
> that:
>
> fib (2*k) == (fib (k+1))^2 - (fib (k-1))^2
> fib (2*k-1) == (fib k)^2 + (fib (k-1))^2

Nice one:
$ time ./a.out another_fib 200000
Using 'another_fib' to calculate fib of 200000
 -> 15085683557988938992[...]52246259408175853125

real    0m1.177s
user    0m1.051s
sys     0m0.017s


Implementation details:
-----------------------------------------
another_fibs = 0 : 1 : 1 : map f [3..]
    where
      square x = x * x
      sqfib = square . another_fib
      f n | even n = sqfib (k+1) - sqfib (k-1) where k = n `div` 2
      f n          = sqfib k + sqfib (k-1) where k = (n + 1) `div` 2
another_fib = (!!) another_fibs
-----------------------------------------

Conclusion: it's often better to improve the algorithm than the
implementation =).

-- 
Felipe.


More information about the Haskell-Cafe mailing list