Thursday, August 2, 2012

Fibonacci in log(n) Java code

/*
* | 1 1 |n |Fn+1 Fn |
* | 1 0 | = |Fn Fn-1 |
*
* Figure 1
*/
public int FibonacciLogN(int n)
{
if(n <= 0)
return 0;
if(n == 1 || n == 2)
return 1;
// calculate n - 1 term (see above figure 1)
return FibonacciMatrix(FIBONACCI_MATRIX, n - 1)[0][0];
}
private int[][] FibonacciMatrix(int[][] m, int n)
{
if(n == 1)
return FIBONACCI_MATRIX;
if(n == 2)
return multiply(FIBONACCI_MATRIX, FIBONACCI_MATRIX);
int solution[][] = FibonacciMatrix(m, n/2);
solution = multiply(solution, solution);
if(n%2 != 0)
solution = multiply(solution, FIBONACCI_MATRIX);
return solution;
}
// for quick multiplication
private int[][] multiply(int[][] m, int[][] n)
{
int[][] result = new int[2][2];
result[0][0] = m[0][0] * n[0][0] + m[0][1] * n[1][0];
result[0][1] = m[0][0] * n[0][1] + m[0][1] * n[1][1];
result[1][0] = m[1][0] * n[0][0] + m[1][1] * n[1][0];
result[1][1] = m[1][0] * n[0][1] + m[1][1] * n[1][1];
return result;
}
private int[][] FIBONACCI_MATRIX = new int[][] { {1,1}, {1,0} };