From d5a4ebe8913bcac698db5e16ec31054850a7dd96 Mon Sep 17 00:00:00 2001 From: sarthakgupta1907-cell Date: Sat, 7 Nov 2026 18:07:16 +0530 Subject: [PATCH] feat: add Bell number algorithm --- Maths/BellNumber.js | 28 +++++++++++++++++++++ Maths/test/BellNumber.test.js | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 Maths/BellNumber.js create mode 100644 Maths/test/BellNumber.test.js diff --git a/Maths/BellNumber.js b/Maths/BellNumber.js new file mode 100644 index 0000000000..f82a439968 --- /dev/null +++ b/Maths/BellNumber.js @@ -0,0 +1,28 @@ +/** + * @function bellNumber + * @description Bell numbers count the number of ways to partition a set. + * They are computed using Bell triangle. + * Sequence: 1, 1, 2, 5, 15, 52, 203, 877... + * @param {number} n - The position in the Bell sequence (0-indexed) + * @returns {number} - The nth Bell number + * @see https://en.wikipedia.org/wiki/Bell_number + * @example bellNumber(0) => 1 + * @example bellNumber(3) => 5 + * @example bellNumber(5) => 52 + */ +const bellNumber = (n) => { + if (!Number.isInteger(n) || n < 0) { + throw new TypeError('Input must be a non-negative integer') + } + const triangle = [[1]] + for (let i = 1; i <= n; i++) { + const row = [triangle[i - 1][i - 1]] + for (let j = 1; j <= i; j++) { + row.push(row[j - 1] + triangle[i - 1][j - 1]) + } + triangle.push(row) + } + return triangle[n][0] +} + +export { bellNumber } diff --git a/Maths/test/BellNumber.test.js b/Maths/test/BellNumber.test.js new file mode 100644 index 0000000000..17305f6ca0 --- /dev/null +++ b/Maths/test/BellNumber.test.js @@ -0,0 +1,47 @@ +import { bellNumber } from '../BellNumber.js' + +describe('bellNumber', () => { + test('bellNumber(0) returns 1', () => { + expect(bellNumber(0)).toBe(1) + }) + + test('bellNumber(1) returns 1', () => { + expect(bellNumber(1)).toBe(1) + }) + + test('bellNumber(2) returns 2', () => { + expect(bellNumber(2)).toBe(2) + }) + + test('bellNumber(3) returns 5', () => { + expect(bellNumber(3)).toBe(5) + }) + + test('bellNumber(4) returns 15', () => { + expect(bellNumber(4)).toBe(15) + }) + + test('bellNumber(5) returns 52', () => { + expect(bellNumber(5)).toBe(52) + }) + + test('bellNumber(6) returns 203', () => { + expect(bellNumber(6)).toBe(203) + }) + + test('bellNumber(7) returns 877', () => { + expect(bellNumber(7)).toBe(877) + }) + + test('throws TypeError for negative input', () => { + expect(() => bellNumber(-1)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => bellNumber(1.5)).toThrow(TypeError) + }) + + test('throws TypeError for string input', () => { + expect(() => bellNumber('3')).toThrow(TypeError) + }) +})