python - 使用 Python 执行模块化矩阵求逆的最简单方法?

标签 python matrix number-theory matrix-inverse

我想在 Python 中采用像 [[1,2],[3,4]] mod 7 这样的矩阵的模逆。我看过 numpy (它做矩阵求逆但不是模矩阵求逆),我在网上看到了一些数论包,但似乎没有什么可以做这个相对常见的过程(至少,它对我来说似乎相对常见)。

顺便说一下,上面矩阵的逆矩阵是[[5,1],[5,3]](mod 7)。不过,我希望 Python 为我做这件事。

最佳答案

好的...对于那些关心的人,我解决了我自己的问题。我花了一段时间,但我认为这是可行的。它可能不是最优雅的,应该包含更多的错误处理,但它确实有效:

import numpy
import math
from numpy import matrix
from numpy import linalg

def modMatInv(A,p):       # Finds the inverse of matrix A mod p
  n=len(A)
  A=matrix(A)
  adj=numpy.zeros(shape=(n,n))
  for i in range(0,n):
    for j in range(0,n):
      adj[i][j]=((-1)**(i+j)*int(round(linalg.det(minor(A,j,i)))))%p
  return (modInv(int(round(linalg.det(A))),p)*adj)%p

def modInv(a,p):          # Finds the inverse of a mod p, if it exists
  for i in range(1,p):
    if (i*a)%p==1:
      return i
  raise ValueError(str(a)+" has no inverse mod "+str(p))

def minor(A,i,j):    # Return matrix A with the ith row and jth column deleted
  A=numpy.array(A)
  minor=numpy.zeros(shape=(len(A)-1,len(A)-1))
  p=0
  for s in range(0,len(minor)):
    if p==i:
      p=p+1
    q=0
    for t in range(0,len(minor)):
      if q==j:
        q=q+1
      minor[s][t]=A[p][q]
      q=q+1
    p=p+1
  return minor

关于python - 使用 Python 执行模块化矩阵求逆的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4287721/

相关文章:

algorithm - 将自然数表示为不同平方和

Python 3.x : urllib. 请求错误

python - 在 PyCharm IDE 5.0.4 中运行特定的单元测试功能

python - 使用 Selenium webdriver 进行 Web2py 测试

R:在 X-Y 网格中查找缺失的组合

algorithm - 冒泡排序中执行的平均交换次数

python - 如何从 DataFrame 的列中提取日期和小时?

r - 如何在使用cbind循环R中创建一个空矩阵

arrays - 如何在Octave/MATLAB中找到向量每两个对应元素之间的范围?

c++ - 给定范围内数字因子的最大总和