python如何计算这个模?
How python calculate this modulo?
如何python数学计算这个模数?
>>>-1%10
9
我不确定您是在问 python 使用的算法,还是为什么答案会这样。
如果是后者,假设对于模 n
你减去或添加 n
直到你得到一个介于 0
和 n-1
之间的数字
它是这样计算的:-
-10 / 10 = -1
,
因此余数 9
。
-10
是 10
的最大倍数,小于 -1
.
类似9 % 5
,将最大数小于分红考虑。
5/5 = 1
,因此 4
.
The Wikipedia article on the modulo operation 为 a % q
提供以下约束:
a = nq + r
代入a = -1
、q = 10
和r = 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
看来,当a
和q
的符号不同时,我们从n = -1
开始,然后将n
减1,直到找到最接近的n零使得 n*q < a
。我们可以通过 a
和 q
来测试这个 |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=-1
和 y=10
,我们首先计算 x/y
,即 0(-0.1 舍入为 0)。那么差异是-1 - 0
,即-1
。现在 -1
非零且符号与 10
不同,因此我们向其添加 10
并得到 9
.
对于 python3 (3.4.2) 它有点复杂,因为 python3 整数实际上是 long
s 所以 division algorithm 是在软件而不是硬件,但其他方面基本相同。除法是使用正常除法算法使用基数 2^N 作为一些合适的数字 N
的无符号除法,具体取决于平台。
如何python数学计算这个模数?
>>>-1%10
9
我不确定您是在问 python 使用的算法,还是为什么答案会这样。
如果是后者,假设对于模 n
你减去或添加 n
直到你得到一个介于 0
和 n-1
之间的数字
它是这样计算的:-
-10 / 10 = -1
,
因此余数 9
。
-10
是 10
的最大倍数,小于 -1
.
类似9 % 5
,将最大数小于分红考虑。
5/5 = 1
,因此 4
.
The Wikipedia article on the modulo operation 为 a % q
提供以下约束:
a = nq + r
代入a = -1
、q = 10
和r = 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
看来,当a
和q
的符号不同时,我们从n = -1
开始,然后将n
减1,直到找到最接近的n零使得 n*q < a
。我们可以通过 a
和 q
来测试这个 |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=-1
和 y=10
,我们首先计算 x/y
,即 0(-0.1 舍入为 0)。那么差异是-1 - 0
,即-1
。现在 -1
非零且符号与 10
不同,因此我们向其添加 10
并得到 9
.
对于 python3 (3.4.2) 它有点复杂,因为 python3 整数实际上是 long
s 所以 division algorithm 是在软件而不是硬件,但其他方面基本相同。除法是使用正常除法算法使用基数 2^N 作为一些合适的数字 N
的无符号除法,具体取决于平台。