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)))