我试图找到执行算法所需的乘法次数,该算法使用Squaring的Exponentiation我在Wikipedia上阅读。计算复杂性一节提到该算法最多需要floor(log n)
。我怎么能证明这一点?
我有这个伪代码:
expo(a, n)
if n == 0
return 1
if n == 1
return a
if n is even
b = expo(a, n/2)
return b*b
return a * expo(a, n-1)
有了这个,我也有以下关系
Number of multiplications = T(n)
T(n) = 0 if n<2; a*a^(n-1) if n is odd; (a^(n/2))^2 is n is even
我尝试使用表示需要完成的base,a和注意二进制操作的位串。即5 = 101_2。所有1都需要反相,然后向右移位。所有0都只需要向右移位。然后,这些操作可以表示乘法,如我生成的图表所述:
exponent n 0 1 2 3 4 5 6 7 8
bits in n 1 1 2 2 3 3 3 3 4
0-bits in n 1 0 1 0 2 1 1 0 3
1-bits in n 0 1 1 2 1 2 2 1 1
binary operations for a^n 0 0 1 2 2 3 3 4 3
multiplications for a^n 0 0 1 2 2 3 3 4 3
修改
正如Henry在下面的评论中所指出的,可以使用# of bits in binary representation + # of 1 bits in binary representation - 1
找到乘法的次数。为了防止在数学中迷失,我将假设1位的数量由某个函数b(n)
给出。然后,T(n) = floor(log_2 n) + b(n) - 1
证明n = 2
:
2_10 = 10_2 -> b(2) = 1
-> T(2) = floor(log_2 2) + b(2) - 1 = 1 + 1 - 1 = 1
这与上面的观察表一致。
假设为k。
证明k + 1:
T(k+1) = floor(log_2 (k+1)) + b(k+1) - 1
在这个公式之后,就k + 1而言,我不太清楚该怎么做。我很感激任何见解。