【问题标题】:How python calculate this modulo?python如何计算这个模数?
【发布时间】:2015-11-09 15:03:18
【问题描述】:

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

>>>-1%10  
9

【问题讨论】:

  • 这更像是一道数学题:math.stackexchange.com/questions/519845/…
  • 这确实是一道数学题,尝试小于负 10 的数字可能会有所帮助: divmod(-11, 10) --> -2, 9 (或 -2*10 +9 = -11 )
  • 看起来你正在寻找模运算的数学定义,而不是 python 如何计算模数。这更像是一道数学题。

标签: python modulo negative-number


【解决方案1】:

我不确定您是否在询问 python 使用的算法,或者为什么答案会以这种方式出现。

如果是后者,想象为模 n 减去或加上 n 直到得到介于 0n-1 之间的数字

【讨论】:

    【解决方案2】:

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

    类似于 9 % 5 ,将是最大数小于应考虑的除数。

    5/5 = 1,因此4

    【讨论】:

      【解决方案3】:

      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 实际用于计算模数的算法,但我们至少有一个有用的心智模型来推理给定结果是如何得出的。

      【讨论】:

        【解决方案4】:

        至少对于 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,具体取决于平台。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-24
          • 2013-05-13
          • 1970-01-01
          • 2022-01-09
          • 1970-01-01
          • 1970-01-01
          • 2020-12-20
          相关资源
          最近更新 更多