/*******************************************************************/ /* */ /* BASIC NF OPERATIONS */ /* */ /*******************************************************************/ /* $Id: base3.c,v 1.1.1.1 1999/09/16 13:47:20 karim Exp $ */ #include "pari.h" int ker_trivial_mod_p(GEN x, GEN p); long ideal_is_zk(GEN ideal,long N); GEN idealaddtoone_i(GEN nf, GEN x, GEN y); /*******************************************************************/ /* */ /* OPERATIONS OVER NUMBER FIELD ELEMENTS. */ /* These are always represented as column vectors over the */ /* integral basis nf[7] */ /* */ /*******************************************************************/ int isnfscalar(GEN x) { long lx=lg(x),i; for (i=2; i 1; i--) if (!gegal((GEN)x[i],(GEN)y[i])) return 0; return 1; } GEN basistoalg(GEN nf, GEN x) { long tx=typ(x),lx=lg(x),i; GEN z; nf=checknf(nf); switch(tx) { case t_COL: for (i=1; i= N) x=gres(x,(GEN)nf[1]); return gmul((GEN)nf[8], pol_to_vec(x, N)); } z = cgetg(N+1,t_COL); z[1]=lcopy(x); for (i=2; i<=N; i++) z[i]=zero; return z; } GEN algtobasis(GEN nf, GEN x) { long tx=typ(x),lx=lg(x),av=avma,i,N; GEN z; nf=checknf(nf); switch(tx) { case t_VEC: case t_COL: case t_MAT: z=cgetg(lx,tx); for (i=1; i 0)? (long)_0 : (long)_1; avma = av; setlg(vecsign,j); return vecsign; } /* For internal use. Reduce x modulo ideal. We want a non-zero result */ GEN nfreducemodideal(GEN nf,GEN x,GEN ideal) { long N = lg(x)-1, do_copy = 1, i; GEN p1,q; ideal=idealhermite(nf,ideal); for (i=N; i>=1; i--) { p1=gcoeff(ideal,i,i); q=gdivround((GEN)x[i],p1); if (signe(q)) { x=gsub(x,gmul(q,(GEN)ideal[i])); do_copy=0; } } if (gcmp0(x)) return (GEN) ideal[1]; return do_copy? gcopy(x) : x; } /* a usage interne...Reduction de la colonne x modulo la matrice y inversible utilisant LLL */ GEN lllreducemodmatrix(GEN x,GEN y) { long av = avma,tetpil; GEN z = gmul(y,lllint(y)); z = gneg(gmul(z, ground(gauss(z,x)))); tetpil=avma; return gerepile(av,tetpil,gadd(x,z)); } /* Reduce column x modulo y in HNF */ static GEN colreducemodmat(GEN x,GEN y) { long av = avma, i; GEN q; for (i=lg(x)-1; i>=1; i--) { q = gdivround((GEN)x[i], gcoeff(y,i,i)); if (signe(q)) { q = gneg(q); x = gadd(x, gmul(q,(GEN)y[i])); } } return avma==av? gcopy(x): gerepileupto(av,x); } /* for internal use...Reduce matrix x modulo matrix y */ GEN reducemodmatrix(GEN x, GEN y) { long i, lx = lg(x); GEN z = cgetg(lx,t_MAT); if (DEBUGLEVEL>=8) { fprintferr("entering reducemodmatrix; avma-bot = %ld\n",avma-bot); flusherr(); } y = hnfmod(y,detint(y)); for (i=1; i=8) { fprintferr("%ld ",i); flusherr(); } z[i]=(long)colreducemodmat((GEN)x[i],y); } if(DEBUGLEVEL>=8) { fprintferr("\n"); flusherr(); } return z; } /* compute elt = x mod idele, with sign(elt) = sign(x) at arch */ GEN nfreducemodidele(GEN nf,GEN x,GEN idele,GEN sarch) { GEN p1,p2,arch,gen; long nba,i; if (gcmp0(x)) return gcopy(x); if (!sarch || typ(idele)!=t_VEC || lg(idele)!=3) return nfreducemodideal(nf,x,idele); arch =(GEN)idele[2]; nba = lg(sarch[1]); gen =(GEN)sarch[2]; p1 = nfreducemodideal(nf,x,(GEN)idele[1]); p2 = gadd(zsigne(nf,p1,arch), zsigne(nf,x,arch)); p2 = lift_intern(gmul((GEN)sarch[3],p2)); for (i=1; i 0)? x: p1; } GEN element_powmodideal(GEN nf,GEN x,GEN k,GEN ideal) { GEN y = gscalcol_i(gun,lgef(nf[1])-3); for(;;) { if (mpodd(k)) y=element_mulmodideal(nf,x,y,ideal); k=shifti(k,-1); if (!signe(k)) return y; x = element_sqrmodideal(nf,x,ideal); } } GEN element_powmodidele(GEN nf,GEN x,GEN k,GEN idele,GEN sarch) { GEN y = gscalcol_i(gun,lgef(nf[1])-3); for(;;) { if (mpodd(k)) y=element_mulmodidele(nf,x,y,idele,sarch); k=shifti(k,-1); if (!signe(k)) return y; x = element_sqrmodidele(nf,x,idele,sarch); } } /* given 2 integral ideals x, y in HNF s.t x|y|x^2, compute the quotient (1+x)/(1+y) in the form [[cyc],[gen],ux^-1]. */ static GEN zidealij(GEN x, GEN y) { GEN p1,p2,p3,p4,d,z,x1; long j,N,c; if(DEBUGLEVEL>=6) {fprintferr("entree dans zidealij; avma-bot = %ld\n",avma-bot); flusherr();} x1 = ginv(x); p1 = gmul(x1,y); if(DEBUGLEVEL>=6) {fprintferr("p1 = y/x; avma-bot = %ld\n",avma-bot); flusherr();} p2 = smith2(p1); if(DEBUGLEVEL>=6) {fprintferr("p2 = smith2(p1); avma-bot = %ld\n",avma-bot); flusherr();} p3 = ginv((GEN)p2[1]); if(DEBUGLEVEL>=6) {fprintferr("p3 = 1/p2[1]; avma-bot = %ld\n",avma-bot); flusherr();} p3 = reducemodmatrix(p3,p1); p3 = gmul(x,p3); N=lg(p3)-1; if(DEBUGLEVEL>=6) {fprintferr("p3 = x.p3 mod p1; avma-bot = %ld\n",avma-bot); flusherr();} for (j=1; j<=N; j++) coeff(p3,1,j)=laddsi(1,gcoeff(p3,1,j)); p4 = smithclean(p2); d=(GEN)p4[3]; z=cgetg(4,t_VEC); c=lg(d); p1=cgetg(c,t_VEC); /* transform p3 in a vector (gen) */ p3[0] = evaltyp(t_VEC) | evallg(c); for (j=1; j= 0) err(talker,"module too large in Fp_shanks"); lbaby=itos(p1)+1; smalltable=cgetg(lbaby+1,t_VEC); g0inv = mpinvmod(g0, p); p1 = x; c = 3 * lgefint(p); for (i=1;;i++) { av1 = avma; if (is_pm1(p1)) { avma=av; return stoi(i-1); } smalltable[i]=(long)p1; if (i==lbaby) break; new_chunk(c); p1 = mulii(p1,g0inv); avma = av1; p1 = resii(p1, p); } giant = resii(mulii(x, mpinvmod(p1,p)), p); p1=cgetg(lbaby+1,t_VEC); perm = gen_sort(smalltable, cmp_IND | cmp_C, cmpii); for (i=1; i<=lbaby; i++) p1[i]=smalltable[perm[i]]; smalltable=p1; p1=giant; av1 = avma; lim=stack_lim(av1,2); for (k=1;;k++) { i=tablesearch(smalltable,p1,cmpii); if (i) { v=addis(mulss(lbaby-1,k),perm[i]); return gerepileuptoint(av,addsi(-1,v)); } p1 = resii(mulii(p1,giant), p); if (low_stack(lim, stack_lim(av1,2))) { if(DEBUGMEM>1) err(warnmem,"Fp_shanks, k = %ld", k); p1 = gerepileuptoint(av1, p1); } } } /* smallest integer n such that g0^n=x modulo pr, assume g0 reduced */ /* TODO: should be done in F_(p^f), not in Z_k mod pr (done for f=1) */ GEN nfshanks(GEN nf,GEN x,GEN g0,GEN pr,GEN prhall) { long av=avma,av1,lim,lbaby,i,k, f = itos((GEN)pr[4]); GEN p1,smalltable,giant,perm,v,g0inv,prh = (GEN)prhall[1]; GEN multab, p = (GEN)pr[1]; x = lift_intern(nfreducemodpr(nf,x,prhall)); if (f == 1) return gerepileuptoint(av, Fp_shanks((GEN)x[1],(GEN)g0[1],p)); p1 = addsi(-1, gpowgs(p,f)); if (isnfscalar(x)) { x = (GEN)x[1]; if (gcmp1(x) || egalii((GEN)pr[1], gdeux)) { avma = av; return gzero; } if (egalii(x, p1)) return gerepileuptoint(av,shifti(p1,-1)); v = divii(p1, addsi(-1,p)); g0 = lift_intern((GEN)element_powmodpr(nf,g0,v,prhall)[1]); return gerepileuptoint(av, mulii(v, Fp_shanks(x,g0,p))); } p1 = racine(p1); if (cmpis(p1,LGBITS) >= 0) err(talker,"module too large in nfshanks"); lbaby=itos(p1)+1; smalltable=cgetg(lbaby+1,t_VEC); g0inv = lift_intern(element_invmodpr(nf,g0,prhall)); p1 = x; multab = get_multab(nf, g0inv); for (i=lg(multab)-1; i; i--) multab[i]=(long)Fp_vec_red((GEN)multab[i], p); for (i=1;;i++) { if (isnfscalar(p1) && gcmp1((GEN)p1[1])) { avma=av; return stoi(i-1); } smalltable[i]=(long)p1; if (i==lbaby) break; p1 = mul_matvec_mod_pr(multab,p1,prh); } giant=lift_intern(element_divmodpr(nf,x,p1,prhall)); p1=cgetg(lbaby+1,t_VEC); perm = gen_sort(smalltable, cmp_IND | cmp_C, cmp_vecint); for (i=1; i<=lbaby; i++) p1[i]=smalltable[perm[i]]; smalltable=p1; p1=giant; multab = get_multab(nf, giant); for (i=lg(multab)-1; i; i--) multab[i]=(long)Fp_vec_red((GEN)multab[i], p); av1 = avma; lim=stack_lim(av1,2); for (k=1;;k++) { i=tablesearch(smalltable,p1,cmp_vecint); if (i) { v=addis(mulss(lbaby-1,k),perm[i]); return gerepileuptoint(av,addsi(-1,v)); } p1 = mul_matvec_mod_pr(multab,p1,prh); if (low_stack(lim, stack_lim(av1,2))) { if(DEBUGMEM>1) err(warnmem,"nfshanks"); p1 = gerepileupto(av1, p1); } } } GEN znlog(GEN x, GEN g0) { long av=avma; GEN p = (GEN)g0[1]; if (typ(g0) != t_INTMOD) err(talker,"not an element of (Z/pZ)* in znlog"); switch(typ(x)) { case t_INT: break; default: x = gmul(x, gmodulsg(1,p)); if (typ(x) != t_INTMOD) err(talker,"not an element of (Z/pZ)* in znlog"); case t_INTMOD: x = (GEN)x[2]; break; } return gerepileuptoint(av, Fp_shanks(x,(GEN)g0[2],p)); } GEN dethnf(GEN mat) { long av,i,l = lg(mat); GEN s; if (l<3) return l<2? gun: icopy(gcoeff(mat,1,1)); av = avma; s = gcoeff(mat,1,1); for (i=2; i=4) { fprintferr("treating pr = %Z ^ %Z\n",pr,ep); flusherr(); } prh=prime_to_ideal(nf,pr); N=lg(prh)-1; f=itos((GEN)pr[4]); p=(GEN)pr[1]; pf_1 = addis(gpowgs(p,f), -1); v = zerocol(N); if (f==1) v[1]=gener(p)[2]; else { GEN prhall = cgetg(3,t_VEC); long psim; if (is_bigint(p)) err(talker,"prime too big in zprimestar"); psim = itos(p); list = (GEN)factor(pf_1)[1]; nbp=lg(list)-1; prhall[1]=(long)prh; prhall[2]=zero; for (n=psim; n>=0; n++) { m=n; for (i=1; i<=N; i++) if (!gcmp1(gcoeff(prh,i,i))) { v[i]=lstoi(m%psim); m/=psim; } for (j=1; j<=nbp; j++) { p1 = divii(pf_1,(GEN)list[j]); p1 = lift_intern(element_powmodpr(nf,v,p1,prhall)); if (isnfscalar(p1) && gcmp1((GEN)p1[1])) break; } if (j>nbp) break; } if (n < 0) err(talker,"prime too big in zprimestar"); } /* v generates (Z_K / pr)^* */ if(DEBUGLEVEL>=4) {fprintferr("v calcule\n");flusherr();} e = itos(ep); prk=(e==1)? pr: idealpow(nf,pr,ep); if(DEBUGLEVEL>=4) {fprintferr("prk calcule\n");flusherr();} g0 = v; if (x) { uv = idealaddtoone(nf,prk,idealdivexact(nf,x,prk)); g0 = makeprimetoideal(nf,x,uv,v); } if(DEBUGLEVEL>=4) {fprintferr("g0 calcule\n");flusherr();} list=cgetg(2,t_VEC); p1=cgetg(6,t_VEC); list[1]=(long)p1; p1[5]=un; p2=cgetg(2,t_VEC); p1[1]=(long)p2; p2[1]=(long)pf_1; p2=cgetg(2,t_VEC); p1[2]=(long)p2; p2[1]=(long)v; p2=cgetg(2,t_VEC); p1[3]=(long)p2; p2[1]=(long)g0; p2=cgetg(2,t_VEC); p1[4]=(long)p2; p2[1]=(long)zsigne(nf,g0,arch); if (e==1) { tetpil=avma; return gerepile(av,tetpil,gcopy(list)); } a=1; b=2; av1=avma; pra = prh; prb = (e==2)? prk: idealpow(nf,pr,gdeux); for(;;) { if(DEBUGLEVEL>=4) {fprintferr("on traite a = %ld, b = %ld\n",a,b); flusherr();} p1 = zidealij(pra,prb); newgen = dummycopy((GEN)p1[2]); p3 = cgetg(lg(newgen),t_VEC); if(DEBUGLEVEL>=4) {fprintferr("zidealij fait\n"); flusherr();} for (i=1; i5) fprintferr("zarchstar: r = %ld\n",r); p1 = gpuigs(stoi(rr),N); limr = (cmpis(p1,BIGINT) > 0)? BIGINT: p1[2]; limr = (limr-1)>>1; k = zk? rr: 1; /* to avoid 0 */ for ( ; k<=limr; k++) { long av1=avma, kk = k; GEN alpha = gzero; for (i=1; i<=N; i++) { lambda[i] = (kk+r)%rr - r; kk/=rr; if (lambda[i]) alpha = gadd(alpha, gmulsg(lambda[i],(GEN)bas[i])); } for (i=1; i<=nba; i++) alpha[i] = ladd((GEN)alpha[i], gun); p1 = (GEN)mat[lgmat]; for (i=1; i<=nba; i++) p1[i] = (gsigne((GEN)alpha[i]) > 0)? zero: un; if (ker_trivial_mod_p(mat, gdeux)) avma = av1; else { /* new vector indep. of previous ones */ avma = av1; alpha = gzero; for (i=1; i<=N; i++) if (lambda[i]) alpha = gadd(alpha, gmulsg(lambda[i],(GEN)x[i])); alpha[1] = ladd((GEN)alpha[1], gun); genarch[lgmat++] = (long)alpha; if (lgmat > nba) { GEN *gptr[2]; mat = ginv(mat); gptr[0]=&genarch; gptr[1]=&mat; gerepilemany(av,gptr,2); y[2]=(long)genarch; y[3]=(long)mat; return y; } setlg(mat,lgmat+1); } } } } /* Retourne la decomposition de a sur les nbgen generateurs successifs * contenus dans list_set et si index !=0 on ne fait ce calcul que pour * l'ideal premier correspondant a cet index en mettant a 0 les autres * composantes */ static GEN zinternallog(GEN nf,GEN list_set,long nbgen,GEN arch,GEN fa,GEN a,long index) { GEN prlist,ep,y,ainit,list,pr,prk,cyc,gen,psigne,p1,p2,p3; long av,nbp,cp,i,j,k; y = cgetg(nbgen+1,t_COL); cp=0; av=avma; prlist=(GEN)fa[1]; ep=(GEN)fa[2]; nbp=lg(ep)-1; i=typ(a); if (is_extscalar_t(i)) a = algtobasis(nf,a); if (DEBUGLEVEL>3) { fprintferr("entering zinternallog, "); flusherr(); if (DEBUGLEVEL>5) fprintferr("with a = %Z\n",a); } ainit = a; psigne = zsigne(nf,ainit,arch); for (k=1; k<=nbp; k++) { list=(GEN)list_set[k]; if (index && index!=k) { for (j=1; j5) { fprintferr("do nfshanks\n"); flusherr(); } a=ainit; p3=nfmodprinit(nf,pr); p3 = nfshanks(nf,a,(GEN)gen[1],pr,p3); } else { p3 = (GEN)a[1]; a[1] = laddsi(-1,(GEN)a[1]); p2 = gmul((GEN)p1[5],a); a[1] = (long)p3; if (lg(p2)!=lg(cyc)) err(bugparier,"zinternallog"); p3 = (GEN)p2[1]; } for(i=1;;) { p3 = modii(negi(p3), (GEN)cyc[i]); y[++cp] = lnegi(p3); if (signe(p3)) { if (mpodd((GEN)y[cp])) psigne = gadd(psigne,gmael(p1,4,i)); if (DEBUGLEVEL>5) fprintferr("do element_powmodideal\n"); p3 = element_powmodideal(nf,(GEN)gen[i],p3,prk); a = element_mulmodideal(nf,a,p3,prk); } i++; if (i==lg(cyc)) break; p3 = (GEN)p2[i]; } } } p1=lift_intern(gmul(gmael(list_set,nbp+1,3), psigne)); avma=av; for (i=1; i3) { fprintferr("leaving\n"); flusherr(); } for (i=1; i<=nbgen; i++) y[i] = licopy((GEN)y[i]); return y; } GEN compute_gen(GEN nf, GEN u1, GEN met, GEN gen, GEN module, long nbp, GEN sarch) { long i,j,s,nba, c = lg(met), lgen = lg(gen); GEN basecl=cgetg(c,t_VEC), unnf = gscalcol_i(gun, lgef(nf[1])-3); GEN arch,x,p1,p2,p3,p4,p5,generator; if (sarch) { arch = (GEN)module[2]; x = (GEN)module[1]; generator = (GEN)sarch[2]; nba = lg(generator)-1; } else { x = (typ(module) == t_MAT)? module: (GEN)module[1]; nba = 0; } for (j=1; j 0) op = + else { op = − p1 = negi(p1); } p1 = element_powmodidele(nf,(GEN)gen[i],p1,module,sarch); *op = *op==unnf? p1: element_mulmodidele(nf,*op,p1,module,sarch); } if (nbp) { p5=idealaddtoone_i(nf,minus,x); p4=element_div(nf,p5,minus); /* = minus^(-1) mod x */ p3=element_mulmodideal(nf,plus,p4,x); } else p3=unnf; if (nba) { /* correct so that sign(p3) == sign(plus/minus) */ p4=gadd(gadd(zsigne(nf,p3,arch), zsigne(nf,plus,arch)), zsigne(nf,minus,arch)); p2=lift_intern(gmul((GEN)sarch[3],p4)); for (i=1; i<=nba; i++) if (signe(p2[i])) p3=element_mul(nf,p3,(GEN)generator[i]); } basecl[j]=(long)p3; } return basecl; } /* Compute [[ideal,arch], [h,[cyc],[gen]], idealfact, [liste], U] gen not computed unless add_gen != 0 */ GEN zidealstarinitall(GEN nf, GEN ideal,long add_gen) { long av=avma,tetpil,i,j,k,nba,nbp,R1,nbgen,cp; GEN p1,p2,p3,p4,y,h,met,u1,u1u2,u1u2clean,fa,fa2,ep,x,arch,gen,list,sarch; nf = checknf(nf); R1=itos(gmael(nf,2,1)); if (typ(ideal)==t_VEC && lg(ideal)==3) { arch=(GEN)ideal[2]; ideal = (GEN)ideal[1]; i = typ(arch); if (!is_vec_t(i) || lg(arch) != R1+1) err(talker,"incorrect archimedean component in zidealstarinit"); for (nba=0,i=1; i<=R1; i++) if (signe(arch[i])) nba++; } else { arch=cgetg(R1+1,t_VEC); for (nba=0,i=1; i<=R1; i++) arch[i]=zero; } x = idealhermite(nf,ideal); if (!gcmp1(denom(x))) err(talker,"zidealstarinit needs an integral ideal. x =\n%Z\n",x); p1=cgetg(3,t_VEC); ideal=p1; p1[1]=(long)x; p1[2]=(long)arch; fa=idealfactor(nf,x); list=(GEN)fa[1]; ep=(GEN)fa[2]; nbp=lg(list)-1; fa2=cgetg(nbp+2,t_VEC); /* compute them */ gen = cgetg(1,t_VEC); p2 = (nbp==1)? (GEN)NULL: x; for (i=1; i<=nbp; i++) { p1 = zprimestar(nf,(GEN)list[i],(GEN)ep[i],p2,arch); fa2[i]=(long)p1; for (j=1; j=6) { fprintferr("entering element_powmodidele\n"); flusherr(); } p4 = element_powmodidele(nf,(GEN)p3[k],(GEN)p2[k],ideal,sarch); h[++cp] = lneg(zinternallog(nf,fa2,nbgen,arch,fa,p4,i)); coeff(h,cp,cp) = p2[k]; } } } for (j=1; j<=nba; j++) { h[++cp]=(long)zerocol(nbgen); coeff(h,cp,cp)=deux; } if (cp!=nbgen) err(talker,"bug in zidealstarinit"); u1u2 = smith2(h); u1u2clean = smithclean(u1u2); met=(GEN)u1u2clean[3]; if (add_gen) { u1 = reducemodmatrix(ginv((GEN)u1u2[1]),h); p1 = cgetg(4,t_VEC); p1[3] = (long)compute_gen(nf,u1,met,gen,ideal, nbp,sarch); } else p1 = cgetg(3,t_VEC); y = cgetg(6,t_VEC); y[1]=(long)ideal; y[2]=(long)p1; p1[1]=(long)dethnf(met); p1[2]=(long)mattodiagonal(met); y[3]=(long)fa; y[4]=(long)fa2; y[5] = u1u2clean[1]; tetpil=avma; return gerepile(av,tetpil,gcopy(y)); } GEN zidealstarinitgen(GEN nf, GEN ideal) { return zidealstarinitall(nf,ideal,1); } GEN zidealstarinit(GEN nf, GEN ideal) { return zidealstarinitall(nf,ideal,0); } GEN zidealstar(GEN nf, GEN ideal) { long av = avma,tetpil; GEN y = zidealstarinitall(nf,ideal,1); tetpil=avma; return gerepile(av,tetpil,gcopy((GEN)y[2])); } GEN idealstar0(GEN nf, GEN ideal,long flag) { switch(flag) { case 0: return zidealstar(nf,ideal); case 1: return zidealstarinit(nf,ideal); case 2: return zidealstarinitgen(nf,ideal); default: err(flagerr,"idealstar"); } return NULL; /* not reached */ } /* x is not integral, but check that v_p(x)=0 for all prime divisors of the * ideal. We need x = a/b with integral a and b, prime to ideal * denmat = den * id. */ static GEN rat_zinternallog(GEN nf, GEN x, GEN bigideal, GEN denmat) { long nbp,i,v,k, N = lgef(nf[1])-3; GEN den,fa,list,ep,pr,p1,p2,p3,x1,dinv,ideal; ideal = (GEN)bigideal[1]; if (lg(ideal) == 3) ideal = (GEN)ideal[1]; fa=(GEN)bigideal[3]; list=(GEN)fa[1]; ep=(GEN)fa[2]; den=gmael(denmat,1,1); k=1; nbp=lg(list)-1; for (i=1; i<=nbp; i++) { pr=(GEN)list[i]; v = (ggval(den,(GEN)pr[1])*itos((GEN)pr[3])) / itos((GEN)ep[i]) + 1; if (v>k) k=v; } p3=idealpow(nf,ideal,stoi(k)); p1=idealadd(nf,denmat,p3); dinv=idealinv(nf,p1); p2=idealmullll(nf,denmat,dinv); p3=idealmullll(nf,p3,dinv); x1=idealaddtoone_i(nf,p2,p3); if (gcmp0(x1)) x1 = (GEN)denmat[1]; /* x = a/b is suitable, with a=x1*x, b=x1 */ p1=element_mul(nf,x1,x); /* x1 is prime to ideal. Check that x1 * x also */ p2=idealadd(nf,p1,ideal); if (! ideal_is_zk(p2,N)) err(talker,"element is not coprime to ideal in zideallog"); p1=zideallog(nf,p1,bigideal); p2=zideallog(nf,x1,bigideal); return gsub(p1,p2); } /* Given x (not necessarily integral), and bid as output by zidealstarinit, * compute the vector of components on the generators bid[2] */ GEN zideallog(GEN nf, GEN x, GEN bid) { long av,l,i,N,c; GEN fa,fa2,ideal,arch,den,p1,cyc,y; nf=checknf(nf); checkbid(bid); cyc=gmael(bid,2,2); c=lg(cyc); y=cgetg(c,t_COL); av=avma; N = lgef(nf[1])-3; ideal = (GEN) bid[1]; if (typ(ideal)==t_VEC && lg(ideal)==3) arch = (GEN)ideal[2]; else arch = NULL; switch(typ(x)) { case t_INT: case t_FRAC: case t_FRACN: x = gscalcol_i(x,N); break; case t_POLMOD: case t_POL: x = algtobasis(nf,x); break; case t_COL: break; default: err(talker,"not an element in zideallog"); } if (lg(x) != N+1) err(talker,"not an element in zideallog"); den=denom(x); if (!gcmp1(den)) p1 = rat_zinternallog(nf,x,bid, gscalmat(den,N)); else { l=lg(bid[5])-1; fa=(GEN)bid[3]; fa2=(GEN)bid[4]; p1 = zinternallog(nf,fa2,l,arch,fa,x,0); p1 = gmul((GEN)bid[5],p1); /* apply smith */ } if (lg(p1)!=c) err(bugparier,"zideallog"); for (i=1; i=0) err(talker,"nontrivial Archimedian components in zidealstarinitjoin"); fa1=(GEN)fact1[1]; ex1=(GEN)fact1[2]; fa2=(GEN)fact2[1]; ex2=(GEN)fact2[2]; fact=cgetg(3,t_MAT); fact[1]=lconcat(fa1,fa2); lx1=lg(fa1); fact[2]=lconcat(ex1,ex2); lx2=lg(fa2); nbp=lx1+lx2-2; for (i=1; i=0) err(talker,"nontrivial Archimedian components in zidealstarinitjoinarchall"); liste1=(GEN)bid1[4]; lx=lg(liste1); liste=cgetg(lx,t_VEC); for (i=1; i1) { fprintferr("%ld ",p[2]); flusherr(); } fa = primedec(nf,p); for (j=1; j bound) continue; q2=q; ideal=pr; z2=dummycopy(z); if (do_units) lu2=dummycopy(lu); for (l=2; ;l++) { if (big_id) ideal = zidealstarinitall(nf,ideal,do_gen); if (do_units) embunit = logunitmatrix(nf,funits,racunit,ideal); for (i=q; i<=bound; i+=q) { p1 = (GEN)z[i/q]; if ((lp1 = lg(p1)) == 1) continue; p2 = cgetg(lp1,t_VEC); for (k=1; k (ulong)bound) break; ideal = idealpows(nf,pr,l); } z = z2; if (do_units) lu = lu2; } if (low_stack(lim, stack_lim(av,1))) { GEN *gptr[2]; gptr[0]=&z; gptr[1]=&lu; if(DEBUGMEM>1) err(warnmem,"ideallistzstarall"); gerepilemany(av,gptr,do_units?2:1); } } if (!do_units) return gerepileupto(av0, gcopy(z)); y = cgetg(3,t_VEC); y[1] = lcopy(z); lu2 = cgetg(lg(z),t_VEC); for (i=1; i4) err(flagerr,"ideallist"); return ideallistzstarall(bnf,bound,flag); } GEN ideallistzstar(GEN nf,long bound) { return ideallistzstarall(nf,bound,0); } GEN ideallistzstargen(GEN nf,long bound) { return ideallistzstarall(nf,bound,1); } GEN ideallistunit(GEN nf,long bound) { return ideallistzstarall(nf,bound,2); } GEN ideallistunitgen(GEN nf,long bound) { return ideallistzstarall(nf,bound,3); } GEN ideallist(GEN bnf,long bound) { return ideallistzstarall(bnf,bound,4); } static GEN ideallist_arch(GEN nf,GEN list,GEN arch,long flun) { long nba,i,j,lx,ly; GEN p1,z,p2; nba=0; for (i=1; i3) err(flagerr,"ideallistarch"); return ideallistarchall(nf,list,arch,flag); }