Easiest way to perform modular matrix inversion with Python?

前端 未结 6 1213
逝去的感伤
逝去的感伤 2020-12-25 14:32

I\'d like to take the modular inverse of a matrix like [[1,2],[3,4]] mod 7 in Python. I\'ve looked at numpy (which does matrix inversion but not modular matrix inversion) an

6条回答
  •  情歌与酒
    2020-12-25 15:16

    'sympy' package Matrix class function 'sqMatrix.inv_mod(mod)' computes modulo matrix inverse for small and arbitrarily large modulus. By combining sympy with numpy, it becomes easy to compute modulo inverse of 2-D numpy arrays (see the code snippet below):

    enter code here
    
    import numpy
    from sympy import Matrix
    
        def matInvMod (vmnp, mod):
        nr = vmnp.shape[0]
        nc = vmnp.shape[1]
        if (nr!= nc):
            print "Error: Non square matrix! exiting"
            exit()
        vmsym = Matrix(vmnp)
        vmsymInv = vmsym.inv_mod(mod)
        vmnpInv = numpy.array(vmsymInv)
        print "vmnpInv: ", vmnpInv, "\n"
        k = nr
       vmtest = [[1 for i in range(k)] for j in range(k)]  # just a 2-d list
       vmtestInv = vmsym*vmsymInv
       for i in range(k):
          for j in range(k):
             #print i, j, vmtrx2[i,j] % mod
             vmtest[i][j] = vmtestInv[i,j] % mod
       print "test vmk*vkinv % mod \n:", vmtest
       return vmnpInv
    
    if __name__ == '__main__':
        #p = 271
        p = 
    

    115792089210356248762697446949407573530086143415290314195533631308867097853951 vm = numpy.array([[1,1,1,1], [1, 2, 4, 8], [1, 4, 16, 64], [1, 5, 25, 125]])
    #vminv = modMatInv(vm, p) vminv = matInvMod(vm, p) print vminv vmtestnp = vm.dot(vminv)%p # test mtrx inversion print vmtestnp

提交回复
热议问题