diff --git a/Maths/BinaryExponentiationIterative.js b/Maths/BinaryExponentiationIterative.js new file mode 100644 index 0000000000..705dcded4e --- /dev/null +++ b/Maths/BinaryExponentiationIterative.js @@ -0,0 +1,24 @@ +// To calculate x^n i.e. exponent(x, n) in O(log n) time in iterative way +// n is an integer and n >= 0 + +// Explanation: https://en.wikipedia.org/wiki/Exponentiation_by_squaring + +// Examples: +// 2^3 = 8 +// 5^0 = 1 + +// Uses the fact that +// exponent(x, n) +// = exponent(x*x, floor(n/2)) ; if n is odd +// = x*exponent(x*x, floor(n/2)) ; if n is even +const exponent = (x, n) => { + let ans = 1 + while (n > 0) { + if (n % 2 !== 0) ans *= x + n = Math.floor(n / 2) + if (n > 0) x *= x + } + return ans +} + +export { exponent } diff --git a/Maths/test/BinaryExponentiationIterative.test.js b/Maths/test/BinaryExponentiationIterative.test.js new file mode 100644 index 0000000000..6e6fff8bd8 --- /dev/null +++ b/Maths/test/BinaryExponentiationIterative.test.js @@ -0,0 +1,15 @@ +import { exponent } from '../BinaryExponentiationIterative' + +describe('exponent', () => { + it('should return 1 when power is 0', () => { + expect(exponent(5, 0)).toBe(1) + }) + + it('should return 0 when base is 0', () => { + expect(exponent(0, 7)).toBe(0) + }) + + it('should return the value of a base raised to a power', () => { + expect(exponent(3, 5)).toBe(243) + }) +})