1
1
const list = [ ]
2
-
2
+ // https://en.wikipedia.org/wiki/Generalizations_of_Fibonacci_numbers#Extension_to_negative_integers
3
3
const FibonacciIterative = ( nth ) => {
4
- const sequence = [ ]
4
+ const sign = nth < 0
5
+ if ( sign ) n = - n
6
+ const sequence = [ 0 ]
5
7
6
8
if ( nth >= 1 ) sequence . push ( 1 )
7
- if ( nth >= 2 ) sequence . push ( 1 )
9
+ if ( nth >= 2 ) sequence . push ( sign ? - 1 : 1 )
8
10
9
11
for ( let i = 2 ; i < nth ; i ++ ) {
10
- sequence . push ( sequence [ i - 1 ] + sequence [ i - 2 ] )
12
+ sequence . push (
13
+ sign ?
14
+ sequence [ i - 2 ] - sequence [ i - 1 ]
15
+ :
16
+ sequence [ i - 1 ] + sequence [ i - 2 ]
17
+ )
11
18
}
12
19
13
20
return sequence
@@ -17,15 +24,21 @@ const FibonacciRecursive = (number) => {
17
24
return ( ( ) => {
18
25
switch ( list . length ) {
19
26
case 0 :
20
- list . push ( 1 )
27
+ list . push ( 0 )
21
28
return FibonacciRecursive ( number )
22
29
case 1 :
23
30
list . push ( 1 )
24
31
return FibonacciRecursive ( number )
25
32
case number :
26
33
return list
27
34
default :
28
- list . push ( list [ list . length - 1 ] + list [ list . length - 2 ] )
35
+ const sign = number < 0
36
+ list . push (
37
+ sign ?
38
+ list . at ( - 2 ) - list . at ( - 1 )
39
+ :
40
+ list . at ( - 1 ) + list . at ( - 2 )
41
+ )
29
42
return FibonacciRecursive ( number )
30
43
}
31
44
} ) ( )
@@ -34,14 +47,18 @@ const FibonacciRecursive = (number) => {
34
47
const dict = new Map ( )
35
48
36
49
const FibonacciRecursiveDP = ( stairs ) => {
37
- if ( stairs <= 0 ) return 0
50
+ const sign = stairs < 0
51
+ if ( sign ) stairs *= - 1
52
+
53
+ if ( stairs === 0 ) return 0
38
54
if ( stairs === 1 ) return 1
39
55
40
56
// Memoize stair count
41
57
if ( dict . has ( stairs ) ) return dict . get ( stairs )
42
58
43
- const res =
44
- FibonacciRecursiveDP ( stairs - 1 ) + FibonacciRecursiveDP ( stairs - 2 )
59
+ const res = sign
60
+ ?FibonacciRecursiveDP ( stairs - 2 ) - FibonacciRecursiveDP ( stairs - 1 )
61
+ :FibonacciRecursiveDP ( stairs - 1 ) + FibonacciRecursiveDP ( stairs - 2 )
45
62
46
63
dict . set ( stairs , res )
47
64
@@ -60,11 +77,18 @@ const FibonacciRecursiveDP = (stairs) => {
60
77
//@Satzyakiz
61
78
62
79
const FibonacciDpWithoutRecursion = ( number ) => {
63
- const table = [ ]
64
- table . push ( 1 )
80
+ const sgn = number < 0
81
+ if ( sgn ) number *= - 1
82
+ const table = [ 0 ]
65
83
table . push ( 1 )
84
+ table . push ( sgn ?- 1 :1 )
66
85
for ( let i = 2 ; i < number ; ++ i ) {
67
- table . push ( table [ i - 1 ] + table [ i - 2 ] )
86
+ table . push (
87
+ sgn ?
88
+ table [ i - 2 ] - table [ i - 1 ]
89
+ :
90
+ table [ i - 1 ] + table [ i - 2 ]
91
+ )
68
92
}
69
93
return table
70
94
}
@@ -75,10 +99,11 @@ const copyMatrix = (A) => {
75
99
return A . map ( row => row . map ( cell => cell ) )
76
100
}
77
101
78
- // the 2nd param is to generate a "BigInt-safe" matrix
79
- const Identity = ( size , bigint ) => {
80
- const ZERO = bigint ?0n :0
81
- const ONE = bigint ?1n :1
102
+ const Identity = ( size ) => {
103
+ const isBigInt = typeof size === 'bigint'
104
+ const ZERO = isBigInt ?0n :0
105
+ const ONE = isBigInt ?1n :1
106
+ size = Number ( size )
82
107
const I = Array ( size ) . fill ( null ) . map ( ( ) => Array ( size ) . fill ( ) )
83
108
return I . map ( ( row , rowIdx ) => row . map ( ( _col , colIdx ) => {
84
109
return rowIdx === colIdx ?ONE :ZERO
@@ -164,7 +189,6 @@ const FibonacciMatrixExpo = (n) => {
164
189
[ ZERO ]
165
190
]
166
191
F = matrixMultiply ( poweredA , F )
167
- // https://en.wikipedia.org/wiki/Generalizations_of_Fibonacci_numbers#Extension_to_negative_integers
168
192
return F [ 0 ] [ 0 ] * ( sign ?( - ONE ) ** ( n + ONE ) :ONE )
169
193
}
170
194