[GiNaC-devel] [PATCH 2/4] [BUGFIX] primpart_content: correctly handle monomials.

Alexei Sheplyakov alexei.sheplyakov at gmail.com
Mon May 17 08:16:20 CEST 2010


Impact: fixes (rare) incorrect gcd calculation and (potential) segfault.

Thanks to Aless Lasaruk for a bug report.
---
 ginac/polynomial/collect_vargs.cpp    |   10 ++++++++--
 ginac/polynomial/primpart_content.cpp |    2 +-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/ginac/polynomial/collect_vargs.cpp b/ginac/polynomial/collect_vargs.cpp
index 89c3b8b..2593268 100644
--- a/ginac/polynomial/collect_vargs.cpp
+++ b/ginac/polynomial/collect_vargs.cpp
@@ -148,8 +148,14 @@ ex_collect_to_ex(const ex_collect_t& ec, const GiNaC::exvector& vars)
 		exvector tv;
 		tv.reserve(vars.size() + 1);
 		for (std::size_t j = 0; j < vars.size(); ++j) {
-			if (ec[i].first[j] != 0)
-				tv.push_back(power(vars[j], ec[i].first[j]));
+			const exp_vector_t& exp_vector(ec[i].first);
+
+			bug_on(exp_vector.size() != vars.size(),
+				"expected " << vars.size() << " variables, "
+				"expression has " << exp_vector.size() << " instead");
+
+			if (exp_vector[j] != 0)
+				tv.push_back(power(vars[j], exp_vector[j]));
 		}
 		tv.push_back(ec[i].second);
 		ex tmp = (new mul(tv))->setflag(status_flags::dynallocated);
diff --git a/ginac/polynomial/primpart_content.cpp b/ginac/polynomial/primpart_content.cpp
index f703ee7..694f29d 100644
--- a/ginac/polynomial/primpart_content.cpp
+++ b/ginac/polynomial/primpart_content.cpp
@@ -62,7 +62,7 @@ void primpart_content(ex& pp, ex& c, ex e, const exvector& vars,
 		// p_1(x_n) p_2(x_0, \ldots, x_{n-1})
 		c = ec.rbegin()->second;
 		ec.rbegin()->second = ex1;
-		pp = ex_collect_to_ex(ec, vars).expand().smod(numeric(p));
+		pp = ex_collect_to_ex(ec, rest_vars).expand().smod(numeric(p));
 		return;
 	}
 
-- 
1.7.1



More information about the GiNaC-devel mailing list