Python中负数的模运算

3
23 % -5 = -2
23 % 5 = 3

有人能解释一下吗?因为我明天要考试。我想说的是,由于-5 * -5 = 25,然后25 - 2 = 23,这就是他们得到23的方法。这样说对吗?


2
这与Python不太相关,更多地涉及到数学。http://mathforum.org/library/drmath/view/52343.html - Waleed Khan
5
@WaleedKhan,对于不同的语言,答案将有所不同,因此这确实是一个关于Python的问题。请问需要翻译的内容是否已经结束? - Mark Ransom
你可以使用 math.fmod 来获得与 C 或 Java 相同的行为。 - 0x2b3bfa0
5个回答

8
在Python中,余数的符号与分母的符号相同(这与诸如C语言之类的语言不同,在那里其符号与分子的符号相同)。
从数学上讲,您总是保证如果 a,b = divmod(n,d),则 a*d + b == n
请注意,23//5 == 423//-5 == -5 (Python始终执行地板除法)。因此,我们有4*5 + 3 == 23-5*-5 - 2 == 23,就像你所说的一样。

3
Guido在这篇博客文章中更详细地解释了为什么Python的整数除法会向下取整:Why Python's Integer Division Floors - Lukas Graf

0

在Python中,%使用“模运算”;它与取除法操作的余数不同。

a - int(a/n) * n

虽然在某些计算机语言中有时是等效的。

数学表达式可以在此处明确找到:http://en.wikipedia.org/wiki/Modulo_operation

因此,显然,在Python中,“%”操作使用以下表达式:

mod(a, n) = a - n * floor(a / n)

因此,

23%-5 = mod(23,-5)= 23 -(-5)* floor(23 / -5)= 23 -(-5)* -5 = -2

23%5 = mod(23,5)= 23 - 5 * floor(23/5)= 23 - 5 * 4 = 3

此外,您可能会发现有趣的是

-23%5 = mod(-23,5)=(-23)- 5 * floor(-23/5)= -23 - 5 *(-5)= 2

因为floor()操作将整数值向负无穷大取整。


0

让我们将其写成 N=kM+R。

我们有 23 = -5*(-5) - 2,以及 23 = 4*5 + 3。


0

针对您的目的,最简单的问题定义方式是考虑以下定义:

a mod n = R,其中余数R必须满足0<= R

因此,在mod -5算术中,0<= R < -4,即R可以是0、-1、-2、-3、-4之一。

也就是说,您需要将n从a中减去(或加上),直到R进入上述范围:

所以

23 % 5 是 (23-4*5) = 23-20 = 3

但是

23 % -5 是 (23+5*(-5)) = 23-25 = -2


0

23 % 5 = 3,因为4 * 5 = 20,当你将23除以20时,余数为3。你可以认为这是最接近而不超过的。

至于23 % -5,那么答案因编程语言而异。

对于Python来说,它是-2,因为它总是返回除数的值,这是因为5 * 5 = 25,当你在Python中将23除以25时,余数为-2(因为它必须是负数,因为除数是负数),所以我们有25-2 = 23。

值得注意的是,正式的数学定义规定b是正整数。


实际上不是这样的。正式的数学定义是说,某些数字在模数的情况下是等价的。等价类通常被认为是 [0],... [n-1],但并非必须如此。[42][-99]是模2下完全正确的等价类。 - nneonneo
我觉得你误解了我的意思。在形式为a(mod b)的表达式中,a可以是任何整数值。因此,[2]模5同余于[-3]。在正式的数学定义中,必须是b为正整数。【模算术文章】(http://en.wikipedia.org/wiki/Modular_arithmetic) - Derek W
啊,你从未定义过 b,所以我做了一个假设。 - nneonneo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接