下面是我試圖解決的一個例子:
a = 5
b = 21
i = int(input("Enter a number: "))
c = (a*i b) % 41
c 將導致 17。
我的問題是,如果我們有 c(答案),是否有可能找到 i:
數學上:(5xix21)A=17
uj5u.com熱心網友回復:
是和否。
- 是的,很容易找到滿足模方程 5*i 21 == 17 (mod 41) 的所有整數 i 的集合。
- 不,這個整數不是唯一的,因此您無法真正猜測用戶選擇了哪個。
請注意,以下陳述句是等效的:
- “
5 * i 21 == 17 (mod 41)”; - "
5 * i 21 - 17可以被41"整除; - “存在
q這樣的5 * i 21 - 17 == 41 * q”。
所以現在你有一個包含兩個變數的整數線性方程:
5*i - 41*q = -4
(i, q)使用擴展的歐幾里得演算法可以很容易地找到該方程的特定解,然后可以從該特定方程推匯出所有解的引數形式,作為高斯定理的應用。
我想向您推薦一本關于如何手動求解這個方程的優秀課程材料,但目前我手頭沒有參考資料。也許其他人可以推薦一個,或者您可以在https://math.stackexchange.com 上搜索“丟番圖方程”
由于您標記了 [python],這是使用 sympy 的解決方案。參考:https : //docs.sympy.org/latest/modules/solvers/diophantine.html
from sympy.solvers.diophantine import diophantine
from sympy import symbols
i, q = symbols('i q', integer=True)
diophantine(5 * i - 41 * q 4)
# {(41*t_0 32, 5*t_0 4)}
這告訴您,對于 的任何整數值t_0,您都可以通過選擇i = 41*t_0 32和 來獲得解決方案q = 5*t_0 4。
特別是,通過選擇t_0 = 0,我們得到i = 32,您可以檢查這i = 32確實是您原始問題的解決方案:
a = 5
b = 21
i = 32
c = (a*i b) % 41
print(c)
# 17
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/374602.html
上一篇:了解浮點格式
