import java.math.BigInteger;

public class BigFib {

  static BigInteger bigFib(BigInteger n) {
    int result;
    
    if ((result = n.compareTo(BigInteger.ONE)) < 0 || result ==0)
      return BigInteger.ONE;
    else {
      //return bigFib(n.subtract(BigInteger.ONE).add(
      //bigFib(n.subtract(BigInteger.ONE).subtract(BigInteger.ONE))));
      BigInteger nminusone = n.subtract(BigInteger.ONE);
      BigInteger nminustwo = nminusone.subtract(BigInteger.ONE);
      BigInteger fibnminusone = bigFib(nminusone);
      BigInteger fibnminustwo = bigFib(nminustwo);
      BigInteger fibnminusoneplusfibnminustwo = fibnminusone.add(fibnminustwo);
      return fibnminusoneplusfibnminustwo;
    }
  }
  
  public static void main(String [] args) {
    BigInteger i;
    
    System.out.printf("Fib.java - size of a long: 8 bytes\n");
    i = new BigInteger("0");

    while (i.compareTo(new BigInteger("47")) < 0) {
      System.out.printf("fib(%d) = %s\n", i, bigFib(i));
      i = i.add(BigInteger.ONE);
    }
  }
}
