C中64位整数的模乘

时间:2014-04-25 13:56:00

标签: c int modulo multiplication

我想在C中将两个整数模数为另一个(素数)整数(大约50位)。

uint64_t x = ...;
uint64_t y = ...;
uint64_t q = ...;
uint64_t z = (x*y) % q;

这将产生小于q的64位整数,但不幸的是x%q * y%q对于64位类型来说太大了。所以它在我计算余数之前就溢出了。

我想到了一些解决方法:

  • 使用gcc的__uint128_t会违反C标准,无法与其他编译器一起使用
  • 将变量投射到doublelong double但由于浮点不准确而导致结果不正确
  • 使用像GMP这样的多精度库会起作用,但会引入新的项目依赖性,并且可能带来一些开销
  • 为此目的编写自己的乘法函数,但据我所知我需要汇编,所以可移植性已经消失

还有其他选择或您会推荐什么?

编辑:我忘了提一下,如果有效的话,自编写的解决方案是值得做的。例如,做几十个效率低下的%操作会很糟糕。

1 个答案:

答案 0 :(得分:2)

当然你不需要汇编来自己实现任意精度的乘法。

有很多众所周知的算法,并且(根据定义)它们可以在C中实现。

有关详细信息,请参阅Wikipedia。根据我的经验,获得这样的代码可能有点棘手,所以也许你可以通过添加依赖项来更好地花时间。