这里的一些其他主题上SO提到的论文“Fast Exponentiation with Precomputation”由布里克尔等,其中,与对应于二进制数字权力预计算的简单的概念以来,有一个语句大约“幂通过循环移位” (据我所知)。遗憾的是,论文的这一部分是以非常一般的形式表达的,所以我只是无法弄清楚他们是否在谈论一些明显变得复杂的东西而不是2 ** n,或者确实存在一些方法。乘法以外的取幂(平方)?
例如,我们假设我们有x = 5
(二进制的00101
)。如何才能使用y = 5 * 5
(二进制中的11001
),只使用位移和一些加法?当然,算法应该比乘法更有效, - 答案“你可以通过一堆位移和加法来模拟每个乘法,因为y = (5 << 2) + (5 << 0)
”不算数。那么,它可以指望,如果稀疏数字是平常,但它&#39; s不是一个常见的情况,并确定确切位的人口数也费时,因此,除非一个数字是的非常的稀疏,不值得尝试,每次平方后都需要进行新的评估。
答案 0 :(得分:1)
该方法称为“通过二进制分解取幂”,您可以在Knuth 4.6.3中找到讨论。例如,,因此在第一种情况下,您需要7次乘法,但在第二种情况下需要3次(请注意二进制中的8 = 100
)。执行此操作的代码如下:
long power( int x, int n ){
long result = 1;
long base = x;
while( true ){
if( n & 1 ) result = base * result;
n = n >> 1;
if( n == 0 ) return result;
base = base * base;
}
}