diff --git a/poincare/include/poincare/multiplication.h b/poincare/include/poincare/multiplication.h index 32b1c224b..5d19772e7 100644 --- a/poincare/include/poincare/multiplication.h +++ b/poincare/include/poincare/multiplication.h @@ -38,6 +38,7 @@ private: void factorizeChildren(Expression * e1, Expression * e2); void distributeOnChildAtIndex(int index); static bool TermsHaveIdenticalBase(const Expression * e1, const Expression * e2); + static bool TermHasRationalBaseAndExponent(const Expression * e); static const Expression * CreateExponent(Expression * e); }; diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index 8d8bff7c5..92343bb7e 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -100,7 +100,7 @@ void Multiplication::immediateSimplify() { Rational a = Rational::Multiplication(*(static_cast(operand(i))), *(static_cast(operand(i+1)))); replaceOperand(operand(i), new Rational(a), true); removeOperand(operand(i+1), true); - } else if (TermsHaveIdenticalBase(operand(i), operand(i+1))) { + } else if (TermsHaveIdenticalBase(operand(i), operand(i+1)) && !(TermHasRationalBaseAndExponent(operand(i)) && TermHasRationalBaseAndExponent(operand(i+1)))) { factorizeChildren(const_cast(operand(i)), const_cast(operand(i+1))); } } @@ -150,6 +150,12 @@ bool Multiplication::TermsHaveIdenticalBase(const Expression * e1, const Express return (f1->compareTo(f2) == 0); } +bool Multiplication::TermHasRationalBaseAndExponent(const Expression * e) { + bool hasRationalBase = e->type() == Type::Power ? e->operand(0)->type() == Type::Rational : e->type() == Type::Rational; + bool hasRationalExponent = e->type() == Type::Power ? e->operand(1)->type() == Type::Rational : true; + return hasRationalBase && hasRationalExponent; +} + template Poincare::Evaluation* Poincare::Multiplication::computeOnComplexAndMatrix(Poincare::Complex const*, Poincare::Evaluation*); template Poincare::Evaluation* Poincare::Multiplication::computeOnComplexAndMatrix(Poincare::Complex const*, Poincare::Evaluation*); }