예제 #1
0
 public AlgebExpression(AlgebExpression tree)
 {
     left = tree.left; op = tree.op; right = tree.right; value = tree.value;
 }
예제 #2
0
 /// <summary>
 /// only for multiplication canceling
 /// </summary>
 /// <param name="right"></param>
 /// <returns></returns>
 private bool CanCancelWith(AlgebExpression tree)
 {
     if (this.IsDivisibleBy(tree))
         return true;
     else if (this.op == Operation.Value || tree.op == Operation.Value)
         return false;
     if (this.op == Operation.Multiplication)
         return this.left.CanCancelWith(tree)
             || this.right.CanCancelWith(tree);
     if (tree.op == Operation.Multiplication)
         return tree.CanCancelWith(this.right)
             || tree.CanCancelWith(this.left);
     return false;
 }
예제 #3
0
 private bool IsPartOf(AlgebExpression bigTree)
 {
     if (this == bigTree)
         return true;
     if (bigTree.op == Operation.Value)
         return false;
     return
         this.IsPartOf(bigTree.left)
         || this.IsPartOf(bigTree.right);
 }
예제 #4
0
 public AlgebExpression(AlgebExpression l, Operation o, AlgebExpression r)
 {
     left = l; op = o; right = r;
 }
예제 #5
0
 public bool IsDivisibleBy(AlgebExpression tree)
 {
     if (tree == null || this == null)
         return false;
     if (this.op == Operation.Value && tree.op == Operation.Value && this.value.Value.Pow >= tree.value.Value.Pow)
         return this.value.Value.Pow >= tree.value.Value.Pow;
     if (this.op == Operation.Value)
         return false;
     if (this == tree)
         return true;
     else
     {
         if (this.op == Operation.Multiplication)
             return
                 this.left.IsDivisibleBy(tree)
                 || this.right.IsDivisibleBy(tree);
         if (this.op == Operation.Addition || this.op == Operation.Subtraction)
         {
             var newThis = this.SubtructionToNegAddition();
             tree = tree.SubtructionToNegAddition();
             return (newThis.left.IsDivisibleBy(tree)
                     && newThis.right.IsDivisibleBy(tree));
         }
     }
     return false;
 }
예제 #6
0
        private static AlgebExpression SimplifyDivsion(AlgebExpression currTree, ref AlgebExpression bigTree, bool rtnBig)
        {
            if (currTree.op == Operation.Value)
                return currTree;

            currTree.left = SimplifyDivsion(currTree.left, ref bigTree, false);
            currTree.right = SimplifyDivsion(currTree.right, ref bigTree, false);

            if (currTree.op == Operation.Division)
            {
                if (currTree.left.IsDivisibleBy(currTree.right))
                    return SimplifyDivsion((currTree.left / currTree.right), ref bigTree, false);
                if (currTree.IsPartOf(bigTree))
                    bigTree = (bigTree * currTree.right).Factor();
            }
            return rtnBig ? bigTree : currTree;
        }
예제 #7
0
 public AlgebExpression SimplifyMultiplication()
 {
     if (op == Operation.Value)
         return this;
     left = left.SimplifyMultiplication();
     right = right.SimplifyMultiplication();
     if (op == Operation.Multiplication)
         return left * right;
     return this;
 }
예제 #8
0
 public AlgebExpression SubtructionToNegAddition()
 {
     if (this.op == Operation.Value)
         return value;
     this.left = left.SubtructionToNegAddition();
     this.right = right.SubtructionToNegAddition();
     if (this.op == Operation.Subtraction)
         return new AlgebExpression(left, Operation.Addition, right * -1);
     return this;
 }
예제 #9
0
        public AlgebExpression LeftAlignAddition()
        {
            if (this.op == Operation.Equality)
            {
                var leftleft = left.LeftAlignAddition();
                return new AlgebExpression(this.left.LeftAlignAddition(), Operation.Equality, right.LeftAlignAddition());
            }
            if (this.op == Operation.Value)
                return this;
            if (this.op != Operation.Addition)
                throw new InvalidOperationException("to align addition all ops must be addition");
            if (this.right.op == Operation.Value)
                return left.LeftAlignAddition() + right;
            if (this.left.op == Operation.Value)
                return right.LeftAlignAddition() + left;
            if (left.op == Operation.Addition && right.op == Operation.Addition)
            {
                left = left.LeftAlignAddition();
                right = right.LeftAlignAddition();
                if (this.right.op == Operation.Value)
                    return left.LeftAlignAddition() + right;
                if (this.left.op == Operation.Value)
                    return right.LeftAlignAddition() + left;

                return new AlgebExpression
                    (((left.left + right.right)
                        + left.right)
                        + right.left)
                        .LeftAlignAddition();
            }
            else
            {
                throw new InvalidOperationException("to align addition all ops must be addition");
            }
            throw new Exception("sumthing went wrong");
        }