| Karim BELABAS on Tue, 8 Dec 1998 17:51:02 +0100 (MET) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: bug in factronf() |
[Igor:]
> this is a what I call "bad input" bug.
> ? factornf(x^3+2,y^2-1)
> *** non-invertible polynomial in polinvmod. \\ correct error message
> ? factornf(x^3+1,y^2-1)
> *** the PARI stack overflows !!!
>
> *** Warning: doubling stack size; new stack = 8000000.
>
> So factornf() gets confused when both polynomials are reducible and
> keeps growing the stack. This bug was introduced somewhere between
> 2.0.11.beta and 2.0.12.alpha.
It's due to the fact that the output of factor() is now sorted: we reduce to
a factorization problem over Z, and if the "modulus" polynomial is not
irreducible, the output is not really usable. When converting back to the
original problem, a different "bad" factor is considered first. So, instead
of trying to invert a non-invertible polmod, we find 1 as an irreducible
factor, then try to compute the valuation at 1...
The patch below shoudl correct it (apply my preceding patch [msg 329] before
this one).
Karim.
*** src/basemath/polarit2.c.orig Tue Dec 8 17:20:47 1998
--- src/basemath/polarit2.c Tue Dec 8 17:37:32 1998
***************
*** 2256,2287 ****
GEN
polfnf(GEN a, GEN t)
{
! GEN y,p1,p2,u,g,fa,n,unt,f,b,pro;
! long av=avma,tetpil,lx,v,i,e,k,vt;
if (typ(a)!=t_POL || typ(t)!=t_POL) err(typeer,"polfnf");
if (gcmp0(a)) return gcopy(a);
vt=varn(t); v=varn(a);
if (vt<v)
err(talker,"polynomial variable must be of higher priority than number field variable\nin factornf");
! u = gdiv(a,ggcd(a,derivpol(a)));
unt = gmodulsg(1,t); u = gmul(unt,u);
! g=lift(u); k = -2;
! do
{
! k++; n = gsub(polx[MAXVARN], gmulsg(k,polx[vt]));
n = subres(t, poleval(g,n));
}
- while (lgef(modulargcd(n,derivpol(n))) > 3);
fa=factor(n); fa=(GEN)fa[1]; lx=lg(fa);
y=cgetg(3,t_MAT);
p1=cgetg(lx,t_COL); y[1]=(long)p1;
p2=cgetg(lx,t_COL); y[2]=(long)p2;
for (i=1; i<lx; i++)
{
! f = poleval((GEN)fa[i], gadd(polx[v],gmulsg(k,gmodulcp(polx[vt],t))));
! pro = ggcd(u, gmul(unt,f));
p1[i] = (typ(pro)==t_POL)? ldiv(pro,leading_term(pro)): (long)pro;
e=0; while (poldivis(a,(GEN)p1[i], &b)) { a = b; e++; }
p2[i] = lstoi(e);
}
--- 2256,2290 ----
GEN
polfnf(GEN a, GEN t)
{
! GEN x0, y,p1,p2,u,g,fa,n,unt;
! long av=avma,tetpil,lx,v,i,k,vt;
if (typ(a)!=t_POL || typ(t)!=t_POL) err(typeer,"polfnf");
if (gcmp0(a)) return gcopy(a);
vt=varn(t); v=varn(a);
if (vt<v)
err(talker,"polynomial variable must be of higher priority than number field variable\nin factornf");
! u = gdiv(a, ggcd(a,derivpol(a)));
unt = gmodulsg(1,t); u = gmul(unt,u);
! g = lift(u);
! for (k=-1; ; k++)
{
! n = gsub(polx[MAXVARN], gmulsg(k,polx[vt]));
n = subres(t, poleval(g,n));
+ if (lgef(modulargcd(n,derivpol(n))) == 3) break;
}
fa=factor(n); fa=(GEN)fa[1]; lx=lg(fa);
y=cgetg(3,t_MAT);
p1=cgetg(lx,t_COL); y[1]=(long)p1;
p2=cgetg(lx,t_COL); y[2]=(long)p2;
+ x0 = gadd(polx[v],gmulsg(k,gmodulcp(polx[vt],t)));
for (i=1; i<lx; i++)
{
! GEN b, pro = ggcd(u, gmul(unt, poleval((GEN)fa[i], x0)));
! long e;
!
p1[i] = (typ(pro)==t_POL)? ldiv(pro,leading_term(pro)): (long)pro;
+ if (gcmp1((GEN)p1[i])) err(talker,"reducible modulus in factornf");
e=0; while (poldivis(a,(GEN)p1[i], &b)) { a = b; e++; }
p2[i] = lstoi(e);
}
--
Karim Belabas email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud Tel: (00 33) 1 69 15 57 48
F-91405 Orsay (France) Fax: (00 33) 1 69 15 60 19
--
PARI/GP Home Page: http://pari.home.ml.org