簡體   English   中英

Python pow() 函數如何以負冪和 mod 值工作

[英]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_basebase 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 == 1874/38=23 所以最后的表達式變成了:

23 * 38 % 97 == 1

因此,答案是 23。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM