2

我试图把头放在这个mod功能上。在我尝试mod (-4) 3GHCi 之前,一切似乎都很好。有人可以向我解释为什么mod (-4) 3等于2而不是1吗?真的很困扰我!

4

2 回答 2

14
integer x  ... -6 -5 -4 -3 -2 -1  0  1  2  3  4  5 ...
mod x 3    ...  0  1  2  0  1  2  0  1  2  0  1  2 ...

mod (x+3) 3 = mod x 3上面的序列满足任意的方程x。注意如何0 1 2不断重复。

请注意,在 Haskell 中,我们同时拥有

mod (-4) 3 == 2
rem (-4) 3 == -1

在哪里

integer x  ... -6 -5 -4 -3 -2 -1  0  1  2  3  4  5 ...
rem x 3    ...  0 -2 -1  0 -2 -1  0  1  2  0  1  2 ...

mod x ydiv x y是除法向下舍入的“余数” (朝向-无穷大)。取而代之rem x y的是quot x y除法向零舍入的余数(因此“余数”可以为负数)。

于 2015-10-22T16:49:43.077 回答
2

它与正数的 mod 相同。在算术模 c 中,我们试图将任何 x 表示为 qc+r,其中 r 必须是非负整数。

我们为什么不通过一个例子来测试它呢?

取-100 mod 8=4。这是因为 8⋅−13=−104。余数为 4。

我将尝试解释...我的方式:正数的 qc + r 表示 100 mod 8 = 4 因为您可以将其表示为 8*12 + 4 意味着您可以从中拉出 12 个 8 但您会结束需要 4 才能达到 100。在负数情况下,您可以“拉出”-13 个 8,然后您需要加 4(正数)才能达到 100。

因此,在您的情况下,您可以取出两个 3(以 -6 结尾),然后您需要剩余的正 2 才能达到 -4

可能需要数学家来解释: https ://math.stackexchange.com/questions/519845/modulo-of-a-negative-number

于 2015-10-22T16:46:01.433 回答