]> www.ginac.de Git - ginac.git/blobdiff - ginac/factor.cpp
[BUGFIX] Fix factor_univariate(poly, x) for constant poly.
[ginac.git] / ginac / factor.cpp
index aac6038ab932ccb53bd603652dd646d37833de1b..f53642a2bb7e88504073b14d1bd9e33cecc88f78 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 /*
- *  GiNaC Copyright (C) 1999-2018 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2020 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -1491,6 +1491,9 @@ static ex factor_univariate(const ex& poly, const ex& x, unsigned int& prime)
        poly.unitcontprim(x, unit, cont, prim_ex);
        upoly prim;
        upoly_from_ex(prim, prim_ex, x);
+       if (prim_ex.is_equal(1)) {
+               return poly;
+       }
 
        // determine proper prime and minimize number of modular factors
        prime = 3;
@@ -2229,14 +2232,13 @@ static ex factor_sqrfree(const ex& poly);
  */
 static ex factor_multivariate(const ex& poly, const exset& syms)
 {
-       exset::const_iterator s;
        const ex& x = *syms.begin();
 
        // make polynomial primitive
        ex unit, cont, pp;
        poly.unitcontprim(x, unit, cont, pp);
        if ( !is_a<numeric>(cont) ) {
-               return factor_sqrfree(cont) * factor_sqrfree(pp);
+               return unit * factor_sqrfree(cont) * factor_sqrfree(pp);
        }
 
        // factor leading coefficient
@@ -2309,7 +2311,7 @@ static ex factor_multivariate(const ex& poly, const exset& syms)
                        vector<numeric> ftilde(vnlst.nops()-1);
                        for ( size_t i=0; i<ftilde.size(); ++i ) {
                                ex ft = vnlst.op(i+1);
-                               s = syms.begin();
+                               auto s = syms.begin();
                                ++s;
                                for ( size_t j=0; j<a.size(); ++j ) {
                                        ft = ft.subs(*s == a[j]);
@@ -2383,7 +2385,7 @@ static ex factor_multivariate(const ex& poly, const exset& syms)
                // set up evaluation points
                EvalPoint ep;
                vector<EvalPoint> epv;
-               s = syms.begin();
+               auto s = syms.begin();
                ++s;
                for ( size_t i=0; i<a.size(); ++i ) {
                        ep.x = *s++;
@@ -2455,9 +2457,9 @@ static ex factor_sqrfree(const ex& poly)
        if ( findsymbols.syms.size() == 1 ) {
                // univariate case
                const ex& x = *(findsymbols.syms.begin());
-               if ( poly.ldegree(x) > 0 ) {
+               int ld = poly.ldegree(x);
+               if ( ld > 0 ) {
                        // pull out direct factors
-                       int ld = poly.ldegree(x);
                        ex res = factor_univariate(expand(poly/pow(x, ld)), x);
                        return res * pow(x,ld);
                } else {