private Node GenerateMaclaurinSeriesPolynomial(double x, int order) { if (order == 0) { return(this); } if (order == 1) { return(new PlusSign(new MultiplicationSign(ReturnDerivative(x), new VariableNode()), this)); } VariableNode variableNode = new VariableNode(); NaturalNumberNode orderNode = new NaturalNumberNode(order); CaretSign caretSign = new CaretSign(variableNode, orderNode); Node f0 = ReturnDerivative(x); for (int i = 1; i < order; i++) { f0 = f0.ReturnDerivative(x); } MultiplicationSign multiplicationSign = new MultiplicationSign(caretSign, new RationalNumberNode(f0.Calculate(0))); FactorialFunction factorialFunction = new FactorialFunction(orderNode); DivisionSign divisionSign = new DivisionSign(multiplicationSign, factorialFunction); return(new PlusSign(divisionSign, ReturnMaclaurinSeriesPolynomial(x, order - 1))); }
public double ReturnMaclaurinSeries(double x, int order) { if (order == 0) { return(Calculate(0)); } if (order == 1) { return(ReturnDerivative(x).Calculate(0) * x + Calculate(0)); } VariableNode variableNode = new VariableNode(); NaturalNumberNode orderNode = new NaturalNumberNode(order); CaretSign caretSign = new CaretSign(variableNode, orderNode); Node f0 = ReturnDerivative(x); for (int i = 1; i < order; i++) { f0 = f0.ReturnDerivative(x); } MultiplicationSign multiplicationSign = new MultiplicationSign(caretSign, new RationalNumberNode(f0.Calculate(0))); FactorialFunction factorialFunction = new FactorialFunction(orderNode); DivisionSign divisionSign = new DivisionSign(multiplicationSign, factorialFunction); return(divisionSign.Calculate(x) + ReturnMaclaurinSeries(x, order - 1)); }
public override Node ReturnDerivative(double x) { if (leftNode is NumberNode && rightNode is NumberNode) { return(new NaturalNumberNode(0)); } else if (leftNode is VariableNode && (rightNode is NaturalNumberNode || rightNode is RationalNumberNode)) { RationalNumberNode rationalNumberNodeA = new RationalNumberNode(rightNode.Calculate(x)); RationalNumberNode rationalNumberNodeB = new RationalNumberNode(rightNode.Calculate(x) - 1); CaretSign caretSign = new CaretSign(leftNode.Copy(), rationalNumberNodeB); MultiplicationSign multiplicationSign = new MultiplicationSign(rationalNumberNodeA, caretSign); return(multiplicationSign); } else if (leftNode is NumberNode) { LogarithmFunction logarithmFunction = new LogarithmFunction(leftNode.Copy()); CaretSign caretSign = new CaretSign(leftNode.Copy(), rightNode.Copy()); MultiplicationSign multiplicationSignA = new MultiplicationSign(logarithmFunction, caretSign); MultiplicationSign multiplicationSignB = new MultiplicationSign(multiplicationSignA, caretSign.rightNode.ReturnDerivative(x)); return(multiplicationSignB); } else { MinusSign minusSign = new MinusSign(rightNode.Copy(), new NaturalNumberNode(1)); CaretSign caretSign = new CaretSign(leftNode.Copy(), minusSign); MultiplicationSign multiplicationSignA = new MultiplicationSign(rightNode.Copy(), caretSign); MultiplicationSign multiplicationSignB = new MultiplicationSign(multiplicationSignA, leftNode.ReturnDerivative(x)); return(multiplicationSignB); } }
public override Node ReturnDerivative(double x) { ExponentialFunction exponentialFunction = new ExponentialFunction(child.Copy()); MultiplicationSign multiplicationSign = new MultiplicationSign(exponentialFunction, child.ReturnDerivative(x)); return(multiplicationSign); }
public override Node ReturnDerivative(double x) { CosineFunction cosineNode = new CosineFunction(child.Copy()); Node childDerivative = child.ReturnDerivative(x); MultiplicationSign multiplicationSign = new MultiplicationSign(cosineNode, childDerivative); return(multiplicationSign); }
public override Node ReturnDerivative(double x) { NaturalNumberNode zero = new NaturalNumberNode(0); SineFunction sineNode = new SineFunction(child.Copy()); MinusSign minusNode = new MinusSign(zero, sineNode); Node childDerivative = child.ReturnDerivative(x); MultiplicationSign multiplicationSign = new MultiplicationSign(minusNode, childDerivative); return(multiplicationSign); }
public override Node ReturnDerivative(double x) { MultiplicationSign multiplicationSignA = new MultiplicationSign(leftNode.ReturnDerivative(x), rightNode.Copy()); MultiplicationSign multiplicationSignB = new MultiplicationSign(leftNode.Copy(), rightNode.ReturnDerivative(x)); MinusSign minusSign = new MinusSign(multiplicationSignA, multiplicationSignB); NaturalNumberNode naturalNumberNode = new NaturalNumberNode(2); CaretSign caretSign = new CaretSign(rightNode.Copy(), naturalNumberNode); DivisionSign division = new DivisionSign(minusSign, caretSign); return(division); }
private PlusSign[] ReturnNewtonIndeterminates(int order) { PlusSign[] funcs = new PlusSign[order + 1]; HNode hNode = new HNode(); NaturalNumberNode orderNode; MultiplicationSign multiplicationSign; VariableNode variableNode = new VariableNode(); for (int i = 0; i <= order; i++) { orderNode = new NaturalNumberNode(order - i); multiplicationSign = new MultiplicationSign(orderNode, hNode); funcs[i] = new PlusSign(variableNode, multiplicationSign); } return(funcs); }
public override Node ReturnDerivative(double x) { if (leftNode is NumberNode) { return(new MultiplicationSign(leftNode.Copy(), rightNode.ReturnDerivative(x))); } else if (rightNode is NumberNode) { return(new MultiplicationSign(rightNode.Copy(), leftNode.ReturnDerivative(x))); } else { MultiplicationSign multiplicationSignA = new MultiplicationSign(leftNode.ReturnDerivative(x), rightNode.Copy()); MultiplicationSign multiplicationSignB = new MultiplicationSign(leftNode.Copy(), rightNode.ReturnDerivative(x)); PlusSign plusSign = new PlusSign(multiplicationSignA, multiplicationSignB); return(plusSign); } }
public double ReturnNewtonMaclaurinSeries(double x, int order) { if (order == 0) { return(Calculate(0)); } if (order == 1) { return(ReturnNewtonDerivative(0) * x + Calculate(0)); } VariableNode variableNode = new VariableNode(); NaturalNumberNode orderNode = new NaturalNumberNode(order); CaretSign caretSign = new CaretSign(variableNode, orderNode); RationalNumberNode f0 = new RationalNumberNode(CalculatePolynomialDerivative(0, order)); MultiplicationSign multiplicationSign = new MultiplicationSign(caretSign, f0); FactorialFunction factorialFunction = new FactorialFunction(orderNode); DivisionSign divisionSign = new DivisionSign(multiplicationSign, factorialFunction); return(divisionSign.Calculate(x) + ReturnNewtonMaclaurinSeries(x, order - 1)); }
private Node ReturnNewtonPolynomial(double x, int order) { Operator sign = null; int[] coefficients = ReturnIndeterminateCoefficients(order); PlusSign[] indeterminates = ReturnNewtonIndeterminates(order); if (order == 0) { return(new RationalNumberNode(Calculate(indeterminates[0].Calculate(x)))); } if (order == 1) { return(new MinusSign(new RationalNumberNode(Calculate(indeterminates[0].Calculate(x))), new RationalNumberNode(Calculate(indeterminates[1].Calculate(x))))); } NaturalNumberNode naturalNumberNode = new NaturalNumberNode(coefficients[0]); MultiplicationSign multiplicationSign = new MultiplicationSign(naturalNumberNode, new RationalNumberNode(Calculate(indeterminates[0].Calculate(x)))); sign = multiplicationSign; for (int i = 1; i <= order; i++) { naturalNumberNode = new NaturalNumberNode(Math.Abs(coefficients[i])); multiplicationSign = new MultiplicationSign(naturalNumberNode, new RationalNumberNode(Calculate(indeterminates[i].Calculate(x)))); if (i % 2 == 0) { sign = new PlusSign(sign, multiplicationSign); } else { sign = new MinusSign(sign, multiplicationSign); } } return(sign); }
public override Node Simplify() { Node simplifiedLeftNode = leftNode.Simplify(); Node simplifiedRightNode = rightNode.Simplify(); if (simplifiedLeftNode is NaturalNumberNode && simplifiedLeftNode.Calculate(0) == 1) { return(simplifiedRightNode); //1 * 5 = 5 } else if (simplifiedRightNode is NaturalNumberNode && simplifiedRightNode.Calculate(0) == 1) { return(simplifiedLeftNode); //5 * 1 = 5 } else if (simplifiedLeftNode is NaturalNumberNode && simplifiedLeftNode.Calculate(0) == 0 || simplifiedRightNode is NaturalNumberNode && simplifiedRightNode.Calculate(0) == 0) { return(new NaturalNumberNode(0)); //0 * 5 = 0, 5 * 0 = 0 } else if ((simplifiedLeftNode is TangentFunction && simplifiedRightNode is CotangentFunction) || (simplifiedLeftNode is CotangentFunction && simplifiedRightNode is TangentFunction)) // tan(x) * cotg(x) = 1 { double childValueA = ((Operation)simplifiedLeftNode).ReturnChild().Calculate(5); double childValueB = ((Operation)simplifiedRightNode).ReturnChild().Calculate(5); if (childValueA == childValueB) { return(new NaturalNumberNode(1)); } return(new MultiplicationSign(simplifiedLeftNode, simplifiedRightNode)); } else if ((simplifiedLeftNode is TangentFunction && simplifiedRightNode is CosineFunction) || (simplifiedLeftNode is CosineFunction && simplifiedRightNode is TangentFunction) && ((Operation)simplifiedLeftNode).ReturnChild().Calculate(5) == ((Operation)simplifiedRightNode).ReturnChild().Calculate(5)) //tan(x) * cos(x) = sin(x) { Node child = ((Operation)simplifiedLeftNode).ReturnChild(); return(new SineFunction(child)); } else if ((simplifiedLeftNode is CotangentFunction && simplifiedRightNode is SineFunction) || (simplifiedLeftNode is SineFunction && simplifiedRightNode is CotangentFunction) && ((Operation)simplifiedLeftNode).ReturnChild().Calculate(5) == ((Operation)simplifiedRightNode).ReturnChild().Calculate(5)) //cotg(x) * sin(x) = cos(x) { Node child = ((Operation)simplifiedLeftNode).ReturnChild(); return(new CosineFunction(child)); } else if (simplifiedLeftNode is NumberNode && simplifiedRightNode is NumberNode && (!(simplifiedLeftNode is IrrationalNumberNode) && !(simplifiedRightNode is IrrationalNumberNode))) //5 * 2 = 10 { double valueA = 0; double valueB = 0; if (simplifiedLeftNode is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedLeftNode).Value; } if (simplifiedLeftNode is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedLeftNode).Value; } if (simplifiedRightNode is RationalNumberNode) { valueB = ((RationalNumberNode)simplifiedRightNode).Value; } if (simplifiedRightNode is NaturalNumberNode) { valueB = ((NaturalNumberNode)simplifiedRightNode).Value; } return(new RationalNumberNode(valueA * valueB)); } else if (simplifiedLeftNode is ExponentialFunction && simplifiedRightNode is ExponentialFunction) //e^3 * e^2 = e^5 { return(new ExponentialFunction(new PlusSign(((Operation)simplifiedLeftNode).ReturnChild().Simplify(), ((Operation)simplifiedRightNode).ReturnChild().Simplify()).Simplify())); } else if (simplifiedLeftNode is VariableNode && simplifiedRightNode is NumberNode) //x * 5 = 5 * x { return(new MultiplicationSign(simplifiedRightNode, simplifiedLeftNode).Simplify()); } else if (simplifiedLeftNode is PiNode && simplifiedRightNode is NumberNode && !(simplifiedRightNode is IrrationalNumberNode)) //p * 5 = 5 * p { return(new MultiplicationSign(simplifiedRightNode, simplifiedLeftNode).Simplify()); } else if (simplifiedLeftNode is NumberNode && simplifiedRightNode is MultiplicationSign && ((MultiplicationSign)simplifiedRightNode).ReturnLeftNode().Simplify() is NaturalNumberNode) //5 * (2 * x) = 10 * x { return(new MultiplicationSign( new RationalNumberNode(simplifiedLeftNode.Calculate(1) * ((MultiplicationSign)simplifiedRightNode).ReturnLeftNode().Simplify().Calculate(1)), ((MultiplicationSign)simplifiedRightNode).ReturnRightNode().Simplify())); } else if (simplifiedLeftNode is MultiplicationSign && simplifiedRightNode is MultiplicationSign && ((MultiplicationSign)simplifiedRightNode).ReturnLeftNode().Simplify() is NaturalNumberNode) //(5 * x) * (2 * p) = 10 * p * x { return(new MultiplicationSign( new RationalNumberNode(((MultiplicationSign)simplifiedLeftNode).ReturnLeftNode().Simplify().Calculate(1) * ((MultiplicationSign)simplifiedRightNode).ReturnLeftNode().Simplify().Calculate(1)), new MultiplicationSign(((MultiplicationSign)simplifiedLeftNode).ReturnRightNode().Simplify(), ((MultiplicationSign)simplifiedRightNode).ReturnRightNode().Simplify())).Simplify()); } else if (simplifiedLeftNode is VariableNode && simplifiedRightNode is VariableNode) //x * x = x^2 { return(new CaretSign(simplifiedLeftNode, new NaturalNumberNode(2))); } else if (simplifiedLeftNode is MultiplicationSign && simplifiedRightNode is VariableNode) //(5 * x) * x = 5 * x^2 { MultiplicationSign multiplicationSign = (MultiplicationSign)simplifiedLeftNode; if (multiplicationSign.ReturnLeftNode() is NaturalNumberNode && multiplicationSign.ReturnRightNode() is VariableNode) { return(new MultiplicationSign(multiplicationSign.ReturnLeftNode(), new CaretSign(simplifiedRightNode, new NaturalNumberNode(2)))); } else { return(new MultiplicationSign(simplifiedLeftNode, simplifiedRightNode)); } } else { return(new MultiplicationSign(simplifiedLeftNode, simplifiedRightNode)); } }
public override Node Simplify() { Node simplifiedLeftNode = leftNode.Simplify(); Node simplifiedRightNode = rightNode.Simplify(); if (simplifiedLeftNode is NumberNode && simplifiedRightNode is NumberNode && (!(simplifiedLeftNode is IrrationalNumberNode) && !(simplifiedRightNode is IrrationalNumberNode))) //5 - 3 = 2 { double valueA = 0; double valueB = 0; if (simplifiedLeftNode is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedLeftNode).Value; } if (simplifiedLeftNode is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedLeftNode).Value; } if (simplifiedRightNode is RationalNumberNode) { valueB = ((RationalNumberNode)simplifiedRightNode).Value; } if (simplifiedRightNode is NaturalNumberNode) { valueB = ((NaturalNumberNode)simplifiedRightNode).Value; } return(new RationalNumberNode(valueA - valueB)); } else if (simplifiedRightNode is NumberNode && simplifiedRightNode.Calculate(0) == 0) { return(simplifiedLeftNode); //5 - 0 = 5 } else if (simplifiedLeftNode is VariableNode && simplifiedRightNode is VariableNode) //x - x = 0 { return(new NaturalNumberNode(0)); } else if ((simplifiedLeftNode is VariableNode || simplifiedLeftNode is IrrationalNumberNode) && simplifiedRightNode is MultiplicationSign) //x - 5x = -4x, p - 5p = -4p { MultiplicationSign simplifiedMultiplicationRightNode = (MultiplicationSign)simplifiedRightNode; double valueA = 0; if (simplifiedMultiplicationRightNode.ReturnRightNode() is VariableNode || simplifiedMultiplicationRightNode.ReturnRightNode() is IrrationalNumberNode) { if (simplifiedMultiplicationRightNode.ReturnRightNode().GetType() == simplifiedLeftNode.GetType()) { if (simplifiedMultiplicationRightNode.ReturnLeftNode() is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedMultiplicationRightNode.ReturnLeftNode()).Value; } if (simplifiedMultiplicationRightNode.ReturnLeftNode() is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedMultiplicationRightNode.ReturnLeftNode()).Value; } return(new MultiplicationSign(new RationalNumberNode(1 - valueA), simplifiedMultiplicationRightNode.ReturnRightNode())); } return(new MinusSign(simplifiedLeftNode, simplifiedRightNode)); } else { if (simplifiedMultiplicationRightNode.ReturnLeftNode().GetType() == simplifiedLeftNode.GetType()) { if (simplifiedMultiplicationRightNode.ReturnRightNode() is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedMultiplicationRightNode.ReturnRightNode()).Value; } if (simplifiedMultiplicationRightNode.ReturnRightNode() is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedMultiplicationRightNode.ReturnRightNode()).Value; } return(new MultiplicationSign(new RationalNumberNode(1 - valueA), simplifiedMultiplicationRightNode.ReturnLeftNode())); } return(new MinusSign(simplifiedLeftNode, simplifiedRightNode)); } } else if (simplifiedLeftNode is MultiplicationSign && (simplifiedRightNode is VariableNode || simplifiedRightNode is IrrationalNumberNode)) //5x - x = 4x, 5p - p = 4p { MultiplicationSign simplifiedMultiplicationLeftNode = (MultiplicationSign)simplifiedLeftNode; double valueA = 0; if (simplifiedMultiplicationLeftNode.ReturnRightNode() is VariableNode || simplifiedMultiplicationLeftNode.ReturnRightNode() is IrrationalNumberNode) { if (simplifiedMultiplicationLeftNode.ReturnRightNode().GetType() == simplifiedRightNode.GetType()) { if (simplifiedMultiplicationLeftNode.ReturnLeftNode() is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedMultiplicationLeftNode.ReturnLeftNode()).Value; } if (simplifiedMultiplicationLeftNode.ReturnLeftNode() is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedMultiplicationLeftNode.ReturnLeftNode()).Value; } return(new MultiplicationSign(new RationalNumberNode(valueA - 1), simplifiedMultiplicationLeftNode.ReturnRightNode())); } return(new MinusSign(simplifiedLeftNode, simplifiedRightNode)); } else { if (simplifiedMultiplicationLeftNode.ReturnLeftNode().GetType() == simplifiedRightNode.GetType()) { if (simplifiedMultiplicationLeftNode.ReturnRightNode() is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedMultiplicationLeftNode.ReturnRightNode()).Value; } if (simplifiedMultiplicationLeftNode.ReturnRightNode() is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedMultiplicationLeftNode.ReturnRightNode()).Value; } return(new MultiplicationSign(new RationalNumberNode(valueA - 1), simplifiedMultiplicationLeftNode.ReturnLeftNode())); } return(new MinusSign(simplifiedLeftNode, simplifiedRightNode)); } } else if (simplifiedLeftNode is IrrationalNumberNode && simplifiedRightNode is IrrationalNumberNode && simplifiedLeftNode.Calculate(0) == simplifiedRightNode.Calculate(0)) //p - p = 0 { return(new NaturalNumberNode(0)); } else if (simplifiedLeftNode is LogarithmFunction && simplifiedRightNode is LogarithmFunction) //ln(10) - ln(5) = ln(2) { return(new LogarithmFunction(new DivisionSign(((Operation)simplifiedLeftNode).ReturnChild().Simplify(), ((Operation)simplifiedRightNode).ReturnChild().Simplify())).Simplify()); } else if (simplifiedLeftNode is MultiplicationSign && simplifiedRightNode is MultiplicationSign && //5x - 3x = 2x, 5p - 3p = 2p ((((Operator)simplifiedLeftNode).ReturnRightNode() is VariableNode && ((Operator)simplifiedRightNode).ReturnRightNode() is VariableNode) || (((Operator)simplifiedLeftNode).ReturnRightNode() is PiNode && ((Operator)simplifiedRightNode).ReturnRightNode() is PiNode))) { if (((Operator)simplifiedLeftNode).ReturnLeftNode() is NumberNode && Math.Abs(((Operator)simplifiedLeftNode).ReturnLeftNode().Calculate(1) % 1) <= (Double.Epsilon * 100) && ((Operator)simplifiedRightNode).ReturnLeftNode() is NumberNode && Math.Abs(((Operator)simplifiedRightNode).ReturnLeftNode().Calculate(1) % 1) <= (Double.Epsilon * 100)) { return(new MultiplicationSign(new NaturalNumberNode( Convert.ToInt32(((Operator)simplifiedLeftNode).ReturnLeftNode().Calculate(1) - ((Operator)simplifiedRightNode).ReturnLeftNode().Calculate(1))), ((Operator)simplifiedLeftNode).ReturnRightNode()).Simplify()); } else { return(new MinusSign(simplifiedLeftNode, simplifiedRightNode)); } } else { return(new MinusSign(simplifiedLeftNode, simplifiedRightNode)); } }
public override Node Simplify() { Node simplifiedLeftNode = leftNode.Simplify(); Node simplifiedRightNode = rightNode.Simplify(); if (simplifiedLeftNode is NumberNode && simplifiedLeftNode.Calculate(0) == 0) { return(simplifiedRightNode); //0 + 5 = 5 } else if (simplifiedRightNode is NumberNode && simplifiedRightNode.Calculate(0) == 0) { return(simplifiedLeftNode); //5 + 0 = 0 } else if (simplifiedLeftNode is VariableNode && simplifiedRightNode is VariableNode) //x + x = 2 * x { return(new MultiplicationSign(new NaturalNumberNode(2), simplifiedLeftNode)); } else if (simplifiedLeftNode is NumberNode && simplifiedRightNode is NumberNode && (!(simplifiedLeftNode is IrrationalNumberNode) && !(simplifiedRightNode is IrrationalNumberNode))) //2 + 5 = 7 { double valueA = 0; double valueB = 0; if (simplifiedLeftNode is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedLeftNode).Value; } if (simplifiedLeftNode is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedLeftNode).Value; } if (simplifiedRightNode is RationalNumberNode) { valueB = ((RationalNumberNode)simplifiedRightNode).Value; } if (simplifiedRightNode is NaturalNumberNode) { valueB = ((NaturalNumberNode)simplifiedRightNode).Value; } return(new RationalNumberNode(valueA + valueB)); } else if ((simplifiedLeftNode is VariableNode || simplifiedLeftNode is IrrationalNumberNode) && simplifiedRightNode is MultiplicationSign) //x + 4x = 5x, p + 4p = 5p { MultiplicationSign simplifiedMultiplicationRightNode = (MultiplicationSign)simplifiedRightNode; double valueA = 0; if (simplifiedMultiplicationRightNode.ReturnRightNode() is VariableNode || simplifiedMultiplicationRightNode.ReturnRightNode() is IrrationalNumberNode) { if (simplifiedMultiplicationRightNode.ReturnRightNode().GetType() == simplifiedLeftNode.GetType()) { if (simplifiedMultiplicationRightNode.ReturnLeftNode() is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedMultiplicationRightNode.ReturnLeftNode()).Value; } if (simplifiedMultiplicationRightNode.ReturnLeftNode() is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedMultiplicationRightNode.ReturnLeftNode()).Value; } return(new MultiplicationSign(new RationalNumberNode(valueA + 1), simplifiedMultiplicationRightNode.ReturnRightNode())); } return(new PlusSign(simplifiedLeftNode, simplifiedRightNode)); } else { if (simplifiedMultiplicationRightNode.ReturnLeftNode().GetType() == simplifiedLeftNode.GetType()) { if (simplifiedMultiplicationRightNode.ReturnRightNode() is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedMultiplicationRightNode.ReturnRightNode()).Value; } if (simplifiedMultiplicationRightNode.ReturnRightNode() is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedMultiplicationRightNode.ReturnRightNode()).Value; } return(new MultiplicationSign(new RationalNumberNode(valueA + 1), simplifiedMultiplicationRightNode.ReturnLeftNode())); } return(new PlusSign(simplifiedLeftNode, simplifiedRightNode)); } } else if (simplifiedLeftNode is MultiplicationSign && (simplifiedRightNode is VariableNode || simplifiedRightNode is IrrationalNumberNode)) //4x + x = 5x, 4p + p = 5p { MultiplicationSign simplifiedMultiplicationLeftNode = (MultiplicationSign)simplifiedLeftNode; double valueA = 0; if (simplifiedMultiplicationLeftNode.ReturnRightNode() is VariableNode || simplifiedMultiplicationLeftNode.ReturnRightNode() is IrrationalNumberNode) { if (simplifiedMultiplicationLeftNode.ReturnRightNode().GetType() == simplifiedRightNode.GetType()) { if (simplifiedMultiplicationLeftNode.ReturnLeftNode() is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedMultiplicationLeftNode.ReturnLeftNode()).Value; } if (simplifiedMultiplicationLeftNode.ReturnLeftNode() is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedMultiplicationLeftNode.ReturnLeftNode()).Value; } return(new MultiplicationSign(new RationalNumberNode(valueA + 1), simplifiedMultiplicationLeftNode.ReturnRightNode())); } return(new PlusSign(simplifiedLeftNode, simplifiedRightNode)); } else { if (simplifiedMultiplicationLeftNode.ReturnLeftNode().GetType() == simplifiedRightNode.GetType()) { if (simplifiedMultiplicationLeftNode.ReturnRightNode() is RationalNumberNode) { valueA = ((RationalNumberNode)simplifiedMultiplicationLeftNode.ReturnRightNode()).Value; } if (simplifiedMultiplicationLeftNode.ReturnRightNode() is NaturalNumberNode) { valueA = ((NaturalNumberNode)simplifiedMultiplicationLeftNode.ReturnRightNode()).Value; } return(new MultiplicationSign(new RationalNumberNode(valueA + 1), simplifiedMultiplicationLeftNode.ReturnLeftNode())); } return(new PlusSign(simplifiedLeftNode, simplifiedRightNode)); } } else if (simplifiedLeftNode is IrrationalNumberNode && simplifiedRightNode is IrrationalNumberNode && simplifiedLeftNode.Calculate(0) == simplifiedRightNode.Calculate(0)) //p + p = 2 * p { return(new MultiplicationSign(new NaturalNumberNode(2), simplifiedLeftNode)); } else if (simplifiedLeftNode is LogarithmFunction && simplifiedRightNode is LogarithmFunction) //ln(5) + ln(2) = ln(10) { return(new LogarithmFunction(new MultiplicationSign(((Operation)simplifiedLeftNode).ReturnChild().Simplify(), ((Operation)simplifiedRightNode).ReturnChild().Simplify())).Simplify()); } else if (simplifiedLeftNode is MultiplicationSign && simplifiedRightNode is MultiplicationSign && ((((Operator)simplifiedLeftNode).ReturnRightNode() is VariableNode && ((Operator)simplifiedRightNode).ReturnRightNode() is VariableNode) || (((Operator)simplifiedLeftNode).ReturnRightNode() is PiNode && ((Operator)simplifiedRightNode).ReturnRightNode() is PiNode))) //2x + 3x = 5x, 2p + 3p = 5p { if (((Operator)simplifiedLeftNode).ReturnLeftNode() is NumberNode && Math.Abs(((Operator)simplifiedLeftNode).ReturnLeftNode().Calculate(1) % 1) <= (Double.Epsilon * 100) && ((Operator)simplifiedRightNode).ReturnLeftNode() is NumberNode && Math.Abs(((Operator)simplifiedRightNode).ReturnLeftNode().Calculate(1) % 1) <= (Double.Epsilon * 100)) { return(new MultiplicationSign(new NaturalNumberNode( Convert.ToInt32(((Operator)simplifiedLeftNode).ReturnLeftNode().Calculate(1) + ((Operator)simplifiedRightNode).ReturnLeftNode().Calculate(1))), ((Operator)simplifiedLeftNode).ReturnRightNode()).Simplify()); } else { return(new PlusSign(simplifiedLeftNode, simplifiedRightNode)); } } else { return(new PlusSign(simplifiedLeftNode, simplifiedRightNode)); } }