+ex add::real_part() const
+{
+ epvector v;
+ v.reserve(seq.size());
+ for (auto & it : seq)
+ if (it.coeff.info(info_flags::real)) {
+ ex rp = it.rest.real_part();
+ if (!rp.is_zero())
+ v.push_back(expair(rp, it.coeff));
+ } else {
+ ex rp = recombine_pair_to_ex(it).real_part();
+ if (!rp.is_zero())
+ v.push_back(split_ex_to_pair(rp));
+ }
+ return dynallocate<add>(std::move(v), overall_coeff.real_part());
+}
+
+ex add::imag_part() const
+{
+ epvector v;
+ v.reserve(seq.size());
+ for (auto & it : seq)
+ if (it.coeff.info(info_flags::real)) {
+ ex ip = it.rest.imag_part();
+ if (!ip.is_zero())
+ v.push_back(expair(ip, it.coeff));
+ } else {
+ ex ip = recombine_pair_to_ex(it).imag_part();
+ if (!ip.is_zero())
+ v.push_back(split_ex_to_pair(ip));
+ }
+ return dynallocate<add>(std::move(v), overall_coeff.imag_part());
+}
+