[BACK]Return to gen1.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari-2.2 / src / basemath

Diff for /OpenXM_contrib/pari-2.2/src/basemath/Attic/gen1.c between version 1.1 and 1.2

version 1.1, 2001/10/02 11:17:04 version 1.2, 2002/09/11 07:26:50
Line 30  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
Line 30  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
   
 /* assume z[1] was created last */  /* assume z[1] was created last */
 #define fix_frac_if_int(z) if (is_pm1(z[2]))\  #define fix_frac_if_int(z) if (is_pm1(z[2]))\
   z = gerepileupto((long)(z+3), (GEN)z[1]);    z = gerepileupto((gpmem_t)(z+3), (GEN)z[1]);
   
 /* assume z[1] was created last */  /* assume z[1] was created last */
 #define fix_frac_if_int_GC(z,tetpil) { if (is_pm1(z[2]))\  #define fix_frac_if_int_GC(z,tetpil) { if (is_pm1(z[2]))\
   z = gerepileupto((long)(z+3), (GEN)z[1]);\    z = gerepileupto((gpmem_t)(z+3), (GEN)z[1]);\
 else\  else\
   gerepilemanyvec((long)z, tetpil, z+1, 2); }    gerepilemanyvec((gpmem_t)z, tetpil, z+1, 2); }
   
 GEN quickmul(GEN a, GEN b, long na, long nb);  GEN quickmul(GEN a, GEN b, long na, long nb);
   
Line 46  static GEN
Line 46  static GEN
 op_polmod(GEN f(GEN,GEN), GEN x, GEN y, long tx)  op_polmod(GEN f(GEN,GEN), GEN x, GEN y, long tx)
 {  {
   GEN mod,k,l, z=cgetg(3,t_POLMOD);    GEN mod,k,l, z=cgetg(3,t_POLMOD);
   long av,tetpil;    gpmem_t av, tetpil;
   
   l=(GEN)y[1];    l=(GEN)y[1];
   if (tx==t_POLMOD)    if (tx==t_POLMOD)
Line 105  gred_rfrac_simple(GEN x1, GEN x2)
Line 105  gred_rfrac_simple(GEN x1, GEN x2)
   
   c = denom(x1);    c = denom(x1);
   y = cgetg(3,t_RFRAC);    y = cgetg(3,t_RFRAC);
   y[1] = (long)numer(x1);    y[1] = lmul(x1,c);
   y[2] = lmul(x2,c); return y;    y[2] = lmul(x2,c); return y;
 }  }
   
Line 116  gred_rfrac2_i(GEN x1, GEN x2)
Line 116  gred_rfrac2_i(GEN x1, GEN x2)
   long tx,ty;    long tx,ty;
   
   if (gcmp0(x1)) return gcopy(x1);    if (gcmp0(x1)) return gcopy(x1);
     x1 = simplify_i(x1); tx = typ(x1);
   tx=typ(x1); ty=typ(x2);    x2 = simplify_i(x2); ty = typ(x2);
   if (ty!=t_POL)    if (ty!=t_POL)
   {    {
     if (tx!=t_POL) return gred_rfrac_copy(x1,x2);      if (tx!=t_POL) return gred_rfrac_copy(x1,x2);
Line 165  gred_rfrac_i(GEN x)
Line 165  gred_rfrac_i(GEN x)
 GEN  GEN
 gred_rfrac2(GEN x1, GEN x2)  gred_rfrac2(GEN x1, GEN x2)
 {  {
   ulong av = avma;    gpmem_t av = avma;
   return gerepileupto(av, gred_rfrac2_i(x1, x2));    return gerepileupto(av, gred_rfrac2_i(x1, x2));
 }  }
   
Line 180  GEN
Line 180  GEN
 gred_frac2(GEN x1, GEN x2)  gred_frac2(GEN x1, GEN x2)
 {  {
   GEN p1, y = dvmdii(x1,x2,&p1);    GEN p1, y = dvmdii(x1,x2,&p1);
   ulong av;    gpmem_t av;
   
   if (p1 == gzero) return y; /* gzero intended */    if (p1 == gzero) return y; /* gzero intended */
   av = avma;    av = avma;
Line 221  gred(GEN x)
Line 221  gred(GEN x)
 GEN  GEN
 gsub(GEN x, GEN y)  gsub(GEN x, GEN y)
 {  {
   long tetpil, av = avma;    gpmem_t tetpil, av = avma;
   y=gneg_i(y); tetpil=avma;    y=gneg_i(y); tetpil=avma;
   return gerepile(av,tetpil,gadd(x,y));    return gerepile(av,tetpil,gadd(x,y));
 }  }
Line 235  gsub(GEN x, GEN y)
Line 235  gsub(GEN x, GEN y)
 static GEN  static GEN
 addpadic(GEN x, GEN y)  addpadic(GEN x, GEN y)
 {  {
   long c,e,r,d,r1,r2,av,tetpil;    gpmem_t av = avma;
   GEN z,p1,p2, p = (GEN)x[2];    long c,d,e,r,rx,ry;
     GEN u,z,p,mod;
   
   z=cgetg(5,t_PADIC); icopyifstack(p, z[2]); av=avma;    (void)new_chunk(5+lgefint(x[3])+lgefint(y[3]));
   e=valp(x); r=valp(y); d = r-e;    e = valp(x);
   if (d<0) { p1=x; x=y; y=p1; e=r; d = -d; }    r = valp(y); d = r-e;
   r1=precp(x); r2=precp(y);    if (d < 0) { GEN p1=x; x=y; y=p1; e = r; d = -d; }
   if (d)    rx = precp(x); p = (GEN)x[2];
     ry = precp(y);
     if (d) /* v(x) < v(y) */
   {    {
     r = d+r2;      r = d+ry; z = gpowgs(p,d);
     p1 = (d==1)? p: gclone(gpuigs(p,d));      if (r < rx) mod = mulii(z,(GEN)y[3]); else { r = rx; mod = (GEN)x[3]; }
     avma=av;      u = addii((GEN)x[4], mulii(z,(GEN)y[4]));
     if (r<r1) z[3]=lmulii(p1,(GEN)y[3]);  
     else  
     {  
       r=r1; z[3]=licopy((GEN)x[3]);  
     }  
     av=avma; p2=mulii(p1,(GEN)y[4]);  
     if (d!=1) gunclone(p1);  
     p1=addii(p2,(GEN)x[4]); tetpil=avma;  
     z[4]=lpile(av,tetpil, modii(p1,(GEN)z[3]));  
     z[1]=evalprecp(r) | evalvalp(e); return z;  
   }    }
   if (r2<r1) { r=r2; p1=x; x=y; y=p1; } else r=r1;    else
   p1 = addii((GEN)x[4],(GEN)y[4]);  
   if (!signe(p1) || (c = pvaluation(p1,p,&p2)) >=r)  
   {    {
     avma=av; z[4]=zero; z[3]=un;      if (ry < rx) { r=ry; mod = (GEN)x[3]; } else { r=rx; mod = (GEN)y[3]; }
     z[1]=evalvalp(e+r); return z;      u = addii((GEN)x[4], (GEN)y[4]);
   }      if (!signe(u) || (c = pvaluation(u,p,&u)) >= r)
   if (c)  
   {  
     p2=gclone(p2); avma=av;  
     if (c==1)  
       z[3] = ldivii((GEN)x[3], p);  
     else  
     {      {
       p1 = gpuigs(p,c); tetpil=avma;        avma = av; return padiczero(p, e+r);
       z[3] = lpile(av,tetpil, divii((GEN)x[3], p1));  
     }      }
     z[4]=lmodii(p2,(GEN)z[3]); gunclone(p2);      if (c)
     z[1]=evalprecp(r-c) | evalvalp(e+c); return z;      {
         mod = divii(mod, gpowgs(p,c));
         r -= c;
         e += c;
       }
   }    }
   tetpil=avma;    avma = av; z = cgetg(5,t_PADIC);
   z[4]=lpile(av,tetpil,modii(p1,(GEN)x[3]));    z[1] = evalprecp(r) | evalvalp(e);
   z[3]=licopy((GEN)x[3]);    z[3] = licopy(mod);
   z[1]=evalprecp(r) | evalvalp(e); return z;    z[4] = lmodii(u,(GEN)z[3]);
     icopyifstack(p, z[2]); return z;
 }  }
   
 /* return x + y, where x is t_INT or t_FRAC(N), y t_PADIC */  /* return x + y, where x is t_INT or t_FRAC(N), y t_PADIC */
 static GEN  static GEN
 gaddpex(GEN x, GEN y)  gaddpex(GEN x, GEN y)
 {  {
   long tx,e1,e2,e3,av,tetpil;    gpmem_t av;
   GEN z,p,p1,p2;    long tx,vy,py,d,r,e;
     GEN z,q,p,p1,p2,mod,u;
   
   if (gcmp0(x)) return gcopy(y);    if (gcmp0(x)) return gcopy(y);
   
   av=avma; p=(GEN)y[2]; tx=typ(x);    av = avma; p = (GEN)y[2]; tx = typ(x);
   z=cgetg(5,t_PADIC); z[2]=(long)p;    e = (tx == t_INT)? pvaluation(x,p,&p1)
   e3 = (tx == t_INT)? pvaluation(x,p,&p1)  
                     : pvaluation((GEN)x[1],p,&p1) -                      : pvaluation((GEN)x[1],p,&p1) -
                       pvaluation((GEN)x[2],p,&p2);                        pvaluation((GEN)x[2],p,&p2);
   e1 = valp(y)-e3; e2 = signe(y[4])? e1+precp(y): e1;    vy = valp(y); d = vy - e; py = precp(y); r = d + py;
   if (e2<=0)    if (r <= 0) { avma = av; return gcopy(y); }
     mod = (GEN)y[3];
     u   = (GEN)y[4];
     (void)new_chunk(5 + lgefint(mod) + lgefint(p)*labs(d));
   
     if (d > 0)
   {    {
     z[1] = evalprecp(0) | evalvalp(e3);      q = gpowgs(p,d);
     z[3] = un;      mod = mulii(mod, q);
     z[4] = zero;      u   = mulii(u, q);
       if (tx != t_INT && !is_pm1(p2)) p1 = mulii(p1, mpinvmod(p2,mod));
       u = addii(u, p1);
   }    }
     else if (d < 0)
     {
       q = gpowgs(p,-d);
       if (tx != t_INT && !is_pm1(p2)) p1 = mulii(p1, mpinvmod(p2,mod));
       p1 = mulii(p1, q);
       u = addii(u, p1);
       r = py; e = vy;
     }
   else    else
   {    {
     if (tx != t_INT && !is_pm1(p2)) p1 = gdiv(p1,p2);      long c;
     z[1] = evalprecp(e2) | evalvalp(e3);      if (tx != t_INT && !is_pm1(p2)) p1 = mulii(p1, mpinvmod(p2,mod));
     z[3] = e1? lmul((GEN)y[3], gpuigs(p,e1)): y[3];      u = addii(u, p1);
     z[4] = lmod(p1,(GEN)z[3]);      if (!signe(u) || (c = pvaluation(u,p,&u)) >= r)
       {
         avma = av; return padiczero(p,e+r);
       }
       if (c)
       {
         mod = divii(mod, gpowgs(p,c));
         r -= c;
         e += c;
       }
   }    }
   tetpil=avma; return gerepile(av,tetpil,addpadic(z,y));    avma = av; z = cgetg(5,t_PADIC);
     z[1] = evalprecp(r) | evalvalp(e);
     z[3] = licopy(mod);
     z[4] = lmodii(u,(GEN)z[3]);
     icopyifstack(p, z[2]); return z;
 }  }
   
 static long  static long
 kro_quad(GEN x, GEN y)  kro_quad(GEN x, GEN y)
 {  {
   long k, av=avma;    long k;
     gpmem_t av=avma;
   
   x = subii(sqri((GEN)x[3]), shifti((GEN)x[2],2));    x = subii(sqri((GEN)x[3]), shifti((GEN)x[2],2));
   k = kronecker(x,y); avma=av; return k;    k = kronecker(x,y); avma=av; return k;
Line 337  addfrac(GEN x, GEN y)
Line 355  addfrac(GEN x, GEN y)
   if (is_pm1(delta))    if (is_pm1(delta))
   {    {
     p1 = mulii(x1,y2);      p1 = mulii(x1,y2);
     p2 = mulii(y1,x2); avma = (long)z;      p2 = mulii(y1,x2); avma = (gpmem_t)z;
     z[1] = laddii(p1,p2);      z[1] = laddii(p1,p2);
     z[2] = lmulii(x2,y2); return z;      z[2] = lmulii(x2,y2); return z;
   }    }
   x2 = divii(x2,delta);    x2 = divii(x2,delta);
   y2 = divii(y2,delta);    y2 = divii(y2,delta);
   n = addii(mulii(x1,y2), mulii(y1,x2));    n = addii(mulii(x1,y2), mulii(y1,x2));
   if (!signe(n)) { avma = (long)(z+3); return gzero; }    if (!signe(n)) { avma = (gpmem_t)(z+3); return gzero; }
   d = mulii(x2, y2);    d = mulii(x2, y2);
   p1 = dvmdii(n, delta, &p2);    p1 = dvmdii(n, delta, &p2);
   if (p2 == gzero)    if (p2 == gzero)
   {    {
     if (is_pm1(d)) { avma = (long)(z+3); return icopy(p1); }      if (is_pm1(d)) { avma = (gpmem_t)(z+3); return icopy(p1); }
     avma = (long)z;      avma = (gpmem_t)z;
     z[1] = licopy(p1);      z[1] = licopy(p1);
     z[2] = licopy(d); return z;      z[2] = licopy(d); return z;
   }    }
Line 361  addfrac(GEN x, GEN y)
Line 379  addfrac(GEN x, GEN y)
     n = divii(n, p1);      n = divii(n, p1);
   }    }
   d = mulii(d,delta);    d = mulii(d,delta);
   avma = (long)z;    avma = (gpmem_t)z;
   z[1] = licopy(n);    z[1] = licopy(n);
   z[2] = licopy(d); return z;    z[2] = licopy(d); return z;
 }  }
Line 372  addrfrac(GEN x, GEN y)
Line 390  addrfrac(GEN x, GEN y)
   GEN z = cgetg(3,t_RFRAC);    GEN z = cgetg(3,t_RFRAC);
   GEN x1 = (GEN)x[1], x2 = (GEN)x[2];    GEN x1 = (GEN)x[1], x2 = (GEN)x[2];
   GEN y1 = (GEN)y[1], y2 = (GEN)y[2], p1,p2,n,d,delta;    GEN y1 = (GEN)y[1], y2 = (GEN)y[2], p1,p2,n,d,delta;
   long tetpil;    gpmem_t tetpil;
   
   delta = ggcd(x2,y2);    delta = ggcd(x2,y2);
   if (gcmp1(delta))    if (gcmp1(delta))
Line 380  addrfrac(GEN x, GEN y)
Line 398  addrfrac(GEN x, GEN y)
     p1 = gmul(x1,y2);      p1 = gmul(x1,y2);
     p2 = gmul(y1,x2);      p2 = gmul(y1,x2);
     tetpil = avma; /* numerator is non-zero */      tetpil = avma; /* numerator is non-zero */
     z[1] = lpile((long)z,tetpil, gadd(p1,p2));      z[1] = lpile((gpmem_t)z,tetpil, gadd(p1,p2));
     z[2] = lmul(x2, y2); return z;      z[2] = lmul(x2, y2); return z;
   }    }
   x2 = gdeuc(x2,delta);    x2 = gdeuc(x2,delta);
   y2 = gdeuc(y2,delta);    y2 = gdeuc(y2,delta);
   n = gadd(gmul(x1,y2), gmul(y1,x2));    n = gadd(gmul(x1,y2), gmul(y1,x2));
   if (!signe(n)) return gerepileupto((long)(z+3), n);    if (gcmp0(n)) return gerepileupto((gpmem_t)(z+3), n);
   tetpil = avma; d = gmul(x2, y2);    tetpil = avma; d = gmul(x2, y2);
   p1 = poldivres(n, delta, &p2); /* we want gcd(n,delta) */    p1 = poldivres(n, delta, &p2); /* we want gcd(n,delta) */
   if (!signe(p2))    if (gcmp0(p2))
   {    {
     if (lgef(d) == 3) /* "constant" denominator */      if (lgef(d) == 3) /* "constant" denominator */
     {      {
       d = (GEN)d[2];        d = (GEN)d[2];
            if (gcmp_1(d)) p1 = gneg(p1);             if (gcmp_1(d)) p1 = gneg(p1);
       else if (!gcmp1(d)) p1 = gdiv(p1, d);        else if (!gcmp1(d)) p1 = gdiv(p1, d);
       return gerepileupto((long)(z+3), p1);        return gerepileupto((gpmem_t)(z+3), p1);
     }      }
     z[1]=(long)p1; z[2]=(long)d;      z[1]=(long)p1; z[2]=(long)d;
     gerepilemanyvec((long)z,tetpil,z+1,2); return z;      gerepilemanyvec((gpmem_t)z,tetpil,z+1,2); return z;
   }    }
   p1 = ggcd(delta, p2);    p1 = ggcd(delta, p2);
   if (gcmp1(p1))    if (gcmp1(p1))
Line 414  addrfrac(GEN x, GEN y)
Line 432  addrfrac(GEN x, GEN y)
     z[1] = ldeuc(n,p1);      z[1] = ldeuc(n,p1);
   }    }
   z[2] = lmul(d,delta);    z[2] = lmul(d,delta);
   gerepilemanyvec((long)z,tetpil,z+1,2); return z;    gerepilemanyvec((gpmem_t)z,tetpil,z+1,2); return z;
 }  }
   
 static GEN  static GEN
 addscalrfrac(GEN x, GEN y)  addscalrfrac(GEN x, GEN y)
 {  {
   GEN p1,num, z = cgetg(3,t_RFRAC);    GEN p1,num, z = cgetg(3,t_RFRAC);
   long tetpil, av;    gpmem_t tetpil, av;
   
   p1 = gmul(x,(GEN)y[2]); tetpil = avma;    p1 = gmul(x,(GEN)y[2]); tetpil = avma;
   num = gadd(p1,(GEN)y[1]);    num = gadd(p1,(GEN)y[1]);
Line 435  addscalrfrac(GEN x, GEN y)
Line 453  addscalrfrac(GEN x, GEN y)
       tetpil = avma;        tetpil = avma;
       z[1] = ldiv(num, p1);        z[1] = ldiv(num, p1);
       z[2] = ldiv((GEN)y[2], p1);        z[2] = ldiv((GEN)y[2], p1);
       gerepilemanyvec((long)z,tetpil,z+1,2); return z;        gerepilemanyvec((gpmem_t)z,tetpil,z+1,2); return z;
     }      }
   }    }
   avma = av;    avma = av;
   z[1]=lpile((long)z,tetpil, num);    z[1]=lpile((gpmem_t)z,tetpil, num);
   z[2]=lcopy((GEN)y[2]); return z;    z[2]=lcopy((GEN)y[2]); return z;
 }  }
   
Line 460  to_polmod(GEN x, GEN mod)
Line 478  to_polmod(GEN x, GEN mod)
 GEN  GEN
 gadd(GEN x, GEN y)  gadd(GEN x, GEN y)
 {  {
   long tx = typ(x), ty = typ(y), vx,vy,lx,ly,i,j,k,l,av,tetpil;    long tx = typ(x), ty = typ(y), vx, vy, lx, ly, i, j, k, l;
     gpmem_t av, tetpil;
   GEN z,p1,p2;    GEN z,p1,p2;
   
   if (is_const_t(tx) && is_const_t(ty))    if (is_const_t(tx) && is_const_t(ty))
Line 476  gadd(GEN x, GEN y)
Line 495  gadd(GEN x, GEN y)
   
           case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)y[1];            case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)y[1];
             (void)new_chunk(lgefint(p2)+1); /* HACK */              (void)new_chunk(lgefint(p2)+1); /* HACK */
             p1 = addii(modii(x,p2),(GEN)y[2]); avma = (long)z;              p1 = addii(modii(x,p2),(GEN)y[2]); avma = (gpmem_t)z;
             z[2] = (cmpii(p1,p2) >=0)? lsubii(p1,p2): licopy(p1);              z[2] = (cmpii(p1,p2) >=0)? lsubii(p1,p2): licopy(p1);
             icopyifstack(p2,z[1]); return z;              icopyifstack(p2,z[1]); return z;
   
           case t_FRAC: case t_FRACN: z=cgetg(3,ty);            case t_FRAC: case t_FRACN: z=cgetg(3,ty);
             (void)new_chunk(lgefint(x)+lgefint(y[1])+lgefint(y[2])+1); /*HACK*/              (void)new_chunk(lgefint(x)+lgefint(y[1])+lgefint(y[2])+1); /*HACK*/
             p1 = mulii((GEN)y[2],x); avma = (long)z;              p1 = mulii((GEN)y[2],x); avma = (gpmem_t)z;
             z[1] = laddii((GEN)y[1], p1);              z[1] = laddii((GEN)y[1], p1);
             z[2] = licopy((GEN)y[2]); return z;              z[2] = licopy((GEN)y[2]); return z;
   
Line 529  gadd(GEN x, GEN y)
Line 548  gadd(GEN x, GEN y)
             p1=co8(y,lg(x)+i); tetpil=avma;              p1=co8(y,lg(x)+i); tetpil=avma;
             return gerepile(av,tetpil,gadd(p1,x));              return gerepile(av,tetpil,gadd(p1,x));
   
           case t_INTMOD: case t_PADIC: err(operf,"+",tx,ty);            case t_INTMOD: case t_PADIC: err(operf,"+",x,y);
         }          }
   
       case t_INTMOD:        case t_INTMOD:
Line 554  gadd(GEN x, GEN y)
Line 573  gadd(GEN x, GEN y)
           case t_FRAC: case t_FRACN: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];            case t_FRAC: case t_FRACN: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];
             (void)new_chunk(lgefint(p2)<<2); /* HACK */              (void)new_chunk(lgefint(p2)<<2); /* HACK */
             p1 = mulii((GEN)y[1], mpinvmod((GEN)y[2],p2));              p1 = mulii((GEN)y[1], mpinvmod((GEN)y[2],p2));
             p1 = addii(modii(p1,p2), (GEN)x[2]); avma=(long)z;              p1 = addii(modii(p1,p2), (GEN)x[2]); avma=(gpmem_t)z;
             z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;              z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;
   
           case t_COMPLEX: z=cgetg(3,t_COMPLEX);            case t_COMPLEX: z=cgetg(3,t_COMPLEX);
Line 562  gadd(GEN x, GEN y)
Line 581  gadd(GEN x, GEN y)
             z[2]=lcopy((GEN)y[2]); return z;              z[2]=lcopy((GEN)y[2]); return z;
   
           case t_PADIC:            case t_PADIC:
             l=avma; p1=cgetg(3,t_INTMOD);              av=avma; p1=cgetg(3,t_INTMOD);
             p1[1]=x[1]; p1[2]=lgeti(lgefint(x[1]));              p1[1]=x[1]; p1[2]=lgeti(lgefint(x[1]));
             gaffect(y,p1); tetpil=avma;              gaffect(y,p1); tetpil=avma;
             return gerepile(l,tetpil,gadd(p1,x));              return gerepile(av,tetpil,gadd(p1,x));
   
           case t_QUAD: z=cgetg(4,t_QUAD);            case t_QUAD: z=cgetg(4,t_QUAD);
             copyifstack(y[1], z[1]);              copyifstack(y[1], z[1]);
