protected override ProductQuotientSet simplifyFractional <T>(T newSetGeneric) { if (!(newSetGeneric is SumDifferenceSet)) { return(new ProductQuotientSet(newSetGeneric)); } SumDifferenceSet newSet = newSetGeneric as SumDifferenceSet; if (newSet.Count < 2) { return(new ProductQuotientSet(newSet)); } ProductQuotientSet leftSet = fractionSet(newSet, 0); for (int i = 1; i < newSet.Count; i++) { ProductQuotientSet rightSet = fractionSet(newSet, i); IBase unitA = unitSet(leftSet, 0); IBase unitB = unitSet(leftSet, 1); IBase unitC = unitSet(rightSet, 0); IBase unitD = unitSet(rightSet, 1); ProductQuotientSet numeratorSetLeft = new ProductQuotientSet(unitA); numeratorSetLeft.MultiplyItem(unitD); numeratorSetLeft = simplifyNumeric <ProductQuotientSet>(numeratorSetLeft); ProductQuotientSet numeratorSetRight = new ProductQuotientSet(unitC); numeratorSetRight.MultiplyItem(unitB); numeratorSetRight = simplifyNumeric <ProductQuotientSet>(numeratorSetRight); ProductQuotientSet denominatorSet = new ProductQuotientSet(unitB); denominatorSet.MultiplyItem(unitD); denominatorSet = simplifyNumeric <ProductQuotientSet>(denominatorSet); SumDifferenceSet numeratorSet = new SumDifferenceSet(numeratorSetLeft); if (newSet._unitOperatorPair[i].OperatorEquals(Query.ADD)) { numeratorSet.SumItem(numeratorSetRight); } else if (newSet._unitOperatorPair[i].OperatorEquals(Query.SUBTRACT)) { numeratorSet.SubtractItem(numeratorSetRight); } numeratorSet = simplifyNumeric <SumDifferenceSet>(numeratorSet); leftSet = new ProductQuotientSet(numeratorSet); leftSet.DivideItem(denominatorSet); } string simplifiedFraction = Query.SimplifiedFraction(leftSet.Label()); ProductQuotientSet set = new ProductQuotientSet(simplifiedFraction); return((ProductQuotientSet)set.SimplifyUnitsOfOne()); }
public override object Clone() { IBase unit = Count > 0 ? _unitOperatorPair[0].Unit : null; SumDifferenceSet newSet = new SumDifferenceSet(unit, _power, SignIsNegative()); for (int i = 1; i < Count; i++) { if (_unitOperatorPair[i].OperatorEquals(Query.ADD)) { newSet.SumItem(_unitOperatorPair[i].Unit); } if (_unitOperatorPair[i].OperatorEquals(Query.SUBTRACT)) { newSet.SubtractItem(_unitOperatorPair[i].Unit); } } return(newSet); }
protected IBase getBase(bool getAbsolute = false) { if (Count == 0) { return(new SumDifferenceSet()); } IBase unitBase = getUnit(0, getAbsolute); SumDifferenceSet newSet = new SumDifferenceSet(unitBase); for (int i = 1; i < Count; i++) { if (_unitOperatorPair[i].OperatorEquals(Query.ADD)) { newSet.SumItem(_unitOperatorPair[i].Unit); } if (_unitOperatorPair[i].OperatorEquals(Query.SUBTRACT)) { newSet.SubtractItem(_unitOperatorPair[i].Unit); } } return(newSet); }