diff --git a/savenkov_alexander_lab_5/.idea/.gitignore b/savenkov_alexander_lab_5/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/savenkov_alexander_lab_5/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/savenkov_alexander_lab_5/.idea/discord.xml b/savenkov_alexander_lab_5/.idea/discord.xml
new file mode 100644
index 0000000..30bab2a
--- /dev/null
+++ b/savenkov_alexander_lab_5/.idea/discord.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/savenkov_alexander_lab_5/.idea/inspectionProfiles/profiles_settings.xml b/savenkov_alexander_lab_5/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/savenkov_alexander_lab_5/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/savenkov_alexander_lab_5/.idea/misc.xml b/savenkov_alexander_lab_5/.idea/misc.xml
new file mode 100644
index 0000000..60cb3b1
--- /dev/null
+++ b/savenkov_alexander_lab_5/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/savenkov_alexander_lab_5/.idea/modules.xml b/savenkov_alexander_lab_5/.idea/modules.xml
new file mode 100644
index 0000000..1756967
--- /dev/null
+++ b/savenkov_alexander_lab_5/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/savenkov_alexander_lab_5/.idea/savenkov_alexander_lab_5.iml b/savenkov_alexander_lab_5/.idea/savenkov_alexander_lab_5.iml
new file mode 100644
index 0000000..74d515a
--- /dev/null
+++ b/savenkov_alexander_lab_5/.idea/savenkov_alexander_lab_5.iml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/savenkov_alexander_lab_5/README.md b/savenkov_alexander_lab_5/README.md
new file mode 100644
index 0000000..b79deef
--- /dev/null
+++ b/savenkov_alexander_lab_5/README.md
@@ -0,0 +1,32 @@
+# Лабораторная работа №5 - Вспоминаем математику или параллельное перемножение матриц
+
+Задание:
+
+Кратко: реализовать умножение двух больших квадратных матриц.
+
+Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности.
+
+Сделать несколько бенчмарков последовательного и параллельного алгоритма на умножение двух матриц размером 100x100, 300x300, 500x500 элементов.
+
+
+
Код
+
+
+
+
Код
+
+
+
+
Код
+
+
+
+
Работа программы
+
+
+
+Вывод: Параллельный алгоритм намного бысрее и имеет место быть если либо в матрице используются огромные числа или сама матрица намного большей размерностью
+
+# Видео
+
+Видео с разбором лабораторной работы - https://youtu.be/XfRcCUa_QMU
diff --git a/savenkov_alexander_lab_5/app.py b/savenkov_alexander_lab_5/app.py
new file mode 100644
index 0000000..b02223d
--- /dev/null
+++ b/savenkov_alexander_lab_5/app.py
@@ -0,0 +1,66 @@
+import numpy as np
+import time
+from concurrent.futures import ThreadPoolExecutor
+
+def sequential_matrix_multiply(matrix_a, matrix_b):
+ """Выполняет последовательное умножение матриц."""
+ return np.dot(matrix_a, matrix_b)
+
+def parallel_matrix_multiply(matrix_a, matrix_b, num_threads=1):
+ """
+ Выполняет параллельное умножение матриц с использованием заданного количества потоков.
+ Каждый поток обрабатывает свою часть строк матрицы A.
+ """
+ result = np.zeros_like(matrix_a)
+ rows, cols = matrix_a.shape
+ chunk_size = rows // num_threads
+
+ def multiply_chunk(start_row, end_row):
+ """Умножение части матрицы A на матрицу B."""
+ nonlocal result
+ for i in range(start_row, end_row):
+ result[i] = np.dot(matrix_a[i], matrix_b)
+
+ with ThreadPoolExecutor(max_workers=num_threads) as executor:
+ futures = []
+ for i in range(0, rows, chunk_size):
+ end_row = min(i + chunk_size, rows)
+ futures.append(executor.submit(multiply_chunk, i, end_row))
+
+ for future in futures:
+ future.result()
+
+ return result
+
+def benchmark(matrix_size, num_threads=1):
+ """
+ Измеряет время выполнения последовательного и параллельного умножения матриц
+ заданного размера с использованием заданного количества потоков.
+ """
+ matrix_a = np.random.randint(0, 10, size=(matrix_size, matrix_size))
+ matrix_b = np.random.randint(0, 10, size=(matrix_size, matrix_size))
+
+ # Замер времени для последовательного алгоритма
+ start_time = time.time()
+ sequential_result = sequential_matrix_multiply(matrix_a, matrix_b)
+ sequential_time = time.time() - start_time
+
+ # Замер времени для параллельного алгоритма
+ start_time = time.time()
+ parallel_result = parallel_matrix_multiply(matrix_a, matrix_b, num_threads)
+ parallel_time = time.time() - start_time
+
+ return sequential_time, parallel_time
+
+if __name__ == "__main__":
+ matrix_sizes = [100, 300, 500]
+ num_threads = int(input("Введите количество потоков: "))
+
+ for size in matrix_sizes:
+ print(f"Matrix size: {size}x{size}")
+ sequential_time, parallel_time = benchmark(size, num_threads)
+
+ print(f"Sequential algorithm time: {sequential_time:.6f} seconds")
+ print(f"Parallel algorithm time ({num_threads} threads): {parallel_time:.6f} seconds")
+
+ print("="*30)
diff --git a/savenkov_alexander_lab_5/screens/img1.png b/savenkov_alexander_lab_5/screens/img1.png
new file mode 100644
index 0000000..940d45f
Binary files /dev/null and b/savenkov_alexander_lab_5/screens/img1.png differ
diff --git a/savenkov_alexander_lab_5/screens/img2.png b/savenkov_alexander_lab_5/screens/img2.png
new file mode 100644
index 0000000..2021c63
Binary files /dev/null and b/savenkov_alexander_lab_5/screens/img2.png differ
diff --git a/savenkov_alexander_lab_5/screens/img3.png b/savenkov_alexander_lab_5/screens/img3.png
new file mode 100644
index 0000000..b77373f
Binary files /dev/null and b/savenkov_alexander_lab_5/screens/img3.png differ
diff --git a/savenkov_alexander_lab_5/screens/img4.png b/savenkov_alexander_lab_5/screens/img4.png
new file mode 100644
index 0000000..9156e5e
Binary files /dev/null and b/savenkov_alexander_lab_5/screens/img4.png differ