Line 577  gadd(GEN x, GEN y)
Line 596  gadd(GEN x, GEN y)
         switch (ty)          switch (ty)
         {          {
           case t_FRAC: return addfrac(x,y);            case t_FRAC: return addfrac(x,y);
           case t_FRACN: z=cgetg(3,t_FRACN); l=avma;            case t_FRACN: z=cgetg(3,t_FRACN); av=avma;
             p1=mulii((GEN)x[1],(GEN)y[2]);              p1=mulii((GEN)x[1],(GEN)y[2]);
             p2=mulii((GEN)x[2],(GEN)y[1]);              p2=mulii((GEN)x[2],(GEN)y[1]);
             tetpil=avma; z[1]=lpile(l,tetpil,addii(p1,p2));              tetpil=avma; z[1]=lpile(av,tetpil,addii(p1,p2));
             z[2]=lmulii((GEN)x[2],(GEN)y[2]);              z[2]=lmulii((GEN)x[2],(GEN)y[2]);
             return z;              return z;
   
Line 616  gadd(GEN x, GEN y)
Line 635  gadd(GEN x, GEN y)
             return gerepile(av,tetpil,gadd(p1,y));              return gerepile(av,tetpil,gadd(p1,y));
   
           case t_QUAD:            case t_QUAD:
             lx=precision(x); if (!lx) err(operi,"+",tx,ty);              lx=precision(x); if (!lx) err(operi,"+",x,y);
             if (gcmp0(y)) return gcopy(x);              if (gcmp0(y)) return gcopy(x);
   
             av=avma; i=gexpo(y)-gexpo(x);              av=avma; i=gexpo(y)-gexpo(x);
Line 629  gadd(GEN x, GEN y)
Line 648  gadd(GEN x, GEN y)
         switch(ty)          switch(ty)
         {          {
           case t_PADIC:            case t_PADIC:
             if (!egalii((GEN)x[2],(GEN)y[2])) err(operi,"+",tx,ty);              if (!egalii((GEN)x[2],(GEN)y[2])) err(operi,"+",x,y);
             return addpadic(x,y);              return addpadic(x,y);
   
           case t_QUAD:            case t_QUAD:
Line 646  gadd(GEN x, GEN y)
Line 665  gadd(GEN x, GEN y)
         }          }
   
       case t_QUAD: z=cgetg(4,t_QUAD); k=x[1]; l=y[1];        case t_QUAD: z=cgetg(4,t_QUAD); k=x[1]; l=y[1];
         if (!gegal((GEN)k,(GEN)l)) err(operi,"+",tx,ty);          if (!gegal((GEN)k,(GEN)l)) err(operi,"+",x,y);
         copyifstack(l, z[1]);          copyifstack(l, z[1]);
         z[2]=ladd((GEN)x[2],(GEN)y[2]);          z[2]=ladd((GEN)x[2],(GEN)y[2]);
         z[3]=ladd((GEN)x[3],(GEN)y[3]); return z;          z[3]=ladd((GEN)x[3],(GEN)y[3]); return z;
Line 733  gadd(GEN x, GEN y)
Line 752  gadd(GEN x, GEN y)
         if (isexactzero(x)) return gcopy(y);          if (isexactzero(x)) return gcopy(y);
         if (ty == t_MAT) return gaddmat(x,y);          if (ty == t_MAT) return gaddmat(x,y);
         /* fall through */          /* fall through */
       case t_QFR: case t_QFI: err(operf,"+",tx,ty);        case t_QFR: case t_QFI: err(operf,"+",x,y);
     }      }
     err(operf,"+",tx,ty);      err(operf,"+",x,y);
   }    }
   
   /* here !isscalar(x) && isscalar(y) && (vx=vy || ismatvec(x and y)) */    /* here !isscalar(x) && isscalar(y) && (vx=vy || ismatvec(x and y)) */
Line 751  gadd(GEN x, GEN y)
Line 770  gadd(GEN x, GEN y)
           for (i=2; i<ly; i++) z[i]=ladd((GEN)x[i],(GEN)y[i]);            for (i=2; i<ly; i++) z[i]=ladd((GEN)x[i],(GEN)y[i]);
           for (   ; i<lx; i++) z[i]=lcopy((GEN)x[i]);            for (   ; i<lx; i++) z[i]=lcopy((GEN)x[i]);
           (void)normalizepol_i(z, lx);            (void)normalizepol_i(z, lx);
           if (lgef(z) == 2) { avma = (long)(z + lx); z = zeropol(vx); }            if (lgef(z) == 2) { avma = (gpmem_t)(z + lx); z = zeropol(vx); }
           return z;            return z;
   
         case t_SER:          case t_SER:
Line 769  gadd(GEN x, GEN y)
Line 788  gadd(GEN x, GEN y)
           z[1]=lpile(av,tetpil, gadd(p1,(GEN)y[1]));            z[1]=lpile(av,tetpil, gadd(p1,(GEN)y[1]));
           z[2]=lcopy((GEN)y[2]); return z;            z[2]=lcopy((GEN)y[2]); return z;
   
         default: err(operf,"+",tx,ty);          default: err(operf,"+",x,y);
       }        }
   
     case t_SER:      case t_SER:
Line 827  gadd(GEN x, GEN y)
Line 846  gadd(GEN x, GEN y)
           p1 = gdiv((GEN)y[1], p1); tetpil=avma;            p1 = gdiv((GEN)y[1], p1); tetpil=avma;
           return gerepile(av,tetpil,gadd(p1,x));            return gerepile(av,tetpil,gadd(p1,x));
   
         default: err(operf,"+",tx,ty);          default: err(operf,"+",x,y);
       }        }
   
     case t_RFRAC:      case t_RFRAC:
       if (!is_rfrac_t(ty)) err(operi,"+",tx,ty);        if (!is_rfrac_t(ty)) err(operi,"+",x,y);
       return addrfrac(x,y);        return addrfrac(x,y);
     case t_RFRACN:      case t_RFRACN:
       if (!is_rfrac_t(ty)) err(operi,"+",tx,ty);        if (!is_rfrac_t(ty)) err(operi,"+",x,y);
       z=cgetg(3,t_RFRACN); av=avma;        z=cgetg(3,t_RFRACN); av=avma;
       p1=gmul((GEN)x[1],(GEN)y[2]);        p1=gmul((GEN)x[1],(GEN)y[2]);
       p2=gmul((GEN)x[2],(GEN)y[1]); tetpil=avma;        p2=gmul((GEN)x[2],(GEN)y[1]); tetpil=avma;
Line 843  gadd(GEN x, GEN y)
Line 862  gadd(GEN x, GEN y)
   
     case t_VEC: case t_COL: case t_MAT:      case t_VEC: case t_COL: case t_MAT:
       lx = lg(x); ly = lg(y);        lx = lg(x); ly = lg(y);
       if (lx!=ly || tx!=ty) err(operi,"+",tx,ty);        if (lx!=ly || tx!=ty) err(operi,"+",x,y);
       z=cgetg(ly,ty);        z=cgetg(ly,ty);
       for (i=1; i<ly; i++)        for (i=1; i<ly; i++)
         z[i]=ladd((GEN)x[i],(GEN)y[i]);          z[i]=ladd((GEN)x[i],(GEN)y[i]);
       return z;        return z;
   }    }
   err(operf,"+",tx,ty);    err(operf,"+",x,y);
   return NULL; /* not reached */    return NULL; /* not reached */
 }  }
   
Line 861  gadd(GEN x, GEN y)
Line 880  gadd(GEN x, GEN y)
 GEN  GEN
 fix_rfrac_if_pol(GEN x, GEN y)  fix_rfrac_if_pol(GEN x, GEN y)
 {  {
   if (gcmp1(y)) return x;    gpmem_t av = avma;
     y = simplify(y);
     if (gcmp1(y)) { avma = av; return x; }
   if (typ(y) != t_POL)    if (typ(y) != t_POL)
   {    {
     if (typ(x) != t_POL || gvar2(y) > varn(x))      if (typ(x) != t_POL || gvar2(y) > varn(x))
       return gdiv(x,y);        return gdiv(x,y);
   }    }
   else if (varn(y) > varn(x)) return gdiv(x,y);    else if (varn(y) > varn(x)) return gdiv(x,y);
   return NULL;    avma = av; return NULL;
 }  }
   
 static long  static long
Line 895  GEN
Line 916  GEN
 mulscalrfrac(GEN x, GEN y)  mulscalrfrac(GEN x, GEN y)
 {  {
   GEN p1,z,y1,y2,cx,cy1,cy2;    GEN p1,z,y1,y2,cx,cy1,cy2;
   long tetpil,tx;    long tx;
     gpmem_t tetpil;
   
   if (gcmp0(x)) return gcopy(x);    if (gcmp0(x)) return gcopy(x);
   
Line 926  mulscalrfrac(GEN x, GEN y)
Line 948  mulscalrfrac(GEN x, GEN y)
   z[2] = lmul(y2, cy2);    z[2] = lmul(y2, cy2);
   z[1] = lmul(y1, cy1);    z[1] = lmul(y1, cy1);
   p1 = fix_rfrac_if_pol((GEN)z[1],(GEN)z[2]);    p1 = fix_rfrac_if_pol((GEN)z[1],(GEN)z[2]);
   if (p1) return gerepileupto((long)(z+3), p1);    if (p1) return gerepileupto((gpmem_t)(z+3), p1);
   gerepilemanyvec((long)z,tetpil,z+1,2); return z;    gerepilemanyvec((gpmem_t)z,tetpil,z+1,2); return z;
 }  }
   
 static GEN  static GEN
Line 936  mulrfrac(GEN x, GEN y)
Line 958  mulrfrac(GEN x, GEN y)
   GEN z = cgetg(3,t_RFRAC), p1;    GEN z = cgetg(3,t_RFRAC), p1;
   GEN x1 = (GEN)x[1], x2 = (GEN)x[2];    GEN x1 = (GEN)x[1], x2 = (GEN)x[2];
   GEN y1 = (GEN)y[1], y2 = (GEN)y[2];    GEN y1 = (GEN)y[1], y2 = (GEN)y[2];
   long tetpil;    gpmem_t tetpil;
   
   p1 = ggcd(x1, y2); if (!gcmp1(p1)) { x1 = gdiv(x1,p1); y2 = gdiv(y2,p1); }    p1 = ggcd(x1, y2); if (!gcmp1(p1)) { x1 = gdiv(x1,p1); y2 = gdiv(y2,p1); }
   p1 = ggcd(x2, y1); if (!gcmp1(p1)) { x2 = gdiv(x2,p1); y1 = gdiv(y1,p1); }    p1 = ggcd(x2, y1); if (!gcmp1(p1)) { x2 = gdiv(x2,p1); y1 = gdiv(y1,p1); }
Line 944  mulrfrac(GEN x, GEN y)
Line 966  mulrfrac(GEN x, GEN y)
   z[2] = lmul(x2,y2);    z[2] = lmul(x2,y2);
   z[1] = lmul(x1,y1);    z[1] = lmul(x1,y1);
   p1 = fix_rfrac_if_pol((GEN)z[1],(GEN)z[2]);    p1 = fix_rfrac_if_pol((GEN)z[1],(GEN)z[2]);
   if (p1) return gerepileupto((long)(z+3), p1);    if (p1) return gerepileupto((gpmem_t)(z+3), p1);
   gerepilemanyvec((long)z,tetpil,z+1,2); return z;    gerepilemanyvec((gpmem_t)z,tetpil,z+1,2); return z;
 }  }
   
 GEN  GEN
