【问题标题】:How does Python pow() function work with a negative power and a mod valuePython pow() 函数如何在负幂和 mod 值下工作
【发布时间】:2020-09-08 21:02:53
【问题描述】:

关于pow(base, exp[, mod]) 函数的documentation 说,
“如果mod 存在且exp 为负数,则base 必须与mod 互质。在这种情况下,返回pow(inv_base, -exp, mod),其中inv_basebasemod 的逆。 "

我完全不明白这条线以及它是如何工作的。提供的示例如下:

>>> pow(38, -1, mod=97)
23
>>> 23 * 38 % 97 == 1
True

它的行为不应该像 (38**-1)%97 = 0.02631578947368421 吗?
如果我尝试从23 * 38 % 97 == 1 向后退,我不知道取模的逆是什么。

谁能给我一个清楚的解释它是如何结束 23 岁的?数学解释会很有帮助。

【问题讨论】:

  • TypeError: pow() takes no keyword arguments 是我运行它时遇到的错误
  • @CoolCloud 稍后尝试 python。
  • @alani 是的,发现:在 3.8 版中更改:允许关键字参数。以前,仅支持位置参数。
  • 您至少需要 Python 3.8 才能运行它。

标签: python modulo pow


【解决方案1】:

在模算术中除法没有唯一的答案,所以我们没有除法运算。相反,你有modular inverses

文档试图解释pow(b, -1, mod=m) 可用于计算b 的倒数,以m 为模。也就是说,找到某个数字d 使得d * b % m = 1

23 * 38 % 97 == 1 行只是证明答案 23(pow(38, -1, mod=97) 的结果)是 38 的正确模逆。

文档中的解释似乎假设读者已经对模运算有所了解。

谁能给我一个清楚的解释它是如何结束 23 岁的?数学解释会很有帮助。

尝试运行这段代码sn-p:

for i in range(97): 
    s = f"{i} * 38 % 97" 
    print(s, "==", eval(s))

其中一行将显示全等 d * 38 % 97 == 1。当然有smarter ways to compute the inverse,但上面的蛮力演示应该更容易理解模逆的含义。

【讨论】:

  • 这有帮助!才知道题目。仍在尝试了解如何手动计算 d
  • @SMFahim 我添加了一个蛮力示例代码 sn-p,它概述了一种简单的计算方法(它还应该揭示为什么基数应该相对于 mod 是质数)。
  • 这个方法帮助我更好的理解。不知道它是否正确,但它适用于每个示例。我在对这个问题的新回复中详细写了它。请告诉我我是对还是错。
【解决方案2】:

使用整数参数并指定modpow() 在“multiplicative group of integers modulo mod”中进行算术运算

例如,与 8 互质的整数(1、3、5 和 7)在乘法模 8 下形成一个群。恒等式是 1。由于 3*3 = 9 等于 1 模 8,所以 3 是在这个组中它自己的逆,并且

>>> pow(3, -1, 8)
3

在 doc 示例中,23 和 38 是模 97 的倒数。

>>> pow(23, -1, 97)
38
>>> pow(38, -1, 97)
23

这不是特别深奥,而是数论中的基本工具。

【讨论】:

    【解决方案3】:

    @wim 的答案和@Tim Peters 的示例帮助我理解了这个pow() 函数中发生了什么。举个例子吧,

    >>> pow(3, -1, 8)
    3
    

    模数 m 必须在 range(0,m) 中。例如14%5 必须在range(0,5) 中,因此它是 4。

    所以模 1/3 % 8 必须在 range(8) 中。但是作为不在范围内的1/3=0.33,我们需要一种方法来找到它。

    1/3 % 8 不能为零,因为它不可整除。所以可能的最低值是1。这意味着,我们需要以 x % 8 == 1 变为 True 的方式表示 1/3。很明显9 % 8 == 1.
    3(target value) * 3(base) = 9,因此,答案是3(目标值)。

    举个复杂的例子:

    >>> pow(38, -1, mod=97)
    23
    

    1/38=0.026。再次,需要一个方法。因为最低的 mod 应该是 1,因此x % 97 == 1。显然98 % 97 == 1,但98/38 不是整数。接下来,(2*97+1) 或195 % 97 == 1,但195/38 不是整数。

    在这个过程中,(9*97+1) 或874 % 97 == 1874/38=23。所以最终的表达式变成了:

    23 * 38 % 97 == 1
    

    因此,答案是 23。

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 2015-12-20
      • 2016-03-11
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      相关资源
      最近更新 更多