我想在C中将两个整数模数为另一个(素数)整数(大约50位)。
uint64_t x = ...;
uint64_t y = ...;
uint64_t q = ...;
uint64_t z = (x*y) % q;
这将产生小于q的64位整数,但不幸的是x%q * y%q
对于64位类型来说太大了。所以它在我计算余数之前就溢出了。
我想到了一些解决方法:
__uint128_t
会违反C标准,无法与其他编译器一起使用double
或long double
但由于浮点不准确而导致结果不正确还有其他选择或您会推荐什么?
编辑:我忘了提一下,如果有效的话,自编写的解决方案是值得做的。例如,做几十个效率低下的%操作会很糟糕。答案 0 :(得分:2)
当然你不需要汇编来自己实现任意精度的乘法。
有很多众所周知的算法,并且(根据定义)它们可以在C中实现。
有关详细信息,请参阅Wikipedia。根据我的经验,获得这样的代码可能有点棘手,所以也许你可以通过添加依赖项来更好地花时间。