exam_mod_gcd
exam_cra
bugme_chinrem_gcd
+ factor_univariate_bug
pgcd_relatively_prime_bug
pgcd_infinite_loop)
exam_misc \
exam_mod_gcd \
bugme_chinrem_gcd \
+ factor_univariate_bug \
pgcd_relatively_prime_bug \
pgcd_infinite_loop \
exam_cra
bugme_chinrem_gcd_SOURCES = bugme_chinrem_gcd.cpp
bugme_chinrem_gcd_LDADD = ../ginac/libginac.la
+factor_univariate_bug_SOURCES = factor_univariate_bug.cpp
+factor_univariate_bug_LDADD = ../ginac/libginac.la
+
pgcd_relatively_prime_bug_SOURCES = pgcd_relatively_prime_bug.cpp
pgcd_relatively_prime_bug_LDADD = ../ginac/libginac.la
--- /dev/null
+/**
+ * @file factor_upoly_q_bug.cpp Check for a bug in factor_univariate().
+ *
+ * factor_univariate() didn't check if the argument is an integer polynomial,
+ * the result was a segfault.
+ */
+#include "ginac.h"
+#include <iostream>
+using namespace GiNaC;
+using namespace std;
+
+int main(int argc, char** argv)
+{
+ cout << "checking if factor() handles rational polynomials. ";
+ parser p;
+ ex e = p("174247781*x^2-1989199947807987/200000000000000*x");
+ ex ef = factor(e);
+ ex diff = (e - ef).expand();
+ cout << "yes" << endl;
+ return 0;
+}
cl_modint_ring R;
unsigned int trials = 0;
unsigned int minfactors = 0;
- cl_I lc = lcoeff(prim) * the<cl_I>(ex_to<numeric>(cont).to_cl_N());
+
+ const numeric& cont_n = ex_to<numeric>(cont);
+ cl_I i_cont;
+ if (cont_n.is_integer()) {
+ i_cont = the<cl_I>(cont_n.to_cl_N());
+ } else {
+ // poly \in Q[x] => poly = q ipoly, ipoly \in Z[x], q \in Q
+ // factor(poly) \equiv q factor(ipoly)
+ i_cont = cl_I(1);
+ }
+ cl_I lc = lcoeff(prim)*i_cont;
upvec factors;
while ( trials < 2 ) {
umodpoly modpoly;