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)); }
public static Monomial <TVar> From(Rational coeff, IEnumerable <TVar> vars) { return(From(coeff, vars, seq => seq)); }
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)); }
public static Monomial <TVar> From(Rational coeff) { return(new Monomial <TVar> (coeff)); }
public static Monomial <TVar> From(Rational coeff, Sequence <TVar> vars) { return(From(coeff, vars, seq => seq.AsEnumerable())); }
public Monomial <TVar> With(Rational coeff) { return(new Monomial <TVar> (coeff, variables)); }
public override Interval RightOpen(Rational lowerBound) { return(Interval.For(lowerBound, Rational.PlusInfinity)); }
public override Interval LeftOpen(Rational upperBound) { return(Interval.For(Rational.MinusInfinity, upperBound)); }
public override Interval For(Rational lower, Rational upper) { return(Interval.For(lower, upper)); }
public override Interval For(Rational value) { return(Interval.For(value)); }