diff --git a/math/binary_exponent.cpp b/math/binary_exponent.cpp index 8fb9ec1a8..808a36ce8 100644 --- a/math/binary_exponent.cpp +++ b/math/binary_exponent.cpp @@ -1,14 +1,21 @@ -/// C++ Program to find Binary Exponent recursively. +/// C++ Program to find Binary Exponent Iteratively and Recursively. #include /* - * Calculate a^b in O(log(b)) by converting b to a binary number - * Binary exponentiation (also known as exponentiation by squaring) - * is a trick which allows to calculate an using only O(logn) multiplications - * (instead of O(n) multiplications required by the naive approach). + * Calculate a^b in O(log(b)) by converting b to a binary number. + * Binary exponentiation is also known as exponentiation by squaring. + * NOTE : This is a far better approach compared to naive method which provide O(b) operations. + * Example: + * 10 in base 2 is 1010. + * 2^10 = 2^(1010) = 2^8 * 2^2 + * 2^1 = 2 + * 2^2 = (2^1)^2 = 2^2 = 4 + * 2^4 = (2^2)^2 = 4^2 = 16 + * 2^8 = (2^4)^2 = 16^2 = 256 + * Hence to calculate 2^10 we only need to multiply 2^8 and 2^2 skipping 2^1 and 2^4. */ -/// Function to calculate exponent in O(log(n)) using binary exponent. +/// Recursive function to calculate exponent in O(log(n)) using binary exponent. int binExpo(int a, int b) { if (b == 0) { return 1; @@ -21,10 +28,33 @@ int binExpo(int a, int b) { } } +/// Iterative function to calculate exponent in O(log(n)) using binary exponent. +int binExpo_alt(int a, int b) { + int res = 1; + while (b>0) { + if (b%2) { + res = res*a; + } + a = a*a; + b /= 2; + } + return res; +} + int main() { int a, b; /// Give two numbers a, b std::cin >> a >> b; - /// Result of a^b - std::cout << binExpo(a, b) << std::endl; + if (a==0 && b==0) { + std::cout << "Math error" << std::endl; + } else if (b<0) { + std::cout << "Exponent must be positive !!" << std::endl; + } else { + int resRecurse = binExpo(a, b); + /// int resIterate = binExpo_alt(a, b); + + /// Result of a^b (where '^' denotes exponentiation) + std::cout << resRecurse << std::endl; + /// std::cout << resIterate << std::endl; + } }