我知道numpy可用于求解线性方程,如下所示:
import numpy as np
# Solving following system of linear equation
# 1a + 1b = 35
# 2a + 4b = 94
a = np.array([[1, 1],[2,4]])
b = np.array([35, 94])
print(np.linalg.solve(a,b))
现在,让我们说,我有涉及模运算的线性方程。 numpy也可以求解此类方程吗?
以下形式的等式:
m = 2 ** 31 - 1
(207560540 ∗ a + b) modulo m = 956631177
(956631177 ∗ a + b) modulo m = 2037688522
谢谢。
答案 0 :(得分:2)
这是模块化算法,但不幸的是numpy不支持此功能。
但是您可以在python中“手动”解决它。
由于m
是素数,因此首先定义反模m
(来自here):
def inv(x): return pow(x,m-2,m) # inverse mod m, because x**(m-1) %m = 1 (Fermat).
然后,将系统设置为:
A1=207560540
C1=956631177
#(A1 ∗ a + b) modulo m = C1 : equation (1)
A2=956631177
C2=2037688522
#(A2 ∗ a + b) modulo m = C2 : equation (2)
您有:
A = A2-A1 #(2)-(1)
C = C2-C1
#A*a = C % m
X=inv(A)
a=(C*X)%m
然后:
D = A2*C1-A1*C2 # A2*(1) - A1*(2)
#A*b = D %m
b=(D*X)%m
检查:
print(a,b)
print((A1*a+b)%m,C1)
print((A2*a+b)%m,C2)
16807 78125 # a and b
956631177 956631177
2037688522 2037688522
答案 1 :(得分:1)
您可以尝试将其重写为普通的线性系统。像这样:
(207560540 ∗ a + b) + c*m + d*0 = 956631177
(956631177 ∗ a + b) + c*0 + d m = 2037688522
如果您现在解决这个线性系统,您应该会得到答案。