在C++中查找大乘法的余数

Finding the remainder of a large multiplication in C++

本文关键字:余数 C++ 查找      更新时间:2023-10-16

我想就以下问题寻求一些帮助。我需要创建一个函数,该函数将两个整数相乘,并提取此乘法的余数除以某个数字(简而言之,(x*y)%A)。

我使用无符号长整型来解决这个问题,但是在这种情况下,A = 15!,并且x和y之前都已计算模A。因此,x*y 可以大于 2^64 - 1,因此溢出。

我不想使用外部库。谁能帮我设计一个简短的算法来解决这个问题?

提前谢谢。

如果你已经有x和y的mod A,为什么不使用它们呢? 像这样,

如果

x = int_x*A + mod_x
y = int_y*A + mod_y

然后

(x*y)%A = ((int_x*A + mod_x)(int_y*A + mod_y))%A = (mod_x*mod_y)%A

mod_x*mod_y应该小得多,对吧?

编辑:

如果你试图像10e11这样的大数找到模量,我想你将不得不使用另一种方法。但是,虽然不是真正有效,但这样的事情会起作用

const int MAX_INT = 10e22 // get max int
int larger = max(mod_x, mod_y) // get the larger number
int smaller = max(mod_x, mod_y) 
int largest_part = floor(MAX_INT/smaller)
if (largest_part > larger):
    // no prob of overflow. use normal routine
else:
    int larger_array = []
    while(largest_part < larger):
        larger_array.append(largest_part)
        larger -= largest_part
        largest_part = floor(MAX_INT/smaller)
   // now use the parts array to calculate the mod by going through each elements mod and adding them etc

如果您了解此代码和设置,您应该能够弄清楚其余部分