Algorithm 循环移位求幂
这里的另一个主题提到了Brickell等人的论文“”,该论文与对应于二进制数字的幂的预计算的简单概念一起,有一个关于“循环移位求幂”的陈述(据我所知)。不幸的是,这篇文章的这一部分是以一种非常普遍的形式表达的,所以我根本无法确定他们所说的是用除2**n以外的基数变得复杂的显而易见的东西,还是真的存在着除乘法(平方)之外的某种求幂方法 例如,假设我们有Algorithm 循环移位求幂,algorithm,bit-shift,discrete-mathematics,exponentiation,Algorithm,Bit Shift,Discrete Mathematics,Exponentiation,这里的另一个主题提到了Brickell等人的论文“”,该论文与对应于二进制数字的幂的预计算的简单概念一起,有一个关于“循环移位求幂”的陈述(据我所知)。不幸的是,这篇文章的这一部分是以一种非常普遍的形式表达的,所以我根本无法确定他们所说的是用除2**n以外的基数变得复杂的显而易见的东西,还是真的存在着除乘法(平方)之外的某种求幂方法 例如,假设我们有x=5(这是二进制的00101)。怎么可能只使用位移位和一些加法就得到y=5*5(即二进制的11001?当然,该算法应该比乘法更有效,-答案是“您可
x=5
(这是二进制的00101
)。怎么可能只使用位移位和一些加法就得到y=5*5
(即二进制的11001
?当然,该算法应该比乘法更有效,-答案是“您可以通过一系列位移位和加法来模拟每次乘法,如y=(5该方法被称为“二进制分解求幂”您可以在Knuth 4.6.3中找到一个讨论。例如,在第一种情况下,您需要7次乘法,但在第二种情况下需要7次乘法(注意,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;
}
}
该方法称为“二进制分解求幂”,您可以在Knuth 4.6.3中找到讨论。例如,在第一种情况下,您需要7次乘法,但在第二种情况下需要7次乘法(请注意,二进制中的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;
}
}
循环移位似乎是关于GF(p**n)中的数学…我对它一无所知,除了它可能不适用于普通数学。循环移位似乎是关于GF(p**n)中的数学…我对它一无所知,除了它可能不适用于普通数学。你说的是众所周知的“平方求幂”,它不使用位移位。n>=1
运算只是一个“整数除以2”并且不是绝对必要的-您可以通过使用位掩码直接检查特定位来获得相同的结果,这将节省一些CPU时间,前提是n
也是一个大数字。您正在谈论众所周知的“平方求幂”,它不使用位移位。n>=1
操作仅仅是一个“整数除以2”,并不是绝对必要的-您可以通过使用位掩码直接检查特定位来实现相同的结果,这将节省一些CPU时间,前提是n
也是一个大数字。