Line 1040  gmul_err(GEN x, GEN y, long tx, long ty)
Line 1062  gmul_err(GEN x, GEN y, long tx, long ty)
       case t_QFR: return compreal(x,y);        case t_QFR: return compreal(x,y);
       case t_VECSMALL:        case t_VECSMALL:
         l = lg(x); z = cgetg(l, t_VECSMALL);          l = lg(x); z = cgetg(l, t_VECSMALL);
         if (l != lg(y)) err(operf,"*",tx,ty);          if (l != lg(y)) err(operf,"*",x,y);
         for (i=1; i<l; i++) z[i]=x[y[i]];          for (i=1; i<l; i++)
           {
             long yi=y[i];
             if (yi<1 || yi>=l) err(operf,"*",x,y);
             z[i]=x[y[i]];
           }
         return z;          return z;
     }      }
   err(operf,"*",tx,ty);    err(operf,"*",x,y);
   return NULL; /* not reached */    return NULL; /* not reached */
 }  }
   
 GEN  GEN
 gmul(GEN x, GEN y)  gmul(GEN x, GEN y)
 {  {
   long tx,ty,lx,ly,vx,vy,i,j,k,l,av,tetpil;    long tx, ty, lx, ly, vx, vy, i, j, k, l;
     gpmem_t av, tetpil;
   GEN z,p1,p2,p3,p4;    GEN z,p1,p2,p3,p4;
   
   if (x == y) return gsqr(x);    if (x == y) return gsqr(x);
Line 1071  gmul(GEN x, GEN y)
Line 1099  gmul(GEN x, GEN y)
   
           case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)y[1];            case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)y[1];
             (void)new_chunk(lgefint(p2)<<2); /* HACK */              (void)new_chunk(lgefint(p2)<<2); /* HACK */
             p1=mulii(modii(x,p2),(GEN)y[2]); avma=(long)z;              p1=mulii(modii(x,p2),(GEN)y[2]); avma=(gpmem_t)z;
             z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;              z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;
   
           case t_FRAC:            case t_FRAC:
Line 1080  gmul(GEN x, GEN y)
Line 1108  gmul(GEN x, GEN y)
             p1 = mppgcd(x,(GEN)y[2]);              p1 = mppgcd(x,(GEN)y[2]);
             if (is_pm1(p1))              if (is_pm1(p1))
             {              {
               avma = (long)z;                avma = (gpmem_t)z;
               z[2] = licopy((GEN)y[2]);                z[2] = licopy((GEN)y[2]);
               z[1] = lmulii((GEN)y[1], x);                z[1] = lmulii((GEN)y[1], x);
             }              }
Line 1103  gmul(GEN x, GEN y)
Line 1131  gmul(GEN x, GEN y)
   
           case t_PADIC:            case t_PADIC:
             if (!signe(x)) return gzero;              if (!signe(x)) return gzero;
             l=avma; p1=cgetp(y); gaffect(x,p1); tetpil=avma;              av=avma; p1=cgetp(y); gaffect(x,p1); tetpil=avma;
             return gerepile(l,tetpil,gmul(p1,y));              return gerepile(av,tetpil,gmul(p1,y));
   
           case t_QUAD: z=cgetg(4,t_QUAD);            case t_QUAD: z=cgetg(4,t_QUAD);
             copyifstack(y[1], z[1]);              copyifstack(y[1], z[1]);
Line 1118  gmul(GEN x, GEN y)
Line 1146  gmul(GEN x, GEN y)
           case t_REAL: return mulrr(x,y);            case t_REAL: return mulrr(x,y);
   
           case t_FRAC: case t_FRACN:            case t_FRAC: case t_FRACN:
             l=avma; p1=cgetr(lg(x)); tetpil=avma; gaffect(y,p1);              av=avma; p1=mulri(x,(GEN)y[1]); tetpil=avma;
             p2=mulrr(p1,x); return gerepile(l,tetpil,p2);              return gerepile(av, tetpil, divri(p1, (GEN)y[2]));
   
           case t_COMPLEX: z=cgetg(3,t_COMPLEX);            case t_COMPLEX: z=cgetg(3,t_COMPLEX);
             z[1]=lmul(x,(GEN)y[1]);              z[1]=lmul(x,(GEN)y[1]);
             z[2]=lmul(x,(GEN)y[2]); return z;              z[2]=lmul(x,(GEN)y[2]); return z;
   
           case t_QUAD:            case t_QUAD:
             l=avma; p1=co8(y,lg(x)); tetpil=avma;              av=avma; p1=co8(y,lg(x)); tetpil=avma;
             return gerepile(l,tetpil,gmul(p1,x));              return gerepile(av,tetpil,gmul(p1,x));
   
           default: err(operf,"*",tx,ty);            default: err(operf,"*",x,y);
         }          }
   
       case t_INTMOD:        case t_INTMOD:
Line 1155  gmul(GEN x, GEN y)
Line 1183  gmul(GEN x, GEN y)
           case t_FRAC: case t_FRACN: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];            case t_FRAC: case t_FRACN: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];
             (void)new_chunk(lgefint(p2)<<2); /* HACK */              (void)new_chunk(lgefint(p2)<<2); /* HACK */
             p1 = mulii((GEN)y[1], mpinvmod((GEN)y[2],p2));              p1 = mulii((GEN)y[1], mpinvmod((GEN)y[2],p2));
             p1 = mulii(modii(p1,p2),(GEN)x[2]); avma=(long)z;              p1 = mulii(modii(p1,p2),(GEN)x[2]); avma=(gpmem_t)z;
             z[2] = lmodii(p1,p2); icopyifstack(p2,z[1]); return z;              z[2] = lmodii(p1,p2); icopyifstack(p2,z[1]); return z;
   
           case t_COMPLEX: z=cgetg(3,t_COMPLEX);            case t_COMPLEX: z=cgetg(3,t_COMPLEX);
Line 1163  gmul(GEN x, GEN y)
Line 1191  gmul(GEN x, GEN y)
             z[2]=lmul(x,(GEN)y[2]); return z;              z[2]=lmul(x,(GEN)y[2]); return z;
   
           case t_PADIC:            case t_PADIC:
             l=avma; p1=cgetg(3,t_INTMOD);              av=avma; p1=cgetg(3,t_INTMOD);
             p1[1]=x[1]; p1[2]=lgeti(lg(x[1]));              p1[1]=x[1]; p1[2]=lgeti(lg(x[1]));
             gaffect(y,p1); tetpil=avma;              gaffect(y,p1); tetpil=avma;
             return gerepile(l,tetpil,gmul(x,p1));              return gerepile(av,tetpil,gmul(x,p1));
   
           case t_QUAD: z=cgetg(4,t_QUAD);            case t_QUAD: z=cgetg(4,t_QUAD);
             copyifstack(y[1], z[1]);              copyifstack(y[1], z[1]);
Line 1201  gmul(GEN x, GEN y)
Line 1229  gmul(GEN x, GEN y)
   
           case t_PADIC:            case t_PADIC:
             if (!signe(x[1])) return gzero;              if (!signe(x[1])) return gzero;
             l=avma; p1=cgetp(y); gaffect(x,p1); tetpil=avma;              av=avma; p1=cgetp(y); gaffect(x,p1); tetpil=avma;
             return gerepile(l,tetpil,gmul(p1,y));              return gerepile(av,tetpil,gmul(p1,y));
   
           case t_QUAD: z=cgetg(4,t_QUAD);            case t_QUAD: z=cgetg(4,t_QUAD);
             copyifstack(y[1], z[1]);              copyifstack(y[1], z[1]);
Line 1213  gmul(GEN x, GEN y)
Line 1241  gmul(GEN x, GEN y)
       case t_COMPLEX:        case t_COMPLEX:
         switch(ty)          switch(ty)
         {          {
           case t_COMPLEX: z=cgetg(3,t_COMPLEX); l=avma;            case t_COMPLEX: z=cgetg(3,t_COMPLEX); av=avma;
             p1=gmul((GEN)x[1],(GEN)y[1]);              p1=gmul((GEN)x[1],(GEN)y[1]);
             p2=gmul((GEN)x[2],(GEN)y[2]);              p2=gmul((GEN)x[2],(GEN)y[2]);
             x=gadd((GEN)x[1],(GEN)x[2]);              x=gadd((GEN)x[1],(GEN)x[2]);
             y=gadd((GEN)y[1],(GEN)y[2]);              y=gadd((GEN)y[1],(GEN)y[2]);
             y=gmul(x,y); x=gadd(p1,p2);              y=gmul(x,y); x=gadd(p1,p2);
             tetpil=avma; z[1]=lsub(p1,p2); z[2]=lsub(y,x);              tetpil=avma; z[1]=lsub(p1,p2); z[2]=lsub(y,x);
             gerepilemanyvec(l,tetpil,z+1,2); return z;              gerepilemanyvec(av,tetpil,z+1,2); return z;
   
           case t_PADIC:            case t_PADIC:
             if (krosg(-1,(GEN)y[2]))              if (krosg(-1,(GEN)y[2]))
Line 1239  gmul(GEN x, GEN y)
Line 1267  gmul(GEN x, GEN y)
             return gerepile(av,tetpil,gmul(p1,y));              return gerepile(av,tetpil,gmul(p1,y));
   
           case t_QUAD:            case t_QUAD:
             lx=precision(x); if (!lx) err(operi,"*",tx,ty);              lx=precision(x); if (!lx) err(operi,"*",x,y);
             l=avma; p1=co8(y,lx); tetpil=avma;              av=avma; p1=co8(y,lx); tetpil=avma;
             return gerepile(l,tetpil,gmul(p1,x));              return gerepile(av,tetpil,gmul(p1,x));
         }          }
   
       case t_PADIC:        case t_PADIC:
         switch(ty)          switch(ty)
         {          {
           case t_PADIC:            case t_PADIC:
             if (!egalii((GEN)x[2],(GEN)y[2])) err(operi,"*",tx,ty);              if (!egalii((GEN)x[2],(GEN)y[2])) err(operi,"*",x,y);
             l = valp(x)+valp(y);              l = valp(x)+valp(y);
             if (!signe(x[4])) { z=gcopy(x); setvalp(z,l); return z; }              if (!signe(x[4])) { z=gcopy(x); setvalp(z,l); return z; }
             if (!signe(y[4])) { z=gcopy(y); setvalp(z,l); return z; }              if (!signe(y[4])) { z=gcopy(y); setvalp(z,l); return z; }
Line 1273  gmul(GEN x, GEN y)
Line 1301  gmul(GEN x, GEN y)
   
       case t_QUAD: z=cgetg(4,t_QUAD);        case t_QUAD: z=cgetg(4,t_QUAD);
         p1=(GEN)x[1]; p2=(GEN)y[1];          p1=(GEN)x[1]; p2=(GEN)y[1];
         if (!gegal(p1,p2)) err(operi,"*",tx,ty);          if (!gegal(p1,p2)) err(operi,"*",x,y);
   
         copyifstack(p2, z[1]); l=avma;          copyifstack(p2, z[1]); av=avma;
         p2=gmul((GEN)x[2],(GEN)y[2]);          p2=gmul((GEN)x[2],(GEN)y[2]);
         p3=gmul((GEN)x[3],(GEN)y[3]);          p3=gmul((GEN)x[3],(GEN)y[3]);
         p4=gmul(gneg_i((GEN)p1[2]),p3);          p4=gmul(gneg_i((GEN)p1[2]),p3);
Line 1283  gmul(GEN x, GEN y)
Line 1311  gmul(GEN x, GEN y)
         if (gcmp0((GEN)p1[3]))          if (gcmp0((GEN)p1[3]))
         {          {
           tetpil=avma;            tetpil=avma;
           z[2]=lpile(l,tetpil,gadd(p4,p2)); l=avma;            z[2]=lpile(av,tetpil,gadd(p4,p2)); av=avma;
           p2=gmul((GEN)x[2],(GEN)y[3]);            p2=gmul((GEN)x[2],(GEN)y[3]);
           p3=gmul((GEN)x[3],(GEN)y[2]); tetpil=avma;            p3=gmul((GEN)x[3],(GEN)y[2]); tetpil=avma;
           z[3]=lpile(l,tetpil,gadd(p2,p3)); return z;            z[3]=lpile(av,tetpil,gadd(p2,p3)); return z;
         }          }
   
         p1 = gadd(gmul((GEN)x[2],(GEN)y[3]), gmul((GEN)x[3],(GEN)y[2]));          p1 = gadd(gmul((GEN)x[2],(GEN)y[3]), gmul((GEN)x[3],(GEN)y[2]));
         tetpil=avma;          tetpil=avma;
         z[2]=ladd(p2,p4);          z[2]=ladd(p2,p4);
         z[3]=ladd(p1,p3);          z[3]=ladd(p1,p3);
         gerepilemanyvec(l,tetpil,z+2,2); return z;          gerepilemanyvec(av,tetpil,z+2,2); return z;
     }      }
     err(bugparier,"multiplication");      err(bugparier,"multiplication");
   }    }
