ex mul::eval(int level) const
{
epvector evaled = evalchildren(level);
- if (!evaled.empty()) {
+ if (unlikely(!evaled.empty())) {
// do more evaluation later
return (new mul(std::move(evaled), overall_coeff))->
setflag(status_flags::dynallocated);
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)