Skip to content

Commit 93064ae

Browse files
authored
Update fibonacci_fast.cpp
Modify the fibonacci_fast.cpp to fit the project style requirements.
1 parent 649a145 commit 93064ae

File tree

1 file changed

+129
-23
lines changed

1 file changed

+129
-23
lines changed

math/fibonacci_fast.cpp

Lines changed: 129 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,41 @@
11
/**
22
* @file
3-
* @brief Faster computation of Fibonacci series
3+
* @brief Faster computation of Fibonacci series.
44
*
5+
* @details
56
* 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
89
* cannot be stored in a single long long variable, we can only use it till 92nd
910
* fibonacci we can use it for 10000th fibonacci etc, if we implement
1011
* 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
1213
* of fibonacci similar to matrix exponentiation.
1314
*
14-
* \author [Krishna Vedala](https://github.com/kvedala)
15+
* @author [Krishna Vedala](https://github.com/kvedala)
1516
* @see fibonacci_large.cpp, fibonacci.cpp, string_fibonacci.cpp
1617
*/
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
2121

2222
/**
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.
2527
*/
26-
2728
#define MAX 93
2829

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+
*/
3035
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;
3439

3540
if (n <= 2)
3641
return f2;
@@ -39,19 +44,120 @@ uint64_t fib(uint64_t n) {
3944
<< "Cannot compute for n>93 due to limit of 64-bit integers\n";
4045
return 0;
4146
}
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;
4450
f2 += f1;
4551
f1 = temp;
4652

4753
return f2;
4854
}
4955

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+
*/
51160
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
56162
return 0;
57163
}

0 commit comments

Comments
 (0)