inverse_of_fibonacci.pl 713 B

12345678910111213141516171819202122232425262728293031323334
  1. #!/usr/bin/perl
  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. use 5.020;
  6. use strict;
  7. use warnings;
  8. use experimental qw(signatures);
  9. use Math::AnyNum qw(:overload fibonacci is_square isqrt phi);
  10. sub fibonacci_inverse ($n) {
  11. my $m = 5 * $n * $n;
  12. if (is_square($m - 4)) {
  13. $m = isqrt($m - 4);
  14. }
  15. elsif (is_square($m + 4)) {
  16. $m = isqrt($m + 4);
  17. }
  18. else {
  19. return -1; # not a Fibonacci number
  20. }
  21. log(($n * sqrt(5) + $m) / 2) / log(phi);
  22. }
  23. say fibonacci_inverse(fibonacci(100)); #=> 100
  24. say fibonacci_inverse(fibonacci(101)); #=> 101