使用GMP获取数字的二进制后缀的最有效方法是什么?

问题描述

等效地,我想将x % 2^n加载到另一个mpz_t中。我不清楚mpz_modmanual)的速度是否会快于:

mpz_t setSuffix(int n,mpz_t x){
  mpz_t y; 
  mpz_init_set_ui(y,0);
  for(int i=0;i<n;i++){
    if(mpz_tstbit(x,i)){
      mpz_setbit(y,i);
    }
  }
  return y;
}

bit manipulation functions

在这里我可以使用一些内置函数做得更好吗,或者这是速度限制?向后运行循环可能会更快,因此分配只会执行一次。

解决方法

  1. 计算n / 64,n%64。
  2. 传输(n / 64)次乘以64位整数。
  3. 分别传输(n%64)位。

其他优化(而不是上面的3。):

  1. 计算(n%64)/ 32,(n%64)/ 16,(n%64)/ 8。
  2. 如果其中任何一个大于0(即等于1),则一次复制该数量的数据。
  3. 分别传输其余(n%64)%8位。

4.-6可能仍然更快。如果满足以上条件

  1. 您只计算(n%64)/ 8,(n%64)%8
  2. 传输(n%64)/ 8字节
  3. 传输(n%64)%8位

从这里开始进行一些基准测试,并根据需要进行改进。


注意:我假设您有64位系统。对于较旧的系统,请根据需要进行调整。另外,上面的某些数学运算可能需要进行一些调整(在步骤4.-6中)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...