1
1
/* *
2
2
* @file
3
- * @brief Faster computation of Fibonacci series
3
+ * @brief Faster computation of Fibonacci series.
4
4
*
5
+ * @details
5
6
* An efficient way to calculate nth fibonacci number faster and simpler than
6
- * \f$O(n\log n)\f$ method of matrix exponentiation This works by using both
7
- * recursion and dynamic programming. as 93rd fibonacci exceeds 19 digits, which
7
+ * \f$O(n\log n)\f$ method of matrix exponentiation. This works by using both
8
+ * recursion and dynamic programming. As 93rd fibonacci exceeds 19 digits, which
8
9
* cannot be stored in a single long long variable, we can only use it till 92nd
9
10
* fibonacci we can use it for 10000th fibonacci etc, if we implement
10
11
* bigintegers. This algorithm works with the fact that nth fibonacci can easily
11
- * found if we have already found n/2th or (n+1)/2th fibonacci It is a property
12
+ * found if we have already found \f$n/2\f$th or \f$ (n+1)/2\f$th fibonacci. It is a property
12
13
* of fibonacci similar to matrix exponentiation.
13
14
*
14
- * \ author [Krishna Vedala](https://github.com/kvedala)
15
+ * @ author [Krishna Vedala](https://github.com/kvedala)
15
16
* @see fibonacci_large.cpp, fibonacci.cpp, string_fibonacci.cpp
16
17
*/
17
-
18
- #include < cinttypes>
19
- #include < cstdio>
20
- #include < iostream>
18
+ #include < cinttypes> // / for uint64_t
19
+ #include < cstdio> // / for standard IO
20
+ #include < iostream> // / for IO operations
21
21
22
22
/* *
23
- * maximum number that can be computed - The result after 93 cannot be stored
24
- * in a `uint64_t` data type.
23
+ * @brief Maximum Fibonacci number that can be computed
24
+ *
25
+ * @details
26
+ * The result after 93 cannot be stored in a `uint64_t` data type.
25
27
*/
26
-
27
28
#define MAX 93
28
29
29
- /* * Algorithm */
30
+ /* *
31
+ * @brief Function to compute the nth Fibonacci number
32
+ * @param n The index of the Fibonacci number to compute
33
+ * @return uint64_t The nth Fibonacci number
34
+ */
30
35
uint64_t fib (uint64_t n) {
31
- static uint64_t f1 = 1 ,
32
- f2 = 1 ; // using static keyword will retain the values of
33
- // f1 and f2 for the next function call.
36
+ // Using static keyword will retain the values of
37
+ // f1 and f2 for the next function call.
38
+ static uint64_t f1 = 1 , f2 = 1 ;
34
39
35
40
if (n <= 2 )
36
41
return f2;
@@ -39,19 +44,120 @@ uint64_t fib(uint64_t n) {
39
44
<< " Cannot compute for n>93 due to limit of 64-bit integers\n " ;
40
45
return 0 ;
41
46
}
42
-
43
- uint64_t temp = f2; // we do not need temp to be static
47
+
48
+ // We do not need temp to be static.
49
+ uint64_t temp = f2;
44
50
f2 += f1;
45
51
f1 = temp;
46
52
47
53
return f2;
48
54
}
49
55
50
- /* * Main function */
56
+ /* *
57
+ * @brief Function to test the Fibonacci computation
58
+ * @returns void
59
+ */
60
+ static void test () {
61
+ assert (fib (1 ) == 1 );
62
+ assert (fib (2 ) == 1 );
63
+ assert (fib (3 ) == 2 );
64
+ assert (fib (4 ) == 3 );
65
+ assert (fib (5 ) == 5 );
66
+ assert (fib (6 ) == 8 );
67
+ assert (fib (7 ) == 13 );
68
+ assert (fib (8 ) == 21 );
69
+ assert (fib (9 ) == 34 );
70
+ assert (fib (10 ) == 55 );
71
+ assert (fib (11 ) == 89 );
72
+ assert (fib (12 ) == 144 );
73
+ assert (fib (13 ) == 233 );
74
+ assert (fib (14 ) == 377 );
75
+ assert (fib (15 ) == 610 );
76
+ assert (fib (16 ) == 987 );
77
+ assert (fib (17 ) == 1597 );
78
+ assert (fib (18 ) == 2584 );
79
+ assert (fib (19 ) == 4181 );
80
+ assert (fib (20 ) == 6765 );
81
+ assert (fib (21 ) == 10946 );
82
+ assert (fib (22 ) == 17711 );
83
+ assert (fib (23 ) == 28657 );
84
+ assert (fib (24 ) == 46368 );
85
+ assert (fib (25 ) == 75025 );
86
+ assert (fib (26 ) == 121393 );
87
+ assert (fib (27 ) == 196418 );
88
+ assert (fib (28 ) == 317811 );
89
+ assert (fib (29 ) == 514229 );
90
+ assert (fib (30 ) == 832040 );
91
+ assert (fib (31 ) == 1346269 );
92
+ assert (fib (32 ) == 2178309 );
93
+ assert (fib (33 ) == 3524578 );
94
+ assert (fib (34 ) == 5702887 );
95
+ assert (fib (35 ) == 9227465 );
96
+ assert (fib (36 ) == 14930352 );
97
+ assert (fib (37 ) == 24157817 );
98
+ assert (fib (38 ) == 39088169 );
99
+ assert (fib (39 ) == 63245986 );
100
+ assert (fib (40 ) == 102334155 );
101
+ assert (fib (41 ) == 165580141 );
102
+ assert (fib (42 ) == 267914296 );
103
+ assert (fib (43 ) == 433494437 );
104
+ assert (fib (44 ) == 701408733 );
105
+ assert (fib (45 ) == 1134903170 );
106
+ assert (fib (46 ) == 1836311903 );
107
+ assert (fib (47 ) == 2971215073 );
108
+ assert (fib (48 ) == 4807526976 );
109
+ assert (fib (49 ) == 7778742049 );
110
+ assert (fib (50 ) == 12586269025 );
111
+ assert (fib (51 ) == 20365011074 );
112
+ assert (fib (52 ) == 32951280099 );
113
+ assert (fib (53 ) == 53316291173 );
114
+ assert (fib (54 ) == 86267571272 );
115
+ assert (fib (55 ) == 139583862445 );
116
+ assert (fib (56 ) == 225851433717 );
117
+ assert (fib (57 ) == 365435296162 );
118
+ assert (fib (58 ) == 591286729879 );
119
+ assert (fib (59 ) == 956722026041 );
120
+ assert (fib (60 ) == 1548008755920 );
121
+ assert (fib (61 ) == 2504730781961 );
122
+ assert (fib (62 ) == 4052739537881 );
123
+ assert (fib (63 ) == 6557470319842 );
124
+ assert (fib (64 ) == 10610209857723 );
125
+ assert (fib (65 ) == 17167680177565 );
126
+ assert (fib (66 ) == 27777890035288 );
127
+ assert (fib (67 ) == 44945570212853 );
128
+ assert (fib (68 ) == 72723460248141 );
129
+ assert (fib (69 ) == 117669030460994 );
130
+ assert (fib (70 ) == 190392490709135 );
131
+ assert (fib (71 ) == 308061521170129 );
132
+ assert (fib (72 ) == 498454011879264 );
133
+ assert (fib (73 ) == 806515533049393 );
134
+ assert (fib (74 ) == 1304969544928657 );
135
+ assert (fib (75 ) == 2111485077978050 );
136
+ assert (fib (76 ) == 3416454622906707 );
137
+ assert (fib (77 ) == 5527939700884757 );
138
+ assert (fib (78 ) == 8944394323791464 );
139
+ assert (fib (79 ) == 14472334024676221 );
140
+ assert (fib (80 ) == 23416728348467685 );
141
+ assert (fib (81 ) == 37889062373143906 );
142
+ assert (fib (82 ) == 61305790721611591 );
143
+ assert (fib (83 ) == 99194853094755497 );
144
+ assert (fib (84 ) == 160500643816367088 );
145
+ assert (fib (85 ) == 259695496911122585 );
146
+ assert (fib (86 ) == 420196140727489673 );
147
+ assert (fib (87 ) == 679891637638612258 );
148
+ assert (fib (88 ) == 1100087778366101931 );
149
+ assert (fib (89 ) == 1779979416004714189 );
150
+ assert (fib (90 ) == 2880067194370816120 );
151
+ assert (fib (91 ) == 4660046610375530309 );
152
+ assert (fib (92 ) == 7540113804746346429 );
153
+ std::cout << " All Fibonacci tests have successfully passed!\n " ;
154
+ }
155
+
156
+ /* *
157
+ * @brief Main Function
158
+ * @returns 0 on exit
159
+ */
51
160
int main () {
52
- // Main Function
53
- for (uint64_t i = 1 ; i < 93 ; i++) {
54
- std::cout << i << " th fibonacci number is " << fib (i) << std::endl;
55
- }
161
+ test (); // run self-test implementations
56
162
return 0 ;
57
163
}
0 commit comments