有没有办法做 (A*B) mod M 而不会溢出无符号长 A 和 B
Is there a way to do (A*B) mod M without overflow for unsigned long long A and B?
我不想要在Windows上安装GMP的噩梦。
我有两个数字 A 和 B,unsigned long long
s,最多在 10^10 左右的数量级,但即使做((A%M)*(B%M))%M
,我也会出现整数溢出。
是否有自制函数来计算较大数字的(A*B)%M
?
如果模量M
足够小于 ULLONG_MAX
(如果它在 10^10 的范围内就是这种情况),您可以通过将其中一个因子分成两部分来分三步完成。我假设A < M
和B < M
,M < 2^42
.
// split A into to parts
unsigned long long a1 = (A >> 21), a2 = A & ((1ull << 21) - 1);
unsigned long long temp = (a1 * B) % M; // doesn't overflow under the assumptions
temp = (temp << 21) % M; // this neither
temp += (a2*B) % M; // nor this
return temp % M;
对于较大的值,您可以将因子分成三部分,但如果模量变得非常接近ULLONG_MAX
则变得丑陋。
相关文章:
- C++中无符号字符溢出
- 获取隐式转换溢出从无符号到已签名的警告
- 隐式转换双重到无符号长溢出 c++
- 如何检查溢出将字符*[]转换为无符号短短
- 创建具有未定义溢出的无符号 int
- 整数溢出 C++ 即使使用“无符号长整型”也是如此
- 无符号位字段的溢出是否保证环绕
- 有没有办法做 (A*B) mod M 而不会溢出无符号长 A 和 B
- C++大量(无符号长长)的溢出检测
- 在 Linux 32 位上带有 base 36 溢出无符号长长的 strtoull
- 无符号字符模板值溢出
- 溢出的有符号/无符号赋值及其结果
- 无符号Int.溢出
- gcc(TDM-GCC)中的无符号整数溢出错误
- 有没有一种安全的方法可以在不触发溢出的情况下获得有符号整数的无符号绝对值
- 如何抑制来自UBsan的一些无符号整数溢出错误
- C/ c++无符号整数溢出
- 此代码如何产生无符号整数溢出
- 无符号算术和整数溢出
- 发生整数溢出时无符号整数和有符号整数的行为差异