/// <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; } } }