- GINAC_ASSERT(is_ex_exactly_of_type(c,numeric));
- if (is_ex_exactly_of_type(e,mul)) {
- mul const & mulref=ex_to_mul(e);
- GINAC_ASSERT(mulref.seq.size()>1);
- ex const & lastfactor_rest=(*(mulref.seq.end()-1)).rest;
- ex const & lastfactor_coeff=(*(mulref.seq.end()-1)).coeff;
- if (is_ex_exactly_of_type(lastfactor_rest,numeric) &&
- ex_to_numeric(lastfactor_coeff).is_equal(numONE())) {
- //epvector s=mulref.seq;
- //s.pop_back();
- //return expair((new mul(s,1))->setflag(status_flags::dynallocated),
- // ex_to_numeric(lastfactor).mul_dyn(ex_to_numeric(c)));
- mul * mulp=static_cast<mul *>(mulref.duplicate());
-#ifdef EXPAIRSEQ_USE_HASHTAB
- mulp->remove_hashtab_entry(mulp->seq.end()-1);
-#endif // def EXPAIRSEQ_USE_HASHTAB
- mulp->seq.pop_back();
-#ifdef EXPAIRSEQ_USE_HASHTAB
- mulp->shrink_hashtab();
-#endif // def EXPAIRSEQ_USE_HASHTAB
- mulp->clearflag(status_flags::evaluated);
- mulp->clearflag(status_flags::hash_calculated);
- if (are_ex_trivially_equal(c,exONE())) {
- return expair(mulp->setflag(status_flags::dynallocated),lastfactor_rest);
- } else if (are_ex_trivially_equal(lastfactor_rest,exONE())) {
- return expair(mulp->setflag(status_flags::dynallocated),c);
- }
- return expair(mulp->setflag(status_flags::dynallocated),
- ex_to_numeric(lastfactor_rest).mul_dyn(ex_to_numeric(c)));
- }
- }
- return expair(e,c);
-}
-*/
-
-expair add::combine_ex_with_coeff_to_pair(ex const & e,
- ex const & c) const
-{
- GINAC_ASSERT(is_ex_exactly_of_type(c,numeric));
- if (is_ex_exactly_of_type(e,mul)) {
- mul const & mulref=ex_to_mul(e);
- ex numfactor=mulref.overall_coeff;
- //mul * mulcopyp=static_cast<mul *>(mulref.duplicate());
- mul * mulcopyp=new mul(mulref);
- mulcopyp->overall_coeff=exONE();
- mulcopyp->clearflag(status_flags::evaluated);
- mulcopyp->clearflag(status_flags::hash_calculated);
- if (are_ex_trivially_equal(c,exONE())) {
- return expair(mulcopyp->setflag(status_flags::dynallocated),numfactor);
- } else if (are_ex_trivially_equal(numfactor,exONE())) {
- return expair(mulcopyp->setflag(status_flags::dynallocated),c);
- }
- return expair(mulcopyp->setflag(status_flags::dynallocated),
- ex_to_numeric(numfactor).mul_dyn(ex_to_numeric(c)));
- } else if (is_ex_exactly_of_type(e,numeric)) {
- if (are_ex_trivially_equal(c,exONE())) {
- return expair(e,exONE());
- }
- return expair(ex_to_numeric(e).mul_dyn(ex_to_numeric(c)),exONE());
- }
- return expair(e,c);
-}
-
-expair add::combine_pair_with_coeff_to_pair(expair const & p,
- ex const & c) const
-{
- GINAC_ASSERT(is_ex_exactly_of_type(p.coeff,numeric));
- GINAC_ASSERT(is_ex_exactly_of_type(c,numeric));