如何解决使用GMP获取数字的二进制后缀的最有效方法是什么?
等效地,我想将x % 2^n
加载到另一个mpz_t中。我不清楚mpz_mod
(manual)的速度是否会快于:
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;
}
在这里我可以使用一些内置函数做得更好吗,或者这是速度限制?向后运行循环可能会更快,因此分配只会执行一次。
解决方法
- 计算n / 64,n%64。
- 传输(n / 64)次乘以64位整数。
- 分别传输(n%64)位。
其他优化(而不是上面的3。):
- 计算(n%64)/ 32,(n%64)/ 16,(n%64)/ 8。
- 如果其中任何一个大于0(即等于1),则一次复制该数量的数据。
- 分别传输其余(n%64)%8位。
4.-6可能仍然更快。如果满足以上条件
- 您只计算(n%64)/ 8,(n%64)%8
- 传输(n%64)/ 8字节
- 传输(n%64)%8位
从这里开始进行一些基准测试,并根据需要进行改进。
注意:我假设您有64位系统。对于较旧的系统,请根据需要进行调整。另外,上面的某些数学运算可能需要进行一些调整(在步骤4.-6中)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。