]> www.ginac.de Git - ginac.git/commitdiff
 author Richard Kreckel Fri, 5 Feb 2016 23:47:08 +0000 (00:47 +0100) committer Richard Kreckel Fri, 5 Feb 2016 23:53:22 +0000 (00:53 +0100)
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.

 ginac/normal.cpp patch | blob | history

@@ -291,8 +291,13 @@ static ex multiply_lcm(const ex &e, const numeric &lcm)
} else if (is_exactly_a<power>(e)) {
if (is_a<symbol>(e.op(0)))
return e * lcm;
-               else
-                       return pow(multiply_lcm(e.op(0), lcm.power(ex_to<numeric>(e.op(1)).inverse())), e.op(1));
+               else {
+                       numeric root_of_lcm = lcm.power(ex_to<numeric>(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;
}