main.py 2.17 KB
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)))