-ex add::coeff(const symbol & s, int n) const
-{
- epvector coeffseq;
- coeffseq.reserve(seq.size());
-
- epvector::const_iterator it=seq.begin();
- while (it!=seq.end()) {
- coeffseq.push_back(combine_ex_with_coeff_to_pair((*it).rest.coeff(s,n),
- (*it).coeff));
- ++it;
- }
- if (n==0) {
- return (new add(coeffseq,overall_coeff))->setflag(status_flags::dynallocated);
+ex add::coeff(const ex & s, int n) const
+{
+ std::auto_ptr<epvector> coeffseq(new epvector);
+ std::auto_ptr<epvector> coeffseq_cliff(new epvector);
+ char rl = clifford_max_label(s);
+ bool do_clifford = (rl != -1);
+ bool nonscalar = false;
+
+ // Calculate sum of coefficients in each term
+ epvector::const_iterator i = seq.begin(), end = seq.end();
+ while (i != end) {
+ ex restcoeff = i->rest.coeff(s, n);
+ if (!restcoeff.is_zero()) {
+ if (do_clifford) {
+ if (clifford_max_label(restcoeff) == -1) {
+ coeffseq_cliff->push_back(combine_ex_with_coeff_to_pair(ncmul(restcoeff, dirac_ONE(rl)), i->coeff));
+ } else {
+ coeffseq_cliff->push_back(combine_ex_with_coeff_to_pair(restcoeff, i->coeff));
+ nonscalar = true;
+ }
+ }
+ coeffseq->push_back(combine_ex_with_coeff_to_pair(restcoeff, i->coeff));
+ }
+ ++i;