return dynallocate<add>(v);
} else if (is_exactly_a<power>(e)) {
if (!is_a<symbol>(e.op(0))) {
return dynallocate<add>(v);
} else if (is_exactly_a<power>(e)) {
if (!is_a<symbol>(e.op(0))) {
// but not for symbolic b, as evaluation would undo this again
numeric root_of_lcm = lcm.power(ex_to<numeric>(e.op(1)).inverse());
if (root_of_lcm.is_rational())
// but not for symbolic b, as evaluation would undo this again
numeric root_of_lcm = lcm.power(ex_to<numeric>(e.op(1)).inverse());
if (root_of_lcm.is_rational())