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); |
|
|
|
|
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)); |
} |
} |
|
|
|
|
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; |
|
|
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 |
|
|
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)) |
|
|
|
|
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: |
|
|
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: |
|
|
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; |
} |
} |
|
|
|
|
} |
} |
|
|
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]); |
|
|
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 */ |
} |
} |