
// Fibonacci.java
// Andrew Davison, ad@coe.psu.ac.th, April 2023

/* Generate a Fibonacci number using Nut.fibBig()
   which returns a BigInteger for the user's input value n,
   and for n-1, and then calculate their ratio, which
   should approach phi.

   https://en.wikipedia.org/wiki/Fibonacci_sequence

   Nut also has a fib() function, which returns a long.

   Usage:
     > compile Fibonacci.java
     > run Fibonacci <n>
    e.g. 
    > run Fibonacci 100000

   Also see Lucas.java
*/


import java.math.*;


public class Fibonacci
{

  public static void main(String[] args)
  {
    if (args.length != 1) {
      System.out.println("Usage: run Fibonacci <n>");
      return;
    }
    int n = Math.abs(Nut.parseInt(args[0]));

  //  for(int i=1; i <= n; i++) 
  //    System.out.println(i + ". " + Nut.fibBig(i)); // Nut.fib()

    BigDecimal fibN1 = new BigDecimal(Nut.fibBig(n-1));
    BigDecimal fibN = new BigDecimal(Nut.fibBig(n));

    System.out.println("fib(" + (n-1) + ") = " + fibN1); // Nut.fib()
    System.out.println("\nfib(" + n + ") = " + fibN);
    BigDecimal phiEstimate = fibN.divide(fibN1, 40, RoundingMode.HALF_UP);

    System.out.printf("\nPhi:       %.40f\n", Nut.PHI);
    System.out.println("Phi ratio: " + phiEstimate);

  } /* main */

}  // end of Fibonacci class
