From: Alexei Sheplyakov Date: Fri, 3 Dec 2010 23:35:06 +0000 (+0100) Subject: [PATCH 1/2] extract_integer_content: check for rational numbers properly. X-Git-Tag: release_1-6-0~34 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=f0fb303711b4334ce59f7da63bfa7cb49f46265f;hp=3d09388a8ea144a19949c216fae43ccba92e47aa [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. --- 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)