问题描述
关于pow(base,exp[,mod])
函数的documentation说,
“如果存在mod
且exp
为负数,则base
必须相对模数为模数。在这种情况下,将返回pow(inv_base,-exp,mod)
,其中inv_base
是与base
取模mod
取反。”
我根本不了解这条线以及它是如何工作的。提供的示例如下:
>>> pow(38,-1,mod=97)
23
>>> 23 * 38 % 97 == 1
True
它的行为是否应该像(38 **-1)%97 = 0.02631578947368421吗?
如果我尝试从23 * 38 % 97 == 1
转到倒数,我不知道模的倒数是什么。
有人可以给我一个清楚的解释,它以23岁结束了吗?数学解释将非常有帮助。
解决方法
在模块化算术除法中没有唯一的答案,因此我们没有除法运算。相反,您有modular inverses。
文档试图解释pow(b,-1,mod=m)
可以用来计算b
的倒数,取模m
。也就是说,找到某个数字d
,使得d * b % m = 1
。
23 * 38 % 97 == 1
行仅表明pow(38,mod=97)
的结果答案23是38的正确模逆。
文档中的解释似乎是假设读者已经对模块化算术有所了解。
有人可以给我一个清楚的解释,它以23岁结束了吗?数学解释将非常有帮助。
尝试运行此代码段:
for i in range(97):
s = f"{i} * 38 % 97"
print(s,"==",eval(s))
确切地讲,其中的一行将显示一致性d * 38 % 97 == 1
。当然有smarter ways to compute the inverse,但是上面的蛮力演示应该可以更容易地理解模逆的含义。
在使用整数参数并指定了mod
的情况下,pow()
在“ multiplicative group of integers modulo mod
”中进行算术运算
例如,相对于8(1、3、5和7)质数的整数在乘法mod 8下形成一个组。同一性为1。由于3 * 3 = 9与1模8相等,因此3为在这个组中它自己的逆,并且
>>> pow(3,8)
3
在doc示例中,23和38是模97的逆。
>>> pow(23,97)
38
>>> pow(38,97)
23
这不是特别深奥的,而是数论中的基本工具。
, @wim的答案和@Tim Peters的示例有助于我理解此pow()
函数中发生的事情。让我们举个例子吧
>>> pow(3,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
。这意味着,我们需要以1/3
变为True的方式来表示x % 8 == 1
。很明显9 % 8 == 1
。
因此,与3(target value) * 3(base) = 9
一样,答案是3(目标值)。
举一个复杂的例子,我们来看一下:
>>> pow(38,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 == 1
和874/38=23
。所以最终的表达式变为:
23 * 38 % 97 == 1
因此,答案是23。