+
+ // if any terms in the sum still are purely numeric, then they are more
+ // appropriately collected into the overall coefficient
+ int terms_to_collect = 0;
+ for (auto & it : seq) {
+ if (unlikely(is_a<numeric>(it.rest)))
+ ++terms_to_collect;
+ }
+ if (terms_to_collect) {
+ epvector s;
+ s.reserve(seq_size - terms_to_collect);
+ numeric oc = *_num1_p;
+ for (auto & it : seq) {
+ if (unlikely(is_a<numeric>(it.rest)))
+ oc = oc.mul(ex_to<numeric>(it.rest)).mul(ex_to<numeric>(it.coeff));
+ else
+ s.push_back(it);
+ }
+ return (new add(std::move(s), ex_to<numeric>(overall_coeff).add_dyn(oc)))
+ ->setflag(status_flags::dynallocated);
+ }
+