- if ( is_a<power>(sfpoly) ) {
- // case: (polynomial)^exponent
- const ex& base = sfpoly.op(0);
- if ( !is_a<add>(base) ) {
- // simple case: (monomial)^exponent
- return sfpoly;
- }
- ex f = factor_sqrfree(base);
- return pow(f, sfpoly.op(1));
- }
- if ( is_a<mul>(sfpoly) ) {
- // case: multiple factors
- ex res = 1;
- for ( size_t i=0; i<sfpoly.nops(); ++i ) {
- const ex& t = sfpoly.op(i);
- if ( is_a<power>(t) ) {
- const ex& base = t.op(0);
- if ( !is_a<add>(base) ) {
- res *= t;
- }
- else {
- ex f = factor_sqrfree(base);
- res *= pow(f, t.op(1));
- }
- }
- else if ( is_a<add>(t) ) {
- ex f = factor_sqrfree(t);
- res *= f;
+ ex res = 1;
+ factor_iter(sfpoly,
+ [&](const ex &f, const ex &k) {
+ if ( is_a<add>(f) ) {
+ res *= pow(factor_sqrfree(f), k);
+ } else {
+ // simple case: (monomial)^exponent
+ res *= pow(f, k);