diff --git a/balakhonov_danila_lab_6/README.md b/balakhonov_danila_lab_6/README.md new file mode 100644 index 0000000..95f96ee --- /dev/null +++ b/balakhonov_danila_lab_6/README.md @@ -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) \ No newline at end of file diff --git a/balakhonov_danila_lab_6/program.py b/balakhonov_danila_lab_6/program.py new file mode 100644 index 0000000..13dab9c --- /dev/null +++ b/balakhonov_danila_lab_6/program.py @@ -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) \ No newline at end of file diff --git a/balakhonov_danila_lab_6/result.png b/balakhonov_danila_lab_6/result.png new file mode 100644 index 0000000..6ea7b7e Binary files /dev/null and b/balakhonov_danila_lab_6/result.png differ