Exponentiating by squaring
Exponentiating by squaring is an algorithm used for the fast computation of large powers of a number x. It is also known as the square-and-multiply algorithm. It implicitly uses the binary expansion of the exponent. It is of quite general use, for example in modular arithmetic.
| Table of contents |
|
2 Further applications 3 Example implementation |
The following recursive algorithm computes xn for a positive integer n:
Squaring algorithm
Compared to the ordinary method of multiplying x with itself n-1 times, this algorithm uses only O(lg n) multiplications and therefore speeds up the computation of xn tremendously, in much the same way that the "long multiplication" algorithm speeds up multiplication over the slower method of repeated addition.
The same idea allows fast computation of large exponents modulo a number. Especially in cryptography, it is useful to compute powers in a ring of integers modulo q. It can also be used to compute integer powers in a group, using the rule
Further applications
The method works in every semigroup and is often used to compute powers of matrices,
For example, the evaluation of
- 13789722341 (mod 2345)
The repeated application of this algorithm is equivalent to decomposing the exponent (by a base conversion to binary) into a sequence of squares and products: for example
- x7
- = x4x2x1
- = (x2)2x2x
This is an implementation of the above algorithm in the Ruby programming language. It doesn't use recursion, which increases the speed even further.
In most languages you'll need to replace result=1 with result=unit_matrix_of_the_same_size_as_x to get a matrix exponentiating algorithm. In Ruby, thanks to coercion, result is automatically upgraded to the appropriate type, so this function works with matrices as well as with integers and floats.
Example implementation
def power(x,n)
result = 1
while (n != 0)
# if n is odd, multiply result with x
if ((n % 2) == 1) then
result = result * x
end
x = x*x
n = n/2
end
return result
end