From 84b9b6ca50732e19defdc461fb1b7235a629ae24 Mon Sep 17 00:00:00 2001 From: sarthakgupta1907-cell Date: Sat, 7 Nov 2026 11:16:22 +0530 Subject: [PATCH] feat: add Pell number algorithm --- Maths/PellNumber.js | 28 +++++++++++++++++++++ Maths/test/PellNumber.test.js | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 Maths/PellNumber.js create mode 100644 Maths/test/PellNumber.test.js diff --git a/Maths/PellNumber.js b/Maths/PellNumber.js new file mode 100644 index 0000000000..09614b8c6f --- /dev/null +++ b/Maths/PellNumber.js @@ -0,0 +1,28 @@ +/** + * @function pellNumber + * @description Pell numbers are an infinite sequence of integers similar + * to Fibonacci. Each number is the sum of twice the previous number + * and the number before that. + * Sequence: 0, 1, 2, 5, 12, 29, 70, 169... + * @param {number} n - The position in the Pell sequence (0-indexed) + * @returns {number} - The nth Pell number + * @see https://en.wikipedia.org/wiki/Pell_number + * @example pellNumber(0) => 0 + * @example pellNumber(1) => 1 + * @example pellNumber(4) => 12 + */ +const pellNumber = (n) => { + if (!Number.isInteger(n) || n < 0) { + throw new TypeError('Input must be a non-negative integer') + } + if (n === 0) return 0 + if (n === 1) return 1 + let a = 0 + let b = 1 + for (let i = 2; i <= n; i++) { + ;[a, b] = [b, 2 * b + a] + } + return b +} + +export { pellNumber } diff --git a/Maths/test/PellNumber.test.js b/Maths/test/PellNumber.test.js new file mode 100644 index 0000000000..f45dc3e9fa --- /dev/null +++ b/Maths/test/PellNumber.test.js @@ -0,0 +1,47 @@ +import { pellNumber } from '../PellNumber.js' + +describe('pellNumber', () => { + test('pellNumber(0) returns 0', () => { + expect(pellNumber(0)).toBe(0) + }) + + test('pellNumber(1) returns 1', () => { + expect(pellNumber(1)).toBe(1) + }) + + test('pellNumber(2) returns 2', () => { + expect(pellNumber(2)).toBe(2) + }) + + test('pellNumber(3) returns 5', () => { + expect(pellNumber(3)).toBe(5) + }) + + test('pellNumber(4) returns 12', () => { + expect(pellNumber(4)).toBe(12) + }) + + test('pellNumber(5) returns 29', () => { + expect(pellNumber(5)).toBe(29) + }) + + test('pellNumber(6) returns 70', () => { + expect(pellNumber(6)).toBe(70) + }) + + test('pellNumber(7) returns 169', () => { + expect(pellNumber(7)).toBe(169) + }) + + test('throws TypeError for negative input', () => { + expect(() => pellNumber(-1)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => pellNumber(1.5)).toThrow(TypeError) + }) + + test('throws TypeError for string input', () => { + expect(() => pellNumber('4')).toThrow(TypeError) + }) +})