Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 循环移位求幂_Algorithm_Bit Shift_Discrete Mathematics_Exponentiation - Fatal编程技术网

Algorithm 循环移位求幂

Algorithm 循环移位求幂,algorithm,bit-shift,discrete-mathematics,exponentiation,Algorithm,Bit Shift,Discrete Mathematics,Exponentiation,这里的另一个主题提到了Brickell等人的论文“”,该论文与对应于二进制数字的幂的预计算的简单概念一起,有一个关于“循环移位求幂”的陈述(据我所知)。不幸的是,这篇文章的这一部分是以一种非常普遍的形式表达的,所以我根本无法确定他们所说的是用除2**n以外的基数变得复杂的显而易见的东西,还是真的存在着除乘法(平方)之外的某种求幂方法 例如,假设我们有x=5(这是二进制的00101)。怎么可能只使用位移位和一些加法就得到y=5*5(即二进制的11001?当然,该算法应该比乘法更有效,-答案是“您可

这里的另一个主题提到了Brickell等人的论文“”,该论文与对应于二进制数字的幂的预计算的简单概念一起,有一个关于“循环移位求幂”的陈述(据我所知)。不幸的是,这篇文章的这一部分是以一种非常普遍的形式表达的,所以我根本无法确定他们所说的是用除2**n以外的基数变得复杂的显而易见的东西,还是真的存在着除乘法(平方)之外的某种求幂方法

例如,假设我们有
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
也是一个大数字。