From c1c895bebd532a5943b85460cc498d656bec2fcd Mon Sep 17 00:00:00 2001 From: YATIN KATHURIA <47096348+Yatin-kathuria@users.noreply.github.com> Date: Fri, 19 Nov 2021 10:40:51 +0530 Subject: [PATCH] chore: Add PowLogarithmic in Math (#836) * Add PowLogarithmic in Math * add description --- Maths/PowLogarithmic.js | 26 ++++++++++++++++++++++++++ Maths/test/PowLogarithmic.test.js | 15 +++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 Maths/PowLogarithmic.js create mode 100644 Maths/test/PowLogarithmic.test.js diff --git a/Maths/PowLogarithmic.js b/Maths/PowLogarithmic.js new file mode 100644 index 000000000..ff57d14ef --- /dev/null +++ b/Maths/PowLogarithmic.js @@ -0,0 +1,26 @@ +import { isEven } from './IsEven' + +/** + * This algorithm is divide the n by 2 every time and pass this to recursive call to find the result of smaller result. + * why? Because + * x^n => [if n is even] x^(n / 2) * x^(n / 2) (example : 7^4 => 7^2 * 7^2) + * [if n is odd] x^(n / 2) * x^(n / 2) * x (example : 7^5 => 7^2 * 7^2 * 7) + * and repeat the above step until we reach to the base case. + * + * @function PowLogarithmic + * @description Given two integers x and n, return x^n in logarithmic complexity. + * @param {Integer} x - The input integer + * @param {Integer} n - The input integer + * @return {Integer} - Returns x^n. + * @see [Pow-Logarithmic](https://www.geeksforgeeks.org/write-a-c-program-to-calculate-powxn/) + */ +const powLogarithmic = (x, n) => { + if (n === 0) return 1 + const result = powLogarithmic(x, Math.floor(n / 2)) + if (isEven(n)) { + return result * result + } + return result * result * x +} + +export { powLogarithmic } diff --git a/Maths/test/PowLogarithmic.test.js b/Maths/test/PowLogarithmic.test.js new file mode 100644 index 000000000..e432213f6 --- /dev/null +++ b/Maths/test/PowLogarithmic.test.js @@ -0,0 +1,15 @@ +import { powLogarithmic } from '../PowLogarithmic' + +describe('PowLogarithmic', () => { + it('should return 1 for numbers with exponent 0', () => { + expect(powLogarithmic(2, 0)).toBe(1) + }) + + it('should return 0 for numbers with base 0', () => { + expect(powLogarithmic(0, 23)).toBe(0) + }) + + it('should return the base to the exponent power', () => { + expect(powLogarithmic(24, 4)).toBe(331776) + }) +})