【问题标题】:Remainder algorithm of byte array with unsigned int无符号整数字节数组的余数算法
【发布时间】:2014-08-01 21:37:29
【问题描述】:

给定一个固定大小的 C++ 字节数组(模板函数)和一个无符号整数,我如何计算余数(通常是整数的 % 运算符)。

这是我目前使用 GMP 的方法:

template <typename HashType>
uint64_t remainder(const HashType& value, const uint64_t divisor)
{
    mpz_t integ;
    mpz_init(integ);
    mpz_import(integ, value.size(), 1, 1, 1, 0, value.data());
    uint64_t remainder = mpz_fdiv_ui(integ, divisor);
    mpz_clear(integ);
    return remainder;
}

最好去掉 GMP 依赖,并通过不需要设置和拆卸代码来提高性能(直接使用字节数组)。

顺便说一句,是否有任何算法可以更快地找到余数,但仅适用于除数的某个子集(例如素数)? (仅供参考,这用于哈希桶,所以如果我可以选择除数的值)

【问题讨论】:

  • 显然,找到 2 的幂的余数是微不足道的,但对于您的应用程序可能不切实际。 (您要么不得不使用少量的存储桶,要么拥有相当大的哈希表,并且两者都会影响性能)。此外,您是否有理由将散列到字节数组中,然后您将使用适合uint64_t 的东西来调制结果?您可能只想使用无符号整数包装算法。
  • 找到一个 BigInteger 类,将字节数组放入其中并使用为该类定义的operator%。例如,您可以在github.com/barakman/Num 上查看class NaturalNum

标签: c++ algorithm optimization hashtable division


【解决方案1】:

如果divisor 的长度可以超过 56 位,并且您没有可用的 128 位整数类型,那么您不能在高级语言中轻松地进行这种长除法。因此,您可能应该使用汇编语言(为了速度)或 GMP(为了便于编码)。

这是否回答了您的问题?或者你对divisor的大小有限制吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2018-10-13
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多