Line 1327  gmul(GEN x, GEN y)
Line 1355  gmul(GEN x, GEN y)
         switch(ty)          switch(ty)
         {          {
           case t_COL:            case t_COL:
             if (lx!=ly) err(operi,"*",tx,ty);              if (lx!=ly) err(operi,"*",x,y);
             z=gzero; l=avma;              z=gzero; av=avma;
             for (i=1; i<lx; i++)              for (i=1; i<lx; i++)
             {              {
               p1=gmul((GEN)x[i],(GEN)y[i]);                p1=gmul((GEN)x[i],(GEN)y[i]);
               z=gadd(z,p1);                z=gadd(z,p1);
             }              }
             return gerepileupto(l,z);              return gerepileupto(av,z);
   
           case t_MAT:            case t_MAT:
             if (ly==1) return cgetg(1,t_VEC);              if (ly==1) return cgetg(1,t_VEC);
             l=lg(y[1]); if (lx!=l) err(operi,"*",tx,ty);              l=lg(y[1]); if (lx!=l) err(operi,"*",x,y);
   
             z=cgetg(ly,tx);              z=cgetg(ly,tx);
             for (i=1; i<ly; i++)              for (i=1; i<ly; i++)
Line 1353  gmul(GEN x, GEN y)
Line 1381  gmul(GEN x, GEN y)
             }              }
             return z;              return z;
   
           default: err(operf,"*",tx,ty);            default: err(operf,"*",x,y);
         }          }
   
       case t_COL:        case t_COL:
Line 1364  gmul(GEN x, GEN y)
Line 1392  gmul(GEN x, GEN y)
             for (i=1; i<ly; i++)              for (i=1; i<ly; i++)
             {              {
               p1 = gmul((GEN)y[i],x);                p1 = gmul((GEN)y[i],x);
               if (typ(p1) != t_COL) err(operi,"*",tx,ty);                if (typ(p1) != t_COL) err(operi,"*",x,y);
               z[i]=(long)p1;                z[i]=(long)p1;
             }              }
             return z;              return z;
   
           case t_MAT:            case t_MAT:
             if (ly!=1 && lg(y[1])!=2) err(operi,"*",tx,ty);              if (ly!=1 && lg(y[1])!=2) err(operi,"*",x,y);
   
             z=cgetg(ly,t_MAT);              z=cgetg(ly,t_MAT);
             for (i=1; i<ly; i++) z[i]=lmul(gcoeff(y,1,i),x);              for (i=1; i<ly; i++) z[i]=lmul(gcoeff(y,1,i),x);
             return z;              return z;
   
           default: err(operf,"*",tx,ty);            default: err(operf,"*",x,y);
         }          }
   
       case t_MAT:        case t_MAT:
         switch(ty)          switch(ty)
         {          {
           case t_VEC:            case t_VEC:
             if (lx!=2) err(operi,"*",tx,ty);              if (lx!=2) err(operi,"*",x,y);
             z=cgetg(ly,t_MAT);              z=cgetg(ly,t_MAT);
             for (i=1; i<ly; i++) z[i]=lmul((GEN)y[i],(GEN)x[1]);              for (i=1; i<ly; i++) z[i]=lmul((GEN)y[i],(GEN)x[1]);
             return z;              return z;
   
           case t_COL:            case t_COL:
             if (lx!=ly) err(operi,"*",tx,ty);              if (lx!=ly) err(operi,"*",x,y);
             if (lx==1) return gcopy(y);              if (lx==1) return gcopy(y);
   
             lx=lg(x[1]); z=cgetg(lx,t_COL);              lx=lg(x[1]); z=cgetg(lx,t_COL);
             for (i=1; i<lx; i++)              for (i=1; i<lx; i++)
             {              {
               p1=gzero; l=avma;                p1=gzero; av=avma;
               for (j=1; j<ly; j++)                for (j=1; j<ly; j++)
               {                {
                 p2=gmul(gcoeff(x,i,j),(GEN)y[j]);                  p2=gmul(gcoeff(x,i,j),(GEN)y[j]);
                 p1=gadd(p1,p2);                  p1=gadd(p1,p2);
               }                }
               z[i]=lpileupto(l,p1);                z[i]=lpileupto(av,p1);
             }              }
             return z;              return z;
   
           case t_MAT:            case t_MAT:
             if (ly==1) return cgetg(ly,t_MAT);              if (ly==1) return cgetg(ly,t_MAT);
             if (lx != lg(y[1])) err(operi,"*",tx,ty);              if (lx != lg(y[1])) err(operi,"*",x,y);
             z=cgetg(ly,t_MAT);              z=cgetg(ly,t_MAT);
             if (lx==1)              if (lx==1)
             {              {
Line 1440  gmul(GEN x, GEN y)
Line 1468  gmul(GEN x, GEN y)
   {    {
     if (isexactzero(x))      if (isexactzero(x))
     {      {
       if (vy == BIGINT) err(operf,"*",tx,ty);        if (vy == BIGINT) err(operf,"*",x,y);
       return zeropol(vy);        return zeropol(vy);
     }      }
     if (tx == t_INT && is_pm1(x))      if (tx == t_INT && is_pm1(x))
Line 1468  gmul(GEN x, GEN y)
Line 1496  gmul(GEN x, GEN y)
       case t_RFRACN: av=avma; z=cgetg(3,t_RFRACN);        case t_RFRACN: av=avma; z=cgetg(3,t_RFRACN);
         z[1]=lmul(x,(GEN)y[1]);          z[1]=lmul(x,(GEN)y[1]);
         z[2]=lcopy((GEN)y[2]); return z;          z[2]=lcopy((GEN)y[2]); return z;
       default: err(operf,"*",tx,ty);        default: err(operf,"*",x,y);
     }      }
   }    }
   
Line 1490  gmul(GEN x, GEN y)
Line 1518  gmul(GEN x, GEN y)
  */   */
           GEN a = x,b = y            GEN a = x,b = y
           GEN p = NULL, pol = NULL;            GEN p = NULL, pol = NULL;
           long av = avma;            gpmem_t av = avma;
           if (ff_poltype(&x,&p,&pol) && ff_poltype(&y,&p,&pol))            if (ff_poltype(&x,&p,&pol) && ff_poltype(&y,&p,&pol))
           {            {
             /* fprintferr("HUM"); */              /* fprintferr("HUM"); */
Line 1522  gmul(GEN x, GEN y)
Line 1550  gmul(GEN x, GEN y)
           z[1]=lmul(x,(GEN)y[1]);            z[1]=lmul(x,(GEN)y[1]);
           z[2]=lcopy((GEN)y[2]); return z;            z[2]=lcopy((GEN)y[2]); return z;
   
         default: err(operf,"*",tx,ty);          default: err(operf,"*",x,y);
       }        }
   
     case t_SER:      case t_SER:
       switch (ty)        switch (ty)
       {        {
         case t_SER:          case t_SER:
           {
             long mix, miy;
           if (gcmp0(x) || gcmp0(y)) return zeroser(vx, valp(x)+valp(y));            if (gcmp0(x) || gcmp0(y)) return zeroser(vx, valp(x)+valp(y));
           lx=lg(x); ly=lg(y);            lx=lg(x); ly=lg(y);
           if (lx>ly) { k=ly; ly=lx; lx=k; p1=y; y=x; x=p1; }            if (lx>ly) { k=ly; ly=lx; lx=k; p1=y; y=x; x=p1; }
Line 1536  gmul(GEN x, GEN y)
Line 1566  gmul(GEN x, GEN y)
           z[1] = evalvalp(valp(x)+valp(y)) | evalvarn(vx) | evalsigne(1);            z[1] = evalvalp(valp(x)+valp(y)) | evalvarn(vx) | evalsigne(1);
           x += 2; y += 2; z += 2; lx -= 3;            x += 2; y += 2; z += 2; lx -= 3;
           p2 = (GEN)gpmalloc((lx+1)*sizeof(long));            p2 = (GEN)gpmalloc((lx+1)*sizeof(long));
             p3 = (GEN)gpmalloc((ly+1)*sizeof(long));
             mix = miy = 0;
           for (i=0; i<=lx; i++)            for (i=0; i<=lx; i++)
           {            {
             p2[i] = !isexactzero((GEN)y[i]);              p2[i] = !isexactzero((GEN)y[i]); if (p2[i]) miy = i;
               p3[i] = !isexactzero((GEN)x[i]); if (p3[i]) mix = i;
             p1 = gzero; av = avma;              p1 = gzero; av = avma;
             for (j=0; j<=i; j++)              for (j=i-mix; j<=min(i,miy); j++)
               if (p2[j])                if (p2[j]) p1 = gadd(p1, gmul((GEN)y[j],(GEN)x[i-j]));
                 p1 = gadd(p1, gmul((GEN)y[j],(GEN)x[i-j]));  
             z[i] = lpileupto(av,p1);              z[i] = lpileupto(av,p1);
           }            }
           z -= 2; /* back to normalcy */            z -= 2; /* back to normalcy */
           free(p2); return normalize(z);            free(p2);
             free(p3); return normalize(z);
           }
   
         case t_RFRAC: case t_RFRACN:          case t_RFRAC: case t_RFRACN:
           if (gcmp0(y)) return zeropol(vx);            if (gcmp0(y)) return zeropol(vx);
           if (gcmp0(x)) return zeroser(vx, valp(x)+gval(y,vx));            if (gcmp0(x)) return zeroser(vx, valp(x)+gval(y,vx));
           l=avma; p1=gmul((GEN)y[1],x); tetpil=avma;            av=avma; p1=gmul((GEN)y[1],x); tetpil=avma;
           return gerepile(l,tetpil,gdiv(p1,(GEN)y[2]));            return gerepile(av,tetpil,gdiv(p1,(GEN)y[2]));
   
         default: err(operf,"*",tx,ty);          default: err(operf,"*",x,y);
       }        }
   
     /* (tx,ty) == t_RFRAC <==> ty == t_RFRAC */      /* (tx,ty) == t_RFRAC <==> ty == t_RFRAC */
     case t_RFRAC: return mulrfrac(x,y);      case t_RFRAC: return mulrfrac(x,y);
     case t_RFRACN:      case t_RFRACN:
       if (!is_rfrac_t(ty)) err(operf,"*",tx,ty);        if (!is_rfrac_t(ty)) err(operf,"*",x,y);
       av=avma; z=cgetg(3,ty);        av=avma; z=cgetg(3,ty);
       z[1]=lmul((GEN)x[1],(GEN)y[1]);        z[1]=lmul((GEN)x[1],(GEN)y[1]);
       z[2]=lmul((GEN)x[2],(GEN)y[2]); return z;        z[2]=lmul((GEN)x[2],(GEN)y[2]); return z;
Line 1571  gmul(GEN x, GEN y)
Line 1605  gmul(GEN x, GEN y)
 GEN  GEN
 gsqr(GEN x)  gsqr(GEN x)
 {  {
   long tx=typ(x),lx,i,j,k,l,av,tetpil;    long tx=typ(x), lx, i, j, k, l;
     gpmem_t av, tetpil;
   GEN z,p1,p2,p3,p4;    GEN z,p1,p2,p3,p4;
   
   if (is_scalar_t(tx))    if (is_scalar_t(tx))
Line 1585  gsqr(GEN x)
Line 1620  gsqr(GEN x)
   
       case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];        case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];
         (void)new_chunk(lgefint(p2)<<2); /* HACK */          (void)new_chunk(lgefint(p2)<<2); /* HACK */
         p1=sqri((GEN)x[2]); avma=(long)z;          p1=sqri((GEN)x[2]); avma=(gpmem_t)z;
         z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;          z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;
   
       case t_FRAC: case t_FRACN:        case t_FRAC: case t_FRACN:
Line 1595  gsqr(GEN x)
Line 1630  gsqr(GEN x)
         return z;          return z;
   
       case t_COMPLEX:        case t_COMPLEX:
         z=cgetg(lg(x),tx); l=avma;          z=cgetg(3,t_COMPLEX); av=avma;
         p1=gadd((GEN)x[1],(GEN)x[2]);          p1=gadd((GEN)x[1],(GEN)x[2]);
         p2=gadd((GEN)x[1],gneg_i((GEN)x[2]));          p2=gadd((GEN)x[1],gneg_i((GEN)x[2]));
         p3=gmul((GEN)x[1],(GEN)x[2]);          p3=gmul((GEN)x[1],(GEN)x[2]);
         tetpil=avma;          tetpil=avma;
         z[1]=lmul(p1,p2); z[2]=lshift(p3,1);          z[1]=lmul(p1,p2); z[2]=lshift(p3,1);
         gerepilemanyvec(l,tetpil,z+1,2);          gerepilemanyvec(av,tetpil,z+1,2);
         return z;          return z;
   
       case t_PADIC:        case t_PADIC:
Line 1611  gsqr(GEN x)
Line 1646  gsqr(GEN x)
         z[1] = evalprecp(precp(x)+i) | evalvalp(2*valp(x));          z[1] = evalprecp(precp(x)+i) | evalvalp(2*valp(x));
         icopyifstack(x[2], z[2]);          icopyifstack(x[2], z[2]);
         z[3] = lshifti((GEN)x[3], i); av = avma;          z[3] = lshifti((GEN)x[3], i); av = avma;
         z[4] = (long)gerepileuptoint(av, modii(sqri((GEN)x[4]), (GEN)z[3]));          z[4] = lpileuptoint(av, modii(sqri((GEN)x[4]), (GEN)z[3]));
         return z;          return z;
   
       case t_QUAD:        case t_QUAD:
         p1=(GEN)x[1]; z=cgetg(lg(x),tx); l=avma;          p1=(GEN)x[1]; z=cgetg(4,t_QUAD); av=avma;
         p2=gsqr((GEN)x[2]); p3=gsqr((GEN)x[3]);          p2=gsqr((GEN)x[2]); p3=gsqr((GEN)x[3]);
         p4=gmul(gneg_i((GEN)p1[2]),p3);          p4=gmul(gneg_i((GEN)p1[2]),p3);
   
         if (gcmp0((GEN)p1[3]))          if (gcmp0((GEN)p1[3]))
         {          {
           tetpil=avma;            tetpil=avma;
           z[2]=lpile(l,tetpil,gadd(p4,p2));            z[2]=lpile(av,tetpil,gadd(p4,p2));
           l=avma; p2=gmul((GEN)x[2],(GEN)x[3]); tetpil=avma;            av=avma; p2=gmul((GEN)x[2],(GEN)x[3]); tetpil=avma;
           z[3]=lpile(l,tetpil,gmul2n(p2,1));            z[3]=lpile(av,tetpil,gmul2n(p2,1));
           copyifstack(p1,z[1]); return z;            copyifstack(p1,z[1]); return z;
         }          }
   
         p1=gmul((GEN)x[2],(GEN)x[3]);          p1=gmul((GEN)x[2],(GEN)x[3]);
         p1=gmul2n(p1,1); tetpil=avma;          p1=gmul2n(p1,1); tetpil=avma;
         z[2]=ladd(p2,p4); z[3]=ladd(p1,p3);          z[2]=ladd(p2,p4); z[3]=ladd(p1,p3);
         gerepilemanyvec(l,tetpil,z+2,2);          gerepilemanyvec(av,tetpil,z+2,2);
         copyifstack(x[1],z[1]); return z;          copyifstack(x[1],z[1]); return z;
   
       case t_POLMOD:        case t_POLMOD:
         z=cgetg(lg(x),tx); copyifstack(x[1],z[1]);          z=cgetg(3,t_POLMOD); copyifstack(x[1],z[1]);
         l=avma; p1=gsqr((GEN)x[2]); tetpil=avma;          av=avma; p1=gsqr((GEN)x[2]); tetpil=avma;
         z[2]=lpile(l,tetpil, gres(p1,(GEN)z[1]));          z[2]=lpile(av,tetpil, gres(p1,(GEN)z[1]));
         return z;          return z;
     }      }
   
