Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import copy
- from sys import stdin
- class MatrixError(BaseException):
- def __init__(self, matrix1, matrix2):
- self.matrix1 = matrix1
- self.matrix2 = matrix2
- class Matrix:
- def __init__(self, listok):
- self.listok = copy.deepcopy(listok)
- def __str__(self):
- s = str(self.listok).replace('], [', '\n')
- s2 = s.replace('[', '').replace(']', '')
- s = s2.replace(',', '').replace(' ', '\t')
- return s
- def size(self):
- return len(self.listok), len(self.listok[0])
- def __add__(self, list1):
- s = list(list1.listok)
- s2 = list(self.listok)
- n, m = self.size()
- p, q = list1.size()
- if (n == p) and (m == q):
- sNew = [[0] * len(self.listok[0]) for i in range(len(self.listok))]
- for i in range(len(self.listok)):
- for j in range(len(self.listok[0])):
- sNew[i][j] = s[i][j] + s2[i][j]
- return Matrix(sNew)
- else:
- raise MatrixError(self, list1)
- def __mul__(self, other):
- if isinstance(other, int) or isinstance(other, float):
- n, m = self.size()
- s = list(self.listok)
- sNew2 = [[0] * m for i in range(n)]
- for i in range(n):
- for j in range(m):
- sNew2[i][j] = s[i][j] * other
- return Matrix(sNew2)
- elif isinstance(self, int) or isinstance(self, float):
- n, m = other.size()
- s3 = list(other.listok)
- sNew2 = [[0] * m for i in range(n)]
- for i in range(n):
- for j in range(m):
- sNew2[i][j] = s3[i][j] * other
- return Matrix(sNew2)
- elif isinstance(self, Matrix) and isinstance(other, Matrix):
- n, m = self.size()
- p, q = other.size()
- s1 = list(self.listok)
- s2 = list(other.listok)
- if m == p:
- sNew2 = [[0] * q for i in range(n)]
- for i in range(n):
- for j in range(q):
- for l in range(m):
- sNew2[i][j] += s1[i][l] * s2[l][j]
- return Matrix(sNew2)
- else:
- raise MatrixError(self, other)
- __rmul__ = __mul__
- def transpose(self):
- n, m = self.size()
- s = list(self.listok)
- sNew3 = [[0] * n for i in range(m)]
- for i in range(m):
- for j in range(n):
- sNew3[i][j] = s[j][i]
- self.listok = sNew3
- return Matrix(self.listok)
- def transposed(self):
- n, m = self.size()
- s = list(self.listok)
- sNew3 = [[0] * n for i in range(m)]
- for i in range(m):
- for j in range(n):
- sNew3[i][j] = s[j][i]
- return Matrix(sNew3)
- def solve(self, list3):
- s1 = list(self.listok)
- s3 = list(list3)
- n, m = self.size()
- if n == m:
- for i in range(n):
- beta = s1[i][i]
- for j in range(i, m):
- s1[i][j] /= beta
- s3[i] /= beta
- for k in range(i + 1, n):
- alpha = s1[k][i]
- for j in range(i, m):
- s1[k][j] -= s1[i][j] * alpha
- s3[k] -= s3[i] * alpha
- for i in range(1, n):
- beta = s1[i][i]
- for j in range(i, m):
- s1[i][j] /= beta
- s3[i] /= beta
- for k in range(i):
- alpha = s1[k][i]
- for j in range(i, m):
- s1[k][j] -= s1[i][j] * alpha
- s3[k] -= s3[i] * alpha
- return s3
- else:
- raise MatrixError(self, list3)
- class SquareMatrix(Matrix):
- def __pow__(self, power):
- s = list(self.listok)
- n, m = self.size()
- temp = []
- sNew3 = [[0] * n for i in range(m)]
- for i in range(m):
- sNew3[i][i] = 1
- sNew3 = Matrix(sNew3)
- if power == 0:
- return sNew3
- else:
- while power != 0:
- if power % 2 == 0:
- temp.append('1')
- power //= 2
- else:
- temp.append('2')
- power -= 1
- for i in range(len(temp)):
- if temp[-(i + 1)] == '1':
- sNew3 *= sNew3
- else:
- sNew3 *= Matrix(s)
- return sNew3
- exec(stdin.read())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement