/// <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="p">Полином</param> public void AddFactors(FactoredPolynomial p) { for (int i = 0; i < p.Length; i++) { this[i].AddRange(p[i]); } }
/// <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 TestInfo(FactoredPolynomial basep, Polynomial baseOpened, FactoredPolynomial factored, Polynomial factoredOpened, FactoredPolynomial squareFree, bool result, bool check) { BaseP = basep; BaseOpened = baseOpened; Factored = factored; FactoredOpened = factoredOpened; SquareFree = squareFree; Succes = result; FactorizationIdentity = BaseP == Factored; Check = check; }
public TestInfo Run(FactoredPolynomial c, bool check = false) { Polynomial controlp = OpenBraces(c); if (controlp.Degree == 0) { return(Run()); } string ps = controlp.ToString(); Polynomial parsedP = Polynomial.Parse(ps); FactoredPolynomial SquareFree; FactoredPolynomial factoredP = _f.Factor(parsedP, out SquareFree); Polynomial res = OpenBraces(factoredP); TestInfo inf = new TestInfo(c, controlp, factoredP, res, SquareFree, res == controlp, check); return(inf); }
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); }
public Polynomial OpenBraces(FactoredPolynomial p) { if (p.ToString() == "0") { return(new Polynomial(0)); } Polynomial po = new Polynomial(1); for (int i = 0; i < p.Length; i++) { for (int j = 0; j < p[i].Count; j++) { for (int k = 0; k < i || (i == 0 && k == 0); k++) { po = _f.Multiply(po, p[i][j]); } } } return(po); }
/// <summary> /// Возведение разложенного полинома в степень p /// </summary> /// <param name="p">Разложение полинома</param> /// <returns>Разложение в степени p</returns> public FactoredPolynomial PowP(FactoredPolynomial p) { p.Pow(P); return(p); }