=================================================================== RCS file: /home/cvs/OpenXM_contrib/pari-2.2/src/basemath/Attic/gen2.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- OpenXM_contrib/pari-2.2/src/basemath/Attic/gen2.c 2001/10/02 11:17:04 1.1 +++ OpenXM_contrib/pari-2.2/src/basemath/Attic/gen2.c 2002/09/11 07:26:51 1.2 @@ -1,4 +1,4 @@ -/* $Id: gen2.c,v 1.1 2001/10/02 11:17:04 noro Exp $ +/* $Id: gen2.c,v 1.2 2002/09/11 07:26:51 noro Exp $ Copyright (C) 2000 The PARI group. @@ -32,31 +32,31 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, void 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 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 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 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 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; } /*******************************************************************/ @@ -66,7 +66,7 @@ gops2ssz(GEN (*f)(long, long), long s, long y, GEN z) /*******************************************************************/ /* 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 gopsg2(GEN (*f)(GEN, GEN), long s, GEN y) @@ -89,14 +89,14 @@ opgs2(int (*f)(GEN, GEN), GEN y, long s) void 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; } void 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; } @@ -146,6 +146,7 @@ glength(GEN x) case t_POL: case t_LIST: return lgef(x)-2; case t_REAL: return signe(x)? lg(x)-2: 0; case t_STR: return strlen(GSTR(x)); + case t_VECSMALL: return lg(x)-1; } return lg(x)-lontyp[typ(x)]; } @@ -169,22 +170,6 @@ matsize(GEN x) 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 0? 1 + : f? -1: 0; } if (!is_frac_t(tx)) err(typeer,"comparison"); } @@ -418,6 +408,23 @@ gcmp(GEN x, GEN y) 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 */ int lexcmp(GEN x, GEN y) @@ -425,52 +432,33 @@ lexcmp(GEN x, GEN y) const long tx=typ(x), ty=typ(y); long lx,ly,l,fl,i; - ly=lg(y); if (!is_matvec_t(tx)) { if (!is_matvec_t(ty)) return gcmp(x,y); - if (ly==1) return 1; - fl = lexcmp(x,(GEN)y[1]); - if (fl) return fl; - return (ly>2)? -1:0; + return lexcmp_scal_vec(x,y); } - - lx=lg(x); if (!is_matvec_t(ty)) - { - if (lx==1) return -1; - fl = lexcmp(y,(GEN)x[1]); - if (fl) return -fl; - return (lx>2)? 1:0; - } + return -lexcmp_scal_vec(y,x); /* x and y are matvec_t */ - if (ly==1) return (lx==1)?0:1; - if (lx==1) return -1; if (ty==t_MAT) { if (tx != t_MAT) - { - fl = lexcmp(x,(GEN)y[1]); - if (fl) return fl; - return (ly>2)?-1:0; - } + return lexcmp_vec_mat(x,y); } else if (tx==t_MAT) - { - fl = lexcmp(y,(GEN)x[1]); - if (fl) return -fl; - return (ly>2)?1:0; - } - + return -lexcmp_vec_mat(y,x); + /* 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=(GEN)polx && p <= (GEN)(polx+MAXVARN)) || ismonome(p)) - { - i=2; while (isexactzero((GEN)x[i])) i++; - return i-2; - } + return polvaluation(x, NULL); av = avma; limit=stack_lim(av,1); for (val=0; ; val++) { @@ -686,7 +690,7 @@ ggval(GEN x, GEN p) /* x is non-zero */ long -svaluation(ulong x, ulong p, long *py) +svaluation(ulong x, ulong p, ulong *py) { ulong v = 0; for(;;) @@ -700,7 +704,8 @@ svaluation(ulong x, ulong p, long *py) long pvaluation(GEN x, GEN p, GEN *py) { - long av,v; + long v; + gpmem_t av, av2; GEN p1,p2; if (egalii(p,gdeux)) @@ -715,14 +720,17 @@ pvaluation(GEN x, GEN p, GEN *py) if (py) { *py = v? negi(x): icopy(x); } return v; } - if (!is_bigint(x)) + if (lgefint(x) == 3) { - long y; - if (!is_bigint(p)) + if (lgefint(p) == 3) { - v = svaluation(x[2],p[2], &y); - if (signe(x) < 0) y = -y; - if (py) *py = stoi(y); + ulong y; + v = svaluation((ulong)x[2],(ulong)p[2], &y); + if (py) + { + *py = utoi(y); + if (signe(x) < 0) setsigne(*py, -1); + } } else { @@ -732,11 +740,13 @@ pvaluation(GEN x, GEN p, GEN *py) return v; } av = avma; v = 0; (void)new_chunk(lgefint(x)); + av2= avma; for(;;) { p1 = dvmdii(x,p,&p2); if (p2 != gzero) { avma=av; if (py) *py = icopy(x); return v; } v++; x = p1; + if ((v & 0xff) == 0) p1 = gerepileuptoint(av2, p1); } } @@ -866,7 +876,8 @@ gneg_i(GEN x) GEN 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; switch(tx) @@ -879,27 +890,27 @@ gabs(GEN x, long prec) y[2]=labsi((GEN)x[2]); return y; case t_COMPLEX: - l=avma; p1=gnorm(x); + av=avma; p1=gnorm(x); switch(typ(p1)) { case t_INT: if (!carrecomplet(p1, &y)) break; - return gerepileupto(l, y); + return gerepileupto(av, y); case t_FRAC: case t_FRACN: { GEN a,b; if (!carrecomplet((GEN)p1[1], &a)) break; if (!carrecomplet((GEN)p1[2], &b)) break; - return gerepileupto(l, gdiv(a,b)); + return gerepileupto(av, gdiv(a,b)); } } tetpil=avma; - return gerepile(l,tetpil,gsqrt(p1,prec)); + return gerepile(av,tetpil,gsqrt(p1,prec)); case t_QUAD: - l=avma; p1=gmul(x, realun(prec)); tetpil=avma; - return gerepile(l,tetpil,gabs(p1,prec)); + av=avma; p1=gmul(x, realun(prec)); tetpil=avma; + return gerepile(av,tetpil,gabs(p1,prec)); case t_POL: lx=lgef(x); if (lx<=2) return gcopy(x); @@ -1020,7 +1031,6 @@ void gaffsg(long s, GEN x) { long l,i,v; - GEN p; switch(typ(x)) { @@ -1040,11 +1050,13 @@ gaffsg(long s, GEN x) gaffsg(s,(GEN)x[1]); gaffsg(0,(GEN)x[2]); break; case t_PADIC: + { + GEN y; if (!s) { padicaff0(x); break; } - p = (GEN)x[2]; - v = (is_bigint(p))? 0: svaluation(s,p[2], &i); - setvalp(x,v); modsiz(i,(GEN)x[3],(GEN)x[4]); + v = pvaluation(stoi(s), (GEN)x[2], &y); + setvalp(x,v); modiiz(y,(GEN)x[3],(GEN)x[4]); break; + } case t_QUAD: gaffsg(s,(GEN)x[2]); gaffsg(0,(GEN)x[3]); break; @@ -1075,10 +1087,10 @@ gaffsg(long s, GEN x) gaffsg(s,(GEN)x[1]); gaffsg(1,(GEN)x[2]); break; 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; - default: err(operf,"",t_INT,typ(x)); + default: err(operf,"",stoi(s),x); } } @@ -1091,7 +1103,8 @@ gaffsg(long s, GEN x) void 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; @@ -1135,10 +1148,10 @@ gaffect(GEN x, GEN y) case t_PADIC: if (!signe(x)) { padicaff0(y); break; } - l=avma; + av=avma; setvalp(y, pvaluation(x,(GEN)y[2],&p1)); modiiz(p1,(GEN)y[3],(GEN)y[4]); - avma=l; break; + avma=av; break; case t_QUAD: gaffect(x,(GEN)y[2]); gaffsg(0,(GEN)y[3]); break; @@ -1146,7 +1159,7 @@ gaffect(GEN x, GEN y) case t_POLMOD: gaffect(x,(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } break; @@ -1164,9 +1177,9 @@ gaffect(GEN x, GEN y) case t_INT: case t_INTMOD: case t_FRAC: 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; @@ -1175,13 +1188,13 @@ gaffect(GEN x, GEN y) { case t_INTMOD: 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; case t_POLMOD: gaffect(x,(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } break; @@ -1190,7 +1203,7 @@ gaffect(GEN x, GEN y) { case t_INT: if (! mpdivis((GEN)x[1],(GEN)x[2],y)) - err(operi,"",tx,ty); + err(operi,"",x,y); break; case t_REAL: @@ -1222,7 +1235,7 @@ gaffect(GEN x, GEN y) gaffect(x,(GEN)y[2]); gaffsg(0,(GEN)y[3]); break; case t_POLMOD: gaffect(x,(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } break; @@ -1230,7 +1243,7 @@ gaffect(GEN x, GEN y) switch(ty) { 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; case t_REAL: @@ -1257,7 +1270,7 @@ gaffect(GEN x, GEN y) gaffect(x,(GEN)y[2]); gaffsg(0,(GEN)y[3]); break; case t_POLMOD: gaffect(x,(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } break; @@ -1266,7 +1279,7 @@ gaffect(GEN x, GEN y) { case t_INT: case t_REAL: case t_INTMOD: 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; case t_COMPLEX: @@ -1277,7 +1290,7 @@ gaffect(GEN x, GEN y) case t_POLMOD: gaffect(x,(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } break; @@ -1285,22 +1298,22 @@ gaffect(GEN x, GEN y) switch(ty) { case t_INTMOD: - if (valp(x)<0) err(operi,"",tx,ty); + if (valp(x)<0) err(operi,"",x,y); av=avma; v = pvaluation((GEN)y[1],(GEN)x[2],&p1); 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; 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]); setvalp(y,valp(x)); break; case t_POLMOD: gaffect(x,(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } break; @@ -1309,7 +1322,7 @@ gaffect(GEN x, GEN y) { case t_INT: case t_INTMOD: case t_FRAC: 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; case t_REAL: @@ -1322,28 +1335,28 @@ gaffect(GEN x, GEN y) } else { - if (!gcmp0((GEN)x[3])) err(operi,"",tx,ty); + if (!gcmp0((GEN)x[3])) err(operi,"",x,y); gaffect((GEN)x[2],y); } break; 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[3],(GEN)y[3]); break; case t_POLMOD: gaffect(x,(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } break; case t_POLMOD: - if (ty!=t_POLMOD) err(operf,"",tx,ty); - if (! gdivise((GEN)x[1],(GEN)y[1])) err(operi,"",tx,ty); + if (ty!=t_POLMOD) err(operf,"",x,y); + if (! gdivise((GEN)x[1],(GEN)y[1])) err(operi,"",x,y); gmodz((GEN)x[2],(GEN)y[1],(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } return; } @@ -1373,34 +1386,31 @@ gaffect(GEN x, GEN y) case t_RFRAC: case t_RFRACN: gaffect(x,(GEN)y[1]); gaffsg(1,(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } return; } if (is_const_t(ty)) { -#define initial_value(ep) ((ep)+1) - if (tx == t_POL) { - entree *var = varentries[ordvar[varn(x)]]; - /* Is a bound expression, thus should not loop: */ - if (var && var->value != (void*)initial_value(var)) { - gaffect(geval(x),y); - return; - } - } else if (is_rfrac_t(tx)) { - GEN num = (GEN)x[1], den = (GEN)x[2]; - entree *varnum = varentries[ordvar[varn(num)]]; - entree *varden = varentries[ordvar[varn(den)]]; - - /* Are bound expressions, thus should not loop: */ - if (varnum && varnum->value != (void*)initial_value(varnum) - && varden && varden->value != (void*)initial_value(varden)) { - gaffect(geval(x),y); - return; - } + entree *varnum, *varden; + long vnum, vden; + GEN num, den; + if (tx == t_POL) { + vnum = varn(x); varnum = varentries[ordvar[vnum]]; + if (varnum) { + x = geval(x); tx = typ(x); + if (tx != t_POL || varn(x) != vnum) { gaffect(x, y); return; } + } + } else if (is_rfrac_t(tx)) { + num = (GEN)x[1]; vnum = gvar(num); varnum = varentries[ordvar[vnum]]; + den = (GEN)x[2]; vden = gvar(den); varden = varentries[ordvar[vden]]; + if (varnum && varden) { + vnum = min(vnum, vden); + x = geval(x); tx = typ(x); + if (!is_rfrac_t(tx) || gvar(x) != vnum) { gaffect(x, y); return; } } -#undef initial_value - err(operf,"",tx,ty); + } + err(operf,"",x,y); } switch(tx) @@ -1410,10 +1420,10 @@ gaffect(GEN x, GEN y) switch(ty) { 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) { - 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; iv) err(operf,"",tx,ty); + vy=varn(y); if (vy>v) err(operf,"",x,y); if (!signe(x)) { gaffsg(0,y); return; } if (vy==v) { @@ -1452,13 +1462,13 @@ gaffect(GEN x, GEN y) case t_RFRAC: case t_RFRACN: gaffect(x,(GEN)y[1]); gaffsg(1,(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } break; case t_SER: - if (ty!=t_SER) err(operf,"",tx,ty); - v=varn(x); vy=varn(y); if (vy>v) err(operf,"",tx,ty); + if (ty!=t_SER) err(operf,"",x,y); + v=varn(x); vy=varn(y); if (vy>v) err(operf,"",x,y); if (vy==v) { y[1]=x[1]; k=lx; if (k>ly) k=ly; @@ -1480,7 +1490,7 @@ gaffect(GEN x, GEN y) switch(ty) { case t_POL: case t_VEC: case t_COL: case t_MAT: - err(operf,"",tx,ty); + err(operf,"",x,y); case t_POLMOD: av=avma; p1=ginvmod((GEN)x[2],(GEN)y[1]); @@ -1503,16 +1513,16 @@ gaffect(GEN x, GEN y) gaffect((GEN)x[1],(GEN)y[1]); gaffect((GEN)x[2],(GEN)y[2]); break; - default: err(operf,"",tx,ty); + default: err(operf,"",x,y); } break; 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