/// <summary>
        /// Метод находящий ранг матрицы.
        /// </summary>
        /// <returns> Ранг матрицы. </returns>
        public int FindRank()
        {
            var columnLength = MatrixValue.GetLength(0); // длина колонки матрицы.
            var rowLength    = MatrixValue.GetLength(1); // длина строки матрицы.

            var rank = 0;

            var newMatrix = this.MethodThatResetsTheColumnValues(0, 0);


            for (int i = 0; i < columnLength - 1; i++)
            {
                newMatrix = this.MethodThatResetsTheColumnValues(i, i);
            }

            for (int i = 0; i < columnLength; i++)
            {
                for (int j = 0; j < rowLength; j++)
                {
                    if (MatrixValue[i, j] != 0)
                    {
                        rank++;

                        break;
                    }
                }
            }

            return(rank);
        }
        /// <summary>
        /// Метод находящий и выносящий общий множитель из матрицы.
        /// </summary>
        /// <returns> Измененая матрица. </returns>
        public Matrix FindTheCommonMultiplier()
        {
            var columnLength = MatrixValue.GetLength(0); // длина колонки матрицы.
            var rowLength    = MatrixValue.GetLength(1); // длина строки матрицы.

            var newMatrix = new Matrix(new double[columnLength, rowLength]);

            newMatrix = LoadMatrixData(this, newMatrix);

            newMatrix.MatrixValue = this.MatrixValue;

            for (int i = 0; i < columnLength; i++)
            {
                var commonMultiplier        = 1.0;
                var isThereCommonMultiplier = true;
                for (int j = 0; j < rowLength; j++)
                {
                    if (MatrixValue[i, j] != 1)
                    {
                        if (rowLength != j + 1)
                        {
                            if (commonMultiplier == 1.0)
                            {
                                commonMultiplier = GCF(MatrixValue[i, j], MatrixValue[i, j + 1]);
                            }
                            else
                            {
                                if (commonMultiplier % GCF(MatrixValue[i, j], MatrixValue[i, j + 1]) != 0)
                                {
                                    isThereCommonMultiplier = false;
                                }
                            }
                        }
                    }
                    else
                    {
                        commonMultiplier        = 1.0;
                        isThereCommonMultiplier = false;
                    }
                }
                if (isThereCommonMultiplier == true && commonMultiplier != -1)
                {
                    if (commonMultiplier < 0)
                    {
                        commonMultiplier *= -1;
                    }

                    newMatrix = TakeOutTheTotalMultiplier(this, i + 1, commonMultiplier, enumMatrix.row);
                }
            }

            return(newMatrix);
        }
        /// <summary>
        /// Метод транспонирующий матрицу.
        /// </summary>
        /// <returns> Измененая матрица. </returns>
        public Matrix MatrixTransposition()
        {
            Console.WriteLine();
            Console.WriteLine("Трансаонирование матрицы.");
            Console.WriteLine();

            var matrixColumnLength = MatrixValue.GetLength(0);                                 // длина колонки матрицы.
            var matrixRowLength    = MatrixValue.GetLength(1);                                 // длина строки матрицы.

            Matrix matrixResult = new Matrix(new double[matrixColumnLength, matrixRowLength]); // результат транспонирования.

            matrixResult.IsMatrixTransposition = !IsMatrixTransposition;

            for (int i = 0; i < matrixColumnLength; i++)
            {
                for (int j = 0; j < matrixRowLength; j++)
                {
                    matrixResult.MatrixValue[i, j] = MatrixValue[j, i];
                }
            }

            matrixResult.IsMatrixInverse  = IsMatrixInverse;
            matrixResult.IsMatrixUnion    = IsMatrixUnion;
            matrixResult.CommonMultiplier = CommonMultiplier;


            Console.WriteLine();
            for (int i = 0; i < matrixColumnLength; i++)
            {
                for (int j = 0; j < matrixRowLength; j++)
                {
                    Console.Write($" {MatrixValue[i, j]} ");
                }

                Console.WriteLine();
            }

            Console.WriteLine();
            for (int i = 0; i < matrixColumnLength; i++)
            {
                for (int j = 0; j < matrixRowLength; j++)
                {
                    Console.Write($" {matrixResult.MatrixValue[i, j]} ");
                }

                Console.WriteLine();
            }

            return(matrixResult);
        }
        /// <summary>
        /// Метод который обнуляет значения столбцов.
        /// </summary>
        /// <returns> Матрица. </returns>
        public Matrix MethodThatResetsTheColumnValues(int column, int row)
        {
            var columnLength = MatrixValue.GetLength(0); // длина колонки матрицы.
            var rowLength    = MatrixValue.GetLength(1); // длина строки матрицы.

            var matrixResult = new Matrix(new double[columnLength, rowLength]);

            if (column == 0 && row == 0)
            {
                for (int i = 0; i < columnLength; i++)
                {
                    for (int j = 0; j < rowLength; j++)
                    {
                        if (MatrixValue[i, j] == 1)
                        {
                            if (i > 0)
                            {
                                matrixResult = SwapColumnsOrRows(row + 1, i + 1);
                            }
                            if (j > 0)
                            {
                                matrixResult = SwapColumnsOrRows(column + 1, j + 1, enumMatrix.column);
                            }

                            goto Break;
                        }
                    }
                }
            }

Break:

            var isЕlementZero = false;

            if (MatrixValue[column, row] == 0)
            {
                column--;
                row--;
                isЕlementZero = true;
            }

            while (true)
            {
                if (MatrixValue[column, row] != 1)
                {
                    var result      = 0.0;
                    var multiplier  = 0.0;
                    var multiplier2 = 1.0;

                    if (MatrixValue[column, row] > 0)
                    {
                        if (MatrixValue[column + 1, row] > 0)
                        {
                            multiplier2 *= -1;
                        }
                        else
                        {
                            multiplier2 *= 1;
                        }
                    }
                    else
                    {
                        if (MatrixValue[column + 1, row] > 0)
                        {
                            multiplier2 *= 1;
                        }
                        else
                        {
                            multiplier2 *= -1;
                        }
                    }

                    var resultValue = 1.0;

                    if (column != 0 && row != 0)
                    {
                        resultValue = 0;
                    }

                    var iterator = 0;
                    do
                    {
                        iterator++;

                        result = MatrixValue[column, row] * multiplier + MatrixValue[column + 1, row];

                        if (result != resultValue)
                        {
                            multiplier += 0.1 * multiplier2;
                            multiplier  = Math.Round(multiplier, 2);
                        }
                        if (iterator == 100)
                        {
                            matrixResult.MatrixValue = MatrixValue;
                            goto End;
                        }
                    }while (result != resultValue);

                    if (multiplier == 0)
                    {
                        multiplier = multiplier2;
                    }

                    if (isЕlementZero == true)
                    {
                        matrixResult = SixthPropertyOfTheDeterminant(multiplier, row + 1, row + 3);
                    }
                    else
                    {
                        matrixResult = SixthPropertyOfTheDeterminant(multiplier, row + 1, row + 2);
                    }

                    if (column == 0 && row == 0)
                    {
                        matrixResult = SwapColumnsOrRows(row + 1, row + 2);
                    }

End:

                    MatrixValue = matrixResult.MatrixValue;
                }
                else
                {
                    for (int i = 1; i < columnLength; i++)
                    {
                        var multiplier = MatrixValue[i, row];

                        if (multiplier != 0)
                        {
                            matrixResult = SixthPropertyOfTheDeterminant(multiplier * -1, row + 1, i + 1);

                            MatrixValue = matrixResult.MatrixValue;
                        }
                    }

                    break;
                }

                if (column != 0 && row != 0)
                {
                    break;
                }
            }

            return(matrixResult);
        }
        /// <summary>
        /// Метод умножающий строку или колонку num1 на number и складывающий ее со строкой или колонкой num2.
        /// </summary>
        /// <param name="multiplier"> Множитель. </param>
        /// <param name="num1"> Первая строка или столбик. </param>
        /// <param name="num2"> Вторая строка или столбик. </param>
        /// <param name="enumMatrix"> Переключатель между строкой или столбиком. </param>
        /// <returns> Измененая матрица. </returns>
        public Matrix SixthPropertyOfTheDeterminant(double multiplier, int num1, int num2, enumMatrix enumMatrix = enumMatrix.row)
        {
            var columnLength = MatrixValue.GetLength(0);                     // длина колонки матрицы.
            var rowLength    = MatrixValue.GetLength(1);                     // длина строки матрицы.

            var newMatrix = new Matrix(new double[columnLength, rowLength]); // Новая матрица.

            newMatrix = LoadMatrixData(this, newMatrix);

            Console.WriteLine();
            Console.WriteLine("Шестое свойство определителя");
            Console.WriteLine();
            Console.WriteLine($"Множмтель: {newMatrix.CommonMultiplier}");
            Console.WriteLine();
            Console.WriteLine($"Множитель шестого правила: {multiplier}");
            Console.WriteLine();

            if (num1 != num2)
            {
                if (enumMatrix == enumMatrix.row)
                {
                    for (int i = 0; i < columnLength; i++)
                    {
                        for (int j = 0; j < rowLength; j++)
                        {
                            if (num2 - 1 == i)
                            {
                                newMatrix.MatrixValue[i, j] = MatrixValue[num1 - 1, j] * multiplier + MatrixValue[num2 - 1, j];

                                Console.Write($"({MatrixValue[num1 - 1, j]} * {multiplier} + {MatrixValue[num2 - 1, j]})");
                            }
                            else
                            {
                                newMatrix.MatrixValue[i, j] = MatrixValue[i, j];

                                Console.Write($"{newMatrix.MatrixValue[i, j]} ");
                            }
                        }
                        Console.WriteLine();
                    }
                }
                else if (enumMatrix == enumMatrix.column)
                {
                    for (int i = 0; i < columnLength; i++)
                    {
                        for (int j = 0; j < rowLength; j++)
                        {
                            if (num2 - 1 == j)
                            {
                                newMatrix.MatrixValue[i, j] = MatrixValue[i, num1 - 1] * multiplier + MatrixValue[i, num2 - 1];

                                Console.Write($"({MatrixValue[i, num1 - 1]} * {multiplier} + {MatrixValue[i, num2 - 1]})");
                            }
                            else
                            {
                                newMatrix.MatrixValue[i, j] = MatrixValue[i, j];

                                Console.Write($"{newMatrix.MatrixValue[i, j]} ");
                            }
                        }
                        Console.WriteLine();
                    }
                }
            }


            Console.WriteLine();
            Console.WriteLine($"Множмтель: {newMatrix.CommonMultiplier}");
            Console.WriteLine();
            for (int i = 0; i < columnLength; i++)
            {
                for (int j = 0; j < rowLength; j++)
                {
                    Console.Write($"{newMatrix.MatrixValue[i, j]} ");
                }
                Console.WriteLine();
            }

            Console.WriteLine();

            MatrixValue = newMatrix.MatrixValue;

            return(newMatrix);
        }
        /// <summary>
        /// Метод меняющий элементы в матрицах местами.
        /// </summary>
        /// <param name="num1"> Первая строка или столбик. </param>
        /// <param name="num2"> Вторая строка или столбик. </param>
        /// <param name="enumMatrix"> Переключатель между строкой или столбиком. </param>
        /// <returns> Измененая матрица. </returns>
        public Matrix SwapColumnsOrRows(int num1, int num2, enumMatrix enumMatrix = enumMatrix.row)
        {
            var columnLength = MatrixValue.GetLength(0);                     // длина колонки матрицы.
            var rowLength    = MatrixValue.GetLength(1);                     // длина строки матрицы.

            var newMatrix = new Matrix(new double[columnLength, rowLength]); // Новая матрица.

            if (enumMatrix == enumMatrix.row)
            {
                for (int i = 0; i < columnLength; i++)
                {
                    for (int j = 0; j < rowLength; j++)
                    {
                        if (i == num1 - 1)
                        {
                            newMatrix.MatrixValue[i, j] = MatrixValue[num2 - 1, j];
                        }
                        else if (i == num2 - 1)
                        {
                            newMatrix.MatrixValue[i, j] = MatrixValue[num1 - 1, j];
                        }
                        else
                        {
                            newMatrix.MatrixValue[i, j] = MatrixValue[i, j];
                        }
                    }
                }
            }
            else if (enumMatrix == enumMatrix.column)
            {
                for (int i = 0; i < columnLength; i++)
                {
                    for (int j = 0; j < rowLength; j++)
                    {
                        if (j == num1 - 1)
                        {
                            newMatrix.MatrixValue[i, j] = MatrixValue[i, num2 - 1];
                        }
                        else if (j == num2 - 1)
                        {
                            newMatrix.MatrixValue[i, j] = MatrixValue[i, num1 - 1];
                        }
                        else
                        {
                            newMatrix.MatrixValue[i, j] = MatrixValue[i, j];
                        }
                    }
                }
            }

            newMatrix = LoadMatrixData(this, newMatrix);

            newMatrix.CommonMultiplier = CommonMultiplier * -1;


            Console.WriteLine();

            Console.WriteLine($"Меняем {enumMatrix} {num1} и {num2} местами");

            Console.WriteLine();

            Console.WriteLine($"Множмтель: {newMatrix.CommonMultiplier}");

            Console.WriteLine();

            for (int i = 0; i < columnLength; i++)
            {
                for (int j = 0; j < rowLength; j++)
                {
                    Console.Write($" {MatrixValue[i, j]} ");
                }

                Console.WriteLine();
            }

            Console.WriteLine();

            Console.WriteLine($"Множмтель: {newMatrix.CommonMultiplier}");

            Console.WriteLine();

            for (int i = 0; i < columnLength; i++)
            {
                for (int j = 0; j < rowLength; j++)
                {
                    Console.Write($" {newMatrix.MatrixValue[i, j]} ");
                }

                Console.WriteLine();
            }

            Console.WriteLine();

            MatrixValue      = newMatrix.MatrixValue;
            CommonMultiplier = newMatrix.CommonMultiplier;

            return(newMatrix);
        }