diff --git a/Project-Euler/Problem025.js b/Project-Euler/Problem025.js new file mode 100644 index 000000000..236ef90e6 --- /dev/null +++ b/Project-Euler/Problem025.js @@ -0,0 +1,45 @@ +/** +* Problem 25 - 1000-digit Fibonacci number +* +* @see {@link https://projecteuler.net/problem=25} +* +* The Fibonacci sequence is defined by the recurrence relation: +* +* Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1. +* +* Hence the first 12 terms will be: +* +* F1 = 1 +* F2 = 1 +* F3 = 2 +* F4 = 3 +* F5 = 5 +* F6 = 8 +* F7 = 13 +* F8 = 21 +* F9 = 34 +* F10 = 55 +* F11 = 89 +* F12 = 144 +* The 12th term, F12, is the first term to contain three digits. + +* What is the index of the first term in the Fibonacci sequence to contain 1000 digits? +*/ + +// brute force method + +function fibonacciIndex(t = 1000) { + let digits = 10n**BigInt(t-1), + fib0 = BigInt(0), + fib1 = BigInt(1), + index = 1 + while (fib1 < digits) { // using this to compare number of digits instead of .toString() significantly improved run time + const tempfib = fib1 + fib1 = fib1 + fib0 + fib0 = tempfib + index += 1 + } + return(index) +} + +export { fibonacciIndex } diff --git a/Project-Euler/test/Problem025.test.js b/Project-Euler/test/Problem025.test.js new file mode 100644 index 000000000..e5b0627e1 --- /dev/null +++ b/Project-Euler/test/Problem025.test.js @@ -0,0 +1,27 @@ +import { fibonacciIndex } from '../Problem025' + +describe ('Check Problem 25 - 1000 digit Fibonnaci number', () => { + it('First term of the Fibonnaci sequence containing 3 digits', () => { + expect(fibonacciIndex(3)).toBe(12) + }) + + it('First term of the Fibonnaci sequence containing 10 digits', () => { + expect(fibonacciIndex(10)).toBe(45) + }) + + it('First term of the Fibonnaci sequence containing 50 digits', () => { + expect(fibonacciIndex(50)).toBe(237) + }) + + it('First term of the Fibonnaci sequence containing 100 digits', () => { + expect(fibonacciIndex(100)).toBe(476) + }) + + it('First term of the Fibonnaci sequence containing 1000 digits', () => { + expect(fibonacciIndex(1000)).toBe(4782) + }) + + it('First term of the Fibonnaci sequence containing 10000 digits', () => { + expect(fibonacciIndex(10000)).toBe(47847) + }) +})