operator-keyword - 负模运算符结果的目的是什么?

标签 operator-keyword modulus

我之前(天真)假设模数运算符返回除法的余数。我显然错了,因为 -2 % 5 返回 3。我本以为 5 除以 -2 零次,余数为 -2。

现在我明白了这个操作是如何执行的,但我的问题是为什么?谁能给我一个解释为什么模数和余数不是同义词的链接,或者一个有用的情况的例子?

最佳答案

结果完全正确。模运算定义如下(我将使用“一致”,因为我不能用三行输入等号)

a congruent b mod c 当且仅当 a-b 是 c 的倍数,即对于某个整数 x,x * c = (a-b)。

例如

0 congruent 0 mod 5 (0 * 5 = 0-0)
1 congruent 1 mod 5 (0 * 5 = 1-1)
2 congruent 2 mod 5 (0 * 5 = 2-2)
3 congruent 3 mod 5 (0 * 5 = 3-3)
4 congruent 4 mod 5 (0 * 5 = 4-4)
5 congruent 0 mod 5 (1 * 5 = 5-0)
6 congruent 1 mod 5 (1 * 5 = 6-1)
...

同样可以扩展到负整数:

-1 congruent 4 mod 5 (-1 * 5 = -1-4)
-2 congruent 3 mod 5 (-1 * 5 = -2-3)
-3 congruent 2 mod 5 (-1 * 5 = -3-2)
-4 congruent 1 mod 5 (-1 * 5 = -4-1)
-5 congruent 5 mod 5 (-1 * 5 = -5-0)
-6 congruent 4 mod 5 (-2 * 5 = -6-4)
-7 congruent 3 mod 5 (-2 * 5 = -7-3)
...

如您所见,很多整数都是 3 mod 5 全等的: ..., -12, -7, -2, 3, 8, 13, ...

在数学中,这些数的集合被称为由等价关系“同余”导出的等价类。我们对余数的理解和“mod”函数的定义都是基于这个等价类。 “余数”或模计算的结果是等价类的代表性元素。通过声明,我们选择了最小的非负元素(因此 -2 不是有效的候选者)。

因此,当您读到 -2 mod 5 = x 时,这会转化为“找到最小的非负 x 以便存在一个整数 y 且 y * 5 = -2 - x”,这与同余的定义一致。解决方案是 y=1 和 x = 3,正如您通过简单地尝试 y 的其他值所看到的那样。

关于operator-keyword - 负模运算符结果的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6755946/

相关文章:

go - 如何在 Go 中测试一个 float 是否为整数?

java - 模数除法得到 10 的倍数

c++ - operator << 中的执行顺序

c++ - C++ 运算符重载错误

java - 代码中模乘的逆运算

xcode - 使用一个变量更新另一个变量时如何避免此错误?

c++ - 错误: no match for operator ==

haskell - 试图理解 Monad。 >> 运算符

c++ 自定义运算符 (+=) 以不可预测的方式运行

c++ - 如何在 C++ 中找到模乘逆