From b6bde113e60080ae1fda4bb0c8061c4f4036f641 Mon Sep 17 00:00:00 2001 From: Jens Vollinga Date: Mon, 15 Oct 2007 23:49:18 +0000 Subject: [PATCH] Synced to HEAD: - This helps mul::expand() and friends to recognize objects which have no indices at all [Sheplyakov]. --- ginac/mul.cpp | 12 ++++++++++++ ginac/power.cpp | 3 +++ 2 files changed, 15 insertions(+) diff --git a/ginac/mul.cpp b/ginac/mul.cpp index 5176218b..d6ff7cb9 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(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 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 bbcb4536..010af6c9 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(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; -- 2.49.0