inverse_of_fibonacci.sf 560 B

123456789101112131415161718192021222324252627
  1. #!/usr/bin/ruby
  2. # Find the position of a Fibonacci number in the Fibonacci sequence.
  3. # See also:
  4. # https://en.wikipedia.org/wiki/Fibonacci_number#Recognizing_Fibonacci_numbers
  5. func fibonacci_inverse (n) {
  6. var m = 5*n*n
  7. if (is_square(m - 4)) {
  8. m = isqrt(m - 4)
  9. }
  10. elsif (is_square(m + 4)) {
  11. m = isqrt(m + 4)
  12. }
  13. else {
  14. return -1 # not a Fibonacci number
  15. }
  16. log((n*sqrt(5) + m) / 2) / log(Num.phi)
  17. }
  18. say fibonacci_inverse(fibonacci(100)) #=> 100
  19. say fibonacci_inverse(fibonacci(101)) #=> 101