Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python';s模运算符(%)与欧几里德定义不匹配?_Python - Fatal编程技术网

为什么Python';s模运算符(%)与欧几里德定义不匹配?

为什么Python';s模运算符(%)与欧几里德定义不匹配?,python,Python,欧几里德的定义是 给定两个整数a和b,其中≠ 存在唯一的整数q和r,使得a=bq+r和0≤ r函数。这就同时给出了两个数的除法和模。python中的整数除法始终是四舍五入到下一个较小整数的除法。所以-3/-2是1.5四舍五入到1,剩下的-1作为模。@Jornsharpe没有帮助,给出了递归的答案,因为我不明白%是如何工作的,我怎么能理解(a//b)*b+(a%b)==a工作的?尽管这是bq+r的形式,但我不确定这是否重复:相关问题主要是关于负红利,而不是负除数。OP似乎已经对这种负红利的行为感到

欧几里德的定义是

给定两个整数a和b,其中≠ 存在唯一的整数q和r,使得a=bq+r和0≤ r<|b |,其中| b |表示b的绝对值

根据以下观察,

>>> -3 % -2   # Ideally it should be (-2 * 2) + 1
-1
>>> -3 % 2    # this looks fine, (-2 * 2) + 1 
1
>>> 2 % -3    # Ideally it should be (-3 * 0) + 2
-1
看起来
%
运算符正在使用不同的规则运行

  • 没有帮助,
  • 给出递归的答案,因为我不理解
    %
    是如何工作的,所以很难理解
    (a//b)*b+(a%b)==a
    是如何工作的
我的问题:


如何理解python中模运算符的行为?我不知道与
%
运算符的操作有关的任何其他语言。

的一篇文章中解释了整数除法和模运算的行为,即:。我将引用相关部分:

如果其中一个操作数为负数,则结果为底数,即。, 从零开始四舍五入(朝向负无穷大):

这让一些人感到不安,但有一个很好的数学原因。 整数除法运算(
/
)及其同级模运算 操作(
%
),一起去满足一个好的数学模型 关系(所有变量均为整数):

a/b=q
带余数
r

以致

b*q+r=a
0=0

如果希望关系扩展为负值
a
(保持
b
正),您有两个选择:如果将
q
截断为零,
r

将变为负值,因此,
0的不变变化在的一篇文章中解释了整数除法和模运算的行为,即:。我将引用相关部分:

如果其中一个操作数为负数,则结果为底数,即。, 从零开始四舍五入(朝向负无穷大):

这让一些人感到不安,但有一个很好的数学原因。 整数除法运算(
/
)及其同级模运算 操作(
%
),一起去满足一个好的数学模型 关系(所有变量均为整数):

a/b=q
带余数
r

以致

b*q+r=a
0=0

如果希望关系扩展为负值
a
(保持
b
正),您有两个选择:如果将
q
截断为零,
r

将变为负值,因此不变量将更改为
0要了解发生了什么,请查看
divmod
函数。这就同时给出了两个数的除法和模。python中的整数除法始终是四舍五入到下一个较小整数的除法。所以-3/-2是1.5四舍五入到1,剩下的-1作为模。@Jornsharpe没有帮助,给出了递归的答案,因为我不明白%是如何工作的,我怎么能理解
(a//b)*b+(a%b)==a
工作的?尽管这是bq+r的形式,但我不确定这是否重复:相关问题主要是关于负红利,而不是负除数。OP似乎已经对这种负红利的行为感到满意了。作为记录,Python比大多数其他常见编程语言更接近您引用的定义。对于正B,它遵循这个定义,而例如C++和java在A是否定的时候不知道。要知道发生了什么,看看<代码> DIVMOD< /COD>函数。这就同时给出了两个数的除法和模。python中的整数除法始终是四舍五入到下一个较小整数的除法。所以-3/-2是1.5四舍五入到1,剩下的-1作为模。@Jornsharpe没有帮助,给出了递归的答案,因为我不明白%是如何工作的,我怎么能理解
(a//b)*b+(a%b)==a
工作的?尽管这是bq+r的形式,但我不确定这是否重复:相关问题主要是关于负红利,而不是负除数。OP似乎已经对这种负红利的行为感到满意了。作为记录,Python比大多数其他常见编程语言更接近您引用的定义。对于正B,它遵循这个定义,而C++和java在a是否定的时候不注意。注意,对于积极<代码> b/COD>,Python的行为完全符合在该问题中所陈述的欧几里得除法定理,不管代码< A/<代码>的符号。OP的问题似乎是关于负除数的行为,而不是关于负红利的更常见的问题。@MarkDickinson在最后一段中提到了这一点:“对于负
b
一切都会翻转,不变量变成
0>=r>b
”。是的。但是你关于Python破坏欧几里德定义的评论是误导性的,我认为:它实际上与欧几里德定义一致,而在许多其他通用语言(C99、Java等)都不同意的情况下。@MarkDickinson是的,但允许
r<0
使得欧几里德不变量为假,即使只是在特定情况下。我要补充一句关于其他语言的评论。@MarkDickinson这篇文章可能引用了维基百科的定义。特别是关于。请注意,在页面中,它们确实考虑了负
b
s,并且提供的算法在所有情况下都保持不变量(
r>=0
)。请注意,对于正
b
,Python的行为与问题中所述的欧几里德除法定理完全一致,无论
a的符号是什么
。OP的问题似乎是关于负除数的行为,而不是关于负红利的更常见的问题。@MarkDickinson这在最后一段中提到:“对于负
b
everythi
>>> -5//2
-3
>>> 5//-2
-3
0 >= r > b.