Algorithm 将两个范围为10^18的数字相乘

Algorithm 将两个范围为10^18的数字相乘,algorithm,math,modulo,Algorithm,Math,Modulo,有一个变量first\u variable始终是某个数字的mod,mod\u value。 在每个步骤中,第一个\u变量与一些数字相乘第二个\u变量 这三个变量的范围是从1到10^18 为此,我建立了一个公式 first_variable = ((first_variable%mod_value)*(second_variable%mod_value))%mod_value 但这给出了一个错误的答案 例如,如果第一个变量和第二个变量是(10^18)-1和模值=10^18 请给我推荐一种方法,这

有一个变量
first\u variable
始终是某个数字的mod,
mod\u value
。 在每个步骤中,
第一个\u变量
与一些数字相乘
第二个\u变量

这三个变量的范围是从
1
10^18

为此,我建立了一个公式

first_variable = ((first_variable%mod_value)*(second_variable%mod_value))%mod_value
但这给出了一个错误的答案

例如,如果
第一个变量和第二个变量
(10^18)-1
模值=10^18


请给我推荐一种方法,这样
第一个\u变量
总能给出正确的答案。

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


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

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

>您的号码是<代码> O(10 ^ 36)< /C> >代码> >(2 ^ 108)< /> >,它不能适合任何java语言或C++语言中的原始数据类型。在C++或java中使用BigIt或者在Python中使用NoMyPy来克服它。

你使用的编程语言是什么?一定是溢油了。如果将64位用于较小长度的固定大小变量(例如,java中的long(64位),java中的int(32位)如果乘法大于数据类型所能容纳的最大数,这种乘法溢出。我可以使用<代码>无符号长长或长long < /代码>来解决问题。不像你的平台是非常奇特的,<代码> long long //C++ >不会有帮助。它只在Windows(Visual Studio等)上有64位。和Unix.OTOH,GCC在其自己的库中实现了uu int128类型。您可以尝试一下。我如何为大Oh符号的A,B,C dup计算(A*B)%C的可能副本不适用于此。O()将函数作为参数,如果
10^36
代表
f(n)=10^36
则数字也将是O(-1)或O(0).用它来做这件事是没有意义的,因为它没有告诉你任何事情。@Phantom我的意思是数字可以大到10^36,yes O()符号不好用,但我认为它传达了信息。