python如何计算这个模?

How python calculate this modulo?

如何python数学计算这个模数?

>>>-1%10  
9

我不确定您是在问 python 使用的算法,还是为什么答案会这样。

如果是后者,假设对于模 n 你减去或添加 n 直到你得到一个介于 0n-1 之间的数字

它是这样计算的:-
-10 / 10 = -1 ,
因此余数 9
-1010 的最大倍数,小于 -1.

类似9 % 5,将最大数小于分红考虑。

5/5 = 1 ,因此 4.

The Wikipedia article on the modulo operationa % q 提供以下约束:

a = nq + r

代入a = -1q = 10r = 9,我们看到n必须等于-1。

为 n 插入 -1:

-1 % 10  # Python evaluates this as 9
-1 = n * 10 + r
-1 = -1 * 10 + r
9 = r

用另一个例子测试(再次为 n 插入 -1):

-7 % 17  # Python evaluates this as 10
-7 = n * 17 + r
-7 = -17 + r
10 = r

分子为正、分母为负的第三个例子:

7 % -17  # Python evaluates this as -10
7 = n * (-17) + r
7 = -1 * (-17) + r
7 = 17 + r
-10 = r

看来,当aq的符号不同时,我们从n = -1开始,然后将n减1,直到找到最接近的n零使得 n*q < a。我们可以通过 aq 来测试这个 |a| > |q|:

-100 % 11  # Python evaluates as 10
-100 = n * 11 + r
 ...   -1  # -11 > -100
 ...   -2  # -22 > -100
 ...   -3  ...
 ...   -4  ...
 ...   -5  ...
 ...   -6  ...
 ...   -7  ...
 ...   -8  ...
 ...   -9  # -99 > -100
 -100 = -10 * 11 + r  # -110 < -100
 -100 = -110 + r
 10 = r

因此,虽然这可能不是 Python 实际用于计算模数的算法,但我们至少有一个有用的心智模型来推理给定结果的得出方式。

对于至少 python-2.7.9,它是通过首先进行整数除法 x/y 并向零截断来完成的。然后计算x与商乘y的差(即x - (x/y)*y)。如果结果非零且 y 符号不同,则将 y 添加到结果中。

例如,对于您的示例 x=-1y=10,我们首先计算 x/y,即 0(-0.1 舍入为 0)。那么差异是-1 - 0,即-1。现在 -1 非零且符号与 10 不同,因此我们向其添加 10 并得到 9.

对于 python3 (3.4.2) 它有点复杂,因为 python3 整数实际上是 longs 所以 division algorithm 是在软件而不是硬件,但其他方面基本相同。除法是使用正常除法算法使用基数 2^N 作为一些合适的数字 N 的无符号除法,具体取决于平台。