| Karim BELABAS on Tue, 8 Jan 2002 19:13:22 +0100 (MET) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: two bugs in 2.2.0 |
On Sun, 23 Dec 2001, Ilya Zakharevich wrote:
[...]
> is the following working as expected? I do not think that
> such simple polynomials would require something as drastic as this:
>
> ones(N) = (t^N - 1)/(t - 1)
> allocatemem(132*1024^2)
> p = 3456; ones(3*p-1) % ones(p)
>
> runs out of memory (and is quite slow if not).
OK, I made the fix I mentionned in my previous email plus a trivial one to
take advantage of polynomials with few non-zero entries [ benchmarks said the
penalty was negligible for small degrees ]
On my old Ultra, I now get [with default stack]
(18:49) gp > ones(N) = (t^N - 1)/(t - 1)
(18:49) gp > p = 3456; ones(3*p-1) % ones(p);
time = 720 ms.
which improves a bit on the situation for largish degrees.
Cheers,
Karim.
P.S: CVS server for the development version updated.
P.S2: I've attached a patch for pari-2.2.0 for which the original bug report
was made [ but if you're using development versions anyway, you should rather
upgrade: 2.2.0 is about 8 months old ]
--
Karim Belabas Tel: (+33) (0)1 69 15 57 48
Dép. de Mathematiques, Bat. 425 Fax: (+33) (0)1 69 15 60 19
Université Paris-Sud Email: Karim.Belabas@math.u-psud.fr
F-91405 Orsay (France) http://www.math.u-psud.fr/~belabas
--
PARI/GP Home Page: http://www.parigp-home.de/
RCS file: /home/megrez/cvsroot/pari/src/basemath/polarit1.c,v
retrieving revision 1.47
retrieving revision 1.77
diff -c -r1.47 -r1.77
*** src/basemath/polarit1.c 2001/04/13 09:38:19 1.47
--- src/basemath/polarit1.c 2002/01/08 17:47:14 1.77
***************
*** 207,213 ****
{
ulong avy,av,av1;
long ty=typ(y),tx,vx,vy,dx,dy,dz,i,j,sx,lrem;
- int remainder;
GEN z,p1,rem,y_lead,mod;
GEN (*f)(GEN,GEN);
--- 118,123 ----
***************
*** 294,308 ****
z[1]=evalsigne(1) | evallgef(dz+3) | evalvarn(vx);
x += 2; y += 2; z += 2;
! p1 = (GEN)x[dx]; remainder = (pr == ONLY_REM);
z[dz]=y_lead? (long)f(p1,y_lead): lcopy(p1);
for (i=dx-1; i>=dy; i--)
{
av1=avma; p1=(GEN)x[i];
for (j=i-dy+1; j<=i && j<=dz; j++)
! if (y[i-j]) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j]));
if (y_lead) p1 = f(p1,y_lead);
! if (!remainder) p1 = avma==av1? gcopy(p1): gerepileupto(av1,p1);
z[i-dy] = (long)p1;
}
if (!pr) return gerepileupto(av,z-2);
--- 204,221 ----
z[1]=evalsigne(1) | evallgef(dz+3) | evalvarn(vx);
x += 2; y += 2; z += 2;
! p1 = (GEN)x[dx];
z[dz]=y_lead? (long)f(p1,y_lead): lcopy(p1);
for (i=dx-1; i>=dy; i--)
{
av1=avma; p1=(GEN)x[i];
for (j=i-dy+1; j<=i && j<=dz; j++)
! if (y[i-j] && z[j] != zero) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j]));
if (y_lead) p1 = f(p1,y_lead);
!
! if (isexactzero(p1)) { avma=av1; p1 = gzero; }
! else
! p1 = avma==av1? gcopy(p1): gerepileupto(av1,p1);
z[i-dy] = (long)p1;
}
if (!pr) return gerepileupto(av,z-2);
***************
*** 313,319 ****
p1 = (GEN)x[i];
/* 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;
--- 226,232 ----
p1 = (GEN)x[i];
/* we always enter this loop at least once */
for (j=0; j<=i && j<=dz; j++)
! if (y[i-j] && z[j] != zero) 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;
***************
*** 337,349 ****
{
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;
if (!sx) normalizepol_i(rem, lrem);
! if (remainder) return gerepileupto(av,rem);
z -= 2;
{
GEN *gptr[2]; gptr[0]=&z; gptr[1]=&rem;
--- 250,262 ----
{
av1=avma; p1 = (GEN)x[i];
for (j=0; j<=i && j<=dz; j++)
! if (y[i-j] && z[j] != zero) 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;
if (!sx) normalizepol_i(rem, lrem);
! if (pr == ONLY_REM) return gerepileupto(av,rem);
z -= 2;
{
GEN *gptr[2]; gptr[0]=&z; gptr[1]=&rem;