| Karim BELABAS on Mon, 8 Mar 1999 18:34:00 +0100 (MET) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: pari-2.0.14 bugs |
[Igor:]
> 1) quadclassunit(-148-16!) \\ Infinite loop
You can get a stack overflow also. Too little garbage collecting + unlucky
choice of initial parameters:
(17:41) gp > quadclassunit(-148-16!, , [0.2])
%1 = [540880, [135220, 2, 2], [Qfb(43, 20, 121644127259), Qfb(603166, 603166, 8822861), Qfb(2, 2, 2615348736019)], 1, 1.002722657933447551205884129]
The following patch prevents the overflow and allows extra_relation to
abort if no relations are found (still about 10 times slower than with the
above parameters...). As a side effect, it also corrects:
> 4) bnfclassunit(x^2-x-1) \\ Error
Karim.
*** src/basemath/buch1.c.orig Fri Mar 5 08:51:42 1999
--- src/basemath/buch1.c Mon Mar 8 18:23:15 1999
***************
*** 977,985 ****
double
check_bach(double cbach, double B)
{
- cbach *= 2;
if (cbach > B)
err(talker,"sorry, buchxxx couldn't deal with this field PLEASE REPORT!");
if (DEBUGLEVEL) fprintferr("\nBach constant: %f\n", cbach);
return cbach;
}
--- 977,985 ----
double
check_bach(double cbach, double B)
{
if (cbach > B)
err(talker,"sorry, buchxxx couldn't deal with this field PLEASE REPORT!");
+ cbach *= 2; if (cbach > B) cbach = B;
if (DEBUGLEVEL) fprintferr("\nBach constant: %f\n", cbach);
return cbach;
}
***************
*** 1186,1192 ****
}
static void
! desalloc(long **mat, long KCCO)
{
long i,*p,*q;
--- 1186,1192 ----
}
static void
! desalloc(long **mat)
{
long i,*p,*q;
***************
*** 1195,1201 ****
{
free(subbase);
for (i=1; i<lg(subfactorbase); i++) free(powsubfactorbase[i]);
! for (i=1; i<=KCCO; i++) free(mat[i]);
free(mat); free(powsubfactorbase);
for (i=1; i<HASHT; i++)
for (p = hashtab[i]; p; p = q) { q=(long*)p[0]; free(p-3); }
--- 1195,1201 ----
{
free(subbase);
for (i=1; i<lg(subfactorbase); i++) free(powsubfactorbase[i]);
! for (i=1; i<lg(mat); i++) free(mat[i]);
free(mat); free(powsubfactorbase);
for (i=1; i<HASHT; i++)
for (p = hashtab[i]; p; p = q) { q=(long*)p[0]; free(p-3); }
***************
*** 1250,1256 ****
static GEN
extra_relations(long LIMC, long *ex, long nlze, GEN extramatc)
{
! long fpc,p,ep,i,j,k,nlze2, *col, *colg, s = 0, extrarel = nlze+2;
GEN p1,form, extramat = cgetg(extrarel+1,t_MAT);
if (DEBUGLEVEL)
--- 1250,1257 ----
static GEN
extra_relations(long LIMC, long *ex, long nlze, GEN extramatc)
{
! long av,fpc,p,ep,i,j,k,nlze2, *col, *colg, s = 0, extrarel = nlze+2;
! long MAXRELSUP = min(50,4*KC);
GEN p1,form, extramat = cgetg(extrarel+1,t_MAT);
if (DEBUGLEVEL)
***************
*** 1261,1266 ****
--- 1262,1268 ----
for (j=1; j<=extrarel; j++) extramat[j]=lgetg(KC+1,t_COL);
nlze2 = PRECREG? max(nlze,lgsub): min(nlze+1,KC);
if (nlze2 < 3 && KC > 2) nlze2 = 3;
+ av = avma;
while (s<extrarel)
{
form = NULL;
***************
*** 1289,1297 ****
}
for (i=1; i<=KC; i++)
if (col[i]) break;
! if (i>KC) s--;
! else if (PRECREG) coeff(extramatc,1,s) = form[4];
}
if (DEBUGLEVEL)
{
if (fpc == 1) fprintferr(" %ld",s);
--- 1291,1304 ----
}
for (i=1; i<=KC; i++)
if (col[i]) break;
! if (i>KC)
! {
! s--; avma = av;
! if (--MAXRELSUP == 0) return NULL;
! }
! else { av = avma; if (PRECREG) coeff(extramatc,1,s) = form[4]; }
}
+ else avma = av;
if (DEBUGLEVEL)
{
if (fpc == 1) fprintferr(" %ld",s);
***************
*** 1817,1826 ****
if (!PRECREG) lim /= sqrt(3.);
cp = (long)exp(sqrt(LOGD*log(LOGD)/8.0));
if (cp < 13) cp = 13;
! av = avma;
! INCREASE:
! if (DEBUGLEVEL) { fprintferr("cbach = %f\n",cbach); flusherr(); }
nreldep = nrelsup = 0;
LIMC = (long)(cbach*LOGD*LOGD);
if (LIMC < cp) LIMC=cp;
--- 1824,1832 ----
if (!PRECREG) lim /= sqrt(3.);
cp = (long)exp(sqrt(LOGD*log(LOGD)/8.0));
if (cp < 13) cp = 13;
! av = avma; cbach /= 2;
! INCREASE: avma = av; cbach = check_bach(cbach,6.);
nreldep = nrelsup = 0;
LIMC = (long)(cbach*LOGD*LOGD);
if (LIMC < cp) LIMC=cp;
***************
*** 1834,1853 ****
isqrtD = gfloor(sqrtD);
}
factorbasequad(Disc,LIMC2,LIMC);
! if (!KC) { avma=av; cbach = check_bach(cbach,6.); goto INCREASE; }
vperm = new_chunk(KC+1); for (i=1; i<=KC; i++) vperm[i]=i;
nbram = subfactorbasequad(lim,KC);
! if (nbram == -1)
! {
! desalloc(NULL,0); avma=av;
! cbach = check_bach(cbach,6.); goto INCREASE;
! }
KCCO = KC + RELSUP;
if (DEBUGLEVEL) { fprintferr("KC = %ld, KCCO = %ld\n",KC,KCCO); flusherr(); }
powsubfact(lgsub,CBUCH+7);
mat = (long**) gpmalloc((KCCO+1)*sizeof(long*));
for (i=1; i<=KCCO; i++)
{
mat[i] = (long*) gpmalloc((KC+1)*sizeof(long));
--- 1840,1856 ----
isqrtD = gfloor(sqrtD);
}
factorbasequad(Disc,LIMC2,LIMC);
! if (!KC) goto INCREASE;
vperm = new_chunk(KC+1); for (i=1; i<=KC; i++) vperm[i]=i;
nbram = subfactorbasequad(lim,KC);
! if (nbram == -1) { desalloc(NULL); goto INCREASE; }
KCCO = KC + RELSUP;
if (DEBUGLEVEL) { fprintferr("KC = %ld, KCCO = %ld\n",KC,KCCO); flusherr(); }
powsubfact(lgsub,CBUCH+7);
mat = (long**) gpmalloc((KCCO+1)*sizeof(long*));
+ setlg(mat, KCCO+1);
for (i=1; i<=KCCO; i++)
{
mat[i] = (long*) gpmalloc((KC+1)*sizeof(long));
***************
*** 1881,1891 ****
fprintferr("\n");
msgtimer("be honest");
}
! if (!s)
! {
! desalloc(mat,KCCO); avma=av;
! cbach = check_bach(cbach,6.); goto INCREASE;
! }
}
matc=cgetg(KCCO+1,t_MAT);
if (PRECREG)
--- 1884,1890 ----
fprintferr("\n");
msgtimer("be honest");
}
! if (!s) { desalloc(mat); goto INCREASE; }
}
matc=cgetg(KCCO+1,t_MAT);
if (PRECREG)
***************
*** 1908,1925 ****
extramatc=cgetg(extrarel+1,t_MAT);
for (i=1; i<=extrarel; i++) extramatc[i]=lgetg(s,t_COL);
extramat = extra_relations(LIMC,ex,nlze,extramatc);
if (nrelsup) nlze=0;
mit=hnfadd(mit,&pdep,&matc,vperm,&matalpha,KCCOPRO,KC,col,&nlze,
extramat,extramatc);
KCCOPRO += extrarel; col = KCCOPRO-lg(matalpha)+1;
if (nlze)
{
! nreldep++;
! if (nreldep>5)
! {
! desalloc(mat,KCCO); avma=av;
! cbach = check_bach(cbach,6.); goto INCREASE;
! }
goto EXTRAREL;
}
}
--- 1907,1920 ----
extramatc=cgetg(extrarel+1,t_MAT);
for (i=1; i<=extrarel; i++) extramatc[i]=lgetg(s,t_COL);
extramat = extra_relations(LIMC,ex,nlze,extramatc);
+ if (!extramat) { desalloc(mat); goto INCREASE; }
if (nrelsup) nlze=0;
mit=hnfadd(mit,&pdep,&matc,vperm,&matalpha,KCCOPRO,KC,col,&nlze,
extramat,extramatc);
KCCOPRO += extrarel; col = KCCOPRO-lg(matalpha)+1;
if (nlze)
{
! if (++nreldep > 5) { desalloc(mat); goto INCREASE; }
goto EXTRAREL;
}
}
***************
*** 1931,1949 ****
reg = get_reg(matc, col-lg(mit)+1);
if (!reg)
{
! desalloc(mat,KCCO); avma=av;
prec = (PRECREG<<1)-2; goto INCREASE;
}
if (gexpo(reg)<=-3)
{
! nrelsup++;
! if (nrelsup<=7)
{
if (DEBUGLEVEL) { fprintferr("regulateur nul\n"); flusherr(); }
nlze=min(KC,nrelsup); goto EXTRAREL;
}
! desalloc(mat,KCCO); avma=av;
! cbach = check_bach(cbach,6.); goto INCREASE;
}
c_1 = divrr(gmul2n(gmul(h,reg),1), cst);
}
--- 1926,1942 ----
reg = get_reg(matc, col-lg(mit)+1);
if (!reg)
{
! desalloc(mat);
prec = (PRECREG<<1)-2; goto INCREASE;
}
if (gexpo(reg)<=-3)
{
! if (++nrelsup <= 7)
{
if (DEBUGLEVEL) { fprintferr("regulateur nul\n"); flusherr(); }
nlze=min(KC,nrelsup); goto EXTRAREL;
}
! desalloc(mat); goto INCREASE;
}
c_1 = divrr(gmul2n(gmul(h,reg),1), cst);
}
***************
*** 1963,1977 ****
{ fprintferr("***** check = %f\n\n",gtodouble(c_1)); flusherr(); }
nlze=min(KC,nrelsup); goto EXTRAREL;
}
! if (cbach < 5.99)
! {
! desalloc(mat,KCCO); avma=av;
! cbach = check_bach(cbach,6.); goto INCREASE;
! }
err(warner,"suspicious check. Suggest increasing extra relations.");
}
basecl = get_clgp(Disc,mit,&met,PRECREG);
! s = lg(basecl); desalloc(mat,KCCO); tetpil=avma;
res=cgetg(6,t_VEC);
res[1]=lcopy(h); p1=cgetg(s,t_VEC);
--- 1956,1966 ----
{ fprintferr("***** check = %f\n\n",gtodouble(c_1)); flusherr(); }
nlze=min(KC,nrelsup); goto EXTRAREL;
}
! if (cbach < 5.99) { desalloc(mat); goto INCREASE; }
err(warner,"suspicious check. Suggest increasing extra relations.");
}
basecl = get_clgp(Disc,mit,&met,PRECREG);
! s = lg(basecl); desalloc(mat); tetpil=avma;
res=cgetg(6,t_VEC);
res[1]=lcopy(h); p1=cgetg(s,t_VEC);
--
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/