/// <summary>
        /// S-полином
        /// </summary>
        /// <param name="a"> Полином </param>
        /// <param name="b"> Полином </param>
        /// <returns></returns>
        public static Polynom S_polynom(Polynom a, Polynom b)
        {
            var lcm = Monom.GetLCM(a.LT, b.LT);
            var sp  = a * (lcm / a.LT) - b * (lcm / b.LT);

            return(sp);
        }
        /// <summary>
        /// Упрощение
        /// </summary>
        /// <returns> Упрощенный полином </returns>
        public Polynom SimplifyPolynom()
        {
            List <int> nullCoefs = new List <int>();

            for (int i = 0; i < monoms.Count; i++)
            {
                //найдем нулевые коэффициенты
                if (monoms[i].Coef == 0)
                {
                    monoms.RemoveAt(i);
                    //nullCoefs.Add(i);
                    i--;
                }
            }

            for (int i = 0; i < monoms.Count; i++)
            {
                for (int j = i + 1; j < monoms.Count; j++)
                {
                    if (Monom.AreEqual(monoms[i], monoms[j]))
                    {
                        monoms[i] = monoms[i] + monoms[j];
                        monoms.RemoveAt(j);
                    }
                }
            }

            return(new Polynom(monoms));
        }
        /// <summary>
        /// Деление полиномов с остатком
        /// </summary>
        /// <param name="f"> Делимое </param>
        /// <param name="g"> Делитель </param>
        /// <param name="q"> Частное </param>
        /// <param name="r"> Остаток </param>
        public static void DividePolynoms(Polynom f, Polynom g, out List <Monom> q, out Polynom r)
        {
            q = new List <Monom>();
            r = (Polynom)f.Clone();

            while (r.Degree >= g.Degree)
            {
                if (!r.IsNull && Monom.CanDivide(r.LT, g.LT))
                {
                    Monom divLT = r.LT / g.LT;
                    q.Add(divLT);
                    var temp = g * (divLT);
                    r = r - temp;
                    r = LexOrder.CreateOrderedPolynom(r);
                    r = r.SimplifyPolynom();
                }
                else
                {
                    break;
                }
            }
        }