Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions Dynamic-Programming/FastFibonacciNumber.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/**
* @function fastFibonacci
* @description fastFibonacci is same as fibonacci algorithm by calculating the sum of previous two fibonacci numbers but in O(log(n)).
* @param {Integer} N - The input integer
* @return {Integer} fibonacci of N.
* @see [Fast_Fibonacci_Numbers](https://www.geeksforgeeks.org/fast-doubling-method-to-find-the-nth-fibonacci-number/)
*/

// recursive function that returns (F(n), F(n-1))
const fib = (N) => {
if (N === 0) return [0, 1]
const [a, b] = fib(Math.trunc(N / 2))
const c = a * (b * 2 - a)
const d = a * a + b * b
return N % 2 ? [d, c + d] : [c, d]
}

const fastFibonacci = (N) => {
if (!Number.isInteger(N)) {
throw new TypeError('Input should be integer')
}
return fib(N)[0]
}

export { fastFibonacci }
23 changes: 23 additions & 0 deletions Dynamic-Programming/tests/FastFibonacciNumber.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { fastFibonacci } from '../FastFibonacciNumber'

describe('Testing FibonacciNumber', () => {
const errorCases = ['0', '12', true]

test.each(errorCases)('throws an error if %p is invalid', (input) => {
expect(() => {
fastFibonacci(input)
}).toThrow()
})

const testCases = [
[0, 0],
[1, 1],
[10, 55],
[25, 75025],
[40, 102334155]
]

test.each(testCases)('if input is %i it returns %i', (input, expected) => {
expect(fastFibonacci(input)).toBe(expected)
})
})