Line 1664  gsqr(GEN x)
Line 1699  gsqr(GEN x)
     }      }
   
     case t_SER:      case t_SER:
       {
         long mi;
       if (gcmp0(x)) return zeroser(varn(x), 2*valp(x));        if (gcmp0(x)) return zeroser(varn(x), 2*valp(x));
       lx = lg(x); z = cgetg(lx,tx);        lx = lg(x); z = cgetg(lx,tx);
       z[1] = evalsigne(1) | evalvalp(2*valp(x)) | evalvarn(varn(x));        z[1] = evalsigne(1) | evalvalp(2*valp(x)) | evalvarn(varn(x));
       x += 2; z += 2; lx -= 3;        x += 2; z += 2; lx -= 3;
       p2 = (GEN)gpmalloc((lx+1)*sizeof(long));        p2 = (GEN)gpmalloc((lx+1)*sizeof(long));
         mi = 0;
       for (i=0; i<=lx; i++)        for (i=0; i<=lx; i++)
       {        {
         p2[i] = !isexactzero((GEN)x[i]);          p2[i] = !isexactzero((GEN)x[i]); if (p2[i]) mi = i;
         p1=gzero; av=avma; l=(i+1)>>1;          p1=gzero; av=avma; l=((i+1)>>1) - 1;
         for (j=0; j<l; j++)          for (j=i-mi; j<=min(l,mi); j++)
           if (p2[j] && p2[i-j])            if (p2[j] && p2[i-j]) p1 = gadd(p1, gmul((GEN)x[j],(GEN)x[i-j]));
             p1 = gadd(p1, gmul((GEN)x[j],(GEN)x[i-j]));  
         p1 = gshift(p1,1);          p1 = gshift(p1,1);
         if ((i&1) == 0 && p2[i>>1])          if ((i&1) == 0 && p2[i>>1])
           p1 = gadd(p1, gsqr((GEN)x[i>>1]));            p1 = gadd(p1, gsqr((GEN)x[i>>1]));
         z[i] = lpileupto(av,p1);          z[i] = lpileupto(av,p1);
       }        }
       z -= 2; free(p2); return normalize(z);        z -= 2; free(p2); return normalize(z);
       }
     case t_RFRAC: case t_RFRACN:      case t_RFRAC: case t_RFRACN:
       z=cgetg(3,tx);        z=cgetg(3,tx);
       z[1]=lsqr((GEN)x[1]);        z[1]=lsqr((GEN)x[1]);
Line 1691  gsqr(GEN x)
Line 1728  gsqr(GEN x)
     case t_MAT:      case t_MAT:
       lx=lg(x);        lx=lg(x);
       if (lx==1) return cgetg(1,tx);        if (lx==1) return cgetg(1,tx);
       if (lx != lg(x[1])) err(operi,"*",tx,tx);        if (lx != lg(x[1])) err(operi,"*",x,x);
       z=cgetg(lx,tx);        z=cgetg(lx,tx);
       for (j=1; j<lx; j++)        for (j=1; j<lx; j++)
       {        {
         z[j]=lgetg(lx,t_COL);          z[j]=lgetg(lx,t_COL);
         for (i=1; i<lx; i++)          for (i=1; i<lx; i++)
         {          {
           p1=gzero; l=avma;            p1=gzero; av=avma;
           for (k=1; k<lx; k++)            for (k=1; k<lx; k++)
             p1 = gadd(p1, gmul(gcoeff(x,i,k),gcoeff(x,k,j)));              p1 = gadd(p1, gmul(gcoeff(x,i,k),gcoeff(x,k,j)));
           coeff(z,i,j)=lpileupto(l,p1);            coeff(z,i,j)=lpileupto(av,p1);
         }          }
       }        }
       return z;        return z;
Line 1742  GEN divrfrac(GEN x, GEN y)
Line 1779  GEN divrfrac(GEN x, GEN y)
 GEN  GEN
 gdiv(GEN x, GEN y)  gdiv(GEN x, GEN y)
 {  {
   long tx = typ(x), ty = typ(y), lx,ly,vx,vy,i,j,k,l,av,tetpil;    long tx = typ(x), ty = typ(y), lx, ly, vx, vy, i, j, k, l;
     gpmem_t av, tetpil;
   GEN z,p1,p2,p3;    GEN z,p1,p2,p3;
   
   if (y == gun) return gcopy(x);    if (y == gun) return gcopy(x);
Line 1771  gdiv(GEN x, GEN y)
Line 1809  gdiv(GEN x, GEN y)
       case t_INTMOD:        case t_INTMOD:
         z=cgetg(3,t_INTMOD); p2=(GEN)y[1];          z=cgetg(3,t_INTMOD); p2=(GEN)y[1];
         (void)new_chunk(lgefint(p2)<<2); /* HACK */          (void)new_chunk(lgefint(p2)<<2); /* HACK */
         p1=mulii(modii(x,p2), mpinvmod((GEN)y[2],p2)); avma=(long)z;          p1=mulii(modii(x,p2), mpinvmod((GEN)y[2],p2)); avma=(gpmem_t)z;
         z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;          z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;
   
       case t_FRAC:        case t_FRAC:
Line 1779  gdiv(GEN x, GEN y)
Line 1817  gdiv(GEN x, GEN y)
         p1 = mppgcd(x,(GEN)y[1]);          p1 = mppgcd(x,(GEN)y[1]);
         if (is_pm1(p1))          if (is_pm1(p1))
         {          {
           avma = (long)z; tetpil = 0;            avma = (gpmem_t)z; tetpil = 0;
           z[2] = licopy((GEN)y[1]);            z[2] = licopy((GEN)y[1]);
         }          }
         else          else
Line 1802  gdiv(GEN x, GEN y)
Line 1840  gdiv(GEN x, GEN y)
         fix_frac(z); return z;          fix_frac(z); return z;
   
       case t_PADIC:        case t_PADIC:
         l=avma; p1=cgetp(y); gaffect(x,p1); tetpil=avma;          av=avma; p1=cgetp(y); gaffect(x,p1); tetpil=avma;
         return gerepile(l,tetpil,gdiv(p1,y));          return gerepile(av,tetpil,gdiv(p1,y));
   
       case t_COMPLEX: case t_QUAD:        case t_COMPLEX: case t_QUAD:
         l=avma; p1=gnorm(y); p2=gmul(x,gconj(y)); tetpil=avma;          av=avma; p1=gnorm(y); p2=gmul(x,gconj(y)); tetpil=avma;
         return gerepile(l,tetpil,gdiv(p2,p1));          return gerepile(av,tetpil,gdiv(p2,p1));
     }      }
   }    }
   if (gcmp0(y) && ty != t_MAT) err(gdiver2);    if (gcmp0(y) && ty != t_MAT) err(gdiver2);
