fibonacci_number_fast.sf 546 B

123456789101112131415161718192021222324
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 19 June 2018
  4. # https://github.com/trizen
  5. # A very efficient algorithm for computing the nth-Fibonacci number.
  6. func fibonacci_number(n) {
  7. var (f, g) = (0, 1)
  8. var (a, b) = (0, 1)
  9. for k in (0 .. n.ilog2) {
  10. (f, g) = (f*a + g*b, f*b + g*(a+b)) if n.getbit(k)
  11. (a, b) = (a*a + b*b, a*b + b*(a+b))
  12. }
  13. return f
  14. }
  15. say fibonacci_number(100) #=> 354224848179261915075
  16. say 15.of(fibonacci_number) #=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]