模函数,避免C++整数溢出
Modulus Function to Avoid Integer Overflow in C++
如果我有 2 个int
或long long
变量,请将它们称为a
和b
,我想计算(a + b) mod p
和,其中 p 是一个大的素数,我怎样才能利用 C++ 中的模运算符来达到预期的结果?
我已经尝试过(a + b) % p
,但这有时会溢出,因为a + b
会在应用 mod 之前溢出。
我尝试过的其他类似方法似乎可以避免溢出,但给出的结果不正确。
在这种情况下,如何使用取模运算符来正确计算所需的总和,同时避免溢出?
a %= p
b %= p
c = p-a
if(b==c)
sum = 0
if (b<c)
sum = a+b
if (b>c)
sum = b-c
编辑:诀窍是避免任何可能导致溢出的计算,而不知道限制在哪里。我们所知道的是,给定的a,b和p低于极限 - 也许刚好低于极限。
在前两个步骤(a%=p;b%=p;
(之后,我们知道a<p
和b<p
。我们仍然不敢添加a+b
,因为该总和可能会超过 p 并突破限制*。但是我们可以看到我们还剩下多少空间c = p-a
,这是安全的,因为我们知道c<=p
和c>0
.(所述类型是无符号的,但我们也可以避免负数,如果只是因为它们的极限有时会与正极限的负数相差一,这是我永远记不清的方式。
如果 b=c,则 b=p-a,所以 a+b=p,所以总和 (mod p( 为零。
如果b<c
,则a+b<p
,因此我们可以安全地计算a+b
(并且不需要应用模(。
如果b>c
,那么计算a+b
是不安全的,但我们知道我们要找的数字是a+b-p
,我们可以将其重写为b-(p-a)
,并且我们已经有b
和p-a
,因此我们可以安全地执行该减法。
(*(没错,我说"不敢"。这是一个非常好的词。
相关文章:
- 整数溢出,最大值为 pow(10,19)
- 模函数,避免C++整数溢出
- 优化正在杀死我在 clang 6 中的整数溢出检查
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 我很难理解这些关于检测整数溢出的评论
- 检测 32 位整数溢出
- 如何在没有整数溢出的情况下找到n%(k*k)
- C 中俄罗斯农民算法中的整数溢出
- 检查Android NDK COD中的整数溢出
- 对于特定情况的整数溢出似乎是由整数溢出引起的错误
- 如何修复整数溢出警告
- 整数溢出 C++ 即使使用“无符号长整型”也是如此
- 整数溢出是否会影响其他变量
- 为什么功能不给整数溢出
- 有符号整数溢出、内部函数和未定义的行为
- 整数溢出不会发生:它们从0重新启动
- 以下程序中最大 int 1000 000(在 int 范围内)的整数溢出
- 为什么Turbo C Wraparound每次签名的整数溢出,尽管签名的整数溢出是不确定的
- 编译器是否有可能检测整数溢出或其他数据类型溢出的可能性