将两个数字乘以其范围为10 ^ 18

时间:2014-01-06 10:06:31

标签: algorithm math modulo

变量first_variable始终是某个数字的模mod_value。 在每个步骤中first_variable都会乘以一些数字second_variable

所有三个变量的范围都是110^18

为此我建立了一个公式,

first_variable = ((first_variable%mod_value)*(second_variable%mod_value))%mod_value

但这给出了错误的答案,

例如,如果first_variable and second_variable(10^18)-1mod_value = 10^18

请建议我使用方法,以便first_variable始终给出正确答案。

3 个答案:

答案 0 :(得分:0)

似乎您正在使用运算符,其中使用64位整数实现算术运算。您可以使用2 ^ 32之类的乘数来检查:如果它们的乘积为0,我的猜测是正确的。在这种情况下,您应该切换到一个任意长的算术实现,或至少一个比当前长得多的算术实现。例如。 Python支持最多2 ^ 1016(256 ^ 127)的整数,对于Erlang也是如此。

我在评论中看到你使用C ++。如果是这样,请查找GMP库和类似物。或者,如果128位足够,现代GCC通过自己的库支持它。

答案 1 :(得分:0)

这基本上是溢出,因此您应该为mod_value使用不同的值(最多10 ^ 9)或限制第一个值和第二个值的范围。

答案 2 :(得分:0)

您的号码是O(10^36) O(2^108),它不能适合java或C ++等语言中的任何原始数据类型。在C ++或Java中使用BigInt或在python中使用numpy来克服它。