Advertisement
Guest User

Untitled

a guest
Oct 19th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.63 KB | None | 0 0
  1. import copy
  2. from sys import stdin
  3.  
  4.  
  5. class MatrixError(BaseException):
  6. def __init__(self, matrix1, matrix2):
  7. self.matrix1 = matrix1
  8. self.matrix2 = matrix2
  9.  
  10.  
  11. class Matrix:
  12. def __init__(self, listok):
  13. self.listok = copy.deepcopy(listok)
  14.  
  15. def __str__(self):
  16. s = str(self.listok).replace('], [', '\n')
  17. s2 = s.replace('[', '').replace(']', '')
  18. s = s2.replace(',', '').replace(' ', '\t')
  19. return s
  20.  
  21. def size(self):
  22. return len(self.listok), len(self.listok[0])
  23.  
  24. def __add__(self, list1):
  25. s = list(list1.listok)
  26. s2 = list(self.listok)
  27. n, m = self.size()
  28. p, q = list1.size()
  29. if (n == p) and (m == q):
  30. sNew = [[0] * len(self.listok[0]) for i in range(len(self.listok))]
  31. for i in range(len(self.listok)):
  32. for j in range(len(self.listok[0])):
  33. sNew[i][j] = s[i][j] + s2[i][j]
  34. return Matrix(sNew)
  35. else:
  36. raise MatrixError(self, list1)
  37.  
  38. def __mul__(self, other):
  39. if isinstance(other, int) or isinstance(other, float):
  40. n, m = self.size()
  41. s = list(self.listok)
  42. sNew2 = [[0] * m for i in range(n)]
  43. for i in range(n):
  44. for j in range(m):
  45. sNew2[i][j] = s[i][j] * other
  46. return Matrix(sNew2)
  47. elif isinstance(self, int) or isinstance(self, float):
  48. n, m = other.size()
  49. s3 = list(other.listok)
  50. sNew2 = [[0] * m for i in range(n)]
  51. for i in range(n):
  52. for j in range(m):
  53. sNew2[i][j] = s3[i][j] * other
  54. return Matrix(sNew2)
  55. elif isinstance(self, Matrix) and isinstance(other, Matrix):
  56. n, m = self.size()
  57. p, q = other.size()
  58. s1 = list(self.listok)
  59. s2 = list(other.listok)
  60. if m == p:
  61. sNew2 = [[0] * q for i in range(n)]
  62. for i in range(n):
  63. for j in range(q):
  64. for l in range(m):
  65. sNew2[i][j] += s1[i][l] * s2[l][j]
  66. return Matrix(sNew2)
  67. else:
  68. raise MatrixError(self, other)
  69. __rmul__ = __mul__
  70.  
  71. def transpose(self):
  72. n, m = self.size()
  73. s = list(self.listok)
  74. sNew3 = [[0] * n for i in range(m)]
  75. for i in range(m):
  76. for j in range(n):
  77. sNew3[i][j] = s[j][i]
  78. self.listok = sNew3
  79. return Matrix(self.listok)
  80.  
  81. def transposed(self):
  82. n, m = self.size()
  83. s = list(self.listok)
  84. sNew3 = [[0] * n for i in range(m)]
  85. for i in range(m):
  86. for j in range(n):
  87. sNew3[i][j] = s[j][i]
  88. return Matrix(sNew3)
  89.  
  90. def solve(self, list3):
  91. s1 = list(self.listok)
  92. s3 = list(list3)
  93. n, m = self.size()
  94. if n == m:
  95. for i in range(n):
  96. beta = s1[i][i]
  97. for j in range(i, m):
  98. s1[i][j] /= beta
  99. s3[i] /= beta
  100. for k in range(i + 1, n):
  101. alpha = s1[k][i]
  102. for j in range(i, m):
  103. s1[k][j] -= s1[i][j] * alpha
  104. s3[k] -= s3[i] * alpha
  105. for i in range(1, n):
  106. beta = s1[i][i]
  107. for j in range(i, m):
  108. s1[i][j] /= beta
  109. s3[i] /= beta
  110. for k in range(i):
  111. alpha = s1[k][i]
  112. for j in range(i, m):
  113. s1[k][j] -= s1[i][j] * alpha
  114. s3[k] -= s3[i] * alpha
  115. return s3
  116. else:
  117. raise MatrixError(self, list3)
  118.  
  119.  
  120. class SquareMatrix(Matrix):
  121. def __pow__(self, power):
  122. s = list(self.listok)
  123. n, m = self.size()
  124. temp = []
  125. sNew3 = [[0] * n for i in range(m)]
  126. for i in range(m):
  127. sNew3[i][i] = 1
  128. sNew3 = Matrix(sNew3)
  129. if power == 0:
  130. return sNew3
  131. else:
  132. while power != 0:
  133. if power % 2 == 0:
  134. temp.append('1')
  135. power //= 2
  136. else:
  137. temp.append('2')
  138. power -= 1
  139. for i in range(len(temp)):
  140. if temp[-(i + 1)] == '1':
  141. sNew3 *= sNew3
  142. else:
  143. sNew3 *= Matrix(s)
  144.  
  145. return sNew3
  146.  
  147.  
  148. exec(stdin.read())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement