diff --git a/code_to_optimize/java/src/main/java/com/example/Algorithms.java b/code_to_optimize/java/src/main/java/com/example/Algorithms.java index bc976d3c3..085eed26b 100644 --- a/code_to_optimize/java/src/main/java/com/example/Algorithms.java +++ b/code_to_optimize/java/src/main/java/com/example/Algorithms.java @@ -18,7 +18,40 @@ public long fibonacci(int n) { if (n <= 1) { return n; } - return fibonacci(n - 1) + fibonacci(n - 2); + // For small n, a simple iterative loop is cheaper than the bit-based fast-doubling setup. + if (n < 50) { + long prev = 0L; + long curr = 1L; + for (int i = 2; i <= n; ++i) { + long next = prev + curr; + prev = curr; + curr = next; + } + return curr; + } + + // Use iterative fast-doubling method to compute F(n) in O(log n) time. + long a = 0L; // F(0) + long b = 1L; // F(1) + + int highestBit = 31 - Integer.numberOfLeadingZeros(n); + int bit = 1 << highestBit; + for (; bit != 0; bit >>= 1) { + // c = F(2k) = a * (2*b - a) + long twoBminusA = (b << 1) - a; + long c = a * twoBminusA; + // d = F(2k+1) = a*a + b*b + long d = a * a + b * b; + + if ((n & bit) == 0) { + a = c; + b = d; + } else { + a = d; + b = c + d; + } + } + return a; } /**