[BACK]Return to gen2.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/gen2.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:51
Line 32  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
Line 32  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 void  void
 gop1z(GEN (*f)(GEN), GEN x, GEN y)  gop1z(GEN (*f)(GEN), GEN x, GEN y)
 {  {
   long av=avma; gaffect(f(x),y); avma=av;    gpmem_t av=avma; gaffect(f(x), y); avma=av;
 }  }
   
 void  void
 gop2z(GEN (*f)(GEN, GEN), GEN x, GEN y, GEN z)  gop2z(GEN (*f)(GEN, GEN), GEN x, GEN y, GEN z)
 {  {
   long av=avma; gaffect(f(x,y),z); avma=av;    gpmem_t av=avma; gaffect(f(x, y), z); avma=av;
 }  }
   
 void  void
 gops2gsz(GEN (*f)(GEN, long), GEN x, long s, GEN z)  gops2gsz(GEN (*f)(GEN, long), GEN x, long s, GEN z)
 {  {
   long av=avma; gaffect(f(x,s),z); avma=av;    gpmem_t av=avma; gaffect(f(x, s), z); avma=av;
 }  }
   
 void  void
 gops2sgz(GEN (*f)(long, GEN), long s, GEN y, GEN z)  gops2sgz(GEN (*f)(long, GEN), long s, GEN y, GEN z)
 {  {
   long av=avma; gaffect(f(s,y),z); avma=av;    gpmem_t av=avma; gaffect(f(s, y), z); avma=av;
 }  }
   
 void  void
 gops2ssz(GEN (*f)(long, long), long s, long y, GEN z)  gops2ssz(GEN (*f)(long, long), long s, long y, GEN z)
 {  {
   long av=avma; gaffect(f(s,y),z); avma=av;    gpmem_t av=avma; gaffect(f(s, y), z); avma=av;
 }  }
   
 /*******************************************************************/  /*******************************************************************/
Line 66  gops2ssz(GEN (*f)(long, long), long s, long y, GEN z)
Line 66  gops2ssz(GEN (*f)(long, long), long s, long y, GEN z)
 /*******************************************************************/  /*******************************************************************/
   
 /* small int prototype */  /* small int prototype */
 static long court_p[] = { evaltyp(t_INT) | m_evallg(3),0,0 };  static long court_p[] = { evaltyp(t_INT) | _evallg(3),0,0 };
   
 GEN  GEN
 gopsg2(GEN (*f)(GEN, GEN), long s, GEN y)  gopsg2(GEN (*f)(GEN, GEN), long s, GEN y)
Line 89  opgs2(int (*f)(GEN, GEN), GEN y, long s)
Line 89  opgs2(int (*f)(GEN, GEN), GEN y, long s)
 void  void
 gopsg2z(GEN (*f)(GEN, GEN), long s, GEN y, GEN z)  gopsg2z(GEN (*f)(GEN, GEN), long s, GEN y, GEN z)
 {  {
   long av=avma;    gpmem_t av=avma;
   affsi(s,court_p); gaffect(f(court_p,y),z); avma=av;    affsi(s,court_p); gaffect(f(court_p,y),z); avma=av;
 }  }
   
 void  void
 gopgs2z(GEN (*f)(GEN, GEN), GEN y, long s, GEN z)  gopgs2z(GEN (*f)(GEN, GEN), GEN y, long s, GEN z)
 {  {
   long av=avma;    gpmem_t av=avma;
   affsi(s,court_p); gaffect(f(y,court_p),z); avma=av;    affsi(s,court_p); gaffect(f(y,court_p),z); avma=av;
 }  }
   
Line 146  glength(GEN x)
Line 146  glength(GEN x)
     case t_POL: case t_LIST: return lgef(x)-2;      case t_POL: case t_LIST: return lgef(x)-2;
     case t_REAL: return signe(x)? lg(x)-2: 0;      case t_REAL: return signe(x)? lg(x)-2: 0;
     case t_STR: return strlen(GSTR(x));      case t_STR: return strlen(GSTR(x));
       case t_VECSMALL: return lg(x)-1;
   }    }
   return lg(x)-lontyp[typ(x)];    return lg(x)-lontyp[typ(x)];
 }  }
Line 169  matsize(GEN x)
Line 170  matsize(GEN x)
   return y;    return y;
 }  }
   
 long  
 taille(GEN x)  
 {  
   long i,n,lx, tx = typ(x);  
   n = lg(x);  
   if (is_recursive_t(tx))  
   {  
     lx = (tx==t_POL || tx==t_LIST)? lgef(x): n;  
     for (i=lontyp[tx]; i<lx; i++) n += taille((GEN)x[i]);  
   }  
   return n;  
 }  
   
 long  
 taille2(GEN x) { return taille(x)<<TWOPOTBYTES_IN_LONG; }  
   
 /*******************************************************************/  /*******************************************************************/
 /*                                                                 */  /*                                                                 */
 /*                            GREFFE                               */  /*                            GREFFE                               */
