在C++中查找大乘法的余数
Finding the remainder of a large multiplication in C++
我想就以下问题寻求一些帮助。我需要创建一个函数,该函数将两个整数相乘,并提取此乘法的余数除以某个数字(简而言之,(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
如果您了解此代码和设置,您应该能够弄清楚其余部分
相关文章:
- 余数除法和不允许除以零 (c++) 时遇到问题
- 余数运算符的等效操作,用于处理低于允许的最小值
- 如何找到给定范围内除以给定数字时具有一定余数的值的数量?
- 计算浮点余数的最佳方法
- 使用c++中的循环反转余数
- 改进了计算余数的递归
- 如何计算余数有什么区别吗?
- 我如何检查 - 并使用 fmod(浮点数)获取余数
- 如何在将秒转换为分钟且余数小于 10 秒时包含前导零
- 如果任何余数的总和是奇数,则添加 11 *除非*添加 11 个原因
- 了解 std::fmod 和 std::余数
- 除法函数随机整数需要打印出商和余数
- C++11是否保证余数的符号就是被除数的符号
- 检查除法是否给出余数 0
- 正弦和余数的近似值
- 一种简化求余数的方法
- 为什么在C和C++中没有浮点/双精度的除法余数运算
- 根据 C++ 中的小数余数对平均值进行舍入
- C++余数以较高的数字返回 7
- 在C++中查找大乘法的余数