private static ObjectFormulaTree reduce(ObjectFormulaTree tree) { bool mult = false; if (tree.Operation is ElementaryBinaryOperation) { ElementaryBinaryOperation op = tree.Operation as ElementaryBinaryOperation; if (op.Symbol == '*') { mult = true; } } if (mult) { PolyMult pm = new PolyMult(); for (int i = 0; i < tree.Count; i++) { pm.add(tree); } pm.repeatReduce(); List <ObjectFormulaTree> list = new List <ObjectFormulaTree>(pm.l); pm.l.Clear(); foreach (ObjectFormulaTree t in list) { ObjectFormulaTree r = reduce(t); list.Add(r); pm.add(r); } return(new ObjectFormulaTree(pm, list)); } List <ObjectFormulaTree> listr = new List <ObjectFormulaTree>(); for (int i = 0; i < tree.Count; i++) { listr.Add(reduce(tree[i])); } return(new ObjectFormulaTree(tree.Operation, listr)); }
internal static ObjectFormulaTree MultMult(ObjectFormulaTree tree) { List <ObjectFormulaTree> l = new List <ObjectFormulaTree>(); for (int i = 0; i < tree.Count; i++) { ObjectFormulaTree tr = tree[i]; // tr = ElementaryFormulaSimplification.Object.Simplify(tr); l.Add(MultMult(tr)); } IObjectOperation op = tree.Operation; if (op is ElementaryBinaryOperation) { ElementaryBinaryOperation bo = op as ElementaryBinaryOperation; if (bo.Symbol == '*') { List <ObjectFormulaTree> ll = new List <ObjectFormulaTree>(); PolyMult pm = new PolyMult(); foreach (ObjectFormulaTree t in l) { if (!(t.Operation is PolyMult)) { pm.add(t); ll.Add(t); continue; } for (int i = 0; i < t.Count; i++) { pm.add(t[i]); ll.Add(t[i]); } } return(new ObjectFormulaTree(pm, ll)); } } return(new ObjectFormulaTree(op, l)); }
static internal ObjectFormulaTree simplify(ObjectFormulaTree tree, out bool simple) { //bool s = true; simple = true; List <ObjectFormulaTree> l = new List <ObjectFormulaTree>(); for (int i = 0; i < tree.Count; i++) { ObjectFormulaTree t = simplifyRecursive(tree[i]); l.Add(t); } if (!(tree.Operation is PolyMult)) { return(new ObjectFormulaTree(tree.Operation, l)); } List <ObjectFormulaTree> consts = new List <ObjectFormulaTree>(); List <ObjectFormulaTree> forms = new List <ObjectFormulaTree>(); for (int i = 0; i < tree.Count; i++) { if (ElementaryFormulaSimplification.IsConst(tree[i])) { consts.Add(tree[i]); continue; } forms.Add(tree[i]); } double a = 1; foreach (ObjectFormulaTree t in consts) { double x = (double)t.Result; a *= x; } if (a == 0) { ElementaryRealConstant x = new ElementaryRealConstant(0); simple = true; return(new ObjectFormulaTree(x, new List <ObjectFormulaTree>())); } if (a == 1) { PolyMult pm = new PolyMult(); foreach (ObjectFormulaTree t in forms) { pm.add(t); } if (consts.Count > 0) { simple = false; } return(new ObjectFormulaTree(pm, forms)); } if (consts.Count <= 1) { PolyMult pm = new PolyMult(); pm.l = l; return(new ObjectFormulaTree(tree.Operation, l)); } simple = false; ElementaryRealConstant xx = new ElementaryRealConstant(a); ObjectFormulaTree yy = new ObjectFormulaTree(xx, new List <ObjectFormulaTree>()); List <ObjectFormulaTree> ll = new List <ObjectFormulaTree>(); ll.Add(yy); ll.AddRange(forms); PolyMult pmm = new PolyMult(); pmm.l = new List <ObjectFormulaTree>(ll); return(new ObjectFormulaTree(pmm, ll)); }