Exemple #1
0
        /// <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);
        }
Exemple #2
0
 /// <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;
 }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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);
 }