[英]How does Python pow() function work with a negative power and a mod value
關於pow(base, exp[, mod])
函數的文檔說,
“如果mod
存在並且exp
為負,則base
必須是 mod 的素數。在這種情況下,返回pow(inv_base, -exp, mod)
,其中inv_base
是base
modulo mod
的倒數。”
我根本不了解這條線以及它是如何工作的。 提供的示例如下:
>>> pow(38, -1, mod=97)
23
>>> 23 * 38 % 97 == 1
True
它不應該像 (38**-1)%97 = 0.02631578947368421 嗎?
如果我嘗試從23 * 38 % 97 == 1
向后移動,我不知道模的倒數是什么。
任何人都可以給我一個清楚的解釋它是如何結束 23 的嗎? 數學解釋將非常有幫助。
在模算術除法沒有唯一的答案,所以我們沒有除法運算。 相反,你有模逆。
文檔試圖解釋pow(b, -1, mod=m)
可用於計算b
的倒數,模m
。 也就是說,找到一些數字d
使得d * b % m = 1
。
行23 * 38 % 97 == 1
只是證明答案 23 是pow(38, -1, mod=97)
,是 38 的正確模倒數。
文檔中的解釋似乎假設讀者已經對模算術有一定的了解。
任何人都可以給我一個清楚的解釋它是如何結束 23 的嗎? 數學解釋將非常有幫助。
嘗試運行此代碼片段:
for i in range(97):
s = f"{i} * 38 % 97"
print(s, "==", eval(s))
恰好其中一行將顯示同余d * 38 % 97 == 1
。 當然,有更聰明的方法來計算逆,但上面的蠻力演示應該更容易理解模塊化逆的含義。
與整數參數和mod
指定, pow()
做算術中的“ 整數乘法群模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
這並不是特別深奧,而是數論中的基本工具。
@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(target value)。
對於一個復雜的例子,讓我們來看:
>>> 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 == 1
和874/38=23
。 所以最后的表達式變成了:
23 * 38 % 97 == 1
因此,答案是 23。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.