# Распределенные вычисления и приложения Л6 ## _Автор Базунов Андрей Игревич ПИбд-42_ --- > ### Задание > - Кратко: реализовать нахождение детерминанта квадратной матрицы. Что такое детерминант матрицы (или определитель) > - Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной группы множителей. --- ## Алгоритм: ### Функция вычисления определителя матрицы
Код ```python def minor(matrix, i, j): return [row[:j] + row[j + 1:] for row in (matrix[:i] + matrix[i + 1:])] def determinant(matrix: list, threads=1) -> float: if len(matrix) == 1: return matrix[0][0] elif len(matrix) == 2: return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0] det = 0 futures = [] with ThreadPoolExecutor(max_workers=threads) as executor: for col in range(len(matrix)): cofactor = (-1) ** col * matrix[0][col] futures.append(executor.submit(lambda m, cof: cof * determinant(m), minor(matrix, 0, col), cofactor)) for future in futures: det += future.result() return det ```
| Размер матрицы | 1 Поток (сек) | 5 Потоков (сек) | 20 Потоков (сек) | |----------------|---------------|-----------------|------------------| | 1x1 | 0.0 | 0.0 | 0.0 | | 2x2 | 0.0 | 0.0 | 0.0 | | 3x3 | 0.00018 | 0.00019 | 0.00017 | | 4x4 | 0.00061 | 0.00072 | 0.0007 | | 5x5 | 0.00247 | 0.00359 | 0.00336 | | 6x6 | 0.01306 | 0.01931 | 0.02129 | | 7x7 | 0.08692 | 0.14062 | 0.15682 | | 8x8 | 0.59383 | 1.03971 | 1.27658 | | 9x9 | 5.23021 | 9.72031 | 11.71564 | Видео отчет: https://vkvideo.ru/video236673313_456239579