X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fnormal.cpp;h=a8a1e1eb1bd3f7282418eff3160f2ba1a25114e6;hp=439a644606388ad1f70fc08d1d537f3a7189a7be;hb=ec3f0adc471cd6205e81115111070421c8477c6e;hpb=227c0507d513360c31cd16484e08215e1a506363 diff --git a/ginac/normal.cpp b/ginac/normal.cpp index 439a6446..a8a1e1eb 100644 --- a/ginac/normal.cpp +++ b/ginac/normal.cpp @@ -1771,7 +1771,7 @@ ex lcm(const ex &a, const ex &b, bool check_args) * Yun's algorithm. Used internally by sqrfree(). * * @param a multivariate polynomial over Z[X], treated here as univariate - * polynomial in x. + * polynomial in x (needs not be expanded). * @param x variable to factor in * @return vector of factors sorted in ascending degree */ static exvector sqrfree_yun(const ex &a, const symbol &x) @@ -1780,6 +1780,9 @@ static exvector sqrfree_yun(const ex &a, const symbol &x) ex w = a; ex z = w.diff(x); ex g = gcd(w, z); + if (g.is_zero()) { + return res; + } if (g.is_equal(_ex1)) { res.push_back(a); return res; @@ -1787,6 +1790,9 @@ static exvector sqrfree_yun(const ex &a, const symbol &x) ex y; do { w = quo(w, g, x); + if (w.is_zero()) { + return res; + } y = quo(z, g, x); z = y - w.diff(x); g = gcd(w, z); @@ -1798,7 +1804,7 @@ static exvector sqrfree_yun(const ex &a, const symbol &x) /** Compute a square-free factorization of a multivariate polynomial in Q[X]. * - * @param a multivariate polynomial over Q[X] + * @param a multivariate polynomial over Q[X] (needs not be expanded) * @param l lst of variables to factor in, may be left empty for autodetection * @return a square-free factorization of \p a. * @@ -1833,8 +1839,8 @@ static exvector sqrfree_yun(const ex &a, const symbol &x) */ ex sqrfree(const ex &a, const lst &l) { - if (is_exactly_a(a) || // algorithm does not trap a==0 - is_a(a)) // shortcut + if (is_exactly_a(a) || + is_a(a)) // shortcuts return a; // If no lst of variables to factorize in was specified we have to