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 }