[GiNaC-devel] [PATCH 3/4] {mul, power}::expand: expand monomials faster.

Alexei Sheplyakov varg at theor.jinr.ru
Mon Sep 17 15:21:42 CEST 2007


Apparently, in ~ 30% of calls to mul::expand the expression is monomial.
Expanding monomials should be done as fast as possible.
---
 ginac/mul.cpp   |   10 ++++++++++
 ginac/power.cpp |    3 +++
 2 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/ginac/mul.cpp b/ginac/mul.cpp
index db8b9f1..298715b 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 {
@@ -992,6 +993,15 @@ 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);
 	// First, expand the children
 	std::auto_ptr<epvector> expanded_seqp = expandchildren(options);
diff --git a/ginac/power.cpp b/ginac/power.cpp
index fe7132a..cc003bc 100644
--- a/ginac/power.cpp
+++ b/ginac/power.cpp
@@ -771,6 +771,9 @@ tinfo_t 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.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
Url : http://www.cebix.net/pipermail/ginac-devel/attachments/20070917/74bdab80/attachment.pgp


More information about the GiNaC-devel mailing list