| Karim BELABAS on Mon, 11 Oct 1999 17:10:26 +0200 (MET DST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: bug report |
[Bill Allombert:]
> I have trigger the following SIGBUS:
>
> with version 2.0.15 and current CVS version
>
> ? charpoly(Mod(Mod(Mod(1, 2)*y^2, Mod(1, 2)*y^3 + Mod(1, 2)*y + Mod(1, 2))*x^4 + Mod(Mod(1, 2)*y^2 + Mod(1, 2)*y, Mod(1, 2)*y^3 + Mod(1, 2)*y + Mod(1, 2))*x^2 + Mod(Mod(1, 2), Mod(1, 2)*y^3 + Mod(1, 2)*y + Mod(1, 2))*x, Mod(Mod(1, 2), Mod(1, 2)*y^3 + Mod(1, 2)*y + Mod(1, 2))*x^7 + Mod(Mod(1, 2)*y, Mod(1, 2)*y^3 + Mod(1, 2)*y + Mod(1, 2))))
> *** bus error: bug in GP (please report)
>
> It's really a bug since it works with version 2.0.11, and still works
> with bigger examples
>
> The bug seem to be in caract2.(I tested it with install)
> With gdb, the SIGBUS occurs in gmodulcp.
A tough one... The bug was in poldivres and was due to an incorrect use of
gmod when gmul( , gmodulcp(gun,mod)) should have been used.
[ gmod(t_POL, t_INT) is defined to be zero since the euclidean division is
done in k[x] for a suitable field k. Due to some delayed simplifications, a
polynomial of degree 0 was produced where an integer was expected and an
ordinary division intended. In the end, degrees didn't match... ]
Karim.
P.S: The first part of the patch corrects a possible problem in caract2,
when an intermediate result was assumed to be a polynomial, which it needn't
be [as in Bill's example, before the bug was corrected.].
Index: src/basemath/alglin2.c
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/basemath/alglin2.c,v
retrieving revision 1.3
diff -c -r1.3 alglin2.c
*** src/basemath/alglin2.c 1999/09/23 17:50:55 1.3
--- src/basemath/alglin2.c 1999/10/11 14:58:27
***************
*** 36,42 ****
if (!signe(x)) return gpowgs(polx[v], lgef(p)-3);
x = gneg_i(x); x[2] = ladd((GEN)x[2], polx[MAXVARN]);
p1=subres_f(p, x, NULL);
! if (varn(p1)==MAXVARN) setvarn(p1,v); else p1=gsubst(p1,MAXVARN,polx[v]);
if (!gcmp1(p2) && (d=lgef(x)-3) > 0) p1 = gdiv(p1, gpuigs(p2,d));
return gerepileupto(av,p1);
--- 36,45 ----
if (!signe(x)) return gpowgs(polx[v], lgef(p)-3);
x = gneg_i(x); x[2] = ladd((GEN)x[2], polx[MAXVARN]);
p1=subres_f(p, x, NULL);
! if (typ(p1) == t_POL && varn(p1)==MAXVARN)
! setvarn(p1,v);
! else
! p1 = gsubst(p1,MAXVARN,polx[v]);
if (!gcmp1(p2) && (d=lgef(x)-3) > 0) p1 = gdiv(p1, gpuigs(p2,d));
return gerepileupto(av,p1);
Index: src/basemath/polarit1.c
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/basemath/polarit1.c,v
retrieving revision 1.3
diff -c -r1.3 polarit1.c
*** src/basemath/polarit1.c 1999/10/04 12:14:49 1.3
--- src/basemath/polarit1.c 1999/10/11 14:58:30
***************
*** 269,275 ****
{
case t_INTMOD:
case t_POLMOD: y_lead = ginv(y_lead);
! f = gmul; mod = (GEN)y_lead[1];
break;
default: if (gcmp1(y_lead)) y_lead = NULL;
mod = NULL;
--- 269,275 ----
{
case t_INTMOD:
case t_POLMOD: y_lead = ginv(y_lead);
! f = gmul; mod = gmodulcp(gun, (GEN)y_lead[1]);
break;
default: if (gcmp1(y_lead)) y_lead = NULL;
mod = NULL;
***************
*** 298,304 ****
/* we always enter this loop at least once */
for (j=0; j<=i && j<=dz; j++)
if (y[i-j]) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j]));
! if (mod && avma==av1) p1 = gmod(p1,mod);
if (!gcmp0(p1)) { sx = 1; break; } /* remainder is non-zero */
if (!isinexactreal(p1) && !isexactzero(p1)) break;
if (!i) break;
--- 298,304 ----
/* we always enter this loop at least once */
for (j=0; j<=i && j<=dz; j++)
if (y[i-j]) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j]));
! if (mod && avma==av1) p1 = gmul(p1,mod);
if (!gcmp0(p1)) { sx = 1; break; } /* remainder is non-zero */
if (!isinexactreal(p1) && !isexactzero(p1)) break;
if (!i) break;
***************
*** 322,328 ****
av1=avma; p1 = (GEN)x[i];
for (j=0; j<=i && j<=dz; j++)
if (y[i-j]) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j]));
! if (mod && avma==av1) p1 = gmod(p1,mod);
rem[i]=avma==av1? lcopy(p1):lpileupto(av1,p1);
}
rem -= 2;
--- 322,328 ----
av1=avma; p1 = (GEN)x[i];
for (j=0; j<=i && j<=dz; j++)
if (y[i-j]) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j]));
! if (mod && avma==av1) p1 = gmul(p1,mod);
rem[i]=avma==av1? lcopy(p1):lpileupto(av1,p1);
}
rem -= 2;
__
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://hasse.mathematik.tu-muenchen.de/ntsw/pari/