1
1
package com .thealgorithms .matrix .matrixexponentiation ;
2
2
3
- import java .util .Scanner ;
3
+ import com .thealgorithms .matrix .utils .MatrixUtil ;
4
+ import java .math .BigDecimal ;
4
5
5
6
/**
6
7
* @author Anirudh Buvanesh (https://github.com/anirudhb11) For more information
@@ -12,39 +13,11 @@ private Fibonacci() {
12
13
}
13
14
14
15
// Exponentiation matrix for Fibonacci sequence
15
- private static final int [][] FIB_MATRIX = {{1 , 1 }, {1 , 0 }};
16
- private static final int [][] IDENTITY_MATRIX = {{1 , 0 }, {0 , 1 }};
17
- // First 2 fibonacci numbers
18
- private static final int [][] BASE_FIB_NUMBERS = {{1 }, {0 }};
16
+ private static final BigDecimal ONE = BigDecimal .valueOf (1 );
17
+ private static final BigDecimal ZERO = BigDecimal .valueOf (0 );
19
18
20
- /**
21
- * Performs multiplication of 2 matrices
22
- *
23
- * @param matrix1
24
- * @param matrix2
25
- * @return The product of matrix1 and matrix2
26
- */
27
- private static int [][] matrixMultiplication (int [][] matrix1 , int [][] matrix2 ) {
28
- // Check if matrices passed can be multiplied
29
- int rowsInMatrix1 = matrix1 .length ;
30
- int columnsInMatrix1 = matrix1 [0 ].length ;
31
-
32
- int rowsInMatrix2 = matrix2 .length ;
33
- int columnsInMatrix2 = matrix2 [0 ].length ;
34
-
35
- assert columnsInMatrix1 == rowsInMatrix2 ;
36
- int [][] product = new int [rowsInMatrix1 ][columnsInMatrix2 ];
37
- for (int rowIndex = 0 ; rowIndex < rowsInMatrix1 ; rowIndex ++) {
38
- for (int colIndex = 0 ; colIndex < columnsInMatrix2 ; colIndex ++) {
39
- int matrixEntry = 0 ;
40
- for (int intermediateIndex = 0 ; intermediateIndex < columnsInMatrix1 ; intermediateIndex ++) {
41
- matrixEntry += matrix1 [rowIndex ][intermediateIndex ] * matrix2 [intermediateIndex ][colIndex ];
42
- }
43
- product [rowIndex ][colIndex ] = matrixEntry ;
44
- }
45
- }
46
- return product ;
47
- }
19
+ private static final BigDecimal [][] FIB_MATRIX = {{ONE , ONE }, {ONE , ZERO }};
20
+ private static final BigDecimal [][] IDENTITY_MATRIX = {{ONE , ZERO }, {ZERO , ONE }};
48
21
49
22
/**
50
23
* Calculates the fibonacci number using matrix exponentiaition technique
@@ -53,26 +26,17 @@ private static int[][] matrixMultiplication(int[][] matrix1, int[][] matrix2) {
53
26
* Outputs the nth * fibonacci number
54
27
* @return a 2 X 1 array as { {F_n+1}, {F_n} }
55
28
*/
56
- public static int [][] fib (int n ) {
29
+ public static BigDecimal [][] fib (int n ) {
57
30
if (n == 0 ) {
58
31
return IDENTITY_MATRIX ;
59
32
} else {
60
- int [][] cachedResult = fib (n / 2 );
61
- int [][] matrixExpResult = matrixMultiplication (cachedResult , cachedResult );
33
+ BigDecimal [][] cachedResult = fib (n / 2 );
34
+ BigDecimal [][] matrixExpResult = MatrixUtil . multiply (cachedResult , cachedResult ). get ( );
62
35
if (n % 2 == 0 ) {
63
36
return matrixExpResult ;
64
37
} else {
65
- return matrixMultiplication (FIB_MATRIX , matrixExpResult );
38
+ return MatrixUtil . multiply (FIB_MATRIX , matrixExpResult ). get ( );
66
39
}
67
40
}
68
41
}
69
-
70
- public static void main (String [] args ) {
71
- // Returns [0, 1, 1, 2, 3, 5 ..] for n = [0, 1, 2, 3, 4, 5.. ]
72
- Scanner sc = new Scanner (System .in );
73
- int n = sc .nextInt ();
74
- int [][] result = matrixMultiplication (fib (n ), BASE_FIB_NUMBERS );
75
- System .out .println ("Fib(" + n + ") = " + result [1 ][0 ]);
76
- sc .close ();
77
- }
78
42
}
0 commit comments