diff --git a/DIRECTORY.md b/DIRECTORY.md index dc439d495..5f668918c 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -268,6 +268,7 @@ * **Sorts** * [AlphaNumericalSort](Sorts/AlphaNumericalSort.js) * [BeadSort](Sorts/BeadSort.js) + * [BinaryInsertionSort](Sorts/BinaryInsertionSort.js) * [BogoSort](Sorts/BogoSort.js) * [BubbleSort](Sorts/BubbleSort.js) * [BucketSort](Sorts/BucketSort.js) diff --git a/Project-Euler/Problem002.js b/Project-Euler/Problem002.js index 5b8c3ddd5..065a3a9f6 100644 --- a/Project-Euler/Problem002.js +++ b/Project-Euler/Problem002.js @@ -5,8 +5,10 @@ const PHI = (1 + SQ5) / 2 // definition of PHI // theoretically it should take O(1) constant amount of time as long // arithmetic calculations are considered to be in constant amount of time export const EvenFibonacci = (limit) => { + if (limit < 1) throw new Error('Fibonacci sequence limit can\'t be less than 1') + const highestIndex = Math.floor(Math.log(limit * SQ5) / Math.log(PHI)) const n = Math.floor(highestIndex / 3) - return ((PHI ** (3 * n + 3) - 1) / (PHI ** 3 - 1) - - ((1 - PHI) ** (3 * n + 3) - 1) / ((1 - PHI) ** 3 - 1)) / SQ5 + return Math.floor(((PHI ** (3 * n + 3) - 1) / (PHI ** 3 - 1) - + ((1 - PHI) ** (3 * n + 3) - 1) / ((1 - PHI) ** 3 - 1)) / SQ5) } diff --git a/Project-Euler/test/Problem002.test.js b/Project-Euler/test/Problem002.test.js new file mode 100644 index 000000000..bccd770b4 --- /dev/null +++ b/Project-Euler/test/Problem002.test.js @@ -0,0 +1,14 @@ +import { EvenFibonacci } from '../Problem002' + +describe('Even Fibonacci numbers', () => { + it('should throw error when limit is less than 1', () => { + expect(() => EvenFibonacci(-1)).toThrowError('Fibonacci sequence limit can\'t be less than 1') + }) + test('when limit is greater than 0', () => { + expect(EvenFibonacci(40)).toBe(44) + }) + // Project Euler Condition Check + test('when limit is 4 million', () => { + expect(EvenFibonacci(4e6)).toBe(4613732) + }) +})