diff --git a/Project-Euler/Problem044.js b/Project-Euler/Problem044.js new file mode 100644 index 000000000..04d531d56 --- /dev/null +++ b/Project-Euler/Problem044.js @@ -0,0 +1,44 @@ +/** + * Problem 44 - Pentagon numbers + * + * @see {@link https://projecteuler.net/problem=44} + * + * Pentagonal numbers are generated by the formula, Pn=n(3nāˆ’1)/2. The first ten pentagonal numbers are: + * 1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ... + * It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference, 70 āˆ’ 22 = 48, is not pentagonal. + * Find the pair of pentagonal numbers, Pj and Pk, for which their sum and difference are pentagonal and D = |Pk āˆ’ Pj| is minimised; what is the value of D? + * + * @author ddaniel27 + */ + +function problem44 (k) { + if (k < 1) { + throw new Error('Invalid Input') + } + + while (true) { + k++ + const n = k * (3 * k - 1) / 2 // calculate Pk + + for (let j = k - 1; j > 0; j--) { + const m = j * (3 * j - 1) / 2 // calculate all Pj < Pk + if (isPentagonal(n - m) && isPentagonal(n + m)) { // Check sum and difference + return n - m // return D + } + } + } +} + +/** + * Function to check if a number is pentagonal or not + * This function solves n + * applying the solution for a quadratic function + * @see {@link https://en.wikipedia.org/wiki/Quadratic_function} + */ + +function isPentagonal (n) { + const pent = (Math.sqrt(24 * n + 1) + 1) / 6 + return pent === Math.floor(pent) +} + +export { problem44 } diff --git a/Project-Euler/test/Problem044.test.js b/Project-Euler/test/Problem044.test.js new file mode 100644 index 000000000..bf6cccd60 --- /dev/null +++ b/Project-Euler/test/Problem044.test.js @@ -0,0 +1,18 @@ +import { problem44 } from '../Problem044.js' + +describe('checking nth prime number', () => { + it('should be invalid input if number is negative', () => { + expect(() => problem44(-3)).toThrowError('Invalid Input') + }) + it('should be invalid input if number is 0', () => { + expect(() => problem44(0)).toThrowError('Invalid Input') + }) + // Project Euler Condition Check + test('if the number is greater or equal to 1', () => { + expect(problem44(1)).toBe(5482660) + }) + // Project Euler Second Value for Condition Check + test('if the number is greater or equal to 2167', () => { + expect(problem44(2167)).toBe(8476206790) + }) +})