--- ginac/mul.cpp | 12 ++++++++++++ ginac/power.cpp | 3 +++ 2 files changed, 15 insertions(+), 0 deletions(-) diff --git a/ginac/mul.cpp b/ginac/mul.cpp index 5176218..d6ff7cb 100644 --- a/ginac/mul.cpp +++ b/ginac/mul.cpp @@ -34,6 +34,7 @@ #include "lst.h" #include "archive.h" #include "utils.h" +#include "symbol.h" #include "compiler.h" namespace GiNaC { @@ -940,7 +941,18 @@ bool mul::can_be_further_expanded(const ex & e) ex mul::expand(unsigned options) const { + { + // trivial case: expanding the monomial (~ 30% of all calls) + epvector::const_iterator i = seq.begin(), seq_end = seq.end(); + while ((i != seq.end()) && is_a<symbol>(i->rest) && i->coeff.info(info_flags::integer)) + ++i; + if (i == seq_end) + return (new mul(*this))->setflag(status_flags::dynallocated | status_flags::expanded); + } + const bool skip_idx_rename = ! info(info_flags::has_indices); + if (skip_idx_rename) + ++(mul_expand_stats::n_indexless); // First, expand the children std::auto_ptr<epvector> expanded_seqp = expandchildren(options); const epvector & expanded_seq = (expanded_seqp.get() ? *expanded_seqp : seq); diff --git a/ginac/power.cpp b/ginac/power.cpp index bbcb453..010af6c 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -680,6 +680,9 @@ unsigned power::return_type_tinfo() const ex power::expand(unsigned options) const { + if (is_a<symbol>(basis) && exponent.info(info_flags::integer)) + return (new power(*this))->setflag(status_flags::dynallocated | status_flags::expanded); + if (options == 0 && (flags & status_flags::expanded)) return *this; -- 1.5.2.4 Best regards, Alexei -- All science is either physics or stamp collecting.