Line 229  greffe(GEN x, long l, long use_stack)
Line 214  greffe(GEN x, long l, long use_stack)
 long  long
 gtolong(GEN x)  gtolong(GEN x)
 {  {
   long y,tx=typ(x),av=avma;    long y, tx=typ(x);
     gpmem_t av=avma;
   
   switch(tx)    switch(tx)
   {    {
Line 351  gcmp1(GEN x)
Line 337  gcmp1(GEN x)
 int  int
 gcmp_1(GEN x)  gcmp_1(GEN x)
 {  {
     gpmem_t av;
   long l,y;    long l,y;
   GEN p1;    GEN p1;
   
Line 370  gcmp_1(GEN x)
Line 357  gcmp_1(GEN x)
       return 0;        return 0;
   
     case t_INTMOD:      case t_INTMOD:
       l=avma; y=egalii(addsi(1,(GEN)x[2]), (GEN)x[1]); avma=l; return y;        av=avma; y=egalii(addsi(1,(GEN)x[2]), (GEN)x[1]); avma=av; return y;
   
     case t_FRAC: case t_FRACN:      case t_FRAC: case t_FRACN:
       l = signe(x[1]);        l = signe(x[1]);
Line 383  gcmp_1(GEN x)
Line 370  gcmp_1(GEN x)
       return gcmp_1((GEN)x[2]) && gcmp0((GEN)x[3]);        return gcmp_1((GEN)x[2]) && gcmp0((GEN)x[3]);
   
     case t_PADIC:      case t_PADIC:
       l=avma; y=gegal(addsi(1,(GEN)x[4]), (GEN)x[3]); avma=l; return y;        av=avma; y=gegal(addsi(1,(GEN)x[4]), (GEN)x[3]); avma=av; return y;
   
     case t_POLMOD:      case t_POLMOD:
       l=avma; p1=gadd(gun,(GEN)x[2]);        av=avma; p1=gadd(gun,(GEN)x[2]);
       y = signe(p1) && !gegal(p1,(GEN)x[1]); avma=l; return !y;        y = signe(p1) && !gegal(p1,(GEN)x[1]); avma=av; return !y;
   
     case t_POL:      case t_POL:
       return lgef(x)==3 && gcmp_1((GEN)x[2]);        return lgef(x)==3 && gcmp_1((GEN)x[2]);
Line 399  gcmp_1(GEN x)
Line 386  gcmp_1(GEN x)
 int  int
 gcmp(GEN x, GEN y)  gcmp(GEN x, GEN y)
 {  {
   long tx,ty,f,av;    long tx, ty, f;
     gpmem_t av;
   
   tx=typ(x); ty=typ(y);    tx=typ(x); ty=typ(y);
   if (is_intreal_t(tx))    if (is_intreal_t(tx))
Line 409  gcmp(GEN x, GEN y)
Line 397  gcmp(GEN x, GEN y)
     if (tx==t_STR)      if (tx==t_STR)
     {      {
       if (ty != t_STR) return 1;        if (ty != t_STR) return 1;
       return strcmp(GSTR(x),GSTR(y));        f = strcmp(GSTR(x),GSTR(y));
         return f > 0? 1
                     : f? -1: 0;
     }      }
     if (!is_frac_t(tx)) err(typeer,"comparison");      if (!is_frac_t(tx)) err(typeer,"comparison");
   }    }
Line 418  gcmp(GEN x, GEN y)
Line 408  gcmp(GEN x, GEN y)
   av=avma; y=gneg_i(y); f=gsigne(gadd(x,y)); avma=av; return f;    av=avma; y=gneg_i(y); f=gsigne(gadd(x,y)); avma=av; return f;
 }  }
   
   static int
   lexcmp_scal_vec(GEN x, GEN y)
   {
     long fl;
     if (lg(y)==1) return 1;
     fl = lexcmp(x,(GEN)y[1]);
     if (fl) return fl;
     return -1;
   }
   
   static int
   lexcmp_vec_mat(GEN x, GEN y)
   {
     if (lg(x)==1) return -1;
     return lexcmp_scal_vec(x,y);
   }
   
 /* as gcmp for vector/matrices, using lexicographic ordering on components */  /* as gcmp for vector/matrices, using lexicographic ordering on components */
 int  int
 lexcmp(GEN x, GEN y)  lexcmp(GEN x, GEN y)
Line 425  lexcmp(GEN x, GEN y)
Line 432  lexcmp(GEN x, GEN y)
   const long tx=typ(x), ty=typ(y);    const long tx=typ(x), ty=typ(y);
   long lx,ly,l,fl,i;    long lx,ly,l,fl,i;
   
   ly=lg(y);  
   if (!is_matvec_t(tx))    if (!is_matvec_t(tx))
   {    {
     if (!is_matvec_t(ty)) return gcmp(x,y);      if (!is_matvec_t(ty)) return gcmp(x,y);
     if (ly==1) return 1;      return  lexcmp_scal_vec(x,y);
     fl = lexcmp(x,(GEN)y[1]);  
     if (fl) return fl;  
     return (ly>2)? -1:0;  
   }    }
   
   lx=lg(x);  
   if (!is_matvec_t(ty))    if (!is_matvec_t(ty))
   {      return -lexcmp_scal_vec(y,x);
     if (lx==1) return -1;  
     fl = lexcmp(y,(GEN)x[1]);  
     if (fl) return -fl;  
     return (lx>2)? 1:0;  
   }  
   
   /* x and y are matvec_t */    /* x and y are matvec_t */
   if (ly==1) return (lx==1)?0:1;  
   if (lx==1) return -1;  
   if (ty==t_MAT)    if (ty==t_MAT)
   {    {
     if (tx != t_MAT)      if (tx != t_MAT)
     {        return lexcmp_vec_mat(x,y);
       fl = lexcmp(x,(GEN)y[1]);  
       if (fl) return fl;  
       return (ly>2)?-1:0;  
     }  
   }    }
   else if (tx==t_MAT)    else if (tx==t_MAT)
   {      return -lexcmp_vec_mat(y,x);
     fl = lexcmp(y,(GEN)x[1]);  
     if (fl) return -fl;  
     return (ly>2)?1:0;  
   }  
   
   /* tx = ty = t_MAT, or x and y are both vect_t */    /* tx = ty = t_MAT, or x and y are both vect_t */
   l=min(lx,ly);    lx = lg(x);
     ly = lg(y); l = min(lx,ly);
   for (i=1; i<l; i++)    for (i=1; i<l; i++)
   {    {
     fl = lexcmp((GEN)x[i],(GEN)y[i]);      fl = lexcmp((GEN)x[i],(GEN)y[i]);
     if (fl) return fl;      if (fl) return fl;
   }    }
   return (ly != lx)? -1 : 0;    if (lx == ly) return 0;
     return (lx < ly)? -1 : 1;
 }  }
   
 /*****************************************************************/  /*****************************************************************/
Line 516  vecegal(GEN x, GEN y)
Line 504  vecegal(GEN x, GEN y)
 int  int
 gegal(GEN x, GEN y)  gegal(GEN x, GEN y)
 {  {
   ulong av,tx;    ulong tx;
     gpmem_t av;
   long i;    long i;
   
   if (x == y) return 1;    if (x == y) return 1;
Line 563  gegal(GEN x, GEN y)
Line 552  gegal(GEN x, GEN y)
           if (x[i] != y[i]) return 0;            if (x[i] != y[i]) return 0;
         return 1;          return 1;
     }      }
   {    CATCH(-1) {
     jmp_buf env;      i = 0;
     VOLATILE long av = avma;    } TRY {
     void *c;      av = avma;
     if (setjmp(env)) i = 0;      i = gcmp0(gadd(x, gneg_i(y)));
     else  
     {  
       c = err_catch(-1, env, NULL);  
       i = gcmp0(gadd(x, gneg_i(y)));  
     }  
     err_leave(&c);  
     avma = av;      avma = av;
   }    } ENDCATCH;
   return i;    return i;
 }  }
 #undef MASK  #undef MASK
