@Override public AMExpression simplifyInOneStep() { AMExpression f1 = factor1.simplifyInOneStep(); AMExpression f2 = factor2.simplifyInOneStep(); if (f1 instanceof BasicNumber) { if (f2 instanceof BasicNumber) return ((BasicNumber) f1).multiply((BasicNumber) f2); // n.n' -> n*n' if (((BasicNumber) f1).isZero()) return new BasicNumber(0); // 0.a -> 0 if (((BasicNumber) f1).equals(new BasicNumber(1))) return f2; // 1.a -> a if (((BasicNumber) f1).isNegative()) return new AdditiveInverse( new Product(((BasicNumber) f1).negate(), f2)); // (-n).a -> -(n.a) } if (f2 instanceof BasicNumber) { if (((BasicNumber) f2).isZero()) return new BasicNumber(0); // a.0 -> 0 if (((BasicNumber) f2).equals(new BasicNumber(1))) return f1; // a.1 -> a if (((BasicNumber) f2).isNegative()) return new AdditiveInverse( new Product(((BasicNumber) f2).negate(), f1)); // a.(-n) -> -(n.a) } if (f1 instanceof AdditiveInverse) { if (f2 instanceof AdditiveInverse) return new Product( ((AdditiveInverse) f1).getExpr(), ((AdditiveInverse) f2).getExpr()); // (-a).(-b) -> a.b return new AdditiveInverse( new Product(((AdditiveInverse) f1).getExpr(), f2)); // (-a).b -> -(a.b) } if (f2 instanceof AdditiveInverse) return new AdditiveInverse( new Product(((AdditiveInverse) f2).getExpr(), f1)); // a.(-b) -> -(a.b))) if (f1 instanceof Fraction) { AMExpression numerator = ((Fraction) f1).getNumerator(); AMExpression denominator = ((Fraction) f1).getDenominator(); if (numerator.equals(new BasicNumber(1)) && denominator.equals(f2)) return new BasicNumber(1); // a.(1/a) -> 1 } if (f2 instanceof Fraction) { AMExpression numerator = ((Fraction) f2).getNumerator(); AMExpression denominator = ((Fraction) f2).getDenominator(); if (numerator.equals(new BasicNumber(1)) && denominator.equals(f1)) return new BasicNumber(1); // (1/a).a -> 1 } return new Product(f1, f2); }
@Override public boolean equals(Object expr) { if (!(expr instanceof Product)) return false; Product prod = (Product) expr; return (factor1.equals(prod.getFactor1()) && factor2.equals(prod.getFactor2())); }