=================================================================== RCS file: /home/cvs/OpenXM_contrib/pari-2.2/src/basemath/Attic/base3.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -p -r1.1.1.1 -r1.2 --- OpenXM_contrib/pari-2.2/src/basemath/Attic/base3.c 2001/10/02 11:17:02 1.1.1.1 +++ OpenXM_contrib/pari-2.2/src/basemath/Attic/base3.c 2002/09/11 07:26:49 1.2 @@ -1,4 +1,4 @@ -/* $Id: base3.c,v 1.1.1.1 2001/10/02 11:17:02 noro Exp $ +/* $Id: base3.c,v 1.2 2002/09/11 07:26:49 noro Exp $ Copyright (C) 2000 The PARI group. @@ -19,11 +19,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, /* */ /*******************************************************************/ #include "pari.h" -extern int ker_trivial_mod_p(GEN x, GEN p); -extern long ideal_is_zk(GEN ideal,long N); +extern GEN u_FpM_deplin(GEN x, ulong p); +extern GEN u_FpM_inv(GEN a, ulong p); extern GEN famat_ideallog(GEN nf, GEN g, GEN e, GEN bid); extern GEN famat_to_nf_modidele(GEN nf, GEN g, GEN e, GEN bid); -extern GEN hnfall_i(GEN A, GEN *ptB, long remove); extern GEN vconcat(GEN A, GEN B); /*******************************************************************/ @@ -39,6 +38,7 @@ isnfscalar(GEN x) { long lx=lg(x),i; + if (typ(x) != t_COL) return 0; for (i=2; inf, x, D->I), D->p); } +static GEN +_sqrmod(void *data, GEN x) +{ + eltmod_muldata *D = (eltmod_muldata*)data; + return FpV_red(element_sqri(D->nf, x), D->p); +} /* x = I-th vector of the Z-basis of Z_K, in Z^n, compute lift(x^n mod p) */ GEN element_powid_mod_p(GEN nf, long I, GEN n, GEN p) { - ulong av = avma; - long s,N,i,j,m; - GEN y,p1; + gpmem_t av = avma; + eltmod_muldata D; + long s,N; + GEN y; if (typ(n)!=t_INT) err(talker,"not an integer exponent in nfpow"); nf=checknf(nf); N=degpol(nf[1]); s=signe(n); if (!s || I == 1) return gscalcol_i(gun,N); - p1 = n+2; m = *p1; y = zerocol(N); y[I] = un; - j=1+bfffo(m); m<<=j; j = BITS_IN_LONG-j; - for (i=lgefint(n)-2;;) - { - for (; j; m<<=1,j--) - { - y = element_sqri(nf, y); - if (m<0) y=element_mulid(nf, y, I); - y = FpV_red(y, p); - } - if (--i == 0) break; - m = *++p1, j = BITS_IN_LONG; - } - if (s<0) y = FpV_red(element_inv(nf,y), p); + D.nf = nf; + D.p = p; + D.I = I; + y = leftright_pow(y,n, (void*)&D, &_sqrmod, &_mulidmod); + if (s < 0) y = FpV_red(element_inv(nf,y), p); return av==avma? gcopy(y): gerepileupto(av,y); } +GEN +element_mulidid(GEN nf, long i, long j) +{ + long N; + GEN tab = get_tab(nf, &N); + tab += (i-1)*N; return (GEN)tab[j]; +} + /* Outputs x.w_i, where w_i is the i-th elt of the integral basis */ GEN element_mulid(GEN nf, GEN x, long i) { - long av,j,k,N; + gpmem_t av; + long j,k,N; GEN s,v,c,p1, tab; if (i==1) return gcopy(x); @@ -473,25 +493,46 @@ element_mulid(GEN nf, GEN x, long i) return v; } +/* table of multiplication by wi in ZK = Z[w1,..., wN] */ +GEN +eltmulid_get_table(GEN nf, long i) +{ + long k,N; + GEN m, tab; + + tab = get_tab(nf, &N); + tab += (i-1)*N; + m = cgetg(N+1,t_COL); + for (k=1; k<=N; k++) m[k] = tab[k]; + return m; +} + +/* table of multiplication by x in ZK = Z[w1,..., wN] */ +GEN +eltmul_get_table(GEN nf, GEN x) +{ + long i, N = degpol(nf[1]); + GEN mul = cgetg(N+1,t_MAT); + if (typ(x) != t_COL) x = algtobasis(nf,x); + mul[1] = (long)x; /* assume w_1 = 1 */ + for (i=2; i<=N; i++) mul[i] = (long)element_mulid(nf,x,i); + return mul; +} + /* valuation of integer x, with resp. to prime ideal P above p. * p.P^(-1) = b Z_K, v >= val_p(norm(x)), and N = deg(nf) * [b may be given as the 'multiplication by b' matrix] */ long -int_elt_val(GEN nf, GEN x, GEN p, GEN b, GEN *newx, long v) +int_elt_val(GEN nf, GEN x, GEN p, GEN b, GEN *newx) { long i,k,w, N = degpol(nf[1]); GEN r,a,y,mul; - if (typ(b) == t_MAT) mul = b; - else - { - mul = cgetg(N+1,t_MAT); - for (i=1; i<=N; i++) mul[i] = (long)element_mulid(nf,b,i); - } + mul = (typ(b) == t_MAT)? b: eltmul_get_table(nf, b); y = cgetg(N+1, t_COL); /* will hold the new x */ x = dummycopy(x); - for(w=0; w<=v; w++) + for(w=0;; w++) { for (i=1; i<=N; i++) { /* compute (x.b)_i */ @@ -499,19 +540,21 @@ int_elt_val(GEN nf, GEN x, GEN p, GEN b, GEN *newx, lo for (k=2; k<=N; k++) a = addii(a, mulii((GEN)x[k], gcoeff(mul,i,k))); /* is it divisible by p ? */ y[i] = ldvmdii(a,p,&r); - if (signe(r)) goto END; + if (signe(r)) + { + if (newx) *newx = x; + return w; + } } r=x; x=y; y=r; } -END: - if (newx) *newx = x; - return w; } long element_val(GEN nf, GEN x, GEN vp) { - long av = avma,N,w,vcx,e; + gpmem_t av = avma; + long N,w,vcx,e; GEN cx,p; if (gcmp0(x)) return VERYBIGINT; @@ -523,7 +566,7 @@ element_val(GEN nf, GEN x, GEN vp) return ggval(x,p)*e; case t_POLMOD: x = (GEN)x[2]; /* fall through */ case t_POL: - x = algtobasis_intern(nf,x); break; + x = algtobasis_i(nf,x); break; case t_COL: if (lg(x)==N+1) break; default: err(typeer,"element_val"); @@ -532,23 +575,10 @@ element_val(GEN nf, GEN x, GEN vp) cx = content(x); if (gcmp1(cx)) vcx=0; else { x = gdiv(x,cx); vcx = ggval(cx,p); } - w = int_elt_val(nf,x,p,(GEN)vp[5],NULL,VERYBIGINT); + w = int_elt_val(nf,x,p,(GEN)vp[5],NULL); avma=av; return w + vcx*e; } -/* d = a multiple of norm(x), x integral */ -long -element_val2(GEN nf, GEN x, GEN d, GEN vp) -{ - GEN p = (GEN)vp[1]; - long av, v = ggval(d,p); - - if (!v) return 0; - av=avma; - v = int_elt_val(nf,x,p,(GEN)vp[5],NULL,v); - avma=av; return v; -} - /* polegal without comparing variables */ long polegal_spec(GEN x, GEN y) @@ -564,7 +594,7 @@ polegal_spec(GEN x, GEN y) GEN basistoalg(GEN nf, GEN x) { - long tx=typ(x),lx=lg(x),i; + long tx=typ(x),lx=lg(x),i,j,l; GEN z; nf=checknf(nf); @@ -584,9 +614,18 @@ basistoalg(GEN nf, GEN x) } /* fall through */ - case t_VEC: case t_MAT: z=cgetg(lx,tx); + case t_VEC: z=cgetg(lx,tx); for (i=1; i 0)? _0: _1); + return vecsign; + } } - if (gcmp0(x)) err(talker,"zero element in zsigne"); - - B = bit_accuracy(precision((GEN)rac[1])); - e = gexpo(x); + x = Q_primpart(x); for (j=i=1; i B) - err(precer, "zsigne"); - vecsign[j++] = (gsigne(y) > 0)? (long)_0: (long)_1; - } + vecsign[j++] = (eval_sign(M, x, i) > 0)? (long)_0: (long)_1; avma = av; setlg(vecsign,j); return vecsign; } +/* return the t_COL vector of signs of x; the matrix of such if x is a vector + * of nf elements */ GEN +zsigns(GEN nf, GEN x) +{ + long r1, i, l; + GEN arch, S; + + nf = checknf(nf); r1 = nf_get_r1(nf); + arch = cgetg(r1+1,t_VEC); for (i=1; i<=r1; i++) arch[i] = un; + if (typ(x) != t_VEC) return zsigne(nf, x, arch); + l = lg(x); S = cgetg(l, t_MAT); + for (i=1; i0; i--) { - q = negi(gdivround((GEN)x[i], gcoeff(y,i,i))); + q = negi(diviiround((GEN)x[i], gcoeff(y,i,i))); if (Q) (*Q)[i] = (long)q; if (signe(q)) x = gadd(x, gmul(q, (GEN)y[i])); } @@ -815,26 +868,31 @@ reducemodHNF(GEN x, GEN y, GEN *Q) if (Q) { GEN q = cgetg(lx, t_MAT); *Q = q; - for (i=1; i> 0 at sarch */ @@ -902,12 +960,11 @@ element_powmodidele(GEN nf,GEN x,GEN k,GEN idele,GEN s GEN smithrel(GEN H, GEN *newU, GEN *newUi) { - GEN z,U,Ui,D,p1; + GEN U,Ui,D,p1; long l,c; - z = smith2(H); - U = (GEN)z[1]; - D = (GEN)z[3]; l = lg(D); + D = smithall(H, &U, NULL); + l = lg(D); for (c=1; c = Fp^* */ + q = divii(ord,ordp); + g = FpXQ_pow(g,q,T,p); + if (typ(g) == t_POL) g = constant_term(g); + } + n_q = Fp_PHlog(a,g,p,NULL); + if (q) n_q = mulii(q, n_q); + return gerepileuptoint(av, n_q); +} + /* smallest n >= 0 such that g0^n=x modulo pr, assume g0 reduced - * q = order of g0 (Npr - 1 if q = NULL) - * TODO: should be done in F_(p^f), not in Z_k mod pr (done for f=1) */ + * q = order of g0 is prime (and != p) */ static GEN -nfshanks(GEN nf,GEN x,GEN g0,GEN pr,GEN prhall,GEN q) +ffshanks(GEN x, GEN g0, GEN q, GEN T, GEN p) { - 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]; + gpmem_t av = avma, av1, lim; + long lbaby,i,k; + GEN p1,smalltable,giant,perm,v,g0inv; - x = lift_intern(nfreducemodpr(nf,x,prhall)); - p1 = q? q: addsi(-1, gpowgs(p,f)); - 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)); + if (!degpol(x)) x = constant_term(x); + if (typ(x) == t_INT) + { + if (!gcmp1(modii(p,q))) return gzero; + /* g0 in Fp^*, order q | (p-1) */ + if (typ(g0) == t_POL) g0 = constant_term(g0); + return Fp_PHlog(x,g0,p,q); + } + + p1 = racine(q); + if (cmpis(p1,LGBITS) >= 0) err(talker,"module too large in ffshanks"); + lbaby = itos(p1)+1; smalltable = cgetg(lbaby+1,t_VEC); + g0inv = FpXQ_inv(g0,T,p); p1 = x; - multab = get_multab(nf, g0inv); - for (i=lg(multab)-1; i; i--) - multab[i]=(long)FpV_red((GEN)multab[i], p); - for (i=1;;i++) { - if (isnfscalar(p1) && gcmp1((GEN)p1[1])) { avma=av; return stoi(i-1); } + if (gcmp1(p1)) { avma = av; return stoi(i-1); } smalltable[i]=(long)p1; if (i==lbaby) break; - p1 = mul_matvec_mod_pr(multab,p1,prh); + p1 = FpXQ_mul(p1,g0inv, T,p); } - 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; + giant = FpXQ_div(x,p1,T,p); + perm = gen_sort(smalltable, cmp_IND | cmp_C, cmp_pol); + smalltable = vecextract_p(smalltable, perm); + p1 = giant; - multab = get_multab(nf, giant); - for (i=lg(multab)-1; i; i--) - multab[i]=(long)FpV_red((GEN)multab[i], p); - av1 = avma; lim=stack_lim(av1,2); for (k=1;;k++) { - i=tablesearch(smalltable,p1,cmp_vecint); + i = tablesearch(smalltable,p1,cmp_pol); if (i) { - v=addis(mulss(lbaby-1,k),perm[i]); - return gerepileuptoint(av,addsi(-1,v)); + v = addis(mulss(lbaby-1,k), perm[i]); + return gerepileuptoint(av, addsi(-1,v)); } - p1 = mul_matvec_mod_pr(multab,p1,prh); + p1 = FpXQ_mul(p1, giant, T,p); if (low_stack(lim, stack_lim(av1,2))) { - if(DEBUGMEM>1) err(warnmem,"nfshanks"); + if(DEBUGMEM>1) err(warnmem,"ffshanks"); p1 = gerepileupto(av1, p1); } } } -/* same in nf.zk / pr - * TODO: should be done in F_(p^f), not in Z_k mod pr (done for f=1) */ +/* same in Fp[X]/T */ GEN -nf_PHlog(GEN nf, GEN a, GEN g, GEN pr, GEN prhall) +ff_PHlog(GEN a, GEN g, GEN T, GEN p) { - ulong av = avma; + gpmem_t av = avma; GEN v,t0,a0,b,q,g_q,n_q,ginv0,qj,ginv,ord,fa,ex; long e,i,j,l; - a = lift_intern(nfreducemodpr(nf,a,prhall)); - if (isnfscalar(a)) - { /* can be done in Fp^* */ - GEN p = (GEN)pr[1], ordp = subis(p, 1); - a = (GEN)a[1]; - if (gcmp1(a) || egalii(p, gdeux)) { avma = av; return gzero; } - ord = subis(idealnorm(nf,pr), 1); - if (egalii(a, ordp)) /* -1 */ - return gerepileuptoint(av, shifti(ord,-1)); - - if (egalii(ord, ordp)) - q = NULL; - else /* we want < g > = Fp^* */ - { - q = divii(ord,ordp); - g = element_powmodpr(nf,g,q,prhall); - } - g = lift_intern((GEN)g[1]); - n_q = Fp_PHlog(a,g,p,NULL); - if (q) n_q = mulii(q, n_q); - return gerepileuptoint(av, n_q); - } - ord = subis(idealnorm(nf,pr),1); - fa = factor(ord); ex = (GEN)fa[2]; + if (typ(a) == t_INT) + return gerepileuptoint(av, ff_PHlog_Fp(a,g,T,p)); + /* f > 1 ==> T != NULL */ + ord = subis(gpowgs(p, degpol(T)), 1); + fa = factor(ord); + ex = (GEN)fa[2]; fa = (GEN)fa[1]; l = lg(fa); - ginv = lift_intern(element_invmodpr(nf, g, prhall)); + ginv = FpXQ_inv(g,T,p); v = cgetg(l, t_VEC); for (i=1; i5) - fprintferr("nf_Pohlig-Hellman: DL mod %Z^%ld\n",q,e); + if (DEBUGLEVEL>5) fprintferr("nf_Pohlig-Hellman: DL mod %Z^%ld\n",q,e); qj = new_chunk(e+1); qj[0] = un; for (j=1; j<=e; j++) qj[j] = lmulii((GEN)qj[j-1], q); t0 = divii(ord, (GEN)qj[e]); - a0 = element_powmodpr(nf, a, t0, prhall); - ginv0 = element_powmodpr(nf, ginv, t0, prhall); /* order q^e */ - g_q = element_powmodpr(nf, g, divii(ord,q), prhall); /* order q */ + a0 = FpXQ_pow(a, t0, T,p); + ginv0 = FpXQ_pow(ginv, t0, T,p); /* order q^e */ + g_q = FpXQ_pow(g, divii(ord,q), T,p); /* order q */ + n_q = gzero; for (j=0; j k) return gerepilecopy(av0, g); + } +} + /* Given an ideal pr^ep, and an integral ideal x (in HNF form) compute a list * of vectors, each with 5 components as follows : * [[clh],[gen1],[gen2],[signat2],U.X^-1]. Each component corresponds to @@ -1287,51 +1343,39 @@ makeprimetoidealvec(GEN nf,GEN UV,GEN uv,GEN gen) static GEN zprimestar(GEN nf,GEN pr,GEN ep,GEN x,GEN arch) { - long av=avma,av1,N,f,nbp,j,n,m,tetpil,i,e,a,b; + gpmem_t av = avma, av1, tetpil; + long N, f, i, e, a, b; GEN prh,p,pf_1,list,v,p1,p3,p4,prk,uv,g0,newgen,pra,prb; GEN *gptr[2]; if(DEBUGLEVEL>3) { 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]; + prh = prime_to_ideal(nf,pr); N = degpol(nf[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]; + if (f==1) + { + v = zerocol(N); + 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"); + GEN T, modpr = zk_to_ff_init(nf, &pr, &T, &p); + v = ff_to_nf(FpXQ_gener(T,p), modpr); + v = algtobasis(nf, v); } /* v generates (Z_K / pr)^* */ - if(DEBUGLEVEL>3) {fprintferr("v computed\n");flusherr();} + if(DEBUGLEVEL>3) fprintferr("v computed\n"); e = itos(ep); prk=(e==1)? pr: idealpow(nf,pr,ep); - if(DEBUGLEVEL>3) {fprintferr("prk computed\n");flusherr();} + if(DEBUGLEVEL>3) fprintferr("prk computed\n"); g0 = v; uv = NULL; /* gcc -Wall */ if (x) { - uv = idealaddtoone(nf,prk, idealdivexact(nf,x,prk)); + uv = idealaddtoone(nf,prk, idealdivpowprime(nf,x,pr,ep)); g0 = makeprimetoideal(nf,x,uv,v); - if(DEBUGLEVEL>3) {fprintferr("g0 computed\n");flusherr();} + if(DEBUGLEVEL>3) fprintferr("g0 computed\n"); } p1 = cgetg(6,t_VEC); list = _vec(p1); @@ -1346,12 +1390,11 @@ zprimestar(GEN nf,GEN pr,GEN ep,GEN x,GEN arch) pra = prh; prb = (e==2)? prk: idealpow(nf,pr,gdeux); for(;;) { - if(DEBUGLEVEL>3) - {fprintferr(" treating a = %ld, b = %ld\n",a,b); flusherr();} + if(DEBUGLEVEL>3) fprintferr(" treating a = %ld, b = %ld\n",a,b); p1 = zidealij(pra,prb); newgen = dummycopy((GEN)p1[2]); p3 = cgetg(lg(newgen),t_VEC); - if(DEBUGLEVEL>3) {fprintferr("zidealij done\n"); flusherr();} + if(DEBUGLEVEL>3) fprintferr("zidealij done\n"); for (i=1; i5) fprintferr("zarchstar: r = %ld\n",r); p1 = gpowgs(stoi(rr),N); - limr = is_bigint(p1)? BIGINT: p1[2]; + 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; + gpmem_t av1=avma; + long kk = k; GEN alpha = vun; for (i=1; i<=N; i++) { @@ -1441,9 +1492,9 @@ zarchstar(GEN nf,GEN x,GEN arch,long nba) } p1 = (GEN)mat[lgmat]; for (i=1; i<=nba; i++) - p1[i] = (gsigne((GEN)alpha[i]) > 0)? zero: un; + p1[i] = (gsigne((GEN)alpha[i]) < 0)? 1: 0; - if (ker_trivial_mod_p(mat, gdeux)) avma = av1; + if (u_FpM_deplin(mat, 2)) avma = av1; else { /* new vector indep. of previous ones */ avma = av1; alpha = nfun; @@ -1454,7 +1505,8 @@ zarchstar(GEN nf,GEN x,GEN arch,long nba) if (lgmat > nba) { GEN *gptr[2]; - mat = ginv(mat); gptr[0]=&genarch; gptr[1]=&mat; + mat = small_to_mat( u_FpM_inv(mat, 2) ); + gptr[0]=&genarch; gptr[1]=&mat; gerepilemany(av,gptr,2); y[2]=(long)genarch; y[3]=(long)mat; return y; @@ -1476,7 +1528,7 @@ zinternallog_pk(GEN nf, GEN a0, GEN y, GEN pr, GEN prk { L = (GEN)list[j]; cyc=(GEN)L[1]; gen=(GEN)L[2]; if (j==1) - p1 = nf_PHlog(nf,a,(GEN)gen[1],pr, nfmodprinit(nf,pr)); + p1 = nf_PHlog(nf,a,(GEN)gen[1],pr); else { p1 = (GEN)a[1]; a[1] = laddsi(-1,(GEN)a[1]); @@ -1510,7 +1562,8 @@ static GEN zinternallog(GEN nf,GEN a,GEN list_set,long nbgen,GEN arch,GEN fa,long index) { GEN prlist,ep,y0,y,ainit,list,pr,prk,cyc,psigne,p1,p2; - long av,nbp,i,j,k; + gpmem_t av; + long nbp,i,j,k; y0 = y = cgetg(nbgen+1,t_COL); av=avma; prlist=(GEN)fa[1]; ep=(GEN)fa[2]; nbp=lg(ep)-1; @@ -1560,7 +1613,8 @@ compute_gen(GEN nf, GEN u1, GEN gen, GEN bid) GEN zidealstarinitall(GEN nf, GEN ideal,long add_gen) { - long av = avma,i,j,k,nba,nbp,R1,nbgen,cp; + gpmem_t av = avma; + long i,j,k,nba,nbp,R1,nbgen,cp; GEN p1,y,h,cyc,U,u1,fa,fa2,ep,x,arch,list,sarch,gen; nf = checknf(nf); R1=itos(gmael(nf,2,1)); @@ -1649,7 +1703,7 @@ zidealstarinit(GEN nf, GEN ideal) GEN zidealstar(GEN nf, GEN ideal) { - long av = avma; + gpmem_t av = avma; GEN y = zidealstarinitall(nf,ideal,1); return gerepilecopy(av,(GEN)y[2]); } @@ -1694,7 +1748,8 @@ check_nfelt(GEN x, GEN *den) GEN zideallog(GEN nf, GEN x, GEN bid) { - long av,l,i,N,c; + gpmem_t av; + long l,i,N,c; GEN fa,fa2,ideal,arch,den,p1,cyc,y; nf=checknf(nf); checkbid(bid); @@ -1712,6 +1767,7 @@ zideallog(GEN nf, GEN x, GEN bid) case t_POLMOD: case t_POL: x = algtobasis(nf,x); break; case t_MAT: + if (lg(x) == 1) return zerocol(c-1); return famat_ideallog(nf,(GEN)x[1],(GEN)x[2],bid); case t_COL: break; default: err(talker,"not an element in zideallog"); @@ -1722,8 +1778,8 @@ zideallog(GEN nf, GEN x, GEN bid) { GEN g = cgetg(3, t_COL); GEN e = cgetg(3, t_COL); - g[1] = lmul(x,den); e[1] = un; - g[2] = (long)den; e[2] = lstoi(-1); + g[1] = (long)Q_muli_to_int(x,den); e[1] = un; + g[2] = (long)den; e[2] = lstoi(-1); p1 = famat_ideallog(nf, g, e, bid); } else @@ -1748,7 +1804,8 @@ zideallog(GEN nf, GEN x, GEN bid) GEN zidealstarinitjoin(GEN nf, GEN bid1, GEN bid2, long add_gen) { - long av=avma,i,nbp,nbgen,lx1,lx2,l1,l2,lx; + gpmem_t av=avma; + long i,nbp,nbgen,lx1,lx2,l1,l2,lx; GEN module1,module2,struct1,struct2,fact1,fact2,liste1,liste2; GEN module,liste,fact,U,U1,U2,cyc,cyc1,cyc2,uv; GEN p1,p2,y,u1,x,fa1,fa2, gen = add_gen? gun: NULL; @@ -1824,7 +1881,8 @@ zidealstarinitjoin(GEN nf, GEN bid1, GEN bid2, long ad GEN zidealstarinitjoinarch(GEN nf, GEN bid1, GEN arch, long nba, long add_gen) { - long av=avma,i,nbp,lx1; + gpmem_t av=avma; + long i,nbp,lx1; GEN module1,struct1,fact1,liste1,U1,U; GEN module,liste,cyc,p1,y,u1,x,sarch, gen = add_gen? gun: NULL; @@ -1921,7 +1979,8 @@ static GEN ideallistzstarall(GEN bnf,long bound,long flag) { byteptr ptdif=diffptr; - long lim,av0=avma,av,i,j,k,l,q2,lp1,q; + gpmem_t lim,av0=avma,av; + long i,j,k,l,q2,lp1,q; long do_gen = flag & 1, do_units = flag & 2, big_id = !(flag & 4); GEN y,nf,p,z,z2,p1,p2,p3,fa,pr,ideal,lu,lu2,funits,racunit,embunit; @@ -1947,7 +2006,7 @@ ideallistzstarall(GEN bnf,long bound,long flag) if (bound > (long)maxprime()) err(primer1); for (p[2]=0; p[2]<=bound; ) { - p[2] += *ptdif++; + NEXT_PRIME_VIADIFF(p[2], ptdif); if (DEBUGLEVEL>1) { fprintferr("%ld ",p[2]); flusherr(); } fa = primedec(nf,p); for (j=1; j