import numpy as np
import time
from multiprocessing import Pool

def determinant(matrix):
    return np.linalg.det(matrix)

def parallel_determinant(matrix, num_threads):
    size = matrix.shape[0]
    step = size // num_threads
    pool = Pool(processes=num_threads)
    blocks = []
    for i in range(0, size, step):
        blocks.append(matrix[i:i+step, i:i+step])
    dets = pool.map(determinant, blocks)
    return np.prod(dets)

def benchmark(num_threads):
    matrix1 = np.random.rand(100, 100)
    start_time = time.time()
    det1 = determinant(matrix1)
    end_time = time.time()
    execution_time = end_time - start_time
    print("Матрица 100x100:", matrix1)
    print("Детерминант матрицы 100x100:", det1)
    print("Последовательное время выполнения:", execution_time, "сек")
    start_time = time.time()
    detp1 = parallel_determinant(matrix1, num_threads)
    end_time = time.time()
    execution_time = end_time - start_time
    print("Пареллельное время выполнения:", execution_time, "сек")
    matrix2 = np.random.rand(300, 300)
    start_time = time.time()
    det2 = determinant(matrix2)
    end_time = time.time()
    execution_time = end_time - start_time
    print("Матрица 300x300:", matrix2)
    print("Детерминант матрицы 300x300:", det2)
    print("Последовательное время выполнения:", execution_time, "сек")
    start_time = time.time()
    detp2 = parallel_determinant(matrix2, num_threads)
    end_time = time.time()
    execution_time = end_time - start_time
    print("Пареллельное время выполнения:", execution_time, "сек")
    matrix3 = np.random.rand(500, 500)
    det3 = determinant(matrix3)
    end_time = time.time()
    execution_time = end_time - start_time
    print("Матрица 500x500:", matrix3)
    print("Детерминант матрицы 500x500:", det3)
    print("Последовательное время выполнения:", execution_time, "сек")
    start_time = time.time()
    detp3 = parallel_determinant(matrix3, num_threads)
    end_time = time.time()
    execution_time = end_time - start_time
    print("Пареллельное время выполнения:", execution_time, "сек")

if __name__ == "__main__":
    print("Введите кол-во поток")
    n = int(input())
    benchmark(n)