Line 602  minval(GEN x, GEN p, long first, long lx)
Line 585  minval(GEN x, GEN p, long first, long lx)
   return val;    return val;
 }  }
   
   long
   polvaluation(GEN x, GEN *Z)
   {
     long v;
   
     if (!signe(x)) { if (Z) *Z = zeropol(varn(x)); return VERYBIGINT; }
     for (v = 0;; v++)
       if (!isexactzero((GEN)x[2+v])) break;
     if (Z)
     {
       if (!v) *Z = x;
       else
       {
         long i, lz = lgef(x)-v;
         GEN z = cgetg(lz, t_POL);
         z[1] = x[1]; setlgef(z,lz); x += v;
         for (i=2; i<lz; i++) z[i] = x[i];
         *Z = z;
       }
     }
     return v;
   }
   
 long  long
 ggval(GEN x, GEN p)  ggval(GEN x, GEN p)
 {  {
   long tx=typ(x), tp=typ(p), av, limit,vx,v,i,val;    long tx=typ(x), tp=typ(p), vx, v, i, val;
     gpmem_t av, limit;
   GEN p1,p2;    GEN p1,p2;
   
   if (isexactzero(x)) return VERYBIGINT;    if (isexactzero(x)) return VERYBIGINT;
Line 645  ggval(GEN x, GEN p)
Line 652  ggval(GEN x, GEN p)
         if (vx == v)          if (vx == v)
         {          {
           if ((p>=(GEN)polx && p <= (GEN)(polx+MAXVARN)) || ismonome(p))            if ((p>=(GEN)polx && p <= (GEN)(polx+MAXVARN)) || ismonome(p))
           {              return polvaluation(x, NULL);
             i=2; while (isexactzero((GEN)x[i])) i++;  
             return i-2;  
           }  
           av = avma; limit=stack_lim(av,1);            av = avma; limit=stack_lim(av,1);
           for (val=0; ; val++)            for (val=0; ; val++)
           {            {
Line 686  ggval(GEN x, GEN p)
Line 690  ggval(GEN x, GEN p)
   
 /* x is non-zero */  /* x is non-zero */
 long  long
 svaluation(ulong x, ulong p, long *py)  svaluation(ulong x, ulong p, ulong *py)
 {  {
   ulong v = 0;    ulong v = 0;
   for(;;)    for(;;)
Line 700  svaluation(ulong x, ulong p, long *py)
Line 704  svaluation(ulong x, ulong p, long *py)
 long  long
 pvaluation(GEN x, GEN p, GEN *py)  pvaluation(GEN x, GEN p, GEN *py)
 {  {
   long av,v;    long v;
     gpmem_t av, av2;
   GEN p1,p2;    GEN p1,p2;
   
   if (egalii(p,gdeux))    if (egalii(p,gdeux))
Line 715  pvaluation(GEN x, GEN p, GEN *py)
Line 720  pvaluation(GEN x, GEN p, GEN *py)
     if (py) { *py = v? negi(x): icopy(x); }      if (py) { *py = v? negi(x): icopy(x); }
     return v;      return v;
   }    }
   if (!is_bigint(x))    if (lgefint(x) == 3)
   {    {
     long y;      if (lgefint(p) == 3)
     if (!is_bigint(p))  
     {      {
       v = svaluation(x[2],p[2], &y);        ulong y;
       if (signe(x) < 0) y = -y;        v = svaluation((ulong)x[2],(ulong)p[2], &y);
       if (py) *py = stoi(y);        if (py)
         {
           *py = utoi(y);
           if (signe(x) < 0) setsigne(*py, -1);
         }
     }      }
     else      else
     {      {
Line 732  pvaluation(GEN x, GEN p, GEN *py)
Line 740  pvaluation(GEN x, GEN p, GEN *py)
     return v;      return v;
   }    }
   av = avma; v = 0; (void)new_chunk(lgefint(x));    av = avma; v = 0; (void)new_chunk(lgefint(x));
     av2= avma;
   for(;;)    for(;;)
   {    {
     p1 = dvmdii(x,p,&p2);      p1 = dvmdii(x,p,&p2);
     if (p2 != gzero) { avma=av; if (py) *py = icopy(x); return v; }      if (p2 != gzero) { avma=av; if (py) *py = icopy(x); return v; }
     v++; x = p1;      v++; x = p1;
       if ((v & 0xff) == 0) p1 = gerepileuptoint(av2, p1);
   }    }
 }  }
   
Line 866  gneg_i(GEN x)
Line 876  gneg_i(GEN x)
 GEN  GEN
 gabs(GEN x, long prec)  gabs(GEN x, long prec)
 {  {
   long tx=typ(x),lx,i,l,tetpil;    long tx=typ(x), lx, i;
     gpmem_t av, tetpil;
   GEN y,p1;    GEN y,p1;
   
   switch(tx)    switch(tx)
Line 879  gabs(GEN x, long prec)
Line 890  gabs(GEN x, long prec)
       y[2]=labsi((GEN)x[2]); return y;        y[2]=labsi((GEN)x[2]); return y;
   
     case t_COMPLEX:      case t_COMPLEX:
       l=avma; p1=gnorm(x);        av=avma; p1=gnorm(x);
       switch(typ(p1))        switch(typ(p1))
       {        {
         case t_INT:          case t_INT:
           if (!carrecomplet(p1, &y)) break;            if (!carrecomplet(p1, &y)) break;
           return gerepileupto(l, y);            return gerepileupto(av, y);
         case t_FRAC:          case t_FRAC:
         case t_FRACN:          case t_FRACN:
         {          {
           GEN a,b;            GEN a,b;
           if (!carrecomplet((GEN)p1[1], &a)) break;            if (!carrecomplet((GEN)p1[1], &a)) break;
           if (!carrecomplet((GEN)p1[2], &b)) break;            if (!carrecomplet((GEN)p1[2], &b)) break;
           return gerepileupto(l, gdiv(a,b));            return gerepileupto(av, gdiv(a,b));
         }          }
       }        }
       tetpil=avma;        tetpil=avma;
       return gerepile(l,tetpil,gsqrt(p1,prec));        return gerepile(av,tetpil,gsqrt(p1,prec));
   
     case t_QUAD:      case t_QUAD:
       l=avma; p1=gmul(x, realun(prec)); tetpil=avma;        av=avma; p1=gmul(x, realun(prec)); tetpil=avma;
       return gerepile(l,tetpil,gabs(p1,prec));        return gerepile(av,tetpil,gabs(p1,prec));
   
     case t_POL:      case t_POL:
       lx=lgef(x); if (lx<=2) return gcopy(x);        lx=lgef(x); if (lx<=2) return gcopy(x);
Line 1020  void
Line 1031  void
 gaffsg(long s, GEN x)  gaffsg(long s, GEN x)
 {  {
   long l,i,v;    long l,i,v;
   GEN p;  
   
   switch(typ(x))    switch(typ(x))
   {    {
Line 1040  gaffsg(long s, GEN x)
Line 1050  gaffsg(long s, GEN x)
       gaffsg(s,(GEN)x[1]); gaffsg(0,(GEN)x[2]); break;        gaffsg(s,(GEN)x[1]); gaffsg(0,(GEN)x[2]); break;
   
     case t_PADIC:      case t_PADIC:
       {
         GEN y;
       if (!s) { padicaff0(x); break; }        if (!s) { padicaff0(x); break; }
       p = (GEN)x[2];        v = pvaluation(stoi(s), (GEN)x[2], &y);
       v = (is_bigint(p))? 0: svaluation(s,p[2], &i);        setvalp(x,v); modiiz(y,(GEN)x[3],(GEN)x[4]);
       setvalp(x,v); modsiz(i,(GEN)x[3],(GEN)x[4]);  
       break;        break;
       }
   
     case t_QUAD:      case t_QUAD:
       gaffsg(s,(GEN)x[2]); gaffsg(0,(GEN)x[3]); break;        gaffsg(s,(GEN)x[2]); gaffsg(0,(GEN)x[3]); break;
Line 1075  gaffsg(long s, GEN x)
Line 1087  gaffsg(long s, GEN x)
       gaffsg(s,(GEN)x[1]); gaffsg(1,(GEN)x[2]); break;        gaffsg(s,(GEN)x[1]); gaffsg(1,(GEN)x[2]); break;
   
     case t_VEC: case t_COL: case t_MAT:      case t_VEC: case t_COL: case t_MAT:
       if (lg(x)!=2) err(operi,"",t_INT,typ(x));        if (lg(x)!=2) err(operi,"",stoi(s),x);
       gaffsg(s,(GEN)x[1]); break;        gaffsg(s,(GEN)x[1]); break;
   
     default: err(operf,"",t_INT,typ(x));      default: err(operf,"",stoi(s),x);
   }    }
 }  }
   
Line 1091  gaffsg(long s, GEN x)
Line 1103  gaffsg(long s, GEN x)
 void  void
 gaffect(GEN x, GEN y)  gaffect(GEN x, GEN y)
 {  {
   long i,j,k,l,v,vy,lx,ly,tx,ty,av;    long i, j, k, l, v, vy, lx, ly, tx, ty;
     gpmem_t av;
   GEN p1,num,den;    GEN p1,num,den;
   
   
Line 1135  gaffect(GEN x, GEN y)
Line 1148  gaffect(GEN x, GEN y)
   
             case t_PADIC:              case t_PADIC:
               if (!signe(x)) { padicaff0(y); break; }                if (!signe(x)) { padicaff0(y); break; }
               l=avma;                av=avma;
               setvalp(y, pvaluation(x,(GEN)y[2],&p1));                setvalp(y, pvaluation(x,(GEN)y[2],&p1));
               modiiz(p1,(GEN)y[3],(GEN)y[4]);                modiiz(p1,(GEN)y[3],(GEN)y[4]);
               avma=l; break;                avma=av; break;
   
             case t_QUAD:              case t_QUAD:
               gaffect(x,(GEN)y[2]); gaffsg(0,(GEN)y[3]); break;                gaffect(x,(GEN)y[2]); gaffsg(0,(GEN)y[3]); break;
Line 1146  gaffect(GEN x, GEN y)
Line 1159  gaffect(GEN x, GEN y)
             case t_POLMOD:              case t_POLMOD:
               gaffect(x,(GEN)y[2]); break;                gaffect(x,(GEN)y[2]); break;
   
             default: err(operf,"",tx,ty);              default: err(operf,"",x,y);
           }            }
           break;            break;
   
Line 1164  gaffect(GEN x, GEN y)
Line 1177  gaffect(GEN x, GEN y)
   
             case t_INT: case t_INTMOD: case t_FRAC:              case t_INT: case t_INTMOD: case t_FRAC:
             case t_FRACN: case t_PADIC: case t_QUAD:              case t_FRACN: case t_PADIC: case t_QUAD:
               err(operf,"",tx,ty);                err(operf,"",x,y);
   
             default: err(operf,"",tx,ty);              default: err(operf,"",x,y);
           }            }
           break;            break;
   
Line 1175  gaffect(GEN x, GEN y)
Line 1188  gaffect(GEN x, GEN y)
           {            {
             case t_INTMOD:              case t_INTMOD:
               if (!divise((GEN)x[1],(GEN)y[1]))                if (!divise((GEN)x[1],(GEN)y[1]))
                 err(operi,"",tx,ty);                  err(operi,"",x,y);
               modiiz((GEN)x[2],(GEN)y[1],(GEN)y[2]); break;                modiiz((GEN)x[2],(GEN)y[1],(GEN)y[2]); break;
   
             case t_POLMOD:              case t_POLMOD:
               gaffect(x,(GEN)y[2]); break;                gaffect(x,(GEN)y[2]); break;
   
             default: err(operf,"",tx,ty);              default: err(operf,"",x,y);
           }            }
           break;            break;
   
Line 1190  gaffect(GEN x, GEN y)
Line 1203  gaffect(GEN x, GEN y)
           {            {
             case t_INT:              case t_INT:
               if (! mpdivis((GEN)x[1],(GEN)x[2],y))                if (! mpdivis((GEN)x[1],(GEN)x[2],y))
                 err(operi,"",tx,ty);                  err(operi,"",x,y);
               break;                break;
   
             case t_REAL:              case t_REAL:
Line 1222  gaffect(GEN x, GEN y)
Line 1235  gaffect(GEN x, GEN y)
               gaffect(x,(GEN)y[2]); gaffsg(0,(GEN)y[3]); break;                gaffect(x,(GEN)y[2]); gaffsg(0,(GEN)y[3]); break;
             case t_POLMOD:              case t_POLMOD:
               gaffect(x,(GEN)y[2]); break;                gaffect(x,(GEN)y[2]); break;
             default: err(operf,"",tx,ty);              default: err(operf,"",x,y);
           }            }
           break;            break;
   
Line 1230  gaffect(GEN x, GEN y)
Line 1243  gaffect(GEN x, GEN y)
           switch(ty)            switch(ty)
           {            {
             case t_INT:              case t_INT:
               if (! mpdivis((GEN)x[1],(GEN)x[2],y)) err(operi,"",tx,ty);                if (! mpdivis((GEN)x[1],(GEN)x[2],y)) err(operi,"",x,y);
               break;                break;
   
             case t_REAL:              case t_REAL:
Line 1257  gaffect(GEN x, GEN y)
Line 1270  gaffect(GEN x, GEN y)
               gaffect(x,(GEN)y[2]); gaffsg(0,(GEN)y[3]); break;                gaffect(x,(GEN)y[2]); gaffsg(0,(GEN)y[3]); break;
             case t_POLMOD:              case t_POLMOD:
               gaffect(x,(GEN)y[2]); break;                gaffect(x,(GEN)y[2]); break;
             default: err(operf,"",tx,ty);              default: err(operf,"",x,y);
           }            }
           break;            break;
   
Line 1266  gaffect(GEN x, GEN y)
Line 1279  gaffect(GEN x, GEN y)
           {            {
             case t_INT: case t_REAL: case t_INTMOD:              case t_INT: case t_REAL: case t_INTMOD:
             case t_FRAC: case t_FRACN: case t_PADIC: case t_QUAD:              case t_FRAC: case t_FRACN: case t_PADIC: case t_QUAD:
               if (!gcmp0((GEN)x[2])) err(operi,"",tx,ty);                if (!gcmp0((GEN)x[2])) err(operi,"",x,y);
               gaffect((GEN)x[1],y); break;                gaffect((GEN)x[1],y); break;
   
             case t_COMPLEX:              case t_COMPLEX:
Line 1277  gaffect(GEN x, GEN y)
Line 1290  gaffect(GEN x, GEN y)
             case t_POLMOD:              case t_POLMOD:
               gaffect(x,(GEN)y[2]); break;                gaffect(x,(GEN)y[2]); break;
   
             default: err(operf,"",tx,ty);              default: err(operf,"",x,y);
           }            }
           break;            break;
   
Line 1285  gaffect(GEN x, GEN y)
Line 1298  gaffect(GEN x, GEN y)
           switch(ty)            switch(ty)
           {            {
             case t_INTMOD:              case t_INTMOD:
               if (valp(x)<0) err(operi,"",tx,ty);                if (valp(x)<0) err(operi,"",x,y);
               av=avma;                av=avma;
               v = pvaluation((GEN)y[1],(GEN)x[2],&p1);                v = pvaluation((GEN)y[1],(GEN)x[2],&p1);
               k = signe(x[4])? (precp(x)+valp(x)): valp(x)+1;                k = signe(x[4])? (precp(x)+valp(x)): valp(x)+1;
               if (!gcmp1(p1) || v > k) err(operi,"",tx,ty);                if (!gcmp1(p1) || v > k) err(operi,"",x,y);
               modiiz(gtrunc(x),(GEN)y[1],(GEN)y[2]); avma=av; break;                modiiz(gtrunc(x),(GEN)y[1],(GEN)y[2]); avma=av; break;
   
             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);
               modiiz((GEN)x[4],(GEN)y[3],(GEN)y[4]);                modiiz((GEN)x[4],(GEN)y[3],(GEN)y[4]);
               setvalp(y,valp(x)); break;                setvalp(y,valp(x)); break;
   
             case t_POLMOD:              case t_POLMOD:
               gaffect(x,(GEN)y[2]); break;                gaffect(x,(GEN)y[2]); break;
   
             default: err(operf,"",tx,ty);              default: err(operf,"",x,y);
           }            }
           break;            break;
   
Line 1309  gaffect(GEN x, GEN y)
Line 1322  gaffect(GEN x, GEN y)
           {            {
             case t_INT: case t_INTMOD: case t_FRAC:              case t_INT: case t_INTMOD: case t_FRAC:
             case t_FRACN: case t_PADIC:              case t_FRACN: case t_PADIC:
               if (!gcmp0((GEN)x[3])) err(operi,"",tx,ty);                if (!gcmp0((GEN)x[3])) err(operi,"",x,y);
               gaffect((GEN)x[2],y); break;                gaffect((GEN)x[2],y); break;
   
             case t_REAL:              case t_REAL:
Line 1322  gaffect(GEN x, GEN y)
Line 1335  gaffect(GEN x, GEN y)
               }                }
               else                else
               {                {
                 if (!gcmp0((GEN)x[3])) err(operi,"",tx,ty);                  if (!gcmp0((GEN)x[3])) err(operi,"",x,y);
                 gaffect((GEN)x[2],y);                  gaffect((GEN)x[2],y);
               }                }
               break;                break;
   
             case t_QUAD:              case t_QUAD:
               if (! gegal((GEN)x[1],(GEN)y[1])) err(operi,"",tx,ty);                if (! gegal((GEN)x[1],(GEN)y[1])) err(operi,"",x,y);
               affii((GEN)x[2],(GEN)y[2]);                affii((GEN)x[2],(GEN)y[2]);
               affii((GEN)x[3],(GEN)y[3]);                affii((GEN)x[3],(GEN)y[3]);
               break;                break;
             case t_POLMOD:              case t_POLMOD:
               gaffect(x,(GEN)y[2]); break;                gaffect(x,(GEN)y[2]); break;
             default: err(operf,"",tx,ty);              default: err(operf,"",x,y);
           }            }
           break;            break;
   
         case t_POLMOD:          case t_POLMOD:
           if (ty!=t_POLMOD) err(operf,"",tx,ty);            if (ty!=t_POLMOD) err(operf,"",x,y);
           if (! gdivise((GEN)x[1],(GEN)y[1])) err(operi,"",tx,ty);            if (! gdivise((GEN)x[1],(GEN)y[1])) err(operi,"",x,y);
           gmodz((GEN)x[2],(GEN)y[1],(GEN)y[2]); break;            gmodz((GEN)x[2],(GEN)y[1],(GEN)y[2]); break;
   
         default: err(operf,"",tx,ty);          default: err(operf,"",x,y);
       }        }
       return;        return;
     }      }
Line 1373  gaffect(GEN x, GEN y)
Line 1386  gaffect(GEN x, GEN y)
       case t_RFRAC: case t_RFRACN:        case t_RFRAC: case t_RFRACN:
         gaffect(x,(GEN)y[1]); gaffsg(1,(GEN)y[2]); break;          gaffect(x,(GEN)y[1]); gaffsg(1,(GEN)y[2]); break;
   
       default: err(operf,"",tx,ty);        default: err(operf,"",x,y);
     }      }
     return;      return;
   }    }
   
   if (is_const_t(ty)) {    if (is_const_t(ty)) {
 #define initial_value(ep) ((ep)+1)      entree *varnum, *varden;
       if (tx == t_POL) {      long vnum, vden;
           entree *var = varentries[ordvar[varn(x)]];      GEN num, den;
           /* Is a bound expression, thus should not loop: */      if (tx == t_POL) {
           if (var && var->value != (void*)initial_value(var)) {        vnum = varn(x); varnum = varentries[ordvar[vnum]];
               gaffect(geval(x),y);        if (varnum) {
               return;          x = geval(x); tx = typ(x);
           }          if (tx != t_POL || varn(x) != vnum) { gaffect(x, y); return; }
       } else if (is_rfrac_t(tx)) {        }
           GEN num = (GEN)x[1], den = (GEN)x[2];      } else if (is_rfrac_t(tx)) {
           entree *varnum = varentries[ordvar[varn(num)]];        num = (GEN)x[1]; vnum = gvar(num); varnum = varentries[ordvar[vnum]];
           entree *varden = varentries[ordvar[varn(den)]];        den = (GEN)x[2]; vden = gvar(den); varden = varentries[ordvar[vden]];
         if (varnum && varden) {
           /* Are bound expressions, thus should not loop: */          vnum = min(vnum, vden);
           if (varnum && varnum->value != (void*)initial_value(varnum)          x = geval(x); tx = typ(x);
            && varden && varden->value != (void*)initial_value(varden)) {          if (!is_rfrac_t(tx) || gvar(x) != vnum) { gaffect(x, y); return; }
               gaffect(geval(x),y);  
               return;  
           }  
       }        }
 #undef initial_value      }
       err(operf,"",tx,ty);      err(operf,"",x,y);
   }    }
   
   switch(tx)    switch(tx)
Line 1410  gaffect(GEN x, GEN y)
Line 1420  gaffect(GEN x, GEN y)
       switch(ty)        switch(ty)
       {        {
         case t_POL:          case t_POL:
           vy=varn(y); if (vy>v) err(operf,"",tx,ty);            vy=varn(y); if (vy>v) err(operf,"",x,y);
           if (vy==v)            if (vy==v)
           {            {
             l=lgef(x); if (l>ly) err(operi,"",tx,ty);              l=lgef(x); if (l>ly) err(operi,"",x,y);
             y[1]=x[1]; for (i=2; i<l; i++) gaffect((GEN)x[i],(GEN)y[i]);              y[1]=x[1]; for (i=2; i<l; i++) gaffect((GEN)x[i],(GEN)y[i]);
           }            }
           else            else
Line 1426  gaffect(GEN x, GEN y)
Line 1436  gaffect(GEN x, GEN y)
           break;            break;
   
         case t_SER:          case t_SER:
           vy=varn(y); if (vy>v) err(operf,"",tx,ty);            vy=varn(y); if (vy>v) err(operf,"",x,y);
           if (!signe(x)) { gaffsg(0,y); return; }            if (!signe(x)) { gaffsg(0,y); return; }
           if (vy==v)            if (vy==v)
           {            {
Line 1452  gaffect(GEN x, GEN y)
Line 1462  gaffect(GEN x, GEN y)
         case t_RFRAC: case t_RFRACN:          case t_RFRAC: case t_RFRACN:
           gaffect(x,(GEN)y[1]); gaffsg(1,(GEN)y[2]); break;            gaffect(x,(GEN)y[1]); gaffsg(1,(GEN)y[2]); break;
   
         default: err(operf,"",tx,ty);          default: err(operf,"",x,y);
       }        }
       break;        break;
   
     case t_SER:      case t_SER:
       if (ty!=t_SER) err(operf,"",tx,ty);        if (ty!=t_SER) err(operf,"",x,y);
       v=varn(x); vy=varn(y); if (vy>v) err(operf,"",tx,ty);        v=varn(x); vy=varn(y); if (vy>v) err(operf,"",x,y);
       if (vy==v)        if (vy==v)
       {        {
         y[1]=x[1]; k=lx; if (k>ly) k=ly;          y[1]=x[1]; k=lx; if (k>ly) k=ly;
Line 1480  gaffect(GEN x, GEN y)
Line 1490  gaffect(GEN x, GEN y)
       switch(ty)        switch(ty)
       {        {
         case t_POL: case t_VEC: case t_COL: case t_MAT:          case t_POL: case t_VEC: case t_COL: case t_MAT:
           err(operf,"",tx,ty);            err(operf,"",x,y);
   
         case t_POLMOD:          case t_POLMOD:
           av=avma; p1=ginvmod((GEN)x[2],(GEN)y[1]);            av=avma; p1=ginvmod((GEN)x[2],(GEN)y[1]);
Line 1503  gaffect(GEN x, GEN y)
Line 1513  gaffect(GEN x, GEN y)
           gaffect((GEN)x[1],(GEN)y[1]);            gaffect((GEN)x[1],(GEN)y[1]);
           gaffect((GEN)x[2],(GEN)y[2]); break;            gaffect((GEN)x[2],(GEN)y[2]); break;
   
         default: err(operf,"",tx,ty);          default: err(operf,"",x,y);
       }        }
       break;        break;
   
     case t_QFR: case t_QFI: case t_VEC: case t_COL: case t_MAT:      case t_QFR: case t_QFI: case t_VEC: case t_COL: case t_MAT:
       if (ty != tx || ly != lx) err(operi,"",tx,ty);        if (ty != tx || ly != lx) err(operi,"",x,y);
       for (i=1; i<lx; i++) gaffect((GEN)x[i],(GEN)y[i]);        for (i=1; i<lx; i++) gaffect((GEN)x[i],(GEN)y[i]);
       break;        break;
   
     default: err(operf,"",tx,ty);      default: err(operf,"",x,y);
   }    }
 }  }
   
Line 1525  gaffect(GEN x, GEN y)
Line 1535  gaffect(GEN x, GEN y)
 GEN  GEN
 co8(GEN x, long prec)  co8(GEN x, long prec)
 {  {
   long av=avma,tetpil;    gpmem_t av=avma, tetpil;
   GEN p1, p = (GEN) x[1];    GEN p1, p = (GEN) x[1];
   
   p1 = subii(sqri((GEN)p[3]), shifti((GEN)p[2],2));    p1 = subii(sqri((GEN)p[3]), shifti((GEN)p[2],2));
Line 1548  GEN
Line 1558  GEN
 cvtop(GEN x, GEN p, long l)  cvtop(GEN x, GEN p, long l)
 {  {
   GEN p1,p2,p3;    GEN p1,p2,p3;
   long av,tetpil,n;    long n;
     gpmem_t av, tetpil;
   
   if (typ(p)!=t_INT)    if (typ(p)!=t_INT)
     err(talker,"not an integer modulus in cvtop or gcvtop");      err(talker,"not an integer modulus in cvtop or gcvtop");
Line 1589  cvtop(GEN x, GEN p, long l)
Line 1600  cvtop(GEN x, GEN p, long l)
           n = ggval((GEN)p2[1],p) - ggval((GEN)p2[2],p);            n = ggval((GEN)p2[1],p) - ggval((GEN)p2[2],p);
           p2=gadd(p2,ggrandocp(p,n+l)); break;            p2=gadd(p2,ggrandocp(p,n+l)); break;
   
         default: err(operi,"",t_QUAD,t_QUAD);          default: err(operi,"",x,x);
       }        }
       p2=gsqrt(p2,0); p1=gmul((GEN)x[3],gsub(p2,p3)); tetpil=avma;        p2=gsqrt(p2,0); p1=gmul((GEN)x[3],gsub(p2,p3)); tetpil=avma;
       return gerepile(av,tetpil,gadd((GEN)x[2],p1));        return gerepile(av,tetpil,gadd((GEN)x[2],p1));
Line 1636  gcvtop(GEN x, GEN p, long r)
Line 1647  gcvtop(GEN x, GEN p, long r)
 long  long
 gexpo(GEN x)  gexpo(GEN x)
 {  {
   long tx=typ(x),lx,e,i,y,av;    long tx=typ(x), lx, e, i, y;
     gpmem_t av;
   
   switch(tx)    switch(tx)
   {    {
Line 1673  sizedigit(GEN x)
Line 1685  sizedigit(GEN x)
   return gcmp0(x)? 0: (long) ((gexpo(x)+1) * L2SL10) + 1;    return gcmp0(x)? 0: (long) ((gexpo(x)+1) * L2SL10) + 1;
 }  }
   
   #if 0
 /* Normalize series x in place.  /* Normalize series x in place.
  * Assumption: x,x[2],...,x[lg(x)-1] have been created in that order.   * Assumption: x,x[2],...,x[lg(x)-1] have been created in that order.
  * All intermediate objects will be destroyed.   * All intermediate objects will be destroyed.
Line 1683  normalize(GEN x)
Line 1696  normalize(GEN x)
   long i,j, lx = lg(x);    long i,j, lx = lg(x);
   
   if (typ(x)!=t_SER) err(typeer,"normalize");    if (typ(x)!=t_SER) err(typeer,"normalize");
   if (lx==2) { setsigne(x,0); avma = (long) x; return x; }    if (lx==2) { setsigne(x,0); avma = (gpmem_t) x; return x; }
   if (! isexactzero((GEN)x[2])) { setsigne(x,1); return x; }    if (! isexactzero((GEN)x[2])) { setsigne(x,1); return x; }
   
   for (i=3; i<lx; i++)    for (i=3; i<lx; i++)
     if (! isexactzero((GEN)x[i]))      if (! isexactzero((GEN)x[i]))
     {      {
       long tetpil = avma;        gpmem_t tetpil = avma;
       GEN p1 = cgetg(lx-i+2,t_SER);        GEN p1 = cgetg(lx-i+2,t_SER);
       p1[1] = evalsigne(1) | evalvalp(valp(x)+i-2) | evalvarn(varn(x));        p1[1] = evalsigne(1) | evalvalp(valp(x)+i-2) | evalvarn(varn(x));
       j=i; i=2; while (j<lx) p1[i++] = lcopy((GEN)x[j++]);        j=i; i=2; while (j<lx) p1[i++] = lcopy((GEN)x[j++]);
       return gerepile((long) (x+lx),tetpil,p1);        return gerepile((gpmem_t) (x+lx),tetpil,p1);
     }      }
   avma = (long) (x+lx); return zeroser(varn(x),lx-2);    avma = (gpmem_t) (x+lx); return zeroser(varn(x),lx-2);
 }  }
   #else
   
   /* normalize series. avma is not updated */
 GEN  GEN
   normalize(GEN x)
   {
     long i, lx = lg(x);
     GEN y;
   
     if (typ(x) != t_SER) err(typeer,"normalize");
     if (lx==2) { setsigne(x,0); return x; }
     if (! isexactzero((GEN)x[2])) { setsigne(x,1); return x; }
     for (i=3; i<lx; i++)
       if (! isexactzero((GEN)x[i]))
       {
         i -= 2; y = x + i;
         y[1] = evalsigne(1) | evalvalp(valp(x)+i) | evalvarn(varn(x));
         y[0] = evaltyp(t_SER) | evallg(lx-i); /* don't swap these lines ! */
         stackdummy(x, i); return y;
       }
     return zeroser(varn(x),lx-2);
   }
   #endif
   
   GEN
 normalizepol_i(GEN x, long lx)  normalizepol_i(GEN x, long lx)
 {  {
   long i;    long i;
Line 1845  listconcat(GEN list1, GEN list2)
Line 1881  listconcat(GEN list1, GEN list2)
 GEN  GEN
 listsort(GEN list, long flag)  listsort(GEN list, long flag)
 {  {
   long i,av=avma, c=list[1], lx = lgef(list)-1;    long i, c=list[1], lx = lgef(list)-1;
     gpmem_t av=avma;
   GEN perm,vec,l;    GEN perm,vec,l;
   
   if (typ(list) != t_LIST) err(typeer,"listsort");    if (typ(list) != t_LIST) err(typeer,"listsort");

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

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