如何找到大数模100000007的多重应用

how to find muliplication of large numbers modulo 100000007

本文关键字:应用 100000007 何找      更新时间:2023-10-16

正如我们所知,1000000007是一个大素数。如何找到两个大数字的乘积以1000000007 为模

例如,如果我想找到78627765*67527574 mod 1000000007,我该怎么做?

至少如果有人告诉我程序,我会试试

注意:请让我知道具有原始数据类型(如int、long或long-long)的解决方案提前感谢

模块链接与合理的数字一起工作,这些数字正在突破数字压缩空间的极限:

(A * B) % C == ((A % C) * (B % C)) % C.

这方面的证据非常直接,世界各地的加密网站上有成千上万的例子。一个简单的例子:

(7*8)%5=56%5=1

((7 % 5) * (8 % 5)) % 5 = (2 * 3) % 5 = 6 % 5 = 1

我希望这能有所帮助。显然,当A和B已经被推到了您的高端平台极限,并且仍然小于C时,这将变得毫无意义,但当情况并非如此时(即,当A>C和/或B>C时),它会非常方便。

由于这看起来像是一个家庭作业或上下文问题,我只会给出提示。

如果你知道x%m和y%m,你怎么能找到(x+y)%m?如果你知道x%m,你怎么能找到(2x)%m?

既然你想找到(a*b)%m,有没有一种方法可以分解b,这样你就可以使用上面的两个提示?

为什么不想使用64位算术?当然,只有当被复用的操作数每个不超过32位时,这才有效(但这也可以是固定的)。考虑:

typedef unsigned long long uint64;
uint64 m = 1000000007UL;
uint64 r = (uint64)a * (uint64)b;
r = r % m; // get the residue

还可以对其进行优化,以避免可能昂贵的"%":

double inv = 1.0 / 1000000007UL; // precompute inverse
uint64 r = (uint64)a * (uint64)b;
uint64 rf = (uint64)floor((double)a * (double)b * inv); // floor(a * b / m) 
r = r - rf * m; //  residue

请注意,第二种方法可能需要一些精确的游戏。您也可以使用"long double"代替