Daily bugfix in the polynomial factorization (code didn't catch polynomial "x"
authorJens Vollinga <jensv@nikhef.nl>
Thu, 21 Aug 2008 20:37:09 +0000 (22:37 +0200)
committerJens Vollinga <jensv@nikhef.nl>
Thu, 21 Aug 2008 20:37:09 +0000 (22:37 +0200)
and cln::sqrt conversion was buggy).

check/exam_factor.cpp
ginac/factor.cpp

index bf1751a..7e15648 100644 (file)
@@ -83,12 +83,17 @@ static unsigned exam_factor1()
        result += check_factor(e);
 
        e = ex("x*(2+x^2)*(1+x+x^3+x^2+x^6+x^5+x^4)*(1+x)^2*(1-x+x^2)^2*(-1+x)", syms);
-
        result += check_factor(e);
 
        e = ex("(x+4+x^2-x^3+43*x^4)*(x+1-x^2-3*x^3+4*x^4)", syms);
        result += check_factor(e);
 
+       e = ex("-x^2*(x-1)*(1+x^2)", syms);
+       result += check_factor(e);
+
+       e = x;
+       result += check_factor(e);
+
        return result;
 }
 
index 5489b4c..9b06e6e 100644 (file)
@@ -888,7 +888,7 @@ static ex hensel_univar(const ex& a_, const ex& x, unsigned int p, const UniPoly
        for ( int i=a.degree(x); i>=a.ldegree(x); --i ) {
                maxcoeff += pow(abs(a.coeff(x, i)),2);
        }
-       cl_I normmc = ceiling1(the<cl_F>(cln::sqrt(ex_to<numeric>(maxcoeff).to_cl_N())));
+       cl_I normmc = ceiling1(the<cl_R>(cln::sqrt(ex_to<numeric>(maxcoeff).to_cl_N())));
        unsigned int maxdegree = (u1_.degree() > w1_.degree()) ? u1_.degree() : w1_.degree();
        unsigned int B = cl_I_to_uint(normmc * expt_pos(cl_I(2), maxdegree));
 
@@ -1233,6 +1233,9 @@ ex factor(const ex& poly)
                }
                return res;
        }
+       if ( is_a<symbol>(sfpoly) ) {
+               return poly;
+       }
        // case: (polynomial)
        ex f = factor_sqrfree(sfpoly);
        return f;