Efficiently Determining Fibonacci Numbers in JavaScript
Written on
Chapter 1 Understanding Fibonacci Numbers
To kick things off, let’s clarify what Fibonacci numbers are. The Fibonacci sequence is a series of integers where each number is the sum of the two preceding ones, starting with 0 and 1. Thus, the sequence begins as follows:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233.
The Obvious Approach
A straightforward method to determine if a number is in the Fibonacci sequence involves generating the series until reaching the target number. Here’s how this can be implemented:
const isFibonacci = (n) => {
let a = 0;
let b = 1;
if (n === a || n === b) {
return true;}
let c = a + b;
while (c <= n) {
if (c === n) return true;
a = b;
b = c;
c = a + b;
}
return false;
};
However, this method becomes increasingly inefficient as the number grows larger, making it impractical for real-world applications.
A More Efficient Solution
To improve efficiency, we can leverage the properties of the Fibonacci sequence. The formula derived by the French mathematician Jacques Philippe Marie Binet allows us to compute the nth Fibonacci number:
F(n) = (φ^n — (1-φ)^n) / sqrt(5)
where φ (phi) is the golden ratio, approximately equal to 1.61803398875. Here’s a JavaScript function that applies Binet's formula:
const fibonacci = (n) => {
const phi = (1 + Math.sqrt(5)) / 2;
return Math.round(
(Math.pow(phi, n + 1) - Math.pow(1 - phi, n + 1)) / Math.sqrt(5));
};
Alternatively, you can use this version:
const fibonacci = (n) => {
const x = n - 1;
const sqr = Math.sqrt(5);
const a = Math.pow(1 + sqr, x);
const b = Math.pow(1 - sqr, x);
const c = Math.pow(2, x) * sqr;
return Math.round((a - b) / c);
};
To check if a number belongs to the Fibonacci series, we can derive a formula:
If (5 * N² + 4) or (5 * N² — 4) is a perfect square, then N is a Fibonacci number.
Here’s how to implement this logic:
const isFibonacci = (n) => {
const x1 = 5 * n ** 2 + 4;
const x2 = 5 * n ** 2 - 4;
return Number.isInteger(Math.sqrt(x1)) || Number.isInteger(Math.sqrt(x2));
};
Example usage:
console.log(isFibonacci(13)); // Output: true
You can also write the function more succinctly:
const isFibonacci = (n) =>
Number.isInteger(Math.sqrt(5 * n ** 2 + 4)) ||
Number.isInteger(Math.sqrt(5 * n ** 2 - 4));
Finding the Position of a Fibonacci Number
Next, let's create a function to determine the position of a Fibonacci number in the series. The simplest approach, although resource-intensive, is as follows:
const fibonacciPosition = (n) => {
let position = 0;
let current = 0;
let next = 1;
while (current < n) {
position++;
let temp = current;
current = next;
next = temp + current;
}
return current === n ? position + 1 : -1;
};
A more optimized method using Binet's formula is:
const fibonacciPosition = (n) => {
const phi = (1 + Math.sqrt(5)) / 2;
const position = Math.log(n * Math.sqrt(5) + 0.5) / Math.log(phi);
return Math.floor(position) + 1;
};
However, we should account for the first two Fibonacci numbers:
const fibonacciPosition = (n) => {
if (n === 0) return 1;
if (n === 1) return 2;
const phi = (1 + Math.sqrt(5)) / 2;
const position = Math.log(n * Math.sqrt(5) + 0.5) / Math.log(phi);
return Math.floor(position) + 1;
};
Finally, it’s best to check if the number is a Fibonacci number before any calculations:
const fibonacciPosition = (n) => {
if (!isFibonacci(n)) return -1;
if (n === 0) return 1;
if (n === 1) return 2;
const phi = (1 + Math.sqrt(5)) / 2;
const position = Math.log(n * Math.sqrt(5) + 0.5) / Math.log(phi);
return Math.floor(position) + 1;
};
In conclusion, we have successfully implemented JavaScript functions to calculate the nth Fibonacci number and check if a number is a Fibonacci number.
Stay tuned for more insightful articles!
This video explores the process of checking if a number is a Fibonacci number using programming techniques.
In this video, you’ll learn how to determine if a given number belongs to the Fibonacci series.