Line 1826  gdiv(GEN x, GEN y)
Line 1864  gdiv(GEN x, GEN y)
             return divrr(x,y);              return divrr(x,y);
   
           case t_FRAC: case t_FRACN:            case t_FRAC: case t_FRACN:
             l=avma; p1=cgetg(lg(x),t_REAL); gaffect(y,p1);              av=avma; p1=mulri(x,(GEN)y[2]); tetpil=avma;
             return gerepile(l,(long)p1,divrr(x,p1));              return gerepile(av, tetpil, divri(p1,(GEN)y[1]));
   
           case t_COMPLEX: z=cgetg(3,t_COMPLEX);            case t_COMPLEX: z=cgetg(3,t_COMPLEX);
             l=avma; p1=gnorm(y);              av=avma; p1=gnorm(y);
             p2=gmul(x,(GEN)y[1]);              p2=gmul(x,(GEN)y[1]);
             p3=gmul(x,(GEN)y[2]);              p3=gmul(x,(GEN)y[2]);
             if (!gcmp0(p3)) p3 = gneg_i(p3);              if (!gcmp0(p3)) p3 = gneg_i(p3);
             tetpil=avma;              tetpil=avma;
             z[1]=ldiv(p2,p1);              z[1]=ldiv(p2,p1);
             z[2]=ldiv(p3,p1);              z[2]=ldiv(p3,p1);
             gerepilemanyvec(l,tetpil,z+1,2); return z;              gerepilemanyvec(av,tetpil,z+1,2); return z;
   
           case t_QUAD:            case t_QUAD:
             l=avma; p1=co8(y,lg(x)); tetpil=avma;              av=avma; p1=co8(y,lg(x)); tetpil=avma;
             return gerepile(l,tetpil,gdiv(x,p1));              return gerepile(av,tetpil,gdiv(x,p1));
   
           case t_INTMOD: case t_PADIC: err(operf,"/",tx,ty);            case t_INTMOD: case t_PADIC: err(operf,"/",x,y);
         }          }
   
       case t_INTMOD:        case t_INTMOD:
Line 1851  gdiv(GEN x, GEN y)
Line 1889  gdiv(GEN x, GEN y)
         {          {
           case t_INT: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];            case t_INT: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];
             (void)new_chunk(lgefint(p2)<<2); /* HACK */              (void)new_chunk(lgefint(p2)<<2); /* HACK */
             p1=mulii((GEN)x[2], mpinvmod(y,p2)); avma=(long)z;              p1=mulii((GEN)x[2], mpinvmod(y,p2)); avma=(gpmem_t)z;
             z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;              z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;
   
           case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)x[1]; p1=(GEN)y[1];            case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)x[1]; p1=(GEN)y[1];
             if (p1==p2 || egalii(p1,p2))              if (p1==p2 || egalii(p1,p2))
             { icopyifstack(p2,z[1]); }                icopyifstack(p2,z[1]);
             else              else
             { p2 = mppgcd(p1,p2); z[1] = (long)p2; }              { p2 = mppgcd(p1,p2); z[1] = (long)p2; }
             av=avma; (void)new_chunk(lgefint(x[1])+(lgefint(p1)<<1)); /* HACK */              av=avma; (void)new_chunk(lgefint(x[1])+(lgefint(p1)<<1)); /* HACK */
Line 1866  gdiv(GEN x, GEN y)
Line 1904  gdiv(GEN x, GEN y)
           case t_FRAC: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];            case t_FRAC: z=cgetg(3,t_INTMOD); p2=(GEN)x[1];
             (void)new_chunk(lgefint(p2)<<2); /* HACK */              (void)new_chunk(lgefint(p2)<<2); /* HACK */
             p1=mulii((GEN)y[2], mpinvmod((GEN)y[1],p2));              p1=mulii((GEN)y[2], mpinvmod((GEN)y[1],p2));
             p1=mulii(modii(p1,p2),(GEN)x[2]); avma=(long)z;              p1=mulii(modii(p1,p2),(GEN)x[2]); avma=(gpmem_t)z;
             z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;              z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;
   
           case t_FRACN:            case t_FRACN:
             l=avma; p1=gred(y); tetpil=avma;              av=avma; p1=gred(y); tetpil=avma;
             return gerepile(l,tetpil,gdiv(x,p1));              return gerepile(av,tetpil,gdiv(x,p1));
   
           case t_COMPLEX: case t_QUAD:            case t_COMPLEX: case t_QUAD:
             l=avma; p1=gnorm(y); p2=gmul(x,gconj(y)); tetpil=avma;              av=avma; p1=gnorm(y); p2=gmul(x,gconj(y)); tetpil=avma;
             return gerepile(l,tetpil,gdiv(p2,p1));              return gerepile(av,tetpil,gdiv(p2,p1));
   
           case t_PADIC:            case t_PADIC:
             l=avma; p1=cgetg(3,t_INTMOD); p1[1]=x[1]; p1[2]=lgeti(lg(x[1]));              av=avma; p1=cgetg(3,t_INTMOD); p1[1]=x[1]; p1[2]=lgeti(lg(x[1]));
             gaffect(y,p1); tetpil=avma; return gerepile(l,tetpil,gdiv(x,p1));              gaffect(y,p1); tetpil=avma; return gerepile(av,tetpil,gdiv(x,p1));
   
           case t_REAL: err(operf,"/",tx,ty);            case t_REAL: err(operf,"/",x,y);
         }          }
   
       case t_FRAC: case t_FRACN:        case t_FRAC: case t_FRACN:
Line 1894  gdiv(GEN x, GEN y)
Line 1932  gdiv(GEN x, GEN y)
             p1 = mppgcd(y,(GEN)x[1]);              p1 = mppgcd(y,(GEN)x[1]);
             if (is_pm1(p1))              if (is_pm1(p1))
             {              {
               avma = (long)z; tetpil = 0;                avma = (gpmem_t)z; tetpil = 0;
               z[1] = licopy((GEN)x[1]);                z[1] = licopy((GEN)x[1]);
             }              }
             else              else
Line 1914  gdiv(GEN x, GEN y)
Line 1952  gdiv(GEN x, GEN y)
           return z;            return z;
   
           case t_REAL:            case t_REAL:
             l=avma; p1=cgetg(lg(y),t_REAL); gaffect(x,p1);              av=avma; p1=mulri(y,(GEN)x[2]); tetpil=avma;
             p2=divrr(p1,y); return gerepile(l,(long)p1,p2);              return gerepile(av, tetpil, divir((GEN)x[1], p1));
   
           case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)y[1];            case t_INTMOD: z=cgetg(3,t_INTMOD); p2=(GEN)y[1];
             (void)new_chunk(lgefint(p2)<<2); /* HACK */              (void)new_chunk(lgefint(p2)<<2); /* HACK */
             p1=mulii((GEN)y[2],(GEN)x[2]);              p1=mulii((GEN)y[2],(GEN)x[2]);
             p1=mulii(mpinvmod(p1,p2), modii((GEN)x[1],p2)); avma=(long)z;              p1=mulii(mpinvmod(p1,p2), modii((GEN)x[1],p2)); avma=(gpmem_t)z;
             z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;              z[2]=lmodii(p1,p2); icopyifstack(p2,z[1]); return z;
   
           case t_FRAC: if (tx == t_FRACN) ty=t_FRACN;            case t_FRAC: if (tx == t_FRACN) ty=t_FRACN;
Line 1949  gdiv(GEN x, GEN y)
Line 1987  gdiv(GEN x, GEN y)
             return z;              return z;
   
           case t_COMPLEX: z=cgetg(3,t_COMPLEX);            case t_COMPLEX: z=cgetg(3,t_COMPLEX);
             l=avma; p1=gnorm(y);              av=avma; p1=gnorm(y);
             p2=gmul(x,(GEN)y[1]);              p2=gmul(x,(GEN)y[1]);
             p3=gmul(x,(GEN)y[2]);              p3=gmul(x,(GEN)y[2]);
             if(!gcmp0(p3)) p3 = gneg_i(p3);              if(!gcmp0(p3)) p3 = gneg_i(p3);
             tetpil=avma;              tetpil=avma;
             z[1]=ldiv(p2,p1); z[2]=ldiv(p3,p1);              z[1]=ldiv(p2,p1); z[2]=ldiv(p3,p1);
             gerepilemanyvec(l,tetpil,z+1,2); return z;              gerepilemanyvec(av,tetpil,z+1,2); return z;
   
           case t_PADIC:            case t_PADIC:
             if (!signe(x[1])) return gzero;              if (!signe(x[1])) return gzero;
   
             l=avma; p1=cgetp(y); gaffect(x,p1);              av=avma; p1=cgetp(y); gaffect(x,p1);
             tetpil=avma; return gerepile(l,tetpil,gdiv(p1,y));              tetpil=avma; return gerepile(av,tetpil,gdiv(p1,y));
   
           case t_QUAD:            case t_QUAD:
             l=avma; p1=gnorm(y); p2=gmul(x,gconj(y)); tetpil=avma;              av=avma; p1=gnorm(y); p2=gmul(x,gconj(y)); tetpil=avma;
             return gerepile(l,tetpil,gdiv(p2,p1));              return gerepile(av,tetpil,gdiv(p2,p1));
         }          }
   
       case t_COMPLEX:        case t_COMPLEX:
Line 1977  gdiv(GEN x, GEN y)
Line 2015  gdiv(GEN x, GEN y)
             z[2]=ldiv((GEN)x[2],y); return z;              z[2]=ldiv((GEN)x[2],y); return z;
   
           case t_COMPLEX:            case t_COMPLEX:
             l=avma; p1=gnorm(y); p2=gconj(y); p2=gmul(x,p2); tetpil=avma;              av=avma; p1=gnorm(y); p2=gconj(y); p2=gmul(x,p2); tetpil=avma;
             return gerepile(l,tetpil, gdiv(p2,p1));              return gerepile(av,tetpil, gdiv(p2,p1));
   
           case t_PADIC:            case t_PADIC:
             if (krosg(-1,(GEN)y[2])== -1)              if (krosg(-1,(GEN)y[2])== -1)
