Beispiel #1
0
        /// <summary>
        /// Поиск ведущего элемента
        /// </summary>
        private List <List <SimpleFractions> > NextTable(List <List <SimpleFractions> > table, List <int> basis, Tuple <int, int> search, List <SimpleFractions> co)
        {
            List <List <SimpleFractions> > newTable = new List <List <SimpleFractions> >();

            for (int i = 0; i < table.Count; i++)
            {
                newTable.Add(new List <SimpleFractions>());
                if (i == search.Item2)
                {
                    for (int j = 0; j < table[i].Count; j++)
                    {
                        newTable.LastOrDefault().Add(sFM.Division(table[i][j], table[search.Item2][search.Item1]));
                    }
                }
                else
                {
                    for (int j = 0; j < table[i].Count; j++)
                    {
                        newTable.LastOrDefault().Add(sFM.Difference(table[i][j], sFM.Division(sFM.Multiplication(table[search.Item2][j], table[i][search.Item1]), table[search.Item2][search.Item1])));
                    }
                }
            }
            basis[search.Item2] = search.Item1 - 1;
            return(newTable);
        }
Beispiel #2
0
        public bool RectangleMetod(MatrixFractions matrix)
        {
            List <int> banIndexStrList = new List <int>();

            if (matrix.M < matrix.N)
            {
                if (Notify != null)
                {
                    Notify($"Строк больше столбцов! Невозможно решить! (Код 1.0)\n");
                }
                return(false);
            }
            for (int nowStr = 0, nowCol = 0; nowStr < matrix.N || nowCol < matrix.N; nowStr++, nowCol++)
            {
                if (_mFM.Norm(matrix))
                {
                    if (Notify != null)
                    {
                        Notify("Сокращение:\n" + matrix.toString() + "\n");
                    }
                }
                //блок проверки
                var check = CheckExceptions(matrix);
                if (check == null)
                {
                    if (Notify != null)
                    {
                        Notify($"Ошибка! \n");
                    }
                    return(false);
                }
                if (check.SingleOrDefault() == -1)
                {
                    if (Notify != null)
                    {
                        Notify($"Противоречие! \n");
                    }
                    return(false);
                }
                if (check.Count > 0)
                {
                    foreach (var ch in check)
                    {
                        banIndexStrList.Add(ch);
                    }
                }
                if (Notify != null)
                {
                    Notify($"Пока что все идет по плану... наверное! \n");
                }
                //проверка банлиста
                int strNullCount = CheckBanlist(check, nowStr, matrix.N);
                if (strNullCount > 0)
                {
                    nowStr += strNullCount - 1;
                    if (nowStr >= matrix.N)
                    {
                        if (Notify != null)
                        {
                            Notify("Зануленная строка!\n" + matrix.toString() + "\n");
                        }
                    }
                }
                if (nowStr >= matrix.N)
                {
                    return(true);
                }
                //проверка на 0-вой элемент
                if (matrix.Matrix[nowStr, nowCol].Numerator == 0)
                {
                    int Str = nowStr;
                    Str++;
                    if (Str >= matrix.N)
                    {
                        if (Notify != null)
                        {
                            Notify($"Ведущий элемент 0, а строки закончились. Упс... \n");
                        }
                        return(true);
                    }
                    while (matrix.Matrix[Str, nowCol].Numerator == 0)
                    {
                        Str++;
                        if (Str >= matrix.N)
                        {
                            if (Notify != null)
                            {
                                Notify($"Ведущий элемент 0, а строки закончились. Упс... \n");
                            }
                            return(true);
                        }
                    }
                    ObmenStrok(matrix, Str, nowStr);
                    if (Notify != null)
                    {
                        Notify($"Обмен: ({nowStr} и {Str})\n"); Notify(matrix.toString() + "\n");
                    }
                }
                //приводим к 1
                if (matrix.Matrix[nowStr, nowCol].Numerator != matrix.Matrix[nowStr, nowCol].Denominator)
                {
                    SimpleFractions kof = matrix.Matrix[nowStr, nowCol];
                    for (int j1 = 0; j1 < matrix.M; j1++)
                    {
                        matrix.Matrix[nowStr, j1] = _sFM.Division(matrix.Matrix[nowStr, j1], kof);
                    }
                    if (Notify != null)
                    {
                        Notify($"Приведение: ({nowStr + 1}) : {kof.toString()} \n"); Notify(matrix.toString() + "\n");
                    }
                }
                //прямоугольники
                for (int j1 = nowStr + 1; j1 < matrix.M; j1++)
                {
                    for (int i1 = 0; i1 < matrix.N; i1++)
                    {
                        if (i1 != nowCol)
                        {
                            matrix.Matrix[i1, j1] =
                                _sFM.Difference(matrix.Matrix[i1, j1],
                                                _sFM.Multiplication(matrix.Matrix[nowStr, j1], matrix.Matrix[i1, nowCol]));
                        }
                    }
                }
                for (int i = 0; i < matrix.N; i++)
                {
                    if (i != nowStr)
                    {
                        matrix.Matrix[i, nowCol].Denominator = 1;
                        matrix.Matrix[i, nowCol].Numerator   = 0;
                    }
                }
                if (Notify != null)
                {
                    Notify("После прямоугольников: \n" + matrix.toString() + "\n");
                }
            }
            return(true);
        }