From 0a914f5ec2e6f79cfdcb26f619ada6e3470fd9ec Mon Sep 17 00:00:00 2001 From: sarthakgupta1907-cell Date: Sat, 7 Nov 2026 02:00:51 +0530 Subject: [PATCH] feat: add power (exponentiation by squaring) algorithm --- Maths/Power.js | 29 +++++++++++++++++++++++ Maths/test/Power.test.js | 51 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 Maths/Power.js create mode 100644 Maths/test/Power.test.js diff --git a/Maths/Power.js b/Maths/Power.js new file mode 100644 index 0000000000..c10b5e93a1 --- /dev/null +++ b/Maths/Power.js @@ -0,0 +1,29 @@ +/** + * @function power + * @description Calculates base raised to the power of exponent + * without using JavaScript's built-in Math.pow() or ** operator. + * Uses fast exponentiation (exponentiation by squaring). + * @param {number} base - The base number + * @param {number} exponent - A non-negative integer exponent + * @returns {number} - base raised to the power of exponent + * @see https://en.wikipedia.org/wiki/Exponentiation_by_squaring + * @example power(2, 10) => 1024 + * @example power(3, 4) => 81 + * @example power(5, 0) => 1 + */ +const power = (base, exponent) => { + if (typeof base !== 'number' || isNaN(base)) { + throw new TypeError('Base must be a number') + } + if (!Number.isInteger(exponent) || exponent < 0) { + throw new TypeError('Exponent must be a non-negative integer') + } + if (exponent === 0) return 1 + if (exponent % 2 === 0) { + const half = power(base, exponent / 2) + return half * half + } + return base * power(base, exponent - 1) +} + +export { power } diff --git a/Maths/test/Power.test.js b/Maths/test/Power.test.js new file mode 100644 index 0000000000..133e192b3f --- /dev/null +++ b/Maths/test/Power.test.js @@ -0,0 +1,51 @@ +import { power } from '../Power.js' + +describe('power', () => { + test('power(2, 0) returns 1', () => { + expect(power(2, 0)).toBe(1) + }) + + test('power(2, 1) returns 2', () => { + expect(power(2, 1)).toBe(2) + }) + + test('power(2, 10) returns 1024', () => { + expect(power(2, 10)).toBe(1024) + }) + + test('power(3, 4) returns 81', () => { + expect(power(3, 4)).toBe(81) + }) + + test('power(5, 0) returns 1', () => { + expect(power(5, 0)).toBe(1) + }) + + test('power(10, 3) returns 1000', () => { + expect(power(10, 3)).toBe(1000) + }) + + test('power(0, 5) returns 0', () => { + expect(power(0, 5)).toBe(0) + }) + + test('power(1, 100) returns 1', () => { + expect(power(1, 100)).toBe(1) + }) + + test('power with negative base', () => { + expect(power(-2, 3)).toBe(-8) + }) + + test('throws TypeError for non-number base', () => { + expect(() => power('2', 3)).toThrow(TypeError) + }) + + test('throws TypeError for negative exponent', () => { + expect(() => power(2, -1)).toThrow(TypeError) + }) + + test('throws TypeError for float exponent', () => { + expect(() => power(2, 1.5)).toThrow(TypeError) + }) +})