X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fmul.cpp;h=b12f5d42fafcbbd4a0c5963559c9de48b13255be;hp=924493d272f1956f6d4d755f55f5b01203df5c48;hb=22abfbe8c78e339188096a5bf749a7c2d4f0a368;hpb=da64e515abf7243bc4c84ca3631470931c4e6691 diff --git a/ginac/mul.cpp b/ginac/mul.cpp index 924493d2..b12f5d42 100644 --- a/ginac/mul.cpp +++ b/ginac/mul.cpp @@ -30,6 +30,7 @@ #include "power.h" #include "operators.h" #include "matrix.h" +#include "indexed.h" #include "lst.h" #include "archive.h" #include "utils.h" @@ -128,8 +129,8 @@ void mul::print_overall_coeff(const print_context & c, const char *mul_sym) cons const numeric &coeff = ex_to(overall_coeff); if (coeff.csgn() == -1) c.s << '-'; - if (!coeff.is_equal(_num1) && - !coeff.is_equal(_num_1)) { + if (!coeff.is_equal(*_num1_p) && + !coeff.is_equal(*_num_1_p)) { if (coeff.is_rational()) { if (coeff.is_negative()) (-coeff).print(c); @@ -421,7 +422,7 @@ ex mul::eval(int level) const return recombine_pair_to_ex(*(seq.begin())); } else if ((seq_size==1) && is_exactly_a((*seq.begin()).rest) && - ex_to((*seq.begin()).coeff).is_equal(_num1)) { + ex_to((*seq.begin()).coeff).is_equal(*_num1_p)) { // *(+(x,y,...);c) -> +(*(x,c),*(y,c),...) (c numeric(), no powers of +()) const add & addref = ex_to((*seq.begin()).rest); std::auto_ptr distrseq(new epvector); @@ -766,7 +767,7 @@ expair mul::combine_pair_with_coeff_to_pair(const expair & p, ex mul::recombine_pair_to_ex(const expair & p) const { - if (ex_to(p.coeff).is_equal(_num1)) + if (ex_to(p.coeff).is_equal(*_num1_p)) return p.rest; else return (new power(p.rest,p.coeff))->setflag(status_flags::dynallocated); @@ -821,7 +822,7 @@ bool mul::can_make_flat(const expair & p) const // this assertion will probably fail somewhere // it would require a more careful make_flat, obeying the power laws // probably should return true only if p.coeff is integer - return ex_to(p.coeff).is_equal(_num1); + return ex_to(p.coeff).is_equal(*_num1_p); } bool mul::can_be_further_expanded(const ex & e) @@ -904,11 +905,12 @@ ex mul::expand(unsigned options) const for (epvector::const_iterator i2=add2begin; i2!=add2end; ++i2) { // Don't push_back expairs which might have a rest that evaluates to a numeric, // since that would violate an invariant of expairseq: - const ex rest = (new mul(i1->rest, i2->rest))->setflag(status_flags::dynallocated); - if (is_exactly_a(rest)) + const ex rest = (new mul(i1->rest, rename_dummy_indices_uniquely(i1->rest, i2->rest)))->setflag(status_flags::dynallocated); + if (is_exactly_a(rest)) { oc += ex_to(rest).mul(ex_to(i1->coeff).mul(ex_to(i2->coeff))); - else + } else { distrseq.push_back(expair(rest, ex_to(i1->coeff).mul_dyn(ex_to(i2->coeff)))); + } } tmp_accu += (new add(distrseq, oc))->setflag(status_flags::dynallocated); } @@ -934,11 +936,11 @@ ex mul::expand(unsigned options) const for (size_t i=0; isetflag(status_flags::dynallocated); - if (can_be_further_expanded(term)) + if (can_be_further_expanded(term)) { distrseq.push_back(term.expand()); - else { + } else { if (options == 0) ex_to(term).setflag(status_flags::expanded); distrseq.push_back(term);