@@ -72,11 +72,11 @@ const FibonacciDpWithoutRecursion = (number) => {
72
72
// Using Matrix exponentiation to find n-th fibonacci in O(log n) time
73
73
74
74
const copyMatrix = ( A ) => {
75
- return A . map ( row => row . map ( cell => cell ) ) ;
75
+ return A . map ( row => row . map ( cell => cell ) )
76
76
}
77
77
78
78
const Identity = ( size ) => {
79
- const I = Array ( size ) . fill ( null ) . map ( ( ) => Array ( size ) . fill ( ) ) ;
79
+ const I = Array ( size ) . fill ( null ) . map ( ( ) => Array ( size ) . fill ( ) )
80
80
return I . map ( ( row , rowIdx ) => row . map ( ( _col , colIdx ) => {
81
81
return rowIdx === colIdx ? 1 : 0
82
82
} ) )
@@ -90,12 +90,12 @@ const matrixMultiply = (A, B) => {
90
90
const l = A . length
91
91
const m = B . length
92
92
const n = B [ 0 ] . length // Assuming non-empty matrices
93
- const C = Array ( l ) . fill ( null ) . map ( ( ) => Array ( n ) . fill ( ) ) ;
94
- for ( let i = 0 ; i < l ; i ++ ) {
95
- for ( let j = 0 ; j < n ; j ++ ) {
93
+ const C = Array ( l ) . fill ( null ) . map ( ( ) => Array ( n ) . fill ( ) )
94
+ for ( let i = 0 ; i < l ; i ++ ) {
95
+ for ( let j = 0 ; j < n ; j ++ ) {
96
96
C [ i ] [ j ] = 0
97
- for ( let k = 0 ; k < m ; k ++ ) {
98
- C [ i ] [ j ] += A [ i ] [ k ] * B [ k ] [ j ]
97
+ for ( let k = 0 ; k < m ; k ++ ) {
98
+ C [ i ] [ j ] += A [ i ] [ k ] * B [ k ] [ j ]
99
99
}
100
100
}
101
101
}
@@ -105,41 +105,41 @@ const matrixMultiply = (A, B) => {
105
105
// A is a square matrix
106
106
const matrixExpo = ( A , n ) => {
107
107
A = copyMatrix ( A )
108
- if ( n == 0 ) return Identity ( A . length ) // Identity matrix
109
- if ( n == 1 ) return A
108
+ if ( n = == 0 ) return Identity ( A . length ) // Identity matrix
109
+ if ( n = == 1 ) return A
110
110
111
111
// Just like Binary exponentiation mentioned in ./BinaryExponentiationIterative.js
112
112
let result = Identity ( A . length )
113
- while ( n > 0 ) {
114
- if ( n % 2 !== 0 ) result = matrixMultiply ( result , A )
115
- n = Math . floor ( n / 2 )
116
- if ( n > 0 ) A = matrixMultiply ( A , A )
113
+ while ( n > 0 ) {
114
+ if ( n % 2 !== 0 ) result = matrixMultiply ( result , A )
115
+ n = Math . floor ( n / 2 )
116
+ if ( n > 0 ) A = matrixMultiply ( A , A )
117
117
}
118
118
return result
119
119
}
120
120
121
121
const FibonacciMatrixExpo = ( n ) => {
122
122
// F(0) = 0, F(1) = 1
123
123
// F(n) = F(n-1) + F(n-2)
124
- // Consider below matrix multiplication:
124
+ // Consider below matrix multiplication:
125
125
126
126
// | F(n) | |1 1| |F(n-1)|
127
127
// | | = | | * | |
128
128
// |F(n-1)| |1 0| |F(n-2)|
129
129
130
130
// F(n, n-1) = pow(A, n-1) * F(1, 0)
131
131
132
- if ( n === 0 ) return 0 ;
132
+ if ( n === 0 ) return 0
133
133
134
134
const A = [
135
- [ 1 , 1 ] ,
136
- [ 1 , 0 ]
137
- ]
138
- const poweredA = matrixExpo ( A , n - 1 ) // A raise to the power n
135
+ [ 1 , 1 ] ,
136
+ [ 1 , 0 ]
137
+ ]
138
+ const poweredA = matrixExpo ( A , n - 1 ) // A raise to the power n
139
139
let F = [
140
- [ 1 ] ,
141
- [ 0 ]
142
- ]
140
+ [ 1 ] ,
141
+ [ 0 ]
142
+ ]
143
143
F = matrixMultiply ( poweredA , F )
144
144
return F [ 0 ] [ 0 ]
145
145
}
0 commit comments