From: Richard Kreckel Date: Fri, 5 Feb 2016 23:47:08 +0000 (+0100) Subject: [bugfix] fix elusive bug in quo, rem,... X-Git-Tag: release_1-6-7~1 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=958b72c93a20eaf27ed9e2092d1c342a3c8b8ecf [bugfix] fix elusive bug in quo, rem,... The power of two rational numeric objects needs not be rational. As a result, some care is required when transforming (b^e)*l -> (b*l^(1/e))^e for some rational e and l. This is a common transformation in order to convert a polynomial over Q into a polynomial over Z when computing their quotient, remainder, etc. Failure to be careful can potentially introduce spurious non-rational numbers into rational polynomials and make those operations fail. This patch avoids this transformation when l^(1/e) is not a rational number. --- diff --git a/ginac/normal.cpp b/ginac/normal.cpp index 89fe532a..1f4d9065 100644 --- a/ginac/normal.cpp +++ b/ginac/normal.cpp @@ -291,8 +291,13 @@ static ex multiply_lcm(const ex &e, const numeric &lcm) } else if (is_exactly_a(e)) { if (is_a(e.op(0))) return e * lcm; - else - return pow(multiply_lcm(e.op(0), lcm.power(ex_to(e.op(1)).inverse())), e.op(1)); + else { + numeric root_of_lcm = lcm.power(ex_to(e.op(1)).inverse()); + if (root_of_lcm.is_rational()) + return pow(multiply_lcm(e.op(0), root_of_lcm), e.op(1)); + else + return e * lcm; + } } else return e * lcm; }