I am currently reading Skiena\'s \"The Algorithm Design Manual\".
He describes an algorithm for calculating the power of a number i.e. calculate a^n
.
First of all, let's fix your algorithm:
function power( a, n )
if (n = 0)
return(1)
x = power(a,n/2)
if (n is even)
return(x*x)
else
return(a*x*x)
Say you want to calculate power(2,8)
, that is, 2^8
(^
is not XOR
here, of course).
1) (a=2
, n=8
). 2^8 = (2^4)^2
, so we have to calculate x=2^4
, and then x*x
to yield the final result. We have to call power()
again to get x
. power(2,4)
.
2) (a=2
, n=4
). 2^4 = (2^2)^2
, so we have to calculate x=2^2
, and then x*x
to yield the final result. We have to call power()
again to get x
. power(2,2)
.
3) (a=2
, n=2
). 2^2 = (2^1)^2
, so we have to calculate x=2^1
, and then x*x
to yield the final result. We have to call power()
again to get x
. power(2,1)
.
4) (a=2
, n=1
). 2^1 = (2^0)^2
, so we have to calculate x=2^0
, and then a*x*x
to yield the final result. We have to call power()
again to get x
. power(2,0)
.
5) (a=2
, n=0
). 2^0 = 1
because n
is 0
, so we have the value of x
that is returned to step #4.
4) (a=2
, n=1
, x=1
). The final result for this step is a*x*x = 2*1*1=2
, which is the value to be assigned to x
in step #3.
3) (a=2
, n=2
, x=2
). The final result for this step is x*x = 2*2 = 4
. This is the result to be assigned to x
in step #2.
2) (a=2
, n=4
, x=4
). The final result for this step is x*x = 4*4 = 16
. This is the result to be assigned to x
in step #1.
1) (a=2
, n=8
, x=16
). The final result for this step is x*x = 16*16 = 256
. This is the result to be returned by power(2,8)
.