mul::can_make_flat(): Finish ancient unfinished code.
authorRichard Kreckel <kreckel@ginac.de>
Tue, 24 Nov 2015 10:14:51 +0000 (11:14 +0100)
committerRichard Kreckel <kreckel@ginac.de>
Tue, 24 Nov 2015 11:01:31 +0000 (12:01 +0100)
This makes mul(expairseq({a*b,2},{b})) construct the canonical
mul(expairseq({a,3},{b,2})). Normally, such term rewriting is done
by the .eval() methods, but this is not done when a plain object of
a class derived from basic is constructed.

Cherry-picked from 26e2662e.

ginac/mul.cpp

index 636c939..052e7f7 100644 (file)
@@ -1089,10 +1089,9 @@ void mul::combine_overall_coeff(const ex & c1, const ex & c2)
 bool mul::can_make_flat(const expair & p) const
 {
        GINAC_ASSERT(is_exactly_a<numeric>(p.coeff));
-       // this assertion will probably fail somewhere
-       // it would require a more careful make_flat, obeying the power laws
-       // probably should return true only if p.coeff is integer
-       return ex_to<numeric>(p.coeff).is_equal(*_num1_p);
+
+       // (x*y)^c == x^c*y^c  if c ∈ ℤ
+       return p.coeff.info(info_flags::integer);
 }
 
 bool mul::can_be_further_expanded(const ex & e)