/// <summary> /// Check if the two polynomial terms have the same type of variables (eg: 2xy vs 5yx) /// </summary> private static bool CompareVariables(PolynomialNode <double> term1, PolynomialNode <double> term2) { if (term2.Variables.Count == term1.Variables.Count) { bool varsMatch = true; foreach (var kvp in term2.Variables) { varsMatch = varsMatch && term1.Variables.ContainsKey(kvp.Key) && term1.Variables[kvp.Key] == kvp.Value; } return(varsMatch); } else { return(false); } }
public static string BuildPolynomialTerm(PolynomialNode <double> node) { var variables = node.Variables.Select(kvp => kvp.Key + ((kvp.Value == 1) ? "" : "^" + kvp.Value)).ToArray(); var arr = string.Join("", variables); var sign = node.Coefficient >= 0 ? 1 : -1; var coefficient = Math.Abs(node.Coefficient) == 1 ? "" : Math.Abs(node.Coefficient).ToString(); var term = ""; if (sign > 0) { term = $"+{coefficient}{arr}"; } else { term = $"-{coefficient}{arr}"; } return(term); }
/// <summary> /// Creates list of PolynomialNode (expression) and adds it to stack. /// </summary> /// <param name="polynomialTerm"></param> /// <param name="expressionStack"></param> private void AddToExpressionStack(string polynomialTerm, Stack <List <PolynomialNode <double> > > expressionStack) { var polyNode = new PolynomialNode <double>() { }; polyNode.Coefficient = GetCoefficient(polynomialTerm); // case: AX^mY^n var i = 0; while (i < polynomialTerm.Length) { var c = polynomialTerm[i]; if (char.IsLetter(c)) { // case: x^k if ((i + 1) < polynomialTerm.Length && polynomialTerm[i + 1] == '^' && (i + 2) < polynomialTerm.Length && char.IsDigit(polynomialTerm[i + 2])) { var exponent = int.Parse(polynomialTerm[i + 2].ToString()); polyNode.Variables.Add(c, exponent); i += 3; continue; } else { // case: x polyNode.Variables.Add(c, 1); i++; continue; } } i++; } var list = new List <PolynomialNode <double> >(); list.Add(polyNode); expressionStack.Push(list); }