-
- if (icont != *_num1_p) {
- return (new mul(power(ebasis/icont, *num_exponent), power(icont, *num_exponent))
- )->setflag(status_flags::dynallocated);
- }
-
- if (canonicalizable && (! unit_normal)) {
- if (num_exponent->is_even()) {
- return power(-ebasis, *num_exponent);
- } else {
- return (new mul(power(-ebasis, *num_exponent), *_num_1_p)
- )->setflag(status_flags::dynallocated);
- }
+ if (canonicalizable && (! unit_normal))
+ icont = icont.mul(*_num_1_p);
+
+ if (canonicalizable && (icont != *_num1_p)) {
+ const add& addref = ex_to<add>(ebasis);
+ add* addp = new add(addref);
+ addp->setflag(status_flags::dynallocated);
+ addp->clearflag(status_flags::hash_calculated);
+ addp->overall_coeff = ex_to<numeric>(addp->overall_coeff).div_dyn(icont);
+ for (epvector::iterator i = addp->seq.begin(); i != addp->seq.end(); ++i)
+ i->coeff = ex_to<numeric>(i->coeff).div_dyn(icont);
+
+ const numeric c = icont.power(*num_exponent);
+ if (likely(c != *_num1_p))
+ return (new mul(power(*addp, *num_exponent), c))->setflag(status_flags::dynallocated);
+ else
+ return power(*addp, *num_exponent);