80 lines
2.9 KiB
Python
80 lines
2.9 KiB
Python
import time
|
|
import numpy as np
|
|
from multiprocessing import Pool
|
|
|
|
|
|
def calculate_determinant(args):
|
|
matrix, i = args
|
|
multiplier = matrix[0][i]
|
|
if i % 2 != 0:
|
|
multiplier *= -1
|
|
matrix = np.delete(matrix, 0, axis=0)
|
|
submatrix = np.delete(matrix, i, axis=1)
|
|
return np.linalg.det(submatrix) * multiplier
|
|
|
|
|
|
def parallel_determinant(matrix, parallel):
|
|
n = matrix.shape[0]
|
|
if parallel:
|
|
pool = Pool(processes=n)
|
|
results = []
|
|
start_time = time.time()
|
|
for i in range(n):
|
|
results.append(pool.apply_async(calculate_determinant, args=((matrix, i),)))
|
|
pool.close()
|
|
pool.join()
|
|
result = np.sum([res.get() for res in results])
|
|
end_time = time.time()
|
|
else:
|
|
start_time = time.time()
|
|
result = np.linalg.det(matrix)
|
|
end_time = time.time()
|
|
execution_time = end_time - start_time
|
|
return result, execution_time
|
|
|
|
|
|
def test(parallel):
|
|
mx = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
|
|
result = parallel_determinant(mx, parallel)
|
|
print(f"Определитель матрицы: {result[0]}")
|
|
print(f"Время выполнения: {result[1]} сек.")
|
|
|
|
|
|
def matrix10x10(parallel):
|
|
mx = np.random.randint(0, 100, size=(10, 10))
|
|
result = parallel_determinant(mx, parallel)
|
|
print(f"Определитель матрицы: {result[0]}")
|
|
print(f"Время выполнения: {result[1]} сек.")
|
|
|
|
|
|
def matrix25x25(parallel):
|
|
mx = np.random.randint(0, 100, size=(25, 25))
|
|
result = parallel_determinant(mx, parallel)
|
|
print(f"Определитель матрицы: {result[0]}")
|
|
print(f"Время выполнения: {result[1]} сек.")
|
|
|
|
|
|
def matrix50x50(parallel):
|
|
mx = np.random.randint(0, 100, size=(50, 50))
|
|
result = parallel_determinant(mx, parallel)
|
|
print(f"Определитель матрицы: {result[0]}")
|
|
print(f"Время выполнения: {result[1]} сек.")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# print("Матрица 10x10:")
|
|
# print("Результат нахождения детерминанта параллельно:")
|
|
# matrix10x10(parallel=True)
|
|
# print("Результат нахождения детерминанта обычным способом:")
|
|
# matrix10x10(parallel=False)
|
|
# print("Матрица 25x25:")
|
|
# print("Результат нахождения детерминанта параллельно:")
|
|
# matrix25x25(parallel=True)
|
|
# print("Результат нахождения детерминанта обычным способом:")
|
|
# matrix25x25(parallel=False)
|
|
print("Матрица 50x50:")
|
|
print("Результат нахождения детерминанта параллельно:")
|
|
matrix50x50(parallel=True)
|
|
print("Результат нахождения детерминанта обычным способом:")
|
|
matrix50x50(parallel=False)
|