Line 1991  gdiv(GEN x, GEN y)
Line 2029  gdiv(GEN x, GEN y)
             return gerepile(av,tetpil,gdiv(p1,y));              return gerepile(av,tetpil,gdiv(p1,y));
   
           case t_QUAD:            case t_QUAD:
             lx=precision(x); if (!lx) err(operi,"/",tx,ty);              lx=precision(x); if (!lx) err(operi,"/",x,y);
             l=avma; p1=co8(y,lx); tetpil=avma;              av=avma; p1=co8(y,lx); tetpil=avma;
             return gerepile(l,tetpil,gdiv(x,p1));              return gerepile(av,tetpil,gdiv(x,p1));
         }          }
   
       case t_PADIC:        case t_PADIC:
         switch(ty)          switch(ty)
         {          {
           case t_INT: case t_FRAC: case t_FRACN:            case t_INT: case t_FRAC: case t_FRACN:
             l=avma;              av=avma;
             if (signe(x[4])) { p1=cgetp(x); gaffect(y,p1); }              if (signe(x[4])) { p1=cgetp(x); gaffect(y,p1); }
             else p1=cvtop(y,(GEN)x[2],(valp(x)>0)?valp(x):1);              else p1=cvtop(y,(GEN)x[2],(valp(x)>0)?valp(x):1);
             tetpil=avma; return gerepile(l,tetpil,gdiv(x,p1));              tetpil=avma; return gerepile(av,tetpil,gdiv(x,p1));
   
           case t_INTMOD:            case t_INTMOD:
             l=avma; p1=cgetg(3,t_INTMOD);              av=avma; p1=cgetg(3,t_INTMOD);
             p1[1]=y[1]; p1[2]=lgeti(lg(y[1]));              p1[1]=y[1]; p1[2]=lgeti(lg(y[1]));
             gaffect(x,p1); tetpil=avma;              gaffect(x,p1); tetpil=avma;
             return gerepile(l,tetpil,gdiv(p1,y));              return gerepile(av,tetpil,gdiv(p1,y));
   
           case t_PADIC:            case t_PADIC:
             if (!egalii((GEN)x[2],(GEN)y[2])) err(operi,"/",tx,ty);              if (!egalii((GEN)x[2],(GEN)y[2])) err(operi,"/",x,y);
             if (!signe(x[4]))              if (!signe(x[4]))
             {              {
               z=gcopy(x); setvalp(z,valp(x)-valp(y));                z=gcopy(x); setvalp(z,valp(x)-valp(y));
Line 2020  gdiv(GEN x, GEN y)
Line 2058  gdiv(GEN x, GEN y)
             }              }
   
             p1=(precp(x)>precp(y)) ? y : x;              p1=(precp(x)>precp(y)) ? y : x;
             z=cgetp(p1); l=avma;              z=cgetp(p1); av=avma;
             setvalp(z,valp(x)-valp(y));              setvalp(z,valp(x)-valp(y));
             p2=mpinvmod((GEN)y[4],(GEN)p1[3]);              p2=mpinvmod((GEN)y[4],(GEN)p1[3]);
             modiiz(mulii((GEN)x[4],p2),(GEN)p1[3],(GEN)z[4]);              modiiz(mulii((GEN)x[4],p2),(GEN)p1[3],(GEN)z[4]);
             avma=l; return z;              avma=av; return z;
   
           case t_COMPLEX: case t_QUAD:            case t_COMPLEX: case t_QUAD:
             l=avma; p1=gmul(x,gconj(y)); p2=gnorm(y); tetpil=avma;              av=avma; p1=gmul(x,gconj(y)); p2=gnorm(y); tetpil=avma;
             return gerepile(l,tetpil,gdiv(p1,p2));              return gerepile(av,tetpil,gdiv(p1,p2));
   
           case t_REAL:            case t_REAL:
             err(operf,"/",tx,ty);              err(operf,"/",x,y);
         }          }
   
       case t_QUAD:        case t_QUAD:
Line 2044  gdiv(GEN x, GEN y)
Line 2082  gdiv(GEN x, GEN y)
             return z;              return z;
   
           case t_REAL:            case t_REAL:
             l=avma; p1=co8(x,lg(y)); tetpil=avma;              av=avma; p1=co8(x,lg(y)); tetpil=avma;
             return gerepile(l,tetpil,gdiv(p1,y));              return gerepile(av,tetpil,gdiv(p1,y));
   
           case t_PADIC:            case t_PADIC:
             l=avma; p1=cvtop(x,(GEN)y[2],precp(y));              av=avma; p1=cvtop(x,(GEN)y[2],precp(y));
             tetpil=avma; return gerepile(l,tetpil,gdiv(p1,y));              tetpil=avma; return gerepile(av,tetpil,gdiv(p1,y));
   
           case t_COMPLEX:            case t_COMPLEX:
             ly=precision(y); if (!ly) err(operi,"/",tx,ty);              ly=precision(y); if (!ly) err(operi,"/",x,y);
             l=avma; p1=co8(x,ly); tetpil=avma;              av=avma; p1=co8(x,ly); tetpil=avma;
             return gerepile(l,tetpil,gdiv(p1,y));              return gerepile(av,tetpil,gdiv(p1,y));
   
           case t_QUAD:            case t_QUAD:
             k=x[1]; l=y[1];              k=x[1]; l=y[1];
             if (!gegal((GEN)k,(GEN)l)) err(operi,"/",tx,ty);              if (!gegal((GEN)k,(GEN)l)) err(operi,"/",x,y);
             l=avma; p1=gnorm(y); p2=gmul(x,gconj(y)); tetpil=avma;              av=avma; p1=gnorm(y); p2=gmul(x,gconj(y)); tetpil=avma;
             return gerepile(l,tetpil,gdiv(p2,p1));              return gerepile(av,tetpil,gdiv(p2,p1));
         }          }
     }      }
     err(bugparier,"division");      err(bugparier,"division");
Line 2085  gdiv(GEN x, GEN y)
Line 2123  gdiv(GEN x, GEN y)
     }      }
     return gerepileupto(av, gmul(x, ginv(y)));      return gerepileupto(av, gmul(x, ginv(y)));
   }    }
   if (is_noncalc_t(tx) || is_noncalc_t(ty)) err(operf,"/",tx, ty);    if (is_noncalc_t(tx) || is_noncalc_t(ty)) err(operf,"/",x,y);
   /* now x and y are not both is_scalar_t */    /* now x and y are not both is_scalar_t */
   
   lx = lg(x);    lx = lg(x);
Line 2107  gdiv(GEN x, GEN y)
Line 2145  gdiv(GEN x, GEN y)
         for (i=lontyp[tx]; i<lx; i++) z[i]=ldiv((GEN)x[i],y);          for (i=lontyp[tx]; i<lx; i++) z[i]=ldiv((GEN)x[i],y);
         return z;          return z;
     }      }
     err(operf,"/",tx,ty);      err(operf,"/",x,y);
   }    }
   
   ly=lg(y);    ly=lg(y);
Line 2123  gdiv(GEN x, GEN y)
Line 2161  gdiv(GEN x, GEN y)
       case t_SER:        case t_SER:
         if (gcmp0(x))          if (gcmp0(x))
         {          {
           l=avma; p1=ginv(y); tetpil=avma; /* a ameliorer !!!! */            av=avma; p1=ginv(y); tetpil=avma; /* a ameliorer !!!! */
           return gerepile(l,tetpil,gmul(x,p1));            return gerepile(av,tetpil,gmul(x,p1));
         }          }
         p1 = (GEN)gpmalloc(ly*sizeof(long));          p1 = (GEN)gpmalloc(ly*sizeof(long));
         p1[0] = evaltyp(t_SER) | evallg(ly);          p1[0] = evaltyp(t_SER) | evallg(ly);
Line 2138  gdiv(GEN x, GEN y)
Line 2176  gdiv(GEN x, GEN y)
         z[2]=lcopy((GEN)y[1]); return z;          z[2]=lcopy((GEN)y[1]); return z;
   
       case t_MAT:        case t_MAT:
         l=avma; p1=invmat(y); tetpil=avma;          av=avma; p1=invmat(y); tetpil=avma;
         return gerepile(l,tetpil,gmul(x,p1));          return gerepile(av,tetpil,gmul(x,p1));
   
       case t_VEC: case t_COL: err(operf,"/",tx,ty);        case t_VEC: case t_COL: err(operf,"/",x,y);
     }      }
     err(operf,"/",tx,ty);      err(operf,"/",x,y);
   }    }
   
   /* ici vx=vy et tx>=10 et ty>=10*/    /* ici vx=vy et tx>=10 et ty>=10*/
Line 2167  gdiv(GEN x, GEN y)
Line 2205  gdiv(GEN x, GEN y)
           z[1]=lmul(x,(GEN)y[2]);            z[1]=lmul(x,(GEN)y[2]);
           z[2]=lcopy((GEN)y[1]); return z;            z[2]=lcopy((GEN)y[1]); return z;
   
         default: err(operf,"/",tx,ty);          default: err(operf,"/",x,y);
       }        }
   
     case t_SER:      case t_SER:
Line 2227  gdiv(GEN x, GEN y)
Line 2265  gdiv(GEN x, GEN y)
         }          }
   
         case t_RFRAC: case t_RFRACN:          case t_RFRAC: case t_RFRACN:
           l=avma; p2=gmul(x,(GEN)y[2]); tetpil=avma;            av=avma; p2=gmul(x,(GEN)y[2]); tetpil=avma;
           return gerepile(l,tetpil,gdiv(p2,(GEN)y[1]));            return gerepile(av,tetpil,gdiv(p2,(GEN)y[1]));
   
         default: err(operf,"/",tx,ty);          default: err(operf,"/",x,y);
       }        }
   
     case t_RFRAC: case t_RFRACN:      case t_RFRAC: case t_RFRACN:
Line 2243  gdiv(GEN x, GEN y)
Line 2281  gdiv(GEN x, GEN y)
           z[1]=lcopy((GEN)x[1]); return z;            z[1]=lcopy((GEN)x[1]); return z;
   
         case t_SER:          case t_SER:
           l=avma; p2=gmul((GEN)x[2],y); tetpil=avma;            av=avma; p2=gmul((GEN)x[2],y); tetpil=avma;
           return gerepile(l,tetpil, gdiv((GEN)x[1],p2));            return gerepile(av,tetpil, gdiv((GEN)x[1],p2));
   
         case t_RFRAC: case t_RFRACN:          case t_RFRAC: case t_RFRACN:
           if (tx == t_RFRACN) ty=t_RFRACN;            if (tx == t_RFRACN) ty=t_RFRACN;
Line 2253  gdiv(GEN x, GEN y)
Line 2291  gdiv(GEN x, GEN y)
           z[1]=lmul((GEN)x[1],(GEN)y[2]);            z[1]=lmul((GEN)x[1],(GEN)y[2]);
           z[2]=lmul((GEN)x[2],(GEN)y[1]); return z;            z[2]=lmul((GEN)x[2],(GEN)y[1]); return z;
   
         default: err(operf,"/",tx,ty);          default: err(operf,"/",x,y);
       }        }
   
     case t_VEC: case t_COL: case t_MAT:      case t_VEC: case t_COL: case t_MAT:
Line 2263  gdiv(GEN x, GEN y)
Line 2301  gdiv(GEN x, GEN y)
         for (i=1; i<lx; i++) z[i]=ldiv((GEN)x[i],y);          for (i=1; i<lx; i++) z[i]=ldiv((GEN)x[i],y);
         return z;          return z;
       }        }
       if (ty!=t_MAT || ly==1 || lg(y[1])!=ly) err(operi,"/",tx,ty);        if (ty!=t_MAT || ly==1 || lg(y[1])!=ly) err(operi,"/",x,y);
       l=avma; p1=invmat(y); tetpil=avma;        av=avma; p1=invmat(y); tetpil=avma;
       return gerepile(l,tetpil,gmul(x,p1));        return gerepile(av,tetpil,gmul(x,p1));
      case t_QFI:case t_QFR:       case t_QFI:case t_QFR:
        break;         break;
      default: err(operf,"/",tx,ty);       default: err(operf,"/",x,y);
   }    }
   /*Here tx==t_QFI || tx==t_QFR*/    /*Here tx==t_QFI || tx==t_QFR*/
   if (tx==ty)    if (tx==ty)
Line 2283  gdiv(GEN x, GEN y)
Line 2321  gdiv(GEN x, GEN y)
         setsigne(y[2],l); setsigne(y[4],k); return z;          setsigne(y[2],l); setsigne(y[4],k); return z;
     }      }
   }    }
   err(operf,"/",tx,ty);    err(operf,"/",x,y);
   return NULL; /* not reached */    return NULL; /* not reached */
 }  }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>