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.
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)