=================================================================== RCS file: /home/cvs/OpenXM_contrib/pari-2.2/src/modules/Attic/galois.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/modules/Attic/galois.c 2001/10/02 11:17:11 1.1.1.1 +++ OpenXM_contrib/pari-2.2/src/modules/Attic/galois.c 2002/09/11 07:27:05 1.2 @@ -1,4 +1,4 @@ -/* $Id: galois.c,v 1.1.1.1 2001/10/02 11:17:11 noro Exp $ +/* $Id: galois.c,v 1.2 2002/09/11 07:27:05 noro Exp $ Copyright (C) 2000 The PARI group. @@ -30,25 +30,25 @@ typedef POBJ RESOLVANTE; static long isin_G_H(GEN po, GEN *r, long n1, long n2); -static long N,CAR,PREC,PRMAX,TSCHMAX,coeff[9][10]; +static long N,EVEN,PREC,PRMAX,TSCHMAX,coeff[9][10]; static char SID[] = { 0,1,2,3,4,5,6,7,8,9,10,11 }; static char* str_base = GPDATADIR; -static long par_N, *par_vec; +static long *par_vec; +/* k-1 entries filled so far + * m = maximal allowed value, n = sum to reach with remaining elements */ static void do_par(long k, long n, long m) { long i; - - if (n<=0) + if (n <= 0) { - GEN p1 = new_chunk(par_N+1); - for (i=1; i=av1; i-=l) T[j++]=i; + par_vec = new_chunk(n+1); + av = avma; do_par(1,n,n); + av1= avma; + for (lT=1, P = (GEN)av1; P < (GEN)av; P += lg(P)) lT++; + T = cgetg(lT, t_VEC); + for (j=lT, P = (GEN)av1; P < (GEN)av; P += lg(P)) T[--j] = (long)P; if (DEBUGLEVEL > 7) { - fprintferr("Partitions of %ld: p(%ld) = %ld\n",n,n,j-1); - for (i=1; i1) { l--; tpro=t[l]; } - else - { - tpro=t[r]; t[r]=t[1]; r--; - if (r==1) { t[1]=tpro; return; } - } - i=l; - for (j=i<<1; j<=r; j<<=1) - { - if (j < r && t[j] > t[j+1]) j++; - if (t[j] >= tpro) break; - t[i] = t[j]; i=j; - } - t[i]=tpro; - } -} - -/* 0 if t1=t2, -1 if t1t2 */ -static long -compareupletlong(long *t1,long *t2) -{ - long i; - for (i=1; i<=N; i++) - if (t1[i]!=t2[i]) return (t1[i] < t2[i])? -1: 1; - return 0; -} - /* return i if typ = TYP[i], 0 otherwise */ static long -numerotyp(long **TYP, long *galtyp) +numerotyp(GEN TYP, GEN galtyp) { - long i, nb = TYP[0][0]; - for (i=1; i<=nb; i++) - if (!compareupletlong(galtyp,TYP[i])) return i; + long i, nb = lg(TYP); + for (i=1; i= N) err(talker,"degree too large in tschirn"); if (DEBUGLEVEL) fprintferr("\n$$$$$ Tschirnhaus transformation of degree %ld: $$$$$\n",d); + a = new_chunk(d); do { for (i=0; i>4) & 7) + 1; @@ -833,7 +808,7 @@ static GEN is_int(GEN g) { GEN gint,p1; - long av; + gpmem_t av; if (typ(g) == t_COMPLEX) { @@ -847,7 +822,7 @@ is_int(GEN g) } static PERM -isin_end(PERM S, PERM uu, PERM s0, GEN gpol, long av1) +isin_end(PERM S, PERM uu, PERM s0, GEN gpol, gpmem_t av1) { PERM vv = permmul(S,uu), ww = permmul(vv,s0); @@ -864,7 +839,8 @@ isin_end(PERM S, PERM uu, PERM s0, GEN gpol, long av1) static PERM check_isin(GEN po,GEN *r,long nbm,long nbv, POBJ a, POBJ tau, POBJ ss, PERM s0) { - long pr = PREC, av1 = avma, av2,nogr,nocos,init,i,j,k,l,d,nrm,nri,sp; + long pr = PREC, nogr, nocos, init, i, j, k, l, d, nrm, nri, sp; + gpmem_t av1 = avma, av2; long nbgr,nbcos,nbracint,nbrac,lastnbri,lastnbrm; static long numi[M],numj[M],lastnum[M],multi[M],norac[M],lastnor[M]; GEN rr,ro,roint,racint[M]; @@ -996,9 +972,9 @@ galoisprim8(GEN po, GEN *r) /* PRIM_8_1: */ rep=isin_G_H(po,r,50,43); - if (rep) return CAR? 37: 43; + if (rep) return EVEN? 37: 43; /* PRIM_8_2: */ - if (!CAR) return 50; + if (!EVEN) return 50; /* PRIM_8_3: */ rep=isin_G_H(po,r,49,48); if (!rep) return 49; @@ -1319,7 +1295,7 @@ closure8(GEN po) GEN r[NMAX]; r[0] = myroots(po,PRMAX); preci(r,PREC); - if (!CAR) + if (!EVEN) { /* CLOS_8_1: */ rep=isin_G_H(po,r,50,47); @@ -1507,8 +1483,10 @@ data8(long n1, long n2, GROUP *t) static long galoismodulo8(GEN pol, GEN dpol) { - long av = avma, res, gr[51]; - long **TYP = partitions(8), **GR = (long**)cgeti(49); + long res, gr[51]; + gpmem_t av = avma; + long **GR = (long**)cgeti(49); + GEN TYP = partitions(8); /* List of possible types in group j: GR[j][0] = #GR[j] if * the group is odd, - #GR[j] if even */ @@ -1563,7 +1541,7 @@ galoismodulo8(GEN pol, GEN dpol) gr[0]=51; res = galmodp(pol,dpol,TYP,gr,GR); avma=av; if (!res) return 0; - return CAR? 49: 50; + return EVEN? 49: 50; } /* BIBLIOTHEQUE POUR LE DEGRE 9 */ @@ -1572,7 +1550,7 @@ galoisprim9(GEN po, GEN *r) { long rep; - if (!CAR) + if (!EVEN) { /* PRIM_9_1: */ rep=isin_G_H(po,r,34,26); @@ -1727,7 +1705,7 @@ closure9(GEN po) GEN r[NMAX]; r[0] = myroots(po,PRMAX); preci(r,PREC); - if (!CAR) + if (!EVEN) { /* CLOS_9_1: */ rep=isin_G_H(po,r,34,31); @@ -1793,8 +1771,10 @@ data9(long n1, long n2, GROUP *t) static long galoismodulo9(GEN pol, GEN dpol) { - long av = avma, res, gr[35]; - long **TYP = partitions(9), **GR = (long**) cgeti(33); + long res, gr[35]; + gpmem_t av = avma; + long **GR = (long**) cgeti(33); + GEN TYP = partitions(9); /* 42 TYPES ORDONNES CROISSANT (T[1],...,T[30])*/ @@ -1833,7 +1813,7 @@ galoismodulo9(GEN pol, GEN dpol) gr[0]=35; res = galmodp(pol,dpol,TYP,gr,GR); avma=av; if (!res) return 0; - return CAR? 33: 34; + return EVEN? 33: 34; } /* BIBLIOTHEQUE POUR LE DEGRE 10 */ @@ -1841,7 +1821,7 @@ static long galoisprim10(GEN po, GEN *r) { long rep; - if (CAR) + if (EVEN) { /* PRIM_10_1: */ rep=isin_G_H(po,r,44,31); @@ -2151,7 +2131,7 @@ closure10(GEN po) GEN r[NMAX]; r[0] = myroots(po,PRMAX); preci(r,PREC); - if (CAR) + if (EVEN) { /* CLOS_10_1: */ rep=isin_G_H(po,r,44,42); @@ -2243,8 +2223,10 @@ data10(long n1,long n2,GROUP *t) static long galoismodulo10(GEN pol, GEN dpol) { - long av = avma, res, gr[46]; - long **TYP = partitions(10), **GR = (long**) cgeti(45); + long res, gr[46]; + gpmem_t av = avma; + long **GR = (long**) cgeti(45); + GEN TYP = partitions(10); GR[ 1]= _gr( 4, 1,6,30,42); GR[ 2]= _gr( 3, 1,6,30); @@ -2293,7 +2275,7 @@ galoismodulo10(GEN pol, GEN dpol) gr[0]=46; res = galmodp(pol,dpol,TYP,gr,GR); avma=av; if (!res) return 0; - return CAR? 44: 45; + return EVEN? 44: 45; } /* BIBLIOTHEQUE POUR LE DEGRE 11 */ @@ -2305,7 +2287,7 @@ closure11(GEN po) GEN r[NMAX]; r[0] = myroots(po,PRMAX); preci(r,PREC); - if (CAR) + if (EVEN) { /* EVEN_11_1: */ rep=isin_G_H(po,r,7,6); @@ -2350,33 +2332,31 @@ data11(long n1, GROUP *t) static long galoismodulo11(GEN pol, GEN dpol) { - long av = avma, res, gr[6] = {0, 1,1,1,1,1}; - long **TYP = (long**) cgeti(9); + long res, gr[6] = {0, 1, 1, 1, 1, 1}; + gpmem_t av = avma; + GEN *TYP = (GEN*)cgetg(EVEN? 9: 6, t_VEC); - TYP[0] = new_chunk(1); - TYP[1] = _gr(11, 11,0,0,0,0,0,0,0,0,0,0); - if (CAR) + TYP[1] = _typ(1, 11); + if (EVEN) { - TYP[2] = _gr(11, 8,2,1,0,0,0,0,0,0,0,0); - TYP[3] = _gr(11, 6,3,2,0,0,0,0,0,0,0,0); - TYP[4] = _gr(11, 5,5,1,0,0,0,0,0,0,0,0); - TYP[5] = _gr(11, 4,4,1,1,1,0,0,0,0,0,0); - TYP[6] = _gr(11, 3,3,3,1,1,0,0,0,0,0,0); - TYP[7] = _gr(11, 2,2,2,2,1,1,1,0,0,0,0); - TYP[8] = _gr(11, 1,1,1,1,1,1,1,1,1,1,1); - TYP[0][0] = 8; + TYP[2] = _typ(3, 8,2,1); + TYP[3] = _typ(3, 6,3,2); + TYP[4] = _typ(3, 5,5,1); + TYP[5] = _typ(5, 4,4,1,1,1); + TYP[6] = _typ(5, 3,3,3,1,1); + TYP[7] = _typ(7, 2,2,2,2,1,1,1); + TYP[8] = _typ(11, 1,1,1,1,1,1,1,1,1,1,1); } else { - TYP[2] = _gr(11,10,1,0,0,0,0,0,0,0,0,0); - TYP[3] = _gr(11, 5,5,1,0,0,0,0,0,0,0,0); - TYP[4] = _gr(11, 2,2,2,2,2,1,0,0,0,0,0); - TYP[5] = _gr(11, 1,1,1,1,1,1,1,1,1,1,1); - TYP[0][0] = 5; + TYP[2] = _typ(2, 10,1); + TYP[3] = _typ(3, 5,5,1); + TYP[4] = _typ(6, 2,2,2,2,2,1); + TYP[5] = _typ(11, 1,1,1,1,1,1,1,1,1,1,1); } - res = galmodp(pol,dpol,TYP,gr,NULL); + res = galmodp(pol,dpol,(GEN)TYP,gr,NULL); avma=av; if (!res) return 0; - return CAR? 7: 8; + return EVEN? 7: 8; } /* return 1 iff we need to read a resolvent */ @@ -2477,7 +2457,8 @@ GEN galoisbig(GEN pol, long prec) { GEN dpol, res = cgetg(4,t_VEC); - long *tab,t, av = avma; + long *tab, t; + gpmem_t av = avma; long tab8[]={0, 8,8,8,8,8,16,16,16,16,16, 16,24,24,24,32,32,32,32,32,32, 32,32,48,48,56,64,64,64,64,64, 64,96,96,96,128,168,168,192,192,192, @@ -2491,14 +2472,14 @@ galoisbig(GEN pol, long prec) 1920,1920,1920,3840,7200,14400,14400,28800,1814400,3628800}; long tab11[]={0, 11,22,55,110,660,7920,19958400,39916800}; - N = degpol(pol); dpol = discsr(pol); CAR = carreparfait(dpol); + N = degpol(pol); dpol = ZX_disc(pol); EVEN = carreparfait(dpol); prec += 2 * (MEDDEFAULTPREC-2); PREC = prec; if (DEBUGLEVEL) { fprintferr("Galoisbig (prec=%ld): reduced polynomial #1 = %Z\n",prec,pol); fprintferr("discriminant = %Z\n", dpol); - fprintferr("%s group\n", CAR? "EVEN": "ODD"); flusherr(); + fprintferr("%s group\n", EVEN? "EVEN": "ODD"); flusherr(); } PRMAX = prec+5; TSCHMAX = 1; SID[0] = N; switch(N) @@ -2524,6 +2505,6 @@ galoisbig(GEN pol, long prec) } avma = av; res[1]=lstoi(tab[t]); - res[2]=lstoi(CAR? 1 : -1); + res[2]=lstoi(EVEN? 1 : -1); res[3]=lstoi(t); return res; }