def f(m): return [[float(i) for i in m_row] for m_row in m] def T(m): return list(map(list,zip(*m))) def minor(m,i,j): return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])] def det(m): if len(m) == 2: return m[0][0]*m[1][1]-m[0][1]*m[1][0] d = 0 for c in range(len(m)): d += ((-1)**c)*m[0][c]*det(minor(m,0,c)) return d def inv(m): d = det(m) if len(m) == 2: return [[ m[1][1]/d, -1*m[0][1]/d], [-1*m[1][0]/d, m[0][0]/d]] cfs = [] for r in range(len(m)): cfRow = [] for c in range(len(m)): mi = minor(m,r,c) cfRow.append(((-1)**(r+c)) * det(mi)) cfs.append(cfRow) cfs = T(cfs) for r in range(len(cfs)): for c in range(len(cfs)): cfs[r][c] = cfs[r][c]/d return cfs def add(m1, m2): return [[i + j for i, j in zip(m1_row, m2_row)] for m1_row, m2_row in zip(m1, m2)] def smul(m, s): return [[s * i for i in m_row] for m_row in m] def mmul(m1, m2): return [[sum(i * j for i, j in zip(m1_row, m2_col)) for m2_col in zip(*m2)] for m1_row in m1] def sol(m1, m2): return mmul(inv(m1), m2)