using MathNet.Symbolics;
using Expr = MathNet.Symbolics.Expression;
var expr = Infix.ParseOrThrow("(x - 5)*(x + 2)"); // без звёздочки не парсит :(
var expanded = Algebraic.Expand(expr);
var xsym = Expr.Symbol("x");
if (SingleVariablePolynomial.IsPolynomial(xsym, expanded))
{
var degreeExpr = SingleVariablePolynomial.Degree(xsym, expanded);
var degree = Evaluate.Evaluate(null, degreeExpr).RealValue;
Console.WriteLine($"Degree: {degree}");
}
else
{
Console.WriteLine("Not a polynomial in x");
}
有了两个变量,就不再困难了:
var expr = Infix.ParseOrThrow("(x - 5)*(x + 2) + x * y");
var expanded = Algebraic.Expand(expr);
var xsym = Expr.Symbol("x");
var ysym = Expr.Symbol("y");
var syms = new HashSet<Expr>() {xsym, ysym};
if (Polynomial.IsMultivariatePolynomial(syms, expanded))
{
var degreeXExpr = Polynomial.Degree(xsym, expanded);
var degreeX = Evaluate.Evaluate(null, degreeXExpr).RealValue;
var degreeYExpr = Polynomial.Degree(ysym, expanded);
var degreeY = Evaluate.Evaluate(null, degreeYExpr).RealValue;
Console.WriteLine($"Degree X: {degreeX}, Y: {degreeY}");
}
else
{
Console.WriteLine("Not a polynomial in (x, y)");
}
我是这样得到的:
有了两个变量,就不再困难了: