@Override public boolean canBeSimplified() { if (this.numerator != null && this.denominator != null) { if (this.numerator instanceof Number && this.denominator instanceof Number) { Number numeratorConverted = (Number) numerator; Number denominatorConverted = (Number) denominator; if (Operation.isInteger(numeratorConverted.getValue()) && Operation.isInteger(denominatorConverted.getValue())) { ExpressionPart gcd = new GreatestCommonDivisor(numeratorConverted, denominatorConverted).simplyfy(); if (gcd instanceof Number && ((Number) gcd).getValue() > 1) { return true; } } else { return true; } } if (denominator instanceof Number) { if (((Number) denominator).getValue() == 1) { return true; } } if (numerator.canBeSimplified() || denominator.canBeSimplified()) return true; } return false; }
@Override public ExpressionPart nextStepToSimplyfy() { if (base instanceof Number && exponent instanceof Number) { return new Number(Math.pow(((Number) base).getValue(), ((Number) exponent).getValue())); } ExpressionPart tmpbase = base; ExpressionPart tmpexponent = exponent; if (base.canBeSimplified()) { tmpbase = base.nextStepToSimplyfy(); } if (exponent.canBeSimplified()) { tmpexponent = exponent.simplyfy(); } return this; }
@Override public int hashCode() { int result = prev != null ? prev.hashCode() : 0; result = ~~result; result = 31 * result + (name != null ? name.hashCode() : 0); result = ~~result; result = 31 * result + (classType != null ? classType.hashCode() : 0); result = ~~result; result = 31 * result + (genericType != null ? genericType.hashCode() : 0); result = ~~result; result = 31 * result + (parametricType != null ? parametricType.hashCode() : 0); result = ~~result; return result; }
@Override public String toString() { return base.toString().concat("^").concat(exponent.toString()); }
@Override public ExpressionPart simplyfy() { ExpressionPart tmpNumerator = numerator; ExpressionPart tmpDenominator = denominator; if (tmpNumerator.canBeSimplified()) { tmpNumerator = tmpNumerator.simplyfy(); } if (tmpDenominator.canBeSimplified()) { tmpDenominator = tmpDenominator.simplyfy(); } if (tmpNumerator instanceof Number && tmpDenominator instanceof Number) { Number numeratorConverted = (Number) tmpNumerator; Number denominatorConverted = (Number) tmpDenominator; if (Operation.isInteger(numeratorConverted.getValue()) && Operation.isInteger(denominatorConverted.getValue())) { ExpressionPart gcd = new GreatestCommonDivisor(numeratorConverted, denominatorConverted).simplyfy(); if (gcd instanceof Number && ((Number) gcd).getValue() > 1) { tmpNumerator = new Division(numeratorConverted, gcd).simplyfy(); tmpDenominator = new Division(denominatorConverted, gcd).simplyfy(); } } else { while (!(Operation.isInteger(numeratorConverted.getValue()) && Operation.isInteger(denominatorConverted.getValue()))) { numeratorConverted = new Number(numeratorConverted.getValue() * 10); denominatorConverted = new Number(denominatorConverted.getValue() * 10); } return new Fraction(numeratorConverted, denominatorConverted).simplyfy(); } } if (tmpNumerator instanceof Fraction && tmpDenominator instanceof Fraction) { Fraction tmpNumeratorConverted = (Fraction) tmpNumerator; Fraction tmpDenominatorConverted = (Fraction) tmpDenominator; return new Fraction( new Multiplication(tmpNumeratorConverted.numerator, tmpDenominatorConverted.denominator), new Multiplication(tmpNumeratorConverted.denominator, tmpDenominatorConverted.numerator)); } if (tmpNumerator instanceof Fraction) { Fraction tmpNumeratorConverted = (Fraction) tmpNumerator; return new Fraction( tmpNumeratorConverted.numerator, new Multiplication(tmpNumeratorConverted.denominator, tmpDenominator)); } if (tmpDenominator instanceof Fraction) { Fraction tmpDenominatorConverted = (Fraction) tmpDenominator; return new Fraction( new Multiplication(tmpDenominatorConverted.denominator, tmpNumerator), tmpDenominatorConverted.numerator); } if (tmpDenominator instanceof Number) { if (((Number) tmpDenominator).getValue() == 1) { return tmpNumerator; } } Fraction retValue = new Fraction(tmpNumerator, tmpDenominator); /*retValue.setSign(this.isPositive); if(tmpNumerator instanceof Number){ if(((Number)tmpNumerator).getValue() < 0){ retValue.setSign(false); tmpNumerator = new Number(Math.abs(((Number)tmpNumerator).getValue())); retValue.setSignChecked(true); } }*/ return retValue; }
public void setNext(ExpressionPart next) { this.next = next; if (next != null) { next.prev = this; } }
public void setPrevious(ExpressionPart prev) { this.prev = prev; if (prev != null) { prev.next = this; } }