Python 大数模矩阵求逆
我试图找到一种模矩阵求逆的方法。我找到了代码: 当我用小素数q和矩阵元素测试时,结果是正确的。但是,当我使用大素数q和由大元素(例如1024位)组成的矩阵进行测试时,它会输出错误:Python 大数模矩阵求逆,python,numpy,matrix,Python,Numpy,Matrix,我试图找到一种模矩阵求逆的方法。我找到了代码: 当我用小素数q和矩阵元素测试时,结果是正确的。但是,当我使用大素数q和由大元素(例如1024位)组成的矩阵进行测试时,它会输出错误: A = np.matrix([[ matrix[j, i] for i in range(0,n)] for j in range(0, n)], dtype = long) File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", lin
A = np.matrix([[ matrix[j, i] for i in range(0,n)] for j in range(0, n)], dtype = long)
File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 257, in __new__
arr = N.array(data, dtype=dtype, copy=copy)
是因为np矩阵的数据类型吗?如果是这样,为什么“长”数据类型不能支持这种情况
你能告诉我怎么解决这个错误吗。提前感谢我刚刚发现np.array会导致很多问题。一种解决方案是将矩阵视为二维列表。下面是我的代码
def generalizedEuclidianAlgorithm(a, b):
if b > a:
return generalizedEuclidianAlgorithm(b,a);
elif b == 0:
return (1, 0);
else:
(x, y) = generalizedEuclidianAlgorithm(b, a % b);
return (y, x - (a / b) * y)
def inversemodp(a, p):
a = a % p
if (a == 0):
print "a is 0 mod p"
return 0
(x,y) = generalizedEuclidianAlgorithm(p, a % p);
return y % p
def identitymatrix(n):
return [[long(x == y) for x in range(0, n)] for y in range(0, n)
def multiply_vector_scalar (vector, scalar, q):
kq = []
for i in range (0, len(vector)):
kq.append (vector[i] * scalar %q)
return kq
def minus_vector_scalar1(vector1, scalar, vector2, q):
kq = []
for i in range (0, len(vector1)):
kq.append ((vector1[i] - scalar * vector2[i]) %q)
return kq
def inversematrix1(matrix, q):
n = len(matrix)
A =[]
for j in range (0, n):
temp = []
for i in range (0, n):
temp.append (matrix[j][i])
A.append(temp)
Ainv = identitymatrix(n)
for i in range(0, n):
factor = inversemodp(A[i][i], q)
A[i] = multiply_vector_scalar(A[i],factor,q)
Ainv[i] = multiply_vector_scalar(Ainv[i],factor,q)
for j in range(0, n):
if (i != j):
factor = A[j][i]
A[j] = minus_vector_scalar1(A[j],factor,A[i],q)
Ainv[j] = minus_vector_scalar1(Ainv[j],factor,Ainv[i],q)
return Ainv
手工做有什么理由吗?使用包中的numpy库。您尝试执行的许多操作已经在那里实现和优化。
dtype=long
已转换为固定宽度的整数dtype(例如,在我的机器上,int64
)。您可能想要dtype=object
。@jesuime我认为numpy不支持模块化矩阵inversion@MarkDickinson:谢谢。当我更改为dtype=object时,它会导致如下错误:“无法支持*:long和matrix:-A[I]=A[I]*因子%q,-Ainv[I]=Ainv[I]*因子%q,-A[j]=(A[j]-因子*A[I])%q,-Ainv[j]=(Ainv[j]-因子*Ainv[I])%q感兴趣。看起来这是NumPy中的一个bug。我可以用NumPy 1.6.2重现您的问题,但不能用NumPy 1.8.1重现。看见解决方法是使用numpy.array
而不是numpy.matrix
,这意味着您需要使用numpy.dot
进行矩阵乘法。在NumPy中避免使用矩阵
类型有很多原因;看起来你又找到了一个。:-)注意:identitymatrix
在列表中缺少结束语]
def generalizedEuclidianAlgorithm(a, b):
if b > a:
return generalizedEuclidianAlgorithm(b,a);
elif b == 0:
return (1, 0);
else:
(x, y) = generalizedEuclidianAlgorithm(b, a % b);
return (y, x - (a / b) * y)
def inversemodp(a, p):
a = a % p
if (a == 0):
print "a is 0 mod p"
return 0
(x,y) = generalizedEuclidianAlgorithm(p, a % p);
return y % p
def identitymatrix(n):
return [[long(x == y) for x in range(0, n)] for y in range(0, n)
def multiply_vector_scalar (vector, scalar, q):
kq = []
for i in range (0, len(vector)):
kq.append (vector[i] * scalar %q)
return kq
def minus_vector_scalar1(vector1, scalar, vector2, q):
kq = []
for i in range (0, len(vector1)):
kq.append ((vector1[i] - scalar * vector2[i]) %q)
return kq
def inversematrix1(matrix, q):
n = len(matrix)
A =[]
for j in range (0, n):
temp = []
for i in range (0, n):
temp.append (matrix[j][i])
A.append(temp)
Ainv = identitymatrix(n)
for i in range(0, n):
factor = inversemodp(A[i][i], q)
A[i] = multiply_vector_scalar(A[i],factor,q)
Ainv[i] = multiply_vector_scalar(Ainv[i],factor,q)
for j in range(0, n):
if (i != j):
factor = A[j][i]
A[j] = minus_vector_scalar1(A[j],factor,A[i],q)
Ainv[j] = minus_vector_scalar1(Ainv[j],factor,Ainv[i],q)
return Ainv