=================================================================== RCS file: /home/cvs/OpenXM_contrib/pari-2.2/src/basemath/Attic/base5.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/base5.c 2001/10/02 11:17:02 1.1 +++ OpenXM_contrib/pari-2.2/src/basemath/Attic/base5.c 2002/09/11 07:26:49 1.2 @@ -1,4 +1,4 @@ -/* $Id: base5.c,v 1.1 2001/10/02 11:17:02 noro Exp $ +/* $Id: base5.c,v 1.2 2002/09/11 07:26:49 noro Exp $ Copyright (C) 2000 The PARI group. @@ -20,23 +20,23 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, /* */ /*******************************************************************/ #include "pari.h" -GEN mat_to_vecpol(GEN x, long v); +extern GEN mul_content(GEN cx, GEN cy); +extern long polegal_spec(GEN x, GEN y); +extern GEN mulmat_pol(GEN A, GEN x); GEN matbasistoalg(GEN nf,GEN x) { - long i,j,lx,li; - GEN p1,z; + long i, j, li, lx = lg(x); + GEN p1, z = cgetg(lx,t_MAT); - if (typ(x)!=t_MAT) - err(talker,"argument must be a matrix in matbasistoalg"); - lx=lg(x); z=cgetg(lx,t_MAT); if (lx==1) return z; - - li=lg(x[1]); + if (typ(x) != t_MAT) err(talker,"argument must be a matrix in matbasistoalg"); + if (lx == 1) return z; + li = lg(x[1]); for (j=1; j=vnf) + if (vpol >= vnf) err(talker,"main variable must be of higher priority in rnfinitalg"); RES=cgetg(12,t_VEC); RES[1]=(long)pol; - m=degpol(nf[1]); degabs=n*m; + m = degpol(nf[1]); degabs=n*m; r1 = nf_get_r1(nf); r2 = (m-r1) >> 1; sig=cgetg(r1+r2+1,t_VEC); RES[2]=(long)sig; rac=(GEN)nf[6]; liftpol=lift(pol); @@ -179,10 +165,11 @@ rnfinitalg(GEN nf,GEN pol,long prec) RES[7]=(long)bas; RES[8]=linvmat(p2); - f2=idealdiv(nf,discsr(pol),(GEN)p1[3]); - fac=idealfactor(nf,f2); - fac1=(GEN)fac[1]; fac2=(GEN)fac[2]; lfac=lg(fac1)-1; - f=idmat(m); + f2 = idealdiv(nf, discsr(pol), (GEN)p1[3]); + fac = idealfactor(nf,f2); + fac1 = (GEN)fac[1]; + fac2 = (GEN)fac[2]; lfac = lg(fac1)-1; + f = idmat(m); for (i=1; i<=lfac; i++) { if (mpodd((GEN)fac2[i])) err(bugparier,"rnfinitalg (odd exponent)"); @@ -198,26 +185,26 @@ rnfinitalg(GEN nf,GEN pol,long prec) p4=cgetg(degabs+1,t_MAT); for (i=1; i<=n; i++) { /* removing denominators speeds up multiplication */ - GEN cop3,com, om = rnfelementreltoabs(RES,gmael(bas,1,i)); + GEN c, cop3,com, om = rnfelementreltoabs(RES,gmael(bas,1,i)); if (DEBUGLEVEL>1) msgtimer("i = %ld",i); - com = content(om); om = gdiv(om,com); + om = primitive_part(om, &com); id=gmael(bas,2,i); for (j=1; j<=m; j++) { - p5=cgetg(degabs+1,t_COL); p4[(i-1)*m+j]=(long)p5; - p1=gmul((GEN)nf[7],(GEN)id[j]); - p3 = gsubst(p1,varn(nf[1]), (GEN)p2[2]); - cop3 = content(p3); p3 = gdiv(p3,cop3); - p3 = gmul(gmul(com,cop3), lift_intern(gmul(om,p3))); + p1 = gmul((GEN)nf[7],(GEN)id[j]); + p3 = gsubst(p1, vnf, (GEN)p2[2]); + p3 = primitive_part(p3, &cop3); + c = mul_content(cop3, com); - for (k=1; k1) msgtimer("p4"); - p3 = denom(p4); - p4 = hnfmodid(gmul(p3,p4), p3); + p4 = Q_remove_denom(p4, &p3); + if (p3) p4 = hnfmodid(p4, p3); else p4 = idmat(degabs); if (DEBUGLEVEL>1) msgtimer("hnfmod"); for (j=degabs-1; j>0; j--) if (cmpis(gcoeff(p4,j,j),2) > 0) @@ -228,7 +215,7 @@ rnfinitalg(GEN nf,GEN pol,long prec) for (i=1; i<=j; i++) coeff(p4,i,k)=lsubii(gcoeff(p4,i,k),gcoeff(p4,i,j)); } - p4 = gdiv(p4,p3); + if (p3) p4 = gdiv(p4,p3); p2[4]=(long)mat_to_vecpol(p4,vpol); p2[5]=linvmat(p4); return gerepilecopy(av,RES); @@ -237,7 +224,8 @@ rnfinitalg(GEN nf,GEN pol,long prec) GEN rnfbasistoalg(GEN rnf,GEN x) { - long tx=typ(x),lx=lg(x),av=avma,tetpil,i,n; + long tx=typ(x), lx=lg(x), i, n; + gpmem_t av=avma, tetpil; GEN p1,z,nf; checkrnf(rnf); nf=(GEN)rnf[10]; @@ -269,8 +257,6 @@ rnfbasistoalg(GEN rnf,GEN x) } } -extern long polegal_spec(GEN x, GEN y); - /* assume x is a t_POLMOD */ GEN lift_to_pol(GEN x) @@ -279,12 +265,11 @@ lift_to_pol(GEN x) return (typ(y) != t_POL)? gtopoly(y,varn(x[1])): y; } -extern GEN mulmat_pol(GEN A, GEN x); - GEN rnfalgtobasis(GEN rnf,GEN x) { - long av=avma,tx=typ(x), i,lx; + long tx=typ(x), i, lx; + gpmem_t av=avma; GEN z; checkrnf(rnf); @@ -300,7 +285,7 @@ rnfalgtobasis(GEN rnf,GEN x) err(talker,"not the same number field in rnfalgtobasis"); x = lift_to_pol(x); /* fall through */ case t_POL: - { /* cf algtobasis_intern */ + { /* cf algtobasis_i */ GEN P = (GEN)rnf[1]; long N = degpol(P); if (degpol(x) >= N) x = gres(x,P); @@ -310,59 +295,100 @@ rnfalgtobasis(GEN rnf,GEN x) return gscalcol(x, degpol(rnf[1])); } +GEN +_checkrnfeq(GEN x) +{ + if (typ(x) == t_VEC) + switch(lg(x)) + { + case 12: /* checkrnf(x); */ return (GEN)x[11]; + case 6: /* rnf[11]. FIXME: change the rnf struct */ + case 4: return x; + } + return NULL; +} + +GEN +checkrnfeq(GEN x) +{ + x = _checkrnfeq(x); + if (!x) err(talker,"please apply rnfequation(,,1)"); + return x; +} + +GEN +eltreltoabs(GEN rnfeq, GEN x) +{ + long i, k, va; + gpmem_t av = avma; + GEN polabs, teta, alpha, s; + + rnfeq = checkrnfeq(rnfeq); + polabs= (GEN)rnfeq[1]; + alpha = (GEN)rnfeq[2]; + k = itos((GEN)rnfeq[3]); + + va = varn(polabs); + if (gvar(x) > va) x = scalarpol(x,va); + /* Mod(X + k alpha, polabs(X)), alpha root of the polynomial defining base */ + teta = gmodulcp(gsub(polx[va], gmulsg(k,lift_intern(alpha))), polabs); + s = gzero; + for (i=lgef(x)-1; i>1; i--) + { + GEN c = (GEN)x[i]; + long tc = typ(c); + switch(tc) + { + case t_POLMOD: c = (GEN)c[2]; /* fall through */ + case t_POL: c = poleval(c, alpha); break; + default: + if (!is_const_t(tc)) err(talker, "incorrect data in eltreltoabs"); + } + s = gadd(c, gmul(teta,s)); + } + return gerepileupto(av,s); +} + /* x doit etre un polymod ou un polynome ou un vecteur de tels objets... */ GEN rnfelementreltoabs(GEN rnf,GEN x) { - long av=avma,tx,i,lx,va,tp3; - GEN z,p1,p2,p3,polabs,teta,alpha,s,k; + long i, lx, tx = typ(x); + GEN z; - checkrnf(rnf); tx=typ(x); lx=lg(x); va=varn((GEN)rnf[1]); switch(tx) { case t_VEC: case t_COL: case t_MAT: - z=cgetg(lx,tx); - for (i=1; i va) x = scalarpol(x,va); - p1=(GEN)rnf[11]; polabs=(GEN)p1[1]; alpha=(GEN)p1[2]; k=(GEN)p1[3]; - if (typ(alpha) == t_INT) - teta=gmodulcp(gsub(polx[va],gmul(k,alpha)),polabs); - else - teta=gmodulcp(gsub(polx[va],gmul(k,(GEN)alpha[2])),polabs); - s=gzero; - for (i=lgef(x)-1; i>1; i--) - { - p3=(GEN)x[i]; tp3=typ(p3); - if (is_const_t(tp3)) p2 = p3; - else - switch(tp3) - { - case t_POLMOD: - p3 = (GEN)p3[2]; /* fall through */ - case t_POL: - p2 = poleval(p3,alpha); - break; - default: err(talker, "incorrect data in rnfelementreltoabs"); - return NULL; /* not reached */ - } - s=gadd(p2,gmul(teta,s)); - } - return gerepileupto(av,s); - + case t_POLMOD: x = lift_to_pol(x); /* fall through */ + case t_POL: return eltreltoabs(rnf, x); default: return gcopy(x); } } +/* assume x,T,pol t_POL. T defines base field, pol defines rnf over T. + * x an absolute element of the extension */ GEN +get_theta_abstorel(GEN T, GEN pol, GEN k) +{ + return gmodulcp(gadd(polx[varn(pol)], + gmul(k, gmodulcp(polx[varn(T)],T))), pol); +} +GEN +eltabstorel(GEN x, GEN T, GEN pol, GEN k) +{ + return poleval(x, get_theta_abstorel(T,pol,k)); +} + +GEN rnfelementabstorel(GEN rnf,GEN x) { - long av=avma,tx,i,lx; - GEN z,p1,s,tetap,k,nf; + long tx, i, lx; + gpmem_t av=avma; + GEN z,k,nf,T; checkrnf(rnf); tx=typ(x); lx=lg(x); switch(tx) @@ -373,14 +399,11 @@ rnfelementabstorel(GEN rnf,GEN x) return z; case t_POLMOD: - x=lift_to_pol(x); /* fall through */ + x = lift_to_pol(x); /* fall through */ case t_POL: - p1=(GEN)rnf[11]; k=(GEN)p1[3]; nf=(GEN)rnf[10]; - tetap=gmodulcp(gadd(polx[varn(rnf[1])], - gmul(k,gmodulcp(polx[varn(nf[1])],(GEN)nf[1]))),(GEN)rnf[1]); - s=gzero; - for (i=lgef(x)-1; i>1; i--) s=gadd((GEN)x[i],gmul(tetap,s)); - return gerepileupto(av,s); + k = (GEN)rnf[11]; k = (GEN)k[3]; + nf = (GEN)rnf[10]; T = (GEN)nf[1]; + return gerepileupto(av, eltabstorel(x,T,(GEN)rnf[1],k)); default: return gcopy(x); } @@ -414,7 +437,7 @@ rnfelementup(GEN rnf,GEN x) GEN rnfelementdown(GEN rnf,GEN x) { - ulong av = avma; + gpmem_t av = avma; long i,lx,tx; GEN p1,z; @@ -445,43 +468,47 @@ rnfelementdown(GEN rnf,GEN x) static GEN rnfprincipaltohermite(GEN rnf,GEN x) { - long av=avma,tetpil; + gpmem_t av = avma; GEN nf,bas,bas1,p1,z; - x=rnfbasistoalg(rnf,x); nf=(GEN)rnf[10]; - bas=(GEN)rnf[7]; bas1=(GEN)bas[1]; - p1=rnfalgtobasis(rnf,gmul(x,gmodulcp(bas1,(GEN)rnf[1]))); - z=cgetg(3,t_VEC); z[2]=bas[2]; - settyp(p1,t_MAT); z[1]=(long)matalgtobasis(nf,p1); + x = rnfbasistoalg(rnf,x); nf = (GEN)rnf[10]; + bas = (GEN)rnf[7]; bas1 = (GEN)bas[1]; + p1 = rnfalgtobasis(rnf, gmul(x,gmodulcp(bas1,(GEN)rnf[1]))); + settyp(p1,t_MAT); - tetpil=avma; - return gerepile(av,tetpil,nfhermite(nf,z)); + z = cgetg(3,t_VEC); + z[1] = (long)p1; + z[2] = bas[2]; + return gerepileupto(av, nfhermite(nf,z)); } +static GEN +rnfid(long n, long m) +{ + return idmat_intern(n, gscalcol_i(gun,m), zerocol(m)); +} + GEN rnfidealhermite(GEN rnf,GEN x) { - long tx=typ(x),lx=lg(x),av=avma,tetpil,i,j,n,m; - GEN z,p1,p2,x1,x2,x1j,nf,bas,unnf,zeronf; + long tx=typ(x), lx=lg(x), i, j, n, m; + gpmem_t av=avma, tetpil; + GEN z,p1,p2,x1,x2,x1j,nf,bas; checkrnf(rnf); - n=degpol(rnf[1]); nf=(GEN)rnf[10]; bas=(GEN)rnf[7]; + n = degpol(rnf[1]); nf = (GEN)rnf[10]; bas = (GEN)rnf[7]; switch(tx) { - case t_INT: case t_FRAC: case t_FRACN: z=cgetg(3,t_VEC); - m=degpol(nf[1]); zeronf=gscalcol_i(gzero,m); unnf=gscalcol_i(gun,m); - p1=cgetg(n+1,t_MAT); z[1]=(long)p1; - for (j=1; j<=n; j++) - { - p2=cgetg(n+1,t_COL); p1[j]=(long)p2; - for (i=1; i<=n; i++) p2[i]=(i==j)?(long)unnf:(long)zeronf; - } - z[2]=lmul(x,(GEN)bas[2]); return z; + case t_INT: case t_FRAC: case t_FRACN: + m = degpol(nf[1]); + z = cgetg(3,t_VEC); + z[1] = (long)rnfid(n, m); + z[2] = lmul(x, (GEN)bas[2]); return z; case t_POLMOD: case t_POL: - p1=rnfalgtobasis(rnf,x); tetpil=avma; - return gerepile(av,tetpil,rnfprincipaltohermite(rnf,p1)); + p1 = rnfalgtobasis(rnf,x); + return gerepileupto(av, rnfprincipaltohermite(rnf,p1)); case t_VEC: switch(lx) @@ -535,61 +562,92 @@ rnfidealhermite(GEN rnf,GEN x) return NULL; /* not reached */ } +static GEN +prodid(GEN nf, GEN I) +{ + long i, l = lg(I); + GEN z; + + if (l == 1) return idmat(degpol(nf[1])); + z = (GEN)I[1]; + for (i=2; i vector of 2 generators (relative polymods) */ GEN rnfidealtwoelement(GEN rnf,GEN x) { - long av=avma,tetpil,j; + gpmem_t av = avma; + long j; GEN p1,p2,p3,res,polabs,nfabs,z; checkrnf(rnf); res=(GEN)rnf[11]; polabs=(GEN)res[1]; - nfabs=cgetg(10,t_VEC); nfabs[1]=(long)polabs; - for (j=2; j<=9; j++) nfabs[j]=zero; - nfabs[7]=(long)lift((GEN)res[4]); nfabs[8]=res[5]; - p1=rnfidealreltoabs(rnf,x); - p2=ideal_two_elt(nfabs,p1); - p3=rnfelementabstorel(rnf,gmul((GEN)res[4],(GEN)p2[2])); - tetpil=avma; z=cgetg(3,t_VEC); z[1]=lcopy((GEN)p2[1]); - z[2]=(long)rnfalgtobasis(rnf,p3); - return gerepile(av,tetpil,z); + nfabs = cgetg(10,t_VEC); + nfabs[1] = (long)polabs; + for (j=2; j<=9; j++) nfabs[j] = zero; + nfabs[7] = (long)lift((GEN)res[4]); + nfabs[8] = res[5]; + p1 = rnfidealreltoabs(rnf,x); + p2 = ideal_two_elt(nfabs,p1); + p3 = rnfelementabstorel(rnf,gmul((GEN)res[4],(GEN)p2[2])); + z = cgetg(3,t_VEC); + z[1] = lcopy((GEN)p2[1]); + z[2] = (long)rnfalgtobasis(rnf,p3); + return gerepileupto(av, z); } GEN rnfidealmul(GEN rnf,GEN x,GEN y) /* x et y sous HNF relative uniquement */ { - long av=avma,tetpil,i,j,n; - GEN z,nf,x1,x2,p1,p2,p3,p4,p5,res; + long i, j, n; + gpmem_t av = avma; + GEN z,nf,x1,x2,p1,p2,p3,p4,res; - z=rnfidealtwoelement(rnf,y); - nf=(GEN)rnf[10]; n=degpol(rnf[1]); - x=rnfidealhermite(rnf,x); - x1=gmodulcp(gmul(gmael(rnf,7,1),matbasistoalg(nf,(GEN)x[1])),(GEN) rnf[1]); - x2=(GEN)x[2]; p1=gmul((GEN)z[1],(GEN)x[1]); - p2=lift_intern(gmul(rnfbasistoalg(rnf,(GEN)z[2]),x1)); - p3=cgetg(n+1,t_MAT); + z = rnfidealtwoelement(rnf,y); + nf = (GEN)rnf[10]; n = degpol(rnf[1]); + x = rnfidealhermite(rnf,x); + x1 = gmodulcp(gmul(gmael(rnf,7,1), matbasistoalg(nf,(GEN)x[1])),(GEN) rnf[1]); + x2 = (GEN)x[2]; + p1 = gmul((GEN)z[1],(GEN)x[1]); + p2 = lift_intern(gmul(rnfbasistoalg(rnf,(GEN)z[2]),x1)); + p3 = cgetg(n+1,t_MAT); for (j=1; j<=n; j++) { - p4=cgetg(n+1,t_COL); p3[j]=(long)p4; p5=(GEN)p2[j]; - for (i=1; i<=n; i++) - p4[i]=(long)algtobasis(nf,truecoeff((GEN)p5,i-1)); + p4 = pol_to_vec((GEN)p2[j], n); p3[j] = (long)p4; + for (i=1; i<=n; i++) p4[i] = (long)algtobasis(nf,(GEN)p4[i]); } - res=cgetg(3,t_VEC); - res[1]=(long)concatsp(p1,p3); - res[2]=(long)concatsp(x2,x2); - tetpil=avma; return gerepile(av,tetpil,nfhermite(nf,res)); -} - -/*********************************************************************/ -/** **/ -/** LIBRARY FOR POLYNOMIALS WITH COEFFS. IN Z_K/P **/ -/** An element in Z_K/P is a t_COL with degree(nf[1]) components. **/ -/** These are integers modulo the prime p under prime ideal P **/ -/** (only f(P/p) elements are non zero). These components are **/ -/** given on the integer basis of K. **/ -/** **/ -/*********************************************************************/ - -/* K.B: What follows is not meant to work (yet?) */ - -GEN -polnfmulscal(GEN nf,GEN s,GEN x) -{ - long i,lx=lgef(x); - GEN z; - - if (lx<3) return gcopy(x); - if (gcmp0(s)) - { - z=cgetg(2,t_POL); z[1]=evallgef(2) | evalvarn(varn(x)); - return z; - } - z=cgetg(lx,t_POL); z[1]=x[1]; - for (i=2; i=2; d--) - { - z[d]=x[d+ly-3]; - for (i=d; i