- // D(a+b+c)=D(a)+D(b)+D(c)
- return (new add(diffchildren(s)))->setflag(status_flags::dynallocated);
+ epvector *s = new epvector();
+ s->reserve(seq.size());
+
+ // Only differentiate the "rest" parts of the expairs. This is faster
+ // than the default implementation in basic::derivative() although
+ // if performs the same function (differentiate each term).
+ epvector::const_iterator i = seq.begin(), end = seq.end();
+ while (i != end) {
+ s->push_back(combine_ex_with_coeff_to_pair(i->rest.diff(y), i->coeff));
+ ++i;
+ }
+ return (new add(s, _ex0))->setflag(status_flags::dynallocated);