private static Function _mul(FunctionElement e1, FunctionElement e2)
 {
     return e1.ToVariableMultiplication() * e2;
 }
 private static Function _mul(FunctionElement e, double d)
 {
     return e.ToVariableMultiplication() * d;
 }
 public VariablesMulriplication AddVariable(FunctionElement variable)
 {
     if (this.HasVariable(variable.Name))
     {
         var v = this.GetVariableByName(variable.Name);
         if (variable.MathFunctions.Count == 0 && v.MathFunctions.Count == 0)
         {
             // x * x
             v.ApplyFunction("power", new Function(2));
         }
         else
         {
             if (variable.MathFunctions.Count == 1 && variable.MathFunctions.Last() == Function.GetMathFunction("power") &&
                 v.MathFunctions.Count == 1 && v.MathFunctions.Last() == Function.GetMathFunction("power"))
             {
                 // sum powers
                 v.MathFunctions[0] = new Tuple<MathFunctions.IMathFunction, FunctionElement[]>(Function.GetMathFunction("power"),
                     new FunctionElement[] { v.MathFunctions[0].Item2[0] + variable.MathFunctions[0].Item2[0] });
             }
             else
             {
                 if (variable.MathFunctions.Count == 0 && v.MathFunctions.Count == 1 && v.MathFunctions[0] == Function.GetMathFunction("power"))
                 {
                     variable.ApplyFunction("power", v.MathFunctions[0].Item2[0] + 1);
                 }
                 else
                 {
                     if (v.MathFunctions.Count == 0 && variable.MathFunctions.Count == 1 && variable.MathFunctions[0] == Function.GetMathFunction("power"))
                     {
                         variable.MathFunctions[0] = new Tuple<MathFunctions.IMathFunction, FunctionElement[]>(Function.GetMathFunction("power"),
                             new FunctionElement[] { variable.MathFunctions[0].Item2[0] + 1 });
                     }
                     else
                     {
                         this.variables.Add(variable);
                     }
                 }
             }
         }
     }
     else
     {
         if (variable.IsDouble())
         {
             if (this.variables.Count == 0)
             {
                 this.variables.Add(new Variable(""));
             }
             this.Constant *= variable.ToDouble();
         }
         else
         {
             if (variable is Function && variable.IsVariableMultiplication())
             {
                 var temp = variable.ToVariableMultiplication();
                 temp.variables.ForEach(v => this.AddVariable(v));
                 this.Constant *= temp.Constant;
             }
             else
             {
                 this.variables.Add(variable);
             }
         }
     }
     return this;
 }