=================================================================== RCS file: /home/cvs/OpenXM_contrib/pari-2.2/src/basemath/Attic/polarit1.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/polarit1.c 2001/10/02 11:17:04 1.1 +++ OpenXM_contrib/pari-2.2/src/basemath/Attic/polarit1.c 2002/09/11 07:26:51 1.2 @@ -1,4 +1,4 @@ -/* $Id: polarit1.c,v 1.1 2001/10/02 11:17:04 noro Exp $ +/* $Id: polarit1.c,v 1.2 2002/09/11 07:26:51 noro Exp $ Copyright (C) 2000 The PARI group. @@ -21,14 +21,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, /***********************************************************************/ #include "pari.h" extern GEN get_bas_den(GEN bas); -extern GEN get_mul_table(GEN x,GEN bas,GEN invbas,GEN *T); +extern GEN get_mul_table(GEN x,GEN bas,GEN invbas); extern GEN pol_to_monic(GEN pol, GEN *lead); +#define lswap(x,y) { long _t=x; x=y; y=_t; } +#define swap(x,y) { GEN _t=x; x=y; y=_t; } + /* see splitgen() for how to use these two */ GEN setloop(GEN a) { - a=icopy(a); new_chunk(2); /* dummy to get two cells of extra space */ + a=icopy(a); (void)new_chunk(2); /* dummy to get two cells of extra space */ return a; } @@ -86,14 +89,14 @@ incloop(GEN a) int gdivise(GEN x, GEN y) { - long av=avma; + gpmem_t av=avma; x=gmod(x,y); avma=av; return gcmp0(x); } int poldivis(GEN x, GEN y, GEN *z) { - long av = avma; + gpmem_t av = avma; GEN p1 = poldivres(x,y,ONLY_DIVIDES); if (p1) { *z = p1; return 1; } avma=av; return 0; @@ -108,21 +111,16 @@ poldivis(GEN x, GEN y, GEN *z) * if z = ONLY_REM return remainder, otherwise return quotient * if z != NULL set *z to remainder * *z is the last object on stack (and thus can be disposed of with cgiv - * instead of gerepile) - */ + * instead of gerepile) */ GEN poldivres(GEN x, GEN y, GEN *pr) { - ulong avy,av,av1; + gpmem_t avy, av, av1; long ty=typ(y),tx,vx,vy,dx,dy,dz,i,j,sx,lrem; - int remainder; GEN z,p1,rem,y_lead,mod; GEN (*f)(GEN,GEN); - if (pr == ONLY_DIVIDES_EXACT) - { f = gdivexact; pr = ONLY_DIVIDES; } - else - f = gdiv; + f = gdiv; if (is_scalar_t(ty)) { if (pr == ONLY_REM) return gzero; @@ -149,9 +147,10 @@ poldivres(GEN x, GEN y, GEN *pr) } return f(x,y); } - if (!signe(y)) err(talker,"euclidean division by zero (poldivres)"); - dy=degpol(y); y_lead = (GEN)y[dy+2]; + if (!signe(y)) err(talker,"division by zero in poldivrem"); + dy = degpol(y); + y_lead = (GEN)y[dy+2]; if (gcmp0(y_lead)) /* normalize denominator if leading term is 0 */ { err(warner,"normalizing a polynomial with 0 leading term"); @@ -170,7 +169,7 @@ poldivres(GEN x, GEN y, GEN *pr) } return f(x, constant_term(y)); } - dx=degpol(x); + dx = degpol(x); if (vx>vy || dx=dy; i--) { av1=avma; p1=(GEN)x[i]; for (j=i-dy+1; j<=i && j<=dz; j++) - if (y[i-j]) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j])); + if (y[i-j] && z[j] != zero) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j])); if (y_lead) p1 = f(p1,y_lead); - if (!remainder) p1 = avma==av1? gcopy(p1): gerepileupto(av1,p1); + + if (isexactzero(p1)) { avma=av1; p1 = gzero; } + else + p1 = avma==av1? gcopy(p1): gerepileupto(av1,p1); z[i-dy] = (long)p1; } if (!pr) return gerepileupto(av,z-2); - rem = (GEN)avma; av1 = (long)new_chunk(dx+3); + rem = (GEN)avma; av1 = (gpmem_t)new_chunk(dx+3); for (sx=0; ; i--) { p1 = (GEN)x[i]; /* we always enter this loop at least once */ for (j=0; j<=i && j<=dz; j++) - if (y[i-j]) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j])); + if (y[i-j] && z[j] != zero) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j])); if (mod && avma==av1) p1 = gmul(p1,mod); if (!gcmp0(p1)) { sx = 1; break; } /* remainder is non-zero */ if (!isinexactreal(p1) && !isexactzero(p1)) break; @@ -231,12 +237,12 @@ poldivres(GEN x, GEN y, GEN *pr) if (pr == ONLY_DIVIDES) { if (sx) { avma=av; return NULL; } - avma = (long)rem; + avma = (gpmem_t)rem; return gerepileupto(av,z-2); } lrem=i+3; rem -= lrem; - if (avma==av1) { avma = (long)rem; p1 = gcopy(p1); } - else p1 = gerepileupto((long)rem,p1); + if (avma==av1) { avma = (gpmem_t)rem; p1 = gcopy(p1); } + else p1 = gerepileupto((gpmem_t)rem,p1); rem[0]=evaltyp(t_POL) | evallg(lrem); rem[1]=evalsigne(1) | evalvarn(vx) | evallgef(lrem); rem += 2; @@ -245,13 +251,13 @@ poldivres(GEN x, GEN y, GEN *pr) { av1=avma; p1 = (GEN)x[i]; for (j=0; j<=i && j<=dz; j++) - if (y[i-j]) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j])); + if (y[i-j] && z[j] != zero) p1 = gadd(p1, gmul((GEN)z[j],(GEN)y[i-j])); if (mod && avma==av1) p1 = gmul(p1,mod); rem[i]=avma==av1? lcopy(p1):lpileupto(av1,p1); } rem -= 2; - if (!sx) normalizepol_i(rem, lrem); - if (remainder) return gerepileupto(av,rem); + if (!sx) (void)normalizepol_i(rem, lrem); + if (pr == ONLY_REM) return gerepileupto(av,rem); z -= 2; { GEN *gptr[2]; gptr[0]=&z; gptr[1]=&rem; @@ -286,7 +292,7 @@ factmod_init(GEN *F, GEN pp, long *p) f = gmul(f, mod(gun,pp)); if (!signe(f)) err(zeropoler,"factmod"); f = lift_intern(f); d = lgef(f); - for (i=2; i 7) timer2(); + long j,N = degpol(u); + GEN vker,v,w,Q,p1; + if (DEBUGLEVEL > 7) (void)timer2(); Q = cgetg(N+1,t_MAT); Q[1] = (long)zerocol(N); w = v = FpXQ_pow(polx[varn(u)],p,u,p); for (j=2; j<=N; j++) { - Q[j] = lgetg(N+1,t_COL); p1 = (GEN)Q[j]; - d = lgef(w)-1; p2 = w+1; - for (i=1; i 7) (void)timer2(); + Q = cgetg(N+1,t_MAT); Q[1] = (long)zerocol(N); + w = v = FqXQ_pow(polx[varn(u)], q, u, T, p); + for (j=2; j<=N; j++) + { + p1 = pol_to_vec(w, N); + p1[j] = laddgs((GEN)p1[j], -1); + Q[j] = (long)p1; + if (j < N) + { + gpmem_t av = avma; + w = gerepileupto(av, FpXQX_divres(FpXQX_mul(w,v, T,p), u,T,p,ONLY_REM)); + } + } + if (DEBUGLEVEL > 7) msgtimer("frobenius"); + vker = FqM_ker(Q,T,p); + if (DEBUGLEVEL > 7) msgtimer("kernel"); + return vker; +} + /* f in ZZ[X] and p a prime number. */ long FpX_is_squarefree(GEN f, GEN p) { - long av = avma; + gpmem_t av = avma; GEN z; z = FpX_gcd(f,derivpol(f),p); avma = av; @@ -533,7 +606,8 @@ FpX_is_squarefree(GEN f, GEN p) long FpX_nbroots(GEN f, GEN p) { - long av = avma, n=lgef(f); + long n=lgef(f); + gpmem_t av = avma; GEN z; if (n <= 4) return n-3; f = FpX_red(f, p); @@ -545,10 +619,11 @@ FpX_nbroots(GEN f, GEN p) long FpX_is_totally_split(GEN f, GEN p) { - long av = avma, n=lgef(f); + long n=degpol(f); + gpmem_t av = avma; GEN z; - if (n <= 4) return 1; - if (!is_bigint(p) && n-3 > p[2]) return 0; + if (n <= 1) return 1; + if (!is_bigint(p) && n > p[2]) return 0; f = FpX_red(f, p); z = FpXQ_pow(polx[varn(f)], p, f, p); avma = av; return lgef(z)==4 && gcmp1((GEN)z[3]) && !signe(z[2]); @@ -559,8 +634,8 @@ FpX_is_totally_split(GEN f, GEN p) long FpX_nbfact(GEN u, GEN p) { - ulong av = avma; - GEN vker = Berlekamp_ker(u,p); + gpmem_t av = avma; + GEN vker = FpM_Berlekamp_ker(u,p); avma = av; return lg(vker)-1; } @@ -576,11 +651,11 @@ static GEN gsmul(GEN a,GEN b){return FpX_mul(a,b,modul GEN FpV_roots_to_pol(GEN V, GEN p, long v) { - ulong ltop=avma; + gpmem_t ltop=avma; long i; GEN g=cgetg(lg(V),t_VEC); for(i=1;i 1; j--) - { - GEN p2 = (GEN)p1[j]; - if (typ(p2) == t_INTMOD) p2[1] = (long)p; - } - } -} - static GEN try_pow(GEN w0, GEN pol, GEN p, GEN q, long r) { @@ -639,7 +696,8 @@ try_pow(GEN w0, GEN pol, GEN p, GEN q, long r) static void split(long m, GEN *t, long d, GEN p, GEN q, long r, GEN S) { - long ps,l,v,dv,av0,av; + long ps, l, v, dv; + gpmem_t av0, av; GEN w,w0; dv=degpol(*t); if (dv==d) return; @@ -648,7 +706,7 @@ split(long m, GEN *t, long d, GEN p, GEN q, long r, GE { if (ps==2) { - w0=w=gpuigs(polx[v],m-1); m+=2; + w0 = w = FpXQ_pow(polx[v], stoi(m-1), *t, gdeux); m += 2; for (l=1; l>1]); S[i] = (long)FpX_res(p1, T, p); if (i == n-1) break; p1 = gmul((GEN)S[i], (GEN)S[1]); S[i+1] = (long)FpX_res(p1, T, p); - } + } return S; -} +} /* compute x^p, S is as above */ static GEN spec_FpXQ_pow(GEN x, GEN p, GEN S) { - long av = avma, lim = stack_lim(av,1), i,dx = degpol(x); + long i, dx = degpol(x); + gpmem_t av = avma, lim = stack_lim(av, 1); GEN x0 = x+2, z; z = (GEN)x0[0]; if (dx < 0) err(talker, "zero polynomial in FpXQ_pow. %Z not prime", p); @@ -746,7 +806,8 @@ spec_FpXQ_pow(GEN x, GEN p, GEN S) static GEN factcantor0(GEN f, GEN pp, long flag) { - long i,j,k,d,e,vf,p,nbfact,tetpil,av = avma; + long i, j, k, d, e, vf, p, nbfact; + gpmem_t tetpil, av = avma; GEN ex,y,f2,g,g1,u,v,pd,q; GEN *t; @@ -861,68 +922,170 @@ simplefactmod(GEN f, GEN p) return factcantor0(f,p,1); } -/* vector of polynomials (in v) whose coeffs are given by the columns of x */ GEN -mat_to_vecpol(GEN x, long v) +col_to_ff(GEN x, long v) { - long i,j, lx = lg(x), lcol = lg(x[1]); - GEN y = cgetg(lx, t_VEC); + long i, k = lg(x); + GEN p; - for (j=1; j P(Y,X), n-1 is the degree in Y */ +GEN +swap_polpol(GEN x, long n, long w) +{ + long j, lx = lgef(x), ly = n+3; + long v=varn(x); + GEN y = cgetg(ly, t_POL); + y[1]=evalsigne(1) | evallgef(ly) | evalvarn(v); + for (j=2; j1 && !x[i]); - if (i==1) setsigne(x,0); else { setsigne(x,1); setlgef(x,i+1); } + (void)u_normalizepol(x,i); } +static long +small_rand(long p) +{ + return (p==2)? ((mymyrand() & 0x1000) == 0): mymyrand() % p; +} + +GEN +FpX_rand(long d1, long v, GEN p) +{ + long i, d = d1+2; + GEN y; + y = cgetg(d,t_POL); y[1] = evalsigne(1) | evalvarn(v); + for (i=2; iir) swap(t[i],t[ir]); ir++;} + long -split_berlekamp(GEN *t, GEN pp, GEN pps2) +FpX_split_berlekamp(GEN *t, GEN p) { - GEN u = *t, p1, p2, vker,pol; - long av,N = degpol(u), d,i,kk,l1,l2,p, vu = varn(u); - ulong av0 = avma; - - vker = Berlekamp_ker(u,pp); + GEN u = *t, a,b,po2,vker,pol; + long N = degpol(u), d, i, ir, L, la, lb, ps, vu = varn(u); + gpmem_t av0 = avma; + + vker = FpM_Berlekamp_ker(u,p); vker = mat_to_vecpol(vker,vu); d = lg(vker)-1; - p = is_bigint(pp)? 0: pp[2]; - if (p) + ps = is_bigint(p)? 0: p[2]; + if (ps) { - avma = av0; p1 = cgetg(d+1, t_VEC); /* hack: hidden gerepile */ - for (i=1; i<=d; i++) p1[i] = (long)pol_to_small((GEN)vker[i]); - vker = p1; + avma = av0; a = cgetg(d+1, t_VEC); /* hack: hidden gerepile */ + for (i=1; i<=d; i++) a[i] = (long)pol_to_small((GEN)vker[i]); + vker = a; } + po2 = shifti(p, -1); /* (p-1) / 2 */ pol = cgetg(N+3,t_POL); - - for (kk=1; kk1) + a = t[i]; la = degpol(a); + if (la == 1) { set_irred(i); } + else if (la == 2) { - av = avma; p2 = FpX_res(polt, p1, pp); - if (lgef(p2) <= 3) { avma=av; continue; } - p2 = FpXQ_pow(p2,pps2, p1,pp); - if (!signe(p2)) err(talker,"%Z not a prime in split_berlekamp",pp); - p2 = ZX_s_add(p2, -1); - p2 = FpX_gcd(p1,p2, pp); l2=degpol(p2); - if (l2>0 && l2 7) msgtimer("new factor"); + t[i] = deg1pol_i(gun, subii(p,r), vu); r = otherroot(a,r,p); + t[L] = deg1pol_i(gun, subii(p,r), vu); L++; } + set_irred(i); + } + else + { + gpmem_t av = avma; + b = FpX_res(polt, a, p); + if (degpol(b) == 0) { avma=av; continue; } + b = ZX_s_add(FpXQ_pow(b,po2, a,p), -1); + b = FpX_gcd(a,b, p); lb = degpol(b); + if (lb && lb < la) + { + b = FpX_normalize(b, p); + t[L] = FpX_div(a,b,p); + t[i]= b; L++; + } else avma = av; } } @@ -1044,10 +1250,81 @@ split_berlekamp(GEN *t, GEN pp, GEN pps2) return d; } +static GEN +FqX_deriv(GEN f, GEN T, GEN p) +{ + return FqX_red(derivpol(f), T, p); +} GEN +FqX_gcd(GEN P, GEN Q, GEN T, GEN p) +{ + GEN g = T? FpXQX_safegcd(P,Q,T,p): FpX_gcd(P,Q,p); + if (!g) err(talker,"factmod9: %Z is reducible mod p!", T); + return g; +} +long +FqX_is_squarefree(GEN P, GEN T, GEN p) +{ + gpmem_t av = avma; + GEN z = FqX_gcd(P, derivpol(P), T, p); + avma = av; + return degpol(z)==0; + +} + +long +FqX_split_berlekamp(GEN *t, GEN q, GEN T, GEN p) +{ + GEN u = *t, a,b,qo2,vker,pol; + long N = degpol(u), vu = varn(u), vT = varn(T), dT = degpol(T); + long d, i, ir, L, la, lb; + + vker = FqM_Berlekamp_ker(u,T,q,p); + vker = mat_to_vecpol(vker,vu); + d = lg(vker)-1; + qo2 = shifti(q, -1); /* (q-1) / 2 */ + pol = cgetg(N+3,t_POL); + ir = 0; + /* t[i] irreducible for i < ir, still to be treated for i < L */ + for (L=1; L 0) { f = gdeuc(f,u); fp = derivpol(f); } + p = (GEN)a[2]; + P = egalii(p,gdeux)? stoi(4): p; + a0= gmod(a, P); +#if 0 /* assumption */ + if (!gcmp0(FpX_eval(f,a0,P))) err(rootper2); +#endif + if (!gcmp0(FpX_eval(fp,a0,p))) /* simple zero */ + { + res = rootpadiclift(f, a0, p, prec); + res = strict_int_to_padic(res,p,gpowgs(p,prec),prec,NULL); + return _vec(res); + } + + f = poleval(f, gadd(a, gmul(P,polx[varn(f)]))); f = padic_pol_to_int(f); - fp=derivpol(f); p1=ggcd(f,fp); - if (lgef(p1)>3) { f=gdeuc(f,p1); fp=derivpol(f); } - p=(GEN)a[2]; p1=poleval(f,a); - v=ggval(p1,p); if (v <= 0) err(rootper2); - fl2=egalii(p,gdeux); - if (fl2 && v==1) err(rootper2); - v=ggval(poleval(fp,a),p); - if (!v) /* simple zero */ + f = gdiv(f, gpowgs(p,ggval(f, p))); + + res = cgetg(degpol(f)+1,t_VEC); + q = gpowgs(p,prec); + rac = lift_intern(rootmod(f, P)); + for (j=i=1; i=2^31"); - x = ggrandocp(p, valp(a) | precp(a)); - if (fl2) +/* a t_PADIC, return vector of p-adic roots of f equal to a (mod p) + * We assume 1) f(a) = 0 mod p (mod 4 if p=2). + * 2) leading coeff prime to p. */ +GEN +apprgen(GEN f, GEN a) +{ + gpmem_t av = avma; + if (typ(f) != t_POL) err(notpoler,"apprgen"); + if (gcmp0(f)) err(zeropoler,"apprgen"); + if (typ(a) != t_PADIC) err(rootper1); + return gerepilecopy(av, apprgen_i(padic_pol_to_int(f), a)); +} + +static GEN +rootpadic_i(GEN f, GEN p, long prec) +{ + GEN fp,y,z,q,rac; + long lx,i,j,k; + + fp = derivpol(f); z = ggcd(f,fp); + if (degpol(z) > 0) { f = gdeuc(f,z); fp = derivpol(f); } + rac = rootmod(f, (egalii(p,gdeux) && prec>=2)? stoi(4): p); + rac = lift_intern(rac); lx = lg(rac); + if (prec==1) { - x2=ggrandocp(p,2); P = stoi(4); + y = cgetg(lx,t_COL); + for (i=1; i3) { f=gdeuc(f,p1); fp=derivpol(f); } - fl2=egalii(p,gdeux); rac=(fl2 && r>=2)? rootmod(f,stoi(4)): rootmod(f,p); - lx=lg(rac); p=gclone(p); - if (r==1) - { - tetpil=avma; y=cgetg(lx,t_COL); - for (i=1; i0 such that - q=p^a + q=p^a f in ZZ[X], with leading term prime to p. S must be a simple root mod p. @@ -1375,7 +1699,7 @@ long hensel_lift_accel(long n, long *pmask) GEN rootpadiclift(GEN T, GEN S, GEN p, long e) { - ulong ltop=avma; + gpmem_t ltop=avma; long x; GEN qold, q, qm1; GEN W, Tr, Sr, Wr = gzero; @@ -1387,7 +1711,7 @@ rootpadiclift(GEN T, GEN S, GEN p, long e) W=FpX_eval(deriv(Tr, x),S,q); W=mpinvmod(W,q); for(i=0;itotally split-->use trace trick */ { - ulong av=avma; + gpmem_t av=avma; GEN z; z=(GEN)f[lgef(f)-2];/*-trace(roots)*/ for(i=1; i3) { f=gdeuc(f,p1); fp=derivpol(f); } - t=(GEN)a[1]; + + fp = derivpol(f); u = ggcd(f,fp); + if (degpol(u) > 0) { f = gdeuc(f,u); fp = derivpol(f); } + T = (GEN)a[1]; prec = getprec((GEN)a[2], BIGINT, &p); - prec = getprec(t, prec, &p); + prec = getprec(T, prec, &p); if (prec==BIGINT) err(rootper1); - p1=poleval(f,a); v=ggval(lift_intern(p1),p); if (v<=0) err(rootper2); - fl2=egalii(p,gdeux); + p1 = poleval(f,a); v = ggval(lift_intern(p1),p); if (v<=0) err(rootper2); + fl2 = egalii(p,gdeux); if (fl2 && v==1) err(rootper2); v=ggval(lift_intern(poleval(fp,a)), p); if (!v) @@ -1547,10 +1871,10 @@ apprgen9(GEN f, GEN a) tetpil=avma; pro=cgetg(2,t_COL); pro[1]=lcopy(a); return gerepile(av,tetpil,pro); } - n=degpol(f); pro=cgetg(n+1,t_COL); j=0; + n=degpol(f); pro=cgetg(n+1,t_COL); if (is_bigint(p)) err(impl,"apprgen9 for p>=2^31"); - x=gmodulcp(ggrandocp(p,prec), t); + x=gmodulcp(ggrandocp(p,prec), T); if (fl2) { ps_1=3; x2=ggrandocp(p,2); p=stoi(4); @@ -1560,21 +1884,19 @@ apprgen9(GEN f, GEN a) ps_1=itos(p)-1; x2=ggrandocp(p,1); } f = poleval(f,gadd(a,gmul(p,polx[varn(f)]))); - if (!gcmp0(f)) f=gdiv(f,gpuigs(p,ggval(f,p))); - d=degpol(t); vecg=cgetg(d+1,t_COL); + f = gdiv(f,gpowgs(p,ggval(f,p))); + + d=degpol(T); vecg=cgetg(d+1,t_COL); for (i=1; i<=d; i++) vecg[i] = (long)setloop(gzero); - va=varn(t); + va=varn(T); j = 1; for(;;) /* loop through F_q */ { - ip=gmodulcp(gtopoly(vecg,va),t); + ip=gmodulcp(gtopoly(vecg,va),T); if (gcmp0(poleval(f,gadd(ip,x2)))) { - u=apprgen9(f,gadd(ip,x)); lu=lg(u); - for (k=1; k3) ? padicff(res,p,r) : cgetg(1,t_COL); - nbfac += (lg(fa[j])-1); + fa[i] = (long)padicff((GEN)fa[i],p,prec); + n += lg(fa[i])-1; } - av2=avma; y=cgetg(3,t_MAT); - p1=cgetg(nbfac+1,t_COL); y[1]=(long)p1; - p2=cgetg(nbfac+1,t_COL); y[2]=(long)p2; - for (i=1,k=0; i<=j; i++) - for (i1=1; i13); - setlg(A,i); *ex=B; return A; + long i, l = lg(e); + for (i=1; i1; i--) - { - p1 = (GEN)mod[i]; - if (typ(p1) == t_POLMOD) { pol = (GEN)p1[1] ; break; } - } - if (!pol) err(talker,"need POLMOD coeffs in Kronecker_powmod"); - for (i=lgef(pol)-1; i>1; i--) - { - p1 = (GEN)pol[i]; - if (typ(p1) == t_INTMOD) { p = (GEN)p1[1] ; break; } - } - if (!p) err(talker,"need Fq coeffs in Kronecker_powmod"); - x = lift_intern(to_Kronecker(x,pol)); - - /* adapted from powgi */ - av=avma; lim=stack_lim(av,1); - p1 = n+2; m = *p1; - - y=x; j=1+bfffo(m); m<<=j; j = BITS_IN_LONG-j; - for (i=lgefint(n)-2;;) - { - for (; j; m<<=1,j--) - { - y = gsqr(y); - y = from_Kronecker(FpX(y,p), pol); - setvarn(y, v); - y = gres(y, mod); - y = lift_intern(to_Kronecker(y,pol)); - - if (m<0) - { - y = gmul(y,x); - y = from_Kronecker(FpX(y,p), pol); - setvarn(y, v); - y = gres(y, mod); - y = lift_intern(to_Kronecker(y,pol)); - } - if (low_stack(lim, stack_lim(av,1))) - { - if(DEBUGMEM>1) err(warnmem,"Kronecker_powmod"); - y = gerepilecopy(av, y); - } - } - if (--i == 0) break; - m = *++p1, j = BITS_IN_LONG; - } - y = from_Kronecker(FpX(y,p),pol); - setvarn(y, v); return gerepileupto(av0, y); + long i, lx, tx = typ(x); + if (tx != t_POL) err(typeer,"to_Fq_pol"); + lx = lgef(x); + for (i=2; i 6) timer2(); + if (DEBUGLEVEL > 6) (void)timer2(); av = avma; is2 = egalii(p, gdeux); for(cnt = 1;;cnt++) { /* splits *t with probability ~ 1 - 2^(1-r) */ - w = w0 = FqX_rand(dt,v, p,a); + w = w0 = FqX_rand(dt,v, T,p); for (l=1; l 6) - fprintferr("[split9] time for splitting: %ld (%ld trials)\n",timer2(),cnt); - l /= d; t[l]=gdeuc(*t,w); *t=w; - split9(t+l,d,p,q,a,S); - split9(t ,d,p,q,a,S); + if (DEBUGLEVEL > 6) + fprintferr("[FqX_split] splitting time: %ld (%ld trials)\n",timer2(),cnt); + l /= d; t[l] = FqX_div(*t,w, T,p); *t = w; + FqX_split(t+l,d,q,S,T,p); + FqX_split(t ,d,q,S,T,p); } /* to "compare" (real) scalars and t_INTMODs */ @@ -2019,52 +2267,52 @@ cmp_pol(GEN x, GEN y) return 0; } -/* assume n > 1, X a POLMOD over Fq */ -/* return S = [ X^q, X^2q, ... X^(n-1)q ] mod T (in Fq[X]) in Kronecker form */ +/* assume n > 1, X over FqX */ +/* return S = [ X^q, X^2q, ... X^(n-1)q ] mod u (in Fq[X]) in Kronecker form */ static GEN -init_pow_q_mod_pT(GEN Xmod, GEN q, GEN a, GEN T) +init_pow_q_mod_pT(GEN X, GEN q, GEN u, GEN T, GEN p) { - long i, n = degpol(T); + long i, n = degpol(u); GEN p1, S = cgetg(n, t_VEC); - S[1] = (long)Kronecker_powmod((GEN)Xmod[2], (GEN)Xmod[1], q); + S[1] = (long)FqXQ_pow(X, q, u, T, p); #if 1 /* use as many squarings as possible */ for (i=2; i < n; i+=2) - { + { p1 = gsqr((GEN)S[i>>1]); - S[i] = lres(p1, T); + S[i] = (long)FqX_rem(p1, u, T,p); if (i == n-1) break; p1 = gmul((GEN)S[i], (GEN)S[1]); - S[i+1] = lres(p1, T); - } + S[i+1] = (long)FqX_rem(p1, u, T,p); + } #else for (i=2; i < n; i++) - { + { p1 = gmul((GEN)S[i-1], (GEN)S[1]); - S[i] = lres(p1, T); - } + S[i] = (long)FqX_rem(p1, u, T,p); + } #endif for (i=1; i < n; i++) - S[i] = (long)lift_intern(to_Kronecker((GEN)S[i], a)); + S[i] = (long)to_Kronecker((GEN)S[i], T); return S; } /* compute x^q, S is as above */ static GEN -spec_Fq_pow_mod_pol(GEN x, GEN p, GEN a, GEN S) +spec_Fq_pow_mod_pol(GEN x, GEN S, GEN T, GEN p) { - long av = avma, lim = stack_lim(av,1), i,dx = degpol(x); + long i, dx = degpol(x); + gpmem_t av = avma, lim = stack_lim(av, 1); GEN x0 = x+2, z,c; - c = (GEN)x0[0]; - z = lift_intern(lift(c)); + z = c = (GEN)x0[0]; for (i = 1; i <= dx; i++) { GEN d; c = (GEN)x0[i]; if (gcmp0(c)) continue; d = (GEN)S[i]; - if (!gcmp1(c)) d = gmul(lift_intern(lift(c)),d); + if (!gcmp1(c)) d = gmul(c,d); z = gadd(z, d); if (low_stack(lim, stack_lim(av,1))) { @@ -2072,125 +2320,108 @@ spec_Fq_pow_mod_pol(GEN x, GEN p, GEN a, GEN S) z = gerepileupto(av, z); } } - z = FpX(z, p); - z = from_Kronecker(z, a); + z = FpXQX_from_Kronecker(z, T, p); setvarn(z, varn(x)); return gerepileupto(av, z); } -static long isabsolutepol(GEN f, GEN pp, GEN a) +static long +isabsolutepol(GEN f) { - int i,res=1; - GEN c; - for(i=2; i0) - res = 0; - break; - case t_POL: - isabsolutepol(c,pp,gzero); - if (degpol(c)>0) - res = 0; - break; - default: - err(typeer,"factmod9"); - } + GEN c = (GEN)f[i]; + if (typ(c) == t_POL && degpol(c) > 0) return 0; } - return res; + return 1; } GEN -factmod9(GEN f, GEN pp, GEN a) +factmod9(GEN f, GEN p, GEN T) { - long av = avma, tetpil,p,i,j,k,d,e,vf,va,nbfact,nbf,pk; - GEN S,ex,y,f2,f3,df1,df2,g,g1,xmod,u,v,qqd,qq,unfp,unfq, *t; + gpmem_t av = avma; + long pg, i, j, k, d, e, N, vf, va, nbfact, nbf, pk; + GEN S,ex,f2,f3,df1,df2,g1,u,v,q,unfp,unfq, *t; GEN frobinv,X; - if (typ(a)!=t_POL || typ(f)!=t_POL || gcmp0(a)) err(typeer,"factmod9"); - vf=varn(f); va=varn(a); - if (va<=vf) err(talker,"polynomial variable must be of higher priority than finite field\nvariable in factorff"); - if (isabsolutepol(f, pp, a)) + if (typ(T)!=t_POL || typ(f)!=t_POL || gcmp0(T)) err(typeer,"factmod9"); + vf = varn(f); + va = varn(T); + if (va <= vf) + err(talker,"polynomial variable must have higher priority in factorff"); + unfp = gmodulsg(1,p); T = gmul(unfp,T); + unfq = gmodulo(gmul(unfp,polun[va]), T); + f = gmul(unfq,f); + if (!signe(f)) err(zeropoler,"factmod9"); + d = degpol(f); if (!d) { avma = av; return trivfact(); } + + f = simplify(lift_intern(lift_intern(f))); + T = lift_intern(T); + if (isabsolutepol(f)) { - GEN z= Fp_factor_rel0(simplify(lift(lift(f))), pp, lift(a)); - GEN t=(GEN)z[1],ex=(GEN)z[2]; - unfp = gmodulsg(1,pp); - unfq = gmodulcp(gmul(unfp, polun[va]), gmul(unfp,a)); - nbfact=lg(t); - tetpil=avma; - y=cgetg(3,t_MAT); - u=cgetg(nbfact,t_COL); y[1]=(long)u; - v=cgetg(nbfact,t_COL); y[2]=(long)v; - for (j=1; j= pp: p = 0 can't happen */ - pk *= p; e=pk; - j=(degpol(f))/p+3; setlg(f,j); setlgef(f,j); - for (i=2; i= p: pg = 0 can't happen */ + pk *= pg; e = pk; + j = (degpol(f))/pg+3; setlg(f,j); setlgef(f,j); + for (i=2; i 1) S = init_pow_q_mod_pT(xmod, qq, a, u); - for (d=1; d <= du>>1; d++) + +#if 0 + N = degpol(u); + if (N) { - qqd=mulii(qqd,qq); - v = spec_Fq_pow_mod_pol(v, pp, a, S); - g = ggcd(gsub(v,X),u); + t[nbfact] = FpXQX_normalize(u, T,p); + d = (N==1)? 1: FqX_split_berlekamp(t+nbfact, q, T, p); + for (j=0; j 1) S = init_pow_q_mod_pT(X, q, u, T, p); + for (d=1; d <= N>>1; d++) + { + qqd = mulii(qqd,q); + v = spec_Fq_pow_mod_pol(v, S, T, p); + g = FqX_gcd(gsub(v,X),u, T,p); dg = degpol(g); if (dg <= 0) continue; @@ -2198,22 +2429,24 @@ factmod9(GEN f, GEN pp, GEN a) j = nbfact+dg/d; t[nbfact] = g; - split9(t+nbfact,d,pp,qq,a,S); - for (; nbfact0) g=0; } else if (ti != t_INT && ti != t_INTMOD && !is_frac_t(ti)) g=0; } - l1=avma; p2=cgetg(3,t_COMPLEX); + av1=avma; p2=cgetg(3,t_COMPLEX); p2[1]=lmppi(DEFAULTPREC); p2[2]=ldivrs((GEN)p2[1],10); p11=cgetg(4,t_POL); p11[1]=evalsigne(1)+evallgef(4); setvarn(p11,v); p11[3]=un; @@ -2317,22 +2533,22 @@ rootsold(GEN x, long l) deg=degpol(ps); if (deg) { - l3=avma; e=gexpo((GEN)ps[deg+2]); emax=e; + av3=avma; e=gexpo((GEN)ps[deg+2]); emax=e; for (i=2; iemax) emax=e1; } - e=emax-e; if (e<0) e=0; avma=l3; if (ps!=pax) xd0=deriv(ps,v); + e=emax-e; if (e<0) e=0; avma=av3; if (ps!=pax) xd0=deriv(ps,v); xdabs=cgetg(deg+2,t_POL); xdabs[1]=xd0[1]; for (i=2; i= -20) { p7 = gneg_i(gdiv(p4, poleval(xd,p3))); - l3 = avma; + av3 = avma; if (gcmp0(p5)) exc = -32; else exc = expo(gnorm(p7))-expo(gnorm(p3)); - avma = l3; + avma = av3; for (j=1; j<=10; j++) { p8=gadd(p3,p7); p9=poleval(xc,p8); p10=gnorm(p9); @@ -2358,14 +2574,14 @@ rootsold(GEN x, long l) GEN *gptr[3]; p3=p8; p4=p9; p5=p10; gptr[0]=&p3; gptr[1]=&p4; gptr[2]=&p5; - gerepilemanysp(l2,l3,gptr,3); + gerepilemanysp(av2,av3,gptr,3); break; } - gshiftz(p7,-2,p7); avma=l3; + gshiftz(p7,-2,p7); avma=av3; } if (j > 10) { - avma=av1; + avma=av; if (DEBUGLEVEL) { fprintferr("too many iterations in rootsold(): "); @@ -2375,7 +2591,7 @@ rootsold(GEN x, long l) } } p1=(GEN)y[k+m*i]; setlg(p1[1],3); setlg(p1[2],3); gaffect(p3,p1); - avma=l2; p14=(GEN)p1[1]; p15=(GEN)p1[2]; + avma=av2; p14=(GEN)p1[1]; p15=(GEN)p1[2]; for (ln=4; ln<=l; ln=(ln<<1)-2) { setlg(p14,ln); setlg(p15,ln); @@ -2384,7 +2600,7 @@ rootsold(GEN x, long l) p4=poleval(xc,p1); p5=poleval(xd,p1); p6=gneg_i(gdiv(p4,p5)); settyp(p14,t_REAL); settyp(p15,t_REAL); - gaffect(gadd(p1,p6),p1); avma=l2; + gaffect(gadd(p1,p6),p1); avma=av2; } } setlg(p14,l); setlg(p15,l); @@ -2404,7 +2620,7 @@ rootsold(GEN x, long l) p6=gdiv(p4,poleval(xdabs,gabs(p7,l))); if (gexpo(p6)>=expmin) { - avma=av1; + avma=av; if (DEBUGLEVEL) { fprintferr("internal error in rootsold(): using roots2()\n"); @@ -2412,13 +2628,13 @@ rootsold(GEN x, long l) } return roots2(x,l); } - avma=l2; + avma=av2; if (expo(p1[2])=0; j--) { - f=gadd(gmul(x,f),d); d=gadd(gmul(x,d),b); - b=gadd(gmul(x,b),(GEN)pol[j+2]); - erre=gadd(QuickNormL1(b,PREC),gmul(abx,erre)); + f = gadd(gmul(x,f),d); + d = gadd(gmul(x,d),b); + b = gadd(gmul(x,b), (GEN)pol[j+2]); + erre = gadd(QuickNormL1(b,PREC), gmul(abx,erre)); } - erre=gmul(erre,EPS); + erre = gmul(erre,EPS); if (gcmp(QuickNormL1(b,PREC),erre)<=0) { gaffect(x,rac); avma = av1; return rac; @@ -2674,7 +2896,7 @@ laguer(GEN pol,long N,GEN y0,GEN EPS,long PREC) static GEN balanc(GEN x) { - ulong av = avma; + gpmem_t av = avma; long last,i,j, sqrdx = (RADIX<<1), n = lg(x); GEN r,c,cofgen,a; @@ -2728,7 +2950,7 @@ hqr(GEN mat) /* find all the eigenvalues of the matrix anorm=fabs(a[1][1]); for (i=2; i<=n; i++) for (j=(i-1); j<=n; j++) anorm+=fabs(a[i][j]); - nn=n; t=0.0; + nn=n; t=0.; if (DEBUGLEVEL>3) { fprintferr("* Finding eigenvalues\n"); flusherr(); } while (nn>=1) { @@ -2737,11 +2959,11 @@ hqr(GEN mat) /* find all the eigenvalues of the matrix { for (l=nn; l>=2; l--) { - s=fabs(a[l-1][l-1])+fabs(a[l][l]); if (s==0.0) s=anorm; + s=fabs(a[l-1][l-1])+fabs(a[l][l]); if (s==0.) s=anorm; if ((double)(fabs(a[l][l-1])+s)==s) break; } x=a[nn][nn]; - if (l==nn){ wr[nn]=x+t; wi[nn--]=0.0; } + if (l==nn){ wr[nn]=x+t; wi[nn--]=0.; } else { y=a[nn-1][nn-1]; @@ -2749,18 +2971,18 @@ hqr(GEN mat) /* find all the eigenvalues of the matrix if (l == nn-1) { p=0.5*(y-x); q=p*p+w; z=sqrt(fabs(q)); x+=t; - if (q>=0.0 || fabs(q)<=eps) + if (q>=0. || fabs(q)<=eps) { z=p+SIGN(z,p); wr[nn-1]=wr[nn]=x+z; if (fabs(z)>eps) wr[nn]=x-w/z; - wi[nn-1]=wi[nn]=0.0; + wi[nn-1]=wi[nn]=0.; } else{ wr[nn-1]=wr[nn]=x+p; wi[nn-1]=-(wi[nn]=z); } nn-=2; } else { - p = q = r = 0.0; /* for lint */ + p = q = r = 0.; /* for lint */ if (its==30) err(talker,"too many iterations in hqr"); if (its==10 || its==20) { @@ -2780,18 +3002,18 @@ hqr(GEN mat) /* find all the eigenvalues of the matrix v=fabs(p)*(fabs(a[m-1][m-1])+fabs(z)+fabs(a[m+1][m+1])); if ((double)(u+v)==v) break; } - for (i=m+2; i<=nn; i++){ a[i][i-2]=0.0; if (i!=(m+2)) a[i][i-3]=0.0; } + for (i=m+2; i<=nn; i++){ a[i][i-2]=0.; if (i!=(m+2)) a[i][i-3]=0.; } for (k=m; k<=nn-1; k++) { if (k!=m) { p=a[k][k-1]; q=a[k+1][k-1]; - r = (k != nn-1)? a[k+2][k-1]: 0.0; + r = (k != nn-1)? a[k+2][k-1]: 0.; x = fabs(p)+fabs(q)+fabs(r); - if (x != 0.0) { p/=x; q/=x; r/=x; } + if (x != 0.) { p/=x; q/=x; r/=x; } } s = SIGN(sqrt(p*p+q*q+r*r),p); - if (s == 0.0) continue; + if (s == 0.) continue; if (k==m) { if (l!=m) a[k][k-1] = -a[k][k-1]; } @@ -2819,10 +3041,10 @@ hqr(GEN mat) /* find all the eigenvalues of the matrix } for (j=2; j<=n; j++) /* ordering the roots */ { - x=wr[j]; y=wi[j]; if (y) flj=1; else flj=0; + x=wr[j]; y=wi[j]; if (y != 0.) flj=1; else flj=0; for (k=j-1; k>=1; k--) { - if (wi[k]) flk=1; else flk=0; + if (wi[k] != 0.) flk=1; else flk=0; if (flk