From a0248deaeedd480b8d211d9aed08a489304ea7b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 9 Oct 2017 14:08:22 +0200 Subject: [PATCH] [poincare] Improve Power::simplify Change-Id: I7514ccde02ab92db84778ba385703169b7636ce1 --- poincare/src/power.cpp | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index f2e877fe8..14ceb1cce 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -179,26 +179,28 @@ void Power::immediateSimplify() { return; } // (a*b*...)^r -> |a|^r*(sign(a)*b*)^r if a rational - // TODO: this rule should apply on a positive (and not only a rational) - if (m->operand(0)->type() == Type::Rational) { - Expression * r = const_cast(operand(1)); - Expression * rCopy = r->clone(); - Rational * factor = static_cast((Expression *)m->operand(0)); - if (factor->isNegative()) { - m->replaceOperand(factor, new Rational(Integer(-1)), false); - } else { - m->removeOperand(factor, false); + for (int i = 0; i < m->numberOfOperands(); i++) { + if (m->operand(i)->isPositive() || m->operand(i)->type() == Type::Rational) { + Expression * r = const_cast(operand(1)); + Expression * rCopy = r->clone(); + Expression * factor = const_cast(m->operand(0)); + if (!factor->isPositive()) { + m->replaceOperand(factor, new Rational(Integer(-1)), false); + static_cast(factor)->setNegative(false); + } else { + m->removeOperand(factor, false); + } + m->immediateSimplify(); + const Expression * powOperands[2] = {factor, rCopy}; + Power * p = new Power(powOperands, false); + const Expression * multOperands[2] = {p, clone()}; + Multiplication * root = new Multiplication(multOperands, 2, false); + p->immediateSimplify(); + const_cast(root->operand(1))->immediateSimplify(); + replaceWith(root, true); + root->immediateSimplify(); + return; } - m->immediateSimplify(); - factor->setNegative(false); - const Expression * powOperands[2] = {factor, rCopy}; - Power * p = new Power(powOperands, false); - const Expression * multOperands[2] = {p, clone()}; - Multiplication * root = new Multiplication(multOperands, 2, false); - p->immediateSimplify(); - replaceWith(root, true); - root->immediateSimplify(); - return; } } // a^(b+c) -> Rational(a^b)*a^c with a and b rational