Merge pull request 'balakhonov_danila_lab_6' (#376) from balakhonov_danila_lab_6 into main

Reviewed-on: #376
This commit is contained in:
Alexey 2025-01-02 13:03:30 +04:00
commit 715ed84412
3 changed files with 80 additions and 0 deletions

View File

@ -0,0 +1,36 @@
# Лабораторная работа номер 6
> Здравствуйте меня зовут Балахонов Данила группа ПИбд-42
>
> *— Балахонов Данила ПИбд-42*
Видео лабораторной работы номер 6 доступно по этой [ссылке](https://drive.google.com/file/d/1GUJP05PU88XX0UQ3SnzyrcvMiUZ5LN1j/view?usp=sharing).
## Как запустить лабораторную работу номер 6?
### Необходимые компоненты для запуска лабораторной работы номер 6
> Здесь рассказана установка необходимых компонентов для запуска лабораторной работы номер 6 под дистрибутив GNU/Linux **Ubuntu**.
Для запуска лабораторной работы номер 6 необходимы такие компоненты:
- Python 3
Чтобы установить Python 3, введите такую команду:
``` bash
sudo apt update
sudo apt install python3
```
После этого будет установлена последняя версия Python.
### Запуск лабораторной работы номер 6
Для запуска лабораторной работы номер 6 необходимо **склонировать** репозиторий в любую папку и **перейти на ветку** balakhonov_danila_lab_6.
Далее в папке с `program.py` нужно вызвать такую команду:
``` bash
python3 program.py
```
Таким образом будет запущена программа по подсчету определителя матрицы.
## Какие технологии были использованы?
Для выполнения лабораторной работы номер 6 были использованы такие технологии, как:
- Python
## Что делает лабораторная работа номер 6?
Суть лабораторной работы номер 6 заключается в разработке приложения по параллельному подсчету определителя квадратной матрицы большого размера.
## Выводы лабораторной работы номер 6
Пример выполнения программы на матрицах 100x100, 300x300, 500x500 можно увидеть на рисунке ниже.
![Результат выполнения программы](result.png)

View File

@ -0,0 +1,44 @@
import random as rnd
import time
import concurrent.futures
def gen_square_matrix(size):
return [[rnd.randint(1, 100) for _ in range(size)] for _ in range(size)]
# Параллельное вычисление определителя
def parallel_det(matrix, num_threads):
n = len(matrix)
# Определитель
det_value = 1
def process_row(i, j):
factor = matrix[j][i] / matrix[i][i]
for k in range(i, n):
matrix[j][k] -= factor * matrix[i][k]
for i in range(n):
if matrix[i][i] == 0:
for j in range(i + 1, n):
if matrix[j][i] != 0:
matrix[i], matrix[j] = matrix[j], matrix[i]
det_value *= -1
break
else:
return 0
# Параллельное вычисление
with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:
futures = [
executor.submit(process_row, i, j) for j in range(i + 1, n)
]
concurrent.futures.wait(futures)
# Обновление определителя
det_value *= matrix[i][i]
return det_value
if __name__ == "__main__":
sizes = [100, 300, 500]
num_threads = [1, 5, 8]
for size in sizes:
matrix = gen_square_matrix(size)
for threads in num_threads:
start_time = time.time()
parallel_det(matrix, threads)
end_time = time.time()
print(f"Параллельное вычисление определителя.\tРазмер: {size}, {threads} потоков\t|\t {end_time - start_time}")
print("=" * 100)

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB