【问题标题】:What does pow(a, b, c) do when the exponent is negative?当指数为负时 pow(a, b, c) 会做什么?
【发布时间】:2020-02-01 18:31:19
【问题描述】:

Python 允许在内置函数 pow 中使用第三个参数,该函数基本上以第三个参数 (pow(a,b,c) = a**b % c) 为模计算幂。

当指数为负时它如何工作?例如:

pow(6, -2, 13)
#-> 4

pow(6, -2, 12)
#-> Traceback (most recent call last):
#->  File "<stdin>", line 1, in <module>
#->  ValueError: base is not invertible for the given modulus

【问题讨论】:

    标签: python python-3.x pow


    【解决方案1】:

    来自 python 内置函数文档:

    对于 int 操作数 base 和 exp,如果 mod 存在,mod 也必须是整数类型并且 mod 必须是非零的。如果 mod 存在且 exp 为负数,则 base 必须与 mod 互质。在这种情况下,返回 pow(inv_base, -exp, mod),其中 inv_base 是基模 mod 的逆。

    这意味着在您的示例中,python 计算 6 的倒数(因此 6 * inverse = 1)并计算 pow(inverse, 2, 13)。在这种情况下,6 mod 13 的倒数是 11 (6 * 11 = 66 = 1 mod 13),您计算 11 ** 2 = 121 = 4 mod 13

    【讨论】:

      【解决方案2】:

      当第二个参数是-1 时,它计算a (mod c) 的模逆。使用其他负幂 -n 会将模逆返回到 n-th 幂 (mod c)

      https://en.wikipedia.org/wiki/Modular_multiplicative_inverse

      【讨论】:

        【解决方案3】:

        您是否尝试过亲自检查一下? Python 过去在提供第三个参数时不支持负指数,它们在 3.8.x 版本中有所改变,现在它允许您计算模逆(与处理实数时的“标准”逆相反) )。

        因此,如果示例 pow(2, -1, 3) 会告诉您 mod 3 中的倒数为 2,因为 2*2 =4 = 1 mod 3

        【讨论】:

          【解决方案4】:
          pow(base, exp) =  base**exp
          pow(12,2) = 144 = 12**2
          

          现在在支持的 3.8 中计算模逆。在此之前,他们拒绝反转到基本模数

          【讨论】:

            【解决方案5】:

            我认为没有人回答您的确切问题。 pow(6, -2, 13) 是模 13 的负二乘方的 6,即(来自 range(13))乘以 6 的平方后得到 1。即 4,因为4 * 6**2 == 144,即 1 模 13。

            不存在模 12 相同的东西,因为无论你乘以 36 都可以被 12 整除,所以你总是会得到 0(而且永远不会是 1)模 12。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-10-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多