Esempio n. 1
0
        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)));
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
 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);
     }
 }
Esempio n. 4
0
        public override Node ReturnDerivative(double x)
        {
            ExponentialFunction exponentialFunction = new ExponentialFunction(child.Copy());
            MultiplicationSign  multiplicationSign  = new MultiplicationSign(exponentialFunction, child.ReturnDerivative(x));

            return(multiplicationSign);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
 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);
     }
 }
Esempio n. 10
0
        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));
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        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));
            }
        }
Esempio n. 13
0
        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));
            }
        }
Esempio n. 14
0
        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));
            }
        }