mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
72 lines
1.8 KiB
C++
72 lines
1.8 KiB
C++
/**
|
|
* @file
|
|
* @brief C++ Program to find Binary Exponent Iteratively and Recursively.
|
|
*
|
|
* Calculate \f$a^b\f$ in \f$O(\log(b))\f$ by converting \f$b\f$ 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 \f$O(b)\f$ operations.
|
|
*
|
|
* Example:
|
|
* </br>10 in base 2 is 1010.
|
|
* \f{eqnarray*}{
|
|
* 2^{10_d} &=& 2^{1010_b} = 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\\
|
|
* \f}
|
|
* Hence to calculate 2^10 we only need to multiply \f$2^8\f$ and \f$2^2\f$
|
|
* skipping \f$2^1\f$ and \f$2^4\f$.
|
|
*/
|
|
|
|
#include <iostream>
|
|
|
|
/// Recursive function to calculate exponent in \f$O(\log(n))\f$ using binary
|
|
/// exponent.
|
|
int binExpo(int a, int b) {
|
|
if (b == 0) {
|
|
return 1;
|
|
}
|
|
int res = binExpo(a, b / 2);
|
|
if (b % 2) {
|
|
return res * res * a;
|
|
} else {
|
|
return res * res;
|
|
}
|
|
}
|
|
|
|
/// Iterative function to calculate exponent in \f$O(\log(n))\f$ 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;
|
|
}
|
|
|
|
/// Main function
|
|
int main() {
|
|
int a, b;
|
|
/// Give two numbers a, b
|
|
std::cin >> a >> b;
|
|
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;
|
|
}
|
|
}
|