快速计算功率(例如2 ^ 11)

时间:2010-02-04 08:07:16

标签: algorithm exponent

  

可能重复:
  The most efficient way to implement an integer based power function pow(int, int)

如何以更好的运行时间计算功率?

E.g。 2 ^ 13。

我记得在某处看到它与以下计算有关:

2 ^ 13 = 2 ^ 8 * 2 ^ 4 * 2 ^ 1

但我看不出如何计算等式右边的每个分量然后乘以它们会对我有帮助。

有什么想法吗?

编辑:我的意思是任何基础。你在下面提到的算法,特别是“通过平方展示”,如何提高运行时间/复杂度?

6 个答案:

答案 0 :(得分:15)

有一种通用的算法,但在具有位移的语言中,有一种更快的方法来计算2的幂。你只需输入1 << exp(假设你的位移算子为{{1}在大多数支持该操作的语言中都是如此。

我假设您正在寻找广义算法,并选择了一个不幸的基础作为示例。我将用Python提供这个算法。

<<

这基本上导致指数能够在log2 exp时间内计算。这是一种分而治之的算法。 :-)正如别人说exponentiation by squaring

如果您将示例插入其中,您可以看到它的工作原理并与您给出的等式相关:

def intpow(base, exp):
   if exp == 0:
      return 1
   elif exp == 1:
      return base
   elif (exp & 1) != 0:
       return base * intpow(base * base, exp // 2)
   else:
       return intpow(base * base, exp // 2)

答案 1 :(得分:9)

使用按位移位。防爆。 1&lt;&lt; 11返回2 ^ 11。

答案 2 :(得分:3)

您可以使用exponentiation by squaring。这也称为“平方和乘法”,适用于基数!= 2。

答案 3 :(得分:2)

两个人的权力很容易。在二进制2 ^ 13是一个后跟13个零。

你会使用位移,这是一种内置的运算符,用于多种语言。

答案 4 :(得分:1)

如果你不限制自己的权力,那么:

k ^ 2n =(k ^ n)^ 2

答案 5 :(得分:1)

我所知道的最快的免费算法是Phillip S. Pang, Ph.D,可以找到源代码here。 它使用表驱动的分解,通过它可以使exp()函数快2到10倍,然后是奔腾(R)处理器的原生exp()。