# W5 Notes: Number Theory 3
[ToC]
## Binary Exponentiation: Non-modular and Modular
To exponentiate, i.e., to compute the power $base^{exponent}$ in C, C++ or Java, we usually use the builtin `pow(base, exponent)` function. This function's parameters `base`, `exponent` and the return are all of floating point types. That makes the function a bad candidate if we want our computation to be strictly restricted to integral types.
:::info
**Note:** When you can avoid using floating point types in favor of integral types for arithemtic operations, you should usually do so, because floating point types lose precision of value.
:::
The naive way to do the integral exponentiation would be to multiply $1$ with $base$ an $exponent$ number of times, making it a $O(exponent)$ computation. Obviously, this approach is not practical for large values of $exponent$.
Using the binary exponentiation (a.k.a exponentiation by repeated squaring) technique, we can accomplish the exponentiation in under $O(\log (exponent))$ multiplications.
## Explanation
You can conceptualize the binary exponentiation algorithm in two ways: as a [divide-and-conquer](https://en.wikipedia.org/wiki/Divide-and-conquer_algorithm) approach, or as a way of factoring out $base^{exponent}$ into several $base^{x_i}$ values where $x_i$ is a power of two and $\sum{x_i}=exponent$. However you imagine the algorithm's logic, the end results are essentially the same.
## Implementation
### Recursive
```cpp=
int power(int base, int expo) {
if (expo == 0) return 1;
int result = power(base, expo / 2);
result *= result;
if (expo % 2) result *= base;
return result;
}
```
### Iterative
```cpp=
int power(int base, int expo) {
int result = 1;
while (expo > 0) {
if (expo % 2) result *= base;
base *= base;
expo /= 2;
}
return result;
}
```
## Implementation: Modular Version