From eccdca0011fc44bc14cfcb7ffd82dbcb653e19a5 Mon Sep 17 00:00:00 2001 From: Alexei Sheplyakov Date: Sat, 4 Dec 2010 00:35:06 +0100 Subject: [PATCH] [PATCH 1/2] extract_integer_content: check for rational numbers properly. Commit 3d09388a (titled as `[bugfix] chinrem_gcd: handle polynomials over rationals properly.') broke extract_integer_content: now it always returns 1. The check for rational `integer_contnent' introduced by that commit is wrong (since integers is a subset of rationals). Rewrite the check proprerly. (cherry picked from commit f0fb303711b4334ce59f7da63bfa7cb49f46265f) --- ginac/polynomial/mgcd.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/ginac/polynomial/mgcd.cpp b/ginac/polynomial/mgcd.cpp index 5b9da128..7500805e 100644 --- a/ginac/polynomial/mgcd.cpp +++ b/ginac/polynomial/mgcd.cpp @@ -40,21 +40,23 @@ static cln::cl_I extract_integer_content(ex& Apr, const ex& A) { static const cln::cl_I n1(1); const numeric icont_ = A.integer_content(); + if (cln::instanceof(icont_.to_cl_N(), cln::cl_I_ring)) { + const cln::cl_I icont = cln::the(icont_.to_cl_N()); + if (icont != 1) { + Apr = (A/icont_).expand(); + return icont; + } else { + Apr = A; + return n1; + } + } if (cln::instanceof(icont_.to_cl_N(), cln::cl_RA_ring)) { Apr = (A/icont_).expand(); // A is a polynomail over rationals, so GCD is defined // up to arbitrary rational number. return n1; } - GINAC_ASSERT(cln::instanceof(icont_.to_cl_N(), cln::cl_I_ring)); - const cln::cl_I icont = cln::the(icont_.to_cl_N()); - if (icont != 1) { - Apr = (A/icont_).expand(); - return icont; - } else { - Apr = A; - return n1; - } + GINAC_ASSERT(NULL == "expected polynomial over integers or rationals"); } ex chinrem_gcd(const ex& A_, const ex& B_, const exvector& vars) -- 2.44.0