Exemple #1
0
            public override bool VisitSubtraction(TExpr left, TExpr right, TExpr original, Dummy data)
            {
                Polynomial <TVar, TExpr> polyLeft, polyRight;

                if (!Build(left, out polyLeft) || !Build(right, out polyRight))
                {
                    return(false);
                }

                long   kLeft, kRight;
                object subtraction;

                if (polyLeft.IsIntConstant(out kLeft) && polyRight.IsIntConstant(out kRight) &&
                    EvaluateArithmeticWithOverflow.TryBinary(Decoder.TypeOf(original), ExpressionOperator.Sub, kLeft, kRight, out subtraction))
                {
                    var longValue = subtraction.ConvertToLong();
                    if (longValue.HasValue)
                    {
                        return(true.With(new Polynomial <TVar, TExpr> (Monomial <TVar> .From(Rational.For(longValue.Value))), out poly));
                    }
                }
                return(TryToPolynomialHelperForSubtraction(polyLeft, polyRight, out poly));
            }
Exemple #2
0
 public static Monomial <TVar> From(Rational coeff, IEnumerable <TVar> vars)
 {
     return(From(coeff, vars, seq => seq));
 }
Exemple #3
0
        static bool TrySimplifyMonomes(Monomial <TVar>[] monomes, out Monomial <TVar>[] result)
        {
            if (monomes.Length <= 1)
            {
                return(true.With(monomes, out result));
            }

            var dict = new Dictionary <ListEqual <TVar>, Monomial <TVar> > ();

            foreach (var monomial in monomes)
            {
                var             key = new ListEqual <TVar> (monomial.Degree, monomial.Variables);
                Monomial <TVar> monome;
                if (dict.TryGetValue(key, out monome))
                {
                    Rational coeff;
                    if (!Rational.TryAdd(monome.Coeff, monomial.Coeff, out coeff))
                    {
                        return(false.With(monomes, out result));
                    }

                    var sum = monome.With(coeff);
                    dict[key] = sum;
                }
                else
                {
                    dict.Add(key, monomial);
                }
            }

            var left  = new List <Monomial <TVar> > (dict.Count);
            var right = new List <Monomial <TVar> > (dict.Count);

            Monomial <TVar>?resMonome = null;

            foreach (var pair in dict)
            {
                var monome = pair.Value;
                if (!monome.Coeff.IsZero)
                {
                    if (monome.IsConstant)
                    {
                        resMonome = monome;
                    }
                    else if (monome.Coeff > 0L)
                    {
                        left.Add(monome);
                    }
                    else
                    {
                        right.Add(monome);
                    }
                }
            }

            var list = new List <Monomial <TVar> > (dict.Count);

            list.AddRange(left);
            list.AddRange(right);

            if (resMonome.HasValue)
            {
                list.Add(resMonome.Value);
            }
            if (list.Count == 0)
            {
                list.Add(Monomial <TVar> .From(Rational.Zero));
            }

            return(true.With(list.ToArray(), out result));
        }
Exemple #4
0
 public static Monomial <TVar> From(Rational coeff)
 {
     return(new Monomial <TVar> (coeff));
 }
Exemple #5
0
 public static Monomial <TVar> From(Rational coeff, Sequence <TVar> vars)
 {
     return(From(coeff, vars, seq => seq.AsEnumerable()));
 }
Exemple #6
0
 public Monomial <TVar> With(Rational coeff)
 {
     return(new Monomial <TVar> (coeff, variables));
 }
Exemple #7
0
 public override Interval RightOpen(Rational lowerBound)
 {
     return(Interval.For(lowerBound, Rational.PlusInfinity));
 }
Exemple #8
0
 public override Interval LeftOpen(Rational upperBound)
 {
     return(Interval.For(Rational.MinusInfinity, upperBound));
 }
Exemple #9
0
 public override Interval For(Rational lower, Rational upper)
 {
     return(Interval.For(lower, upper));
 }
Exemple #10
0
 public override Interval For(Rational value)
 {
     return(Interval.For(value));
 }