82 lines
2.9 KiB
Python
82 lines
2.9 KiB
Python
import time
|
||
import random
|
||
from multiprocessing import Pool
|
||
|
||
# Генерация квадратной матрицы со случайными элементами
|
||
def generate_matrix(size):
|
||
return [[random.randint(0, 10) for _ in range(size)] for _ in range(size)]
|
||
|
||
# Рекурсивное вычисление по определителю (по первой строке)
|
||
def determinant_recursive(matrix):
|
||
n = len(matrix)
|
||
if n == 1:
|
||
return matrix[0][0]
|
||
elif n == 2:
|
||
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
|
||
else:
|
||
det = 0
|
||
for c in range(n):
|
||
if n > 1:
|
||
minor = [row[:c] + row[c+1:] for row in matrix[1:]]
|
||
else:
|
||
minor = []
|
||
det += ((-1)**c) * matrix[0][c] * determinant_recursive(minor)
|
||
return det
|
||
|
||
# Вычисление части определителя, выполняется каждым процессом
|
||
def worker(chunk):
|
||
start, end, matrix = chunk
|
||
local_det = 0
|
||
|
||
if len(matrix) == 1:
|
||
local_det = matrix[0][0]
|
||
else:
|
||
for c in range(start, end):
|
||
minor = [row[:c] + row[c + 1:] for row in matrix[1:]]
|
||
local_det += ((-1)**c) * matrix[0][c] * determinant_recursive(minor)
|
||
|
||
return local_det
|
||
|
||
# Параллельное вычисление определителя матрицы
|
||
def parallel_determinant(matrix, num_processes):
|
||
n = len(matrix)
|
||
|
||
with Pool(processes=num_processes) as pool:
|
||
num_chunks = min(n, num_processes)
|
||
chunk_size = n // num_chunks
|
||
remainder = n % num_chunks
|
||
|
||
chunks = []
|
||
start_col = 0
|
||
for i in range(num_chunks):
|
||
end_col = start_col + chunk_size + (1 if i < remainder else 0)
|
||
chunks.append((start_col, end_col, matrix))
|
||
start_col = end_col
|
||
|
||
results = pool.map(worker, chunks)
|
||
|
||
return sum(results)
|
||
|
||
if __name__ == "__main__":
|
||
sizes = [2, 4, 6, 8, 10]
|
||
process_counts = [2, 4, 8]
|
||
|
||
print("| Размер | Метод | Кол-во процессов | Время (мс) | Детерминант |")
|
||
|
||
for size in sizes:
|
||
matrix = generate_matrix(size)
|
||
|
||
# Последовательное
|
||
start_time = time.time()
|
||
det_recursive = determinant_recursive(matrix)
|
||
end_time = time.time()
|
||
recursive_time_ms = (end_time - start_time) * 1000
|
||
print(f"| {size}x{size} | Последовательный | - | {recursive_time_ms} | {det_recursive} |")
|
||
|
||
# Параллельное
|
||
for num_processes in process_counts:
|
||
start_time = time.time()
|
||
det_parallel = parallel_determinant(matrix, num_processes)
|
||
end_time = time.time()
|
||
parallel_time_ms = (end_time - start_time) * 1000
|
||
print(f"| {size}x{size} | Параллельный | {num_processes} | {parallel_time_ms} | {det_parallel} |") |