| Karim Belabas on Sat, 10 May 2014 19:09:29 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Reducible thue() might be missing solutions |
* Georgi Guninski [2014-05-10 17:56]:
> On Sat, May 10, 2014 at 05:09:21PM +0200, Karim Belabas wrote:
> > * Karim Belabas [2014-05-10 16:20]:
> > It required a combination of non-monic polynomials (this we had in abundance,
> > e.g. from elltors testing), lots of rational roots compared to the degree
> > (this we had also, but not in combination with the first point) and a little
> > bad luck to exercise the bug...
In fact it required a leading coefficient exactly equal to -1.
> One man's bad luck is another man's good luck,
> especially for bugs ;)
>
> What about 2.5.5, is it still supported?
No. You should upgrade to either 2.7.* (new stable branch) or to master.
master is preferred if you intend to go bug-hunting of course
(that would be nice :-)
1) Here's a minimal fix for 2.7.*
diff --git a/src/basemath/QX_factor.c b/src/basemath/QX_factor.c
index 87190dc..2efb912 100644
--- a/src/basemath/QX_factor.c
+++ b/src/basemath/QX_factor.c
@@ -807,9 +807,9 @@ DDF_roots(GEN A)
{ lc = NULL; lcpol = A; }
else
{ lc = absi(lc); lcpol = ZX_Z_mul(A, lc); }
- Ap = ZX_to_Flx(A, pp);
+ Ap = Flx_normalize(ZX_to_Flx(A, pp), pp);
bound = root_bound(A);
- if (lc) { Ap = Flx_normalize(Ap, pp); bound = mulii(lc, bound); }
+ if (lc) bound = mulii(lc, bound);
e = logint(addiu(shifti(bound, 1), 1), p, &pe);
pes2 = shifti(pe, -1);
if (DEBUGLEVEL>2) timer_printf(&T, "Root bound");
> (it caught some of the roots unlike master).
2) 2.5.5 is *not* affected by the bug in nfrootsQ() we're talking about,
but it contains a few genuine bugs in thue() itself.
Here's a minimal fix *for the problem you originally reported* for 2.5.5
(there were a few other problems in 2.5.5:thue() : it doesn't support
non-monic polynomials, the final checks are much slower, and it leaked
"user variables")
diff --git a/src/modules/thue.c b/src/modules/thue.c
index 46176c9..a9ede7b 100644
--- a/src/modules/thue.c
+++ b/src/modules/thue.c
@@ -1103,7 +1103,7 @@ thue(GEN tnf, GEN rhs, GEN ne)
ry = nfrootsQ(Rab);
for (k = 1; k < lg(ry); k++)
if (typ(gel(ry,k)) == t_INT) check_y(&S, P, POL, gel(ry,k), rhs);
- if (!odd(e)) {
+ if (odd(e)) {
Rab = gsubst(gsubst(R, va, negi(df)), vb, negi(dg));
ry = nfrootsQ(Rab);
for (k = 1; k < lg(ry); k++)
Cheers,
K.B.
--
Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation http://www.math.u-bordeaux1.fr/~kbelabas/
F-33405 Talence (France) http://pari.math.u-bordeaux1.fr/ [PARI/GP]
`