/// <summary> /// Получение разложения из строки /// </summary> /// <param name="s">Строка</param> /// <returns>Разложение</returns> public static FactoredPolynomial Parse(string s) { Regex rg = new Regex(@"(^\d+)|(\(.+?\))(\^(\d+))?"); MatchCollection ms = rg.Matches(s); FactoredPolynomial fp = new FactoredPolynomial(); if (s == "") { } foreach (Match m in ms) { Polynomial p; int d; if (m.Groups[1].Value == "") { p = Polynomial.Parse(m.Groups[2].Value); d = m.Groups[3].Value == "" ? 1 : int.Parse(m.Groups[4].Value); } else { p = Polynomial.Parse(m.Groups[1].Value); d = 0; } fp.AddFactor(p, d); } return(fp); }
/// <summary> /// Разложение полинома в бесквадратную форму /// </summary> /// <param name="f">Полином</param> /// <returns>Бесквадратное разложение полинома</returns> private FactoredPolynomial SquareFreeFactor(Polynomial f) { FactoredPolynomial F = new FactoredPolynomial(); int i = 1; Polynomial df = Derivative(f); if (df.ToString() == "0") { F = PowP(SquareFreeFactor(GetPRoot(f))); } else { Polynomial g = GCD(f, df); Polynomial h = DividePolynomials(f, g); while (h.ToString() != "1") { Polynomial hs = GCD(h, g); Polynomial l = DividePolynomials(h, hs); F.AddFactor(l, i); i++; h = hs; g = DividePolynomials(g, hs); } if (g.ToString() != "1") { g = GetPRoot(g); F.AddFactors(PowP(SquareFreeFactor(g))); } } return(F); }
/// <summary> /// Разложение полинома на простые множители /// </summary> /// <param name="f">Полином</param> /// <param name="fp">Разложение в бесквадратную форму</param> /// <returns>Разложение даннного полинома</returns> public FactoredPolynomial Factor(Polynomial f, out FactoredPolynomial fp) { if (f.Degree < 2) { FactoredPolynomial sfp = new FactoredPolynomial(); sfp.AddFactor(f, 1); fp = sfp; return(sfp); } Polynomial divisor; Polynomial f2 = MadeMonic(f, out divisor); fp = SquareFreeFactor(f2); FactoredPolynomial res = new FactoredPolynomial(); for (int i = 1; i < fp.Length; i++) { for (int j = 0; j < fp[i].Count; j++) { res[i].AddRange(Berlekamp(fp[i][j])); } } res[0].Add(divisor); return(res); }
public FactoredPolynomial GenFactoredP() { FactoredPolynomial fp = new FactoredPolynomial(); int d = 0; while (d < _n - 1) { Polynomial p = _simpleFactors[_gen.Next(_simpleFactors.Count)]; int k = _gen.Next(1, 4); while (p.Degree > MAX_FACTOR_DEGREE || !p.Monic || d + p.Degree * k > _n - 1) { k = _gen.Next(1, 4); p = _simpleFactors[_gen.Next(_simpleFactors.Count)]; } d += p.Degree * k; fp.AddFactor(p, k); } return(fp); }