在O(n)时间内运行的指数乘法算法?

时间:2014-02-03 17:50:49

标签: performance algorithm runtime

我正在读一本算法教科书,我对这个问题感到困惑:

假设我们想要计算值x ^ y,其中x和y是正数 分别为m和n位的整数。解决问题的一种方法是用x进行y-1次乘法。你能提供一个只使用O(n)乘法步骤的更有效的算法吗?

这会是一种分而治之的算法吗? y-1乘以x将在θ(n)右边运行? ..我不知道从哪个问题开始

3 个答案:

答案 0 :(得分:2)

我以迭代的方式更好地理解这一点:

你可以计算所有2的幂的x ^ z:z =(2 ^ 0,2 ^ 1,2 ^ 2,...,2 ^(n-1))

只需从1到n并应用x ^(2 ^(i + 1))= x ^(2 ^ i)* x ^(2 ^ i)。

现在您可以使用这n个值来计算x ^ y:

result = 1
for i=0 to n-1:
    if the i'th bit in y is on:
        result *= x^(2^i)
return result

全部在O(n)

完成

答案 1 :(得分:1)

应用简单的递归来分而治之。 在这里,我发布的更像伪代码。

x^y :=
    base case: if y==1 return x;
        if y%2==0:  
            then (x^2)^(y/2;
        else 
            x.(x^2)^((y-1)/2);

答案 2 :(得分:0)

y-1乘法解决方案基于身份x^y = x * x^(y-1)。通过重复应用身份,您知道在y步骤中您将1减少到y-1

更好的想法是更“减少”地减少y。假设偶数y,我们有x^y = x^(2*y/2) = (x^2)^(y/2)。假设有一个奇怪的y,我们有x^y = x^(2*y/2+1) = x * (x^2)^(y/2)

如果您使用y代替x^2继续进行功率计算,您会发现可以将x减半。

递归:

Power(x, y)=
    1 if y = 0
    x if y = 1
    Power(x * x, y / 2) if y even
    x * Power(x * x, y / 2) if y odd

查看它的另一种方法是将y读作加权位的总和。 y = b0 + 2.b1 + 4.b2 + 8.b3...

取幂的性质意味着:

x^y = x^b0 . x^(2.b1) . x^(4.b2) . x^(8.b2)... 
    = x^b0 . (x^2)^b1 . (x^4)^b2 . (x^8)^b3...

你可以通过平方获得所需的x的幂,y的二进制分解告诉你要乘以哪些幂。