using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; namespace rvip_6 { public class Matrix { private readonly double[,] data; public int Size { get; } public Matrix(int size) { Size = size; data = new double[size, size]; FillRandom(); } public Matrix(double[,] data) { this.data = data; Size = data.GetLength(0); } public double GetElement(int row, int col) { return data[row, col]; } public void SetElement(int row, int col, double value) { data[row, col] = value; } private void FillRandom() { Random random = new Random(); for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { data[i, j] = random.NextDouble() * 10; // Заполняем случайными числами (0 - 10) } } } public double DeterminantSequential() { if (Size == 1) return data[0, 0]; if (Size == 2) return data[0, 0] * data[1, 1] - data[0, 1] * data[1, 0]; double det = 0; for (int j = 0; j < Size; j++) { det += (j % 2 == 0 ? 1 : -1) * data[0, j] * GetSubMatrix(0, j).DeterminantSequential(); } return det; } private Matrix GetSubMatrix(int rowToRemove, int colToRemove) { double[,] subMatrix = new double[Size - 1, Size - 1]; int subRow = 0; for (int row = 0; row < Size; row++) { if (row == rowToRemove) continue; int subCol = 0; for (int col = 0; col < Size; col++) { if (col == colToRemove) continue; subMatrix[subRow, subCol] = data[row, col]; subCol++; } subRow++; } return new Matrix(subMatrix); } public double DeterminantParallel(int numThreads) { if (Size == 1) return data[0, 0]; if (Size == 2) return data[0, 0] * data[1, 1] - data[0, 1] * data[1, 0]; double det = 0; var results = new double[Size]; var tasks = new Task[Size]; for (int j = 0; j < Size; j++) { int currentJ = j; tasks[j] = Task.Run(() => { results[currentJ] = (currentJ % 2 == 0 ? 1 : -1) * data[0, currentJ] * GetSubMatrix(0, currentJ).DeterminantParallel(numThreads); }); } Task.WaitAll(tasks); for (int i = 0; i < results.Length; i++) { det += results[i]; } return det; } public override string ToString() { string result = ""; for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { result += data[i, j] + " "; } result += "\n"; } return result; } } }