可能是重复问题:
实现整数幂函数pow(int,int)的最有效方法
如何更快地计算幂次方?
例如,2^13。
我记得在某个地方看到过这样的计算方法:
2^13 = 2^8 * 2^4 * 2^1
但我不知道如何计算等式右侧的每个部分,然后将它们相乘能够帮助我。
有什么想法吗?
编辑:我的意思是任意基数。你们下面提到的算法,特别是“平方法求幂”,如何提高运行时间/复杂度?
可能是重复问题:
实现整数幂函数pow(int,int)的最有效方法
如何更快地计算幂次方?
例如,2^13。
我记得在某个地方看到过这样的计算方法:
2^13 = 2^8 * 2^4 * 2^1
但我不知道如何计算等式右侧的每个部分,然后将它们相乘能够帮助我。
有什么想法吗?
编辑:我的意思是任意基数。你们下面提到的算法,特别是“平方法求幂”,如何提高运行时间/复杂度?
有一种通用算法可用于计算幂,但对于具备位移操作的语言,计算2的幂有更快的方法。你可以使用 1 << exp
来计算(假设您的位移运算符是 <<
,这在大多数支持该操作的语言中都是如此)。
我假设您正在寻找通用算法,并且只是选择了一个不幸的基数作为示例。我将在Python中提供此算法。
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)
这基本上使指数能够在log2 exp时间内计算出来。这是一种分治算法。 :-) 就像其他人所说的一样exponentiation by squaring。
如果你将你的示例输入到这个算法中,就可以看到它是如何工作的,并且与你给出的方程式相关:
intpow(2, 13)
2 * intpow(4, 6)
2 * intpow(16, 3)
2 * 16 * intpow(256, 1)
2 * 16 * 256 == 2^1 * 2^4 * 2^8
使用按位移位操作。例如,1 << 11 返回2的11次方。
二的幂次方比较简单。在二进制中,2^13是一个后面跟着13个零的1。
您可以使用位移操作符,这是许多语言中内置的运算符。
如果你不限制自己只使用二的幂次方,那么:
k^2n = (k^n)^2
我所知道的最快的免费算法是Phillip S. Pang, Ph.D
开发的,源代码可以在这里找到。
它使用表驱动分解技术,可以制作出比Pentium(R)处理器本身的exp()函数快2-10倍的函数。
int pow(int base, int exponent) { int result = 1; while (exponent > 0) { if (exponent & 1) { result *= base; } exponent >>= 1; base *= base; } return result; }
这个函数使用二进制位运算来计算幂,并且只需要O(log n)次操作就能得到结果,其中n是指数的大小。 - Nick Dandoulakisbase^exp
,其中log是以2为底的对数。 - Nick DandoulakisO(log(n)^2)
,因为乘法需要超过O(1)的时间。 - Omnifarious