forked from Alexey/DAS_2024_1
55 lines
2.7 KiB
Markdown
55 lines
2.7 KiB
Markdown
|
# Распределенные вычисления и приложения Л6
|
|||
|
|
|||
|
## _Автор Базунов Андрей Игревич ПИбд-42_
|
|||
|
|
|||
|
---
|
|||
|
> ### Задание
|
|||
|
> - Кратко: реализовать нахождение детерминанта квадратной матрицы. Что такое детерминант матрицы (или определитель)
|
|||
|
> - Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной группы множителей.
|
|||
|
---
|
|||
|
|
|||
|
## Алгоритм:
|
|||
|
|
|||
|
### Функция вычисления определителя матрицы
|
|||
|
|
|||
|
<details>
|
|||
|
<summary>Код</summary>
|
|||
|
|
|||
|
```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
|
|||
|
```
|
|||
|
|
|||
|
</details>
|
|||
|
|
|||
|
|
|||
|
| Размер матрицы | 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 |
|