diff --git a/15/main.py b/15/main.py new file mode 100644 index 0000000000000000000000000000000000000000..bc1571464703dda3261041b7f8634f2c8c4569b6 --- /dev/null +++ b/15/main.py @@ -0,0 +1,79 @@ +import random + +from matrix import MutableRationalMatrix2D, MutableRationalVector +from fractions import Fraction +""" +v = MutableRationalVector(dimensions=5) +v[2] = Fraction(100, 1) +print(Fraction(10, 1) * v) +""" + +""" +M = MutableRationalMatrix2D((3, 3)) +M[0][0] = Fraction(100, 1) + +N = MutableRationalMatrix2D((3, 3)) +N[0] = M[0] +N[1][1] = Fraction(1, 2) + +print(M | N) + +exit(0) +""" +########### + + +def create_random_square_matrix(n: int) -> MutableRationalMatrix2D: + m = MutableRationalMatrix2D(dimensions=(n, n)) + for i in range(m.dimensions[0]): + for j in range(n): + m[i][j] = Fraction(random.randint(-100, 100), + random.randint(-100, 100)) + return m + + +def negate_matrix(M: MutableRationalMatrix2D) -> MutableRationalMatrix2D: + m = MutableRationalMatrix2D(dimensions=M.dimensions) + for i in range(m.dimensions[0]): + m[i] = Fraction(-1, 1) * M[i] + # for j in range(m.dimensions[1]): + # m[i][j] = -1 * M[i][j] + return m + + +random.seed(10000) +A = create_random_square_matrix(5) +print(A) +assert negate_matrix(negate_matrix(A)) == A + + +def matrix_column_to_row(A: MutableRationalMatrix2D, i: int) -> MutableRationalVector: + v = MutableRationalVector(dimensions=A.dimensions[0]) + for j in range(A.dimensions[0]): + v[j] = A[j][i] + return v + + +def multiply_matrices(A: MutableRationalMatrix2D, B: MutableRationalMatrix2D) -> MutableRationalMatrix2D: + m = MutableRationalMatrix2D(dimensions=(A.dimensions[0], B.dimensions[1])) + for i in range(A.dimensions[0]): + for j in range(B.dimensions[1]): + m[i][j] = A[i] * matrix_column_to_row(B, j) + return m + + +x: list[list[int]] = [[1, 0, 1], [2, 1, 1], [0, 1, 1], [1, 1, 2]] +y: list[list[int]] = [[1, 2, 1], [2, 3, 1], [4, 2, 2]] +z: list[list[int]] = [[5, 4, 3], [8, 9, 5], [6, 5, 3], [11, 9, 6]] + + +def matrix_create(m: list[list[int]]) -> MutableRationalMatrix2D: + out = MutableRationalMatrix2D(dimensions=(len(m), len(m[0]))) + for i in range(out.dimensions[0]): + for j in range(out.dimensions[1]): + out[i][j] = Fraction(m[i][j], 1) + return out + + +assert (matrix_create(z) == multiply_matrices( + matrix_create(x), matrix_create(y)))