微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用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中)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。