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; |
} |
} |
|
|
|
|
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)]; |
} |
} |
|
|
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) |
{ |
{ |
|
|
int |
int |
gcmp_1(GEN x) |
gcmp_1(GEN x) |
{ |
{ |
|
gpmem_t av; |
long l,y; |
long l,y; |
GEN p1; |
GEN p1; |
|
|
|
|
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]); |
|
|
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]); |
|
|
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); |
} |
} |
} |
} |
|
|
|
|
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); |
|
|
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)); |
|
|
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"); |