Annotation of OpenXM_contrib/pari/src/modules/galois.c, Revision 1.1
1.1 ! maekawa 1: /**************************************************************/
! 2: /* */
! 3: /* Galois group for degree between 8 and 11 (included) */
! 4: /* */
! 5: /**************************************************************/
! 6: /* $Id: galois.c,v 1.1.1.1 1999/09/16 13:48:11 karim Exp $ */
! 7: #include "pari.h"
! 8: #ifndef WINCE
! 9: # include <fcntl.h>
! 10: #endif
! 11:
! 12: #define NMAX 11 /* maximum degree */
! 13:
! 14: typedef char *OBJ;
! 15: typedef OBJ *POBJ;
! 16: typedef OBJ PERM;
! 17: typedef POBJ GROUP;
! 18: typedef POBJ RESOLVANTE;
! 19:
! 20: static long isin_G_H(GEN po, GEN *r, long n1, long n2);
! 21:
! 22: static long N,CAR,PREC,PRMAX,TSCHMAX,coeff[9][10];
! 23: static char SID[] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
! 24: static char* str_coset = GPDATADIR"/COS";
! 25: static char* str_resolv = GPDATADIR"/RES";
! 26:
! 27: static long par_N, *par_vec;
! 28:
! 29: static void
! 30: do_par(long k, long n, long m)
! 31: {
! 32: long i;
! 33:
! 34: if (n<=0)
! 35: {
! 36: GEN p1 = new_chunk(par_N+1);
! 37: for (i=1; i<k ; i++) p1[i] = par_vec[i];
! 38: for ( ; i<=par_N; i++) p1[i] = 0;
! 39: return;
! 40: }
! 41: if (n<m) m=n;
! 42: for (i=1; i<=m; i++)
! 43: {
! 44: par_vec[k] = i;
! 45: do_par(k+1, n-i, i);
! 46: }
! 47: }
! 48:
! 49: /* compute the partitions of m. T[0][0] = p(m) */
! 50: static long **
! 51: partitions(long n)
! 52: {
! 53: long av,av1,i, j = 1, l = n+1;
! 54: GEN T;
! 55:
! 56: par_vec = new_chunk(l); par_N = n;
! 57: l = l*sizeof(long);
! 58: av = avma; do_par(1,n,n); av1 = avma;
! 59: T = new_chunk((av-av1)/l + 1);
! 60: for (i=av-l; i>=av1; i-=l) T[j++]=i;
! 61:
! 62: if (DEBUGLEVEL > 7)
! 63: {
! 64: fprintferr("Partitions of %ld: p(%ld) = %ld\n",n,n,j-1);
! 65: for (i=1; i<j; i++)
! 66: {
! 67: fprintferr("i = %ld: ",i);
! 68: for (l=1; l<=n; l++)
! 69: fprintferr("%ld ",((long**)T)[i][l]);
! 70: fprintferr("\n"); flusherr();
! 71: }
! 72: }
! 73: T[0] = lgeti(1); ((long**)T)[0][0] = j-1;
! 74: return (long**)T;
! 75: }
! 76:
! 77: /* affect to the permutation x the N arguments that follow */
! 78: static void
! 79: _aff(char *x,...)
! 80: {
! 81: va_list args; long i;
! 82: va_start(args,x); for (i=1; i<=N; i++) x[i] = va_arg(args,int);
! 83: va_end(args);
! 84: }
! 85:
! 86: /* return an array of length |len| from the arguments (for galoismodulo) */
! 87: static GEN
! 88: _gr(long len,...)
! 89: {
! 90: va_list args;
! 91: long i, l = labs(len);
! 92: GEN x = new_chunk(l+1);
! 93:
! 94: va_start(args,len); x[0] = len;
! 95: for (i=1; i<=l; i++) x[i] = va_arg(args,int);
! 96: va_end(args); return x;
! 97: }
! 98:
! 99: /* create a permutation with the N arguments of the function */
! 100: static PERM
! 101: _cr(char a,...)
! 102: {
! 103: static char x[NMAX+1];
! 104: va_list args;
! 105: long i;
! 106:
! 107: va_start(args, a); x[0] = N; x[1] = a;
! 108: for (i=2; i<=N; i++) x[i] = va_arg(args,int);
! 109: va_end(args); return x;
! 110: }
! 111:
! 112: static PERM
! 113: permmul(PERM s1, PERM s2)
! 114: {
! 115: long i, n1 = s1[0];
! 116: PERM s3 = gpmalloc(n1+1);
! 117: for (i=1; i<=n1; i++) s3[i]=s1[(int)s2[i]];
! 118: s3[0]=n1; return s3;
! 119: }
! 120:
! 121: static void
! 122: printperm(PERM perm)
! 123: {
! 124: long i, n = perm[0];
! 125: fprintferr("(");
! 126: for (i=1; i<=n; i++) fprintferr(" %d",perm[i]);
! 127: fprintferr(" )\n");
! 128: }
! 129:
! 130: /* ranger dans l'ordre decroissant (quicksort) */
! 131: static void
! 132: ranger(long *t, long n)
! 133: {
! 134: long tpro,l,r,i,j;
! 135:
! 136: l=1+n/2; r=n; tpro=t[1];
! 137: for(;;)
! 138: {
! 139: if (l>1) { l--; tpro=t[l]; }
! 140: else
! 141: {
! 142: tpro=t[r]; t[r]=t[1]; r--;
! 143: if (r==1) { t[1]=tpro; return; }
! 144: }
! 145: i=l;
! 146: for (j=i<<1; j<=r; j<<=1)
! 147: {
! 148: if (j < r && t[j] > t[j+1]) j++;
! 149: if (t[j] >= tpro) break;
! 150: t[i] = t[j]; i=j;
! 151: }
! 152: t[i]=tpro;
! 153: }
! 154: }
! 155:
! 156: /* 0 if t1=t2, -1 if t1<t2, 1 if t1>t2 */
! 157: static long
! 158: compareupletlong(long *t1,long *t2)
! 159: {
! 160: long i;
! 161: for (i=1; i<=N; i++)
! 162: if (t1[i]!=t2[i]) return (t1[i] < t2[i])? -1: 1;
! 163: return 0;
! 164: }
! 165:
! 166: /* return i if typ = TYP[i], 0 otherwise */
! 167: static long
! 168: numerotyp(long **TYP, long *galtyp)
! 169: {
! 170: long i, nb = TYP[0][0];
! 171: for (i=1; i<=nb; i++)
! 172: if (!compareupletlong(galtyp,TYP[i])) return i;
! 173: return 0;
! 174: }
! 175:
! 176: static int
! 177: raye(long *g, long num)
! 178: {
! 179: long i, nb = labs(g[0]);
! 180: for (i=1; i<=nb; i++)
! 181: if (g[i] == num) return 0;
! 182: return 1;
! 183: }
! 184:
! 185: /* we can never determine the group completely in there */
! 186: static long
! 187: rayergroup11(long num, long *gr)
! 188: {
! 189: long r = 0;
! 190:
! 191: if (CAR)
! 192: switch(num)
! 193: {
! 194: case 2: case 5:
! 195: if (gr[3]) { gr[3]=0; r++; }
! 196: case 3: case 6: case 7:
! 197: if (gr[2]) { gr[2]=0; r++; }
! 198: case 4:
! 199: if (gr[1]) { gr[1]=0; r++; }
! 200: }
! 201: else
! 202: switch(num)
! 203: {
! 204: case 2: case 3:
! 205: if (gr[1]) { gr[1]=0; r++; }
! 206: }
! 207: return r;
! 208: }
! 209:
! 210: static long
! 211: rayergroup(long **GR, long num, long *gr)
! 212: {
! 213: long i,nbgr,r;
! 214:
! 215: if (!GR) return rayergroup11(num,gr);
! 216: nbgr = lg(GR); r = 0 ;
! 217: if (CAR)
! 218: {
! 219: for (i=1; i<nbgr; i++)
! 220: if (gr[i] && GR[i][0] < 0 && raye(GR[i],num)) { gr[i]=0; r++; }
! 221: }
! 222: else
! 223: {
! 224: for (i=1; i<nbgr; i++)
! 225: if (gr[i] && GR[i][0] > 0 && raye(GR[i],num)) { gr[i]=0; r++; }
! 226: }
! 227: return r;
! 228: }
! 229:
! 230: static long
! 231: galmodp(GEN pol, GEN dpol, long **TYP, long *gr, long **GR)
! 232: {
! 233: long p = 0, i,k,l,n,nbremain,dtyp[NMAX+1];
! 234: byteptr d = diffptr;
! 235: GEN p1;
! 236:
! 237: switch(N)
! 238: {
! 239: case 8: nbremain = CAR? 28: 22; break;
! 240: case 9: nbremain = CAR? 18: 16; break;
! 241: case 10: nbremain = CAR? 12: 33; break;
! 242: case 11: nbremain = CAR? 5: 3; break;
! 243: }
! 244:
! 245: k = gr[0]; for (i=1; i<k; i++) gr[i]=1;
! 246: for (k=1; k<15; k++, d++)
! 247: {
! 248: p += *d; if (!*d) err(primer1);
! 249: if (smodis(dpol,p)) /* p does not divide dpol */
! 250: {
! 251: p1 = simplefactmod(pol,stoi(p));
! 252: p1 = (GEN)p1[1]; l = lg(p1);
! 253: for (i=1; i<l ; i++) dtyp[i] = itos((GEN)(p1[l-i]));
! 254: for ( ; i<=N; i++) dtyp[i] = 0;
! 255: ranger(dtyp,N); n = numerotyp(TYP,dtyp);
! 256: if (!n) return 1; /* only for N=11 */
! 257: nbremain -= rayergroup(GR,n,gr);
! 258: if (nbremain==1) return 1;
! 259: }
! 260: }
! 261: return 0;
! 262: }
! 263:
! 264: static long
! 265: _aux(GEN z)
! 266: {
! 267: return signe(z)? ((expo(z)+165) >> TWOPOTBITS_IN_LONG) - lg(z)
! 268: : (expo(z)+101) >> TWOPOTBITS_IN_LONG;
! 269: }
! 270:
! 271: static long
! 272: suffprec(GEN z)
! 273: {
! 274: long s,t;
! 275:
! 276: if (typ(z)==t_COMPLEX)
! 277: {
! 278: s=_aux((GEN)z[1]);
! 279: t=_aux((GEN)z[2]); return (t>s)? t: s;
! 280: }
! 281: return _aux(z);
! 282: }
! 283:
! 284: static void
! 285: preci(GEN *r, long p)
! 286: {
! 287: GEN x;
! 288: long d,i;
! 289:
! 290: if (p>PRMAX) err(talker,"too large precision in preci()");
! 291: for (d=0; d<TSCHMAX; d++) for (i=1; i<=N; i++)
! 292: {
! 293: x = (GEN) r[d][i];
! 294: if (typ(x)==t_COMPLEX) { setlg(x[1],p); setlg(x[2],p); } else setlg(x,p);
! 295: }
! 296: }
! 297:
! 298: static long
! 299: getpreci(GEN *r)
! 300: {
! 301: GEN x = (GEN)r[0][1];
! 302: return (typ(x)==t_COMPLEX)? lg(x[1]): lg(x);
! 303: }
! 304:
! 305: static void
! 306: new_pol(GEN *r, long *a, long d)
! 307: {
! 308: long av,i,j;
! 309: GEN x, p1;
! 310: for (i=1; i<=N; i++)
! 311: {
! 312: av =avma; p1 = (GEN)r[0][i]; x = gaddsg(a[0], p1);
! 313: for (j=1; j<=d; j++) x = gaddsg(a[j], gmul(p1,x));
! 314: r[d][i] = (long) gerepileupto(av,x);
! 315: }
! 316: }
! 317:
! 318: static void
! 319: rangeroots(GEN newr, GEN oldr)
! 320: {
! 321: long av = avma,i,j,k,z[NMAX+1],t[NMAX+1];
! 322: GEN diff,diff0;
! 323:
! 324: for (i=1; i<=N; i++) t[i]=1;
! 325: for (i=1; i<=N; i++)
! 326: {
! 327: diff0 = gun;
! 328: for (j=1; j<=N; j++)
! 329: if (t[j])
! 330: {
! 331: diff = gabs(gsub((GEN)oldr[i], (GEN)newr[j]), PREC);
! 332: if (gcmp(diff,diff0) < 0) { diff0=diff; k=j; }
! 333: }
! 334: z[i]=newr[k]; t[k]=0;
! 335: }
! 336: avma=av; for (i=1; i<=N; i++) newr[i]=z[i];
! 337: }
! 338:
! 339: /* clean up roots. If root is real replace it by its real part */
! 340: GEN
! 341: myroots(GEN p, long prec)
! 342: {
! 343: GEN y,x = roots(p,prec);
! 344: long i,lx = lg(x);
! 345: for (i=1; i<lx; i++)
! 346: {
! 347: y = (GEN)x[i];
! 348: if (signe(y[2])) break; /* remaining roots are complex */
! 349: x[i]=y[1]; /* root is real; take real part */
! 350: }
! 351: return x;
! 352: }
! 353:
! 354: /* increase the roots accuracy */
! 355: static void
! 356: moreprec(GEN po, GEN *r, long pr)
! 357: {
! 358: if (DEBUGLEVEL) { fprintferr("$$$$$ New prec = %ld\n",pr); flusherr(); }
! 359: if (pr > PRMAX)
! 360: { /* recompute roots */
! 361: GEN p1;
! 362: long d = PRMAX + 5;
! 363:
! 364: PRMAX = (pr < d)? d: pr;
! 365: p1 = myroots(po,PRMAX); rangeroots(p1,*r); *r=p1;
! 366: for (d=1; d<TSCHMAX; d++) new_pol(r,coeff[d],d);
! 367: }
! 368: preci(r,pr);
! 369: }
! 370:
! 371: #define setcard_obj(x,n) ((x)[0] = (char*)(n))
! 372: #define getcard_obj(x) ((long)((x)[0]))
! 373:
! 374: /* allocate a list of m arrays of length n (index 0 is codeword) */
! 375: static POBJ
! 376: alloc_pobj(long n, long m)
! 377: {
! 378: long i, sz = (m+1)*sizeof(OBJ) + (n+1)*m;
! 379: POBJ g = (POBJ) gpmalloc(sz);
! 380: OBJ gpt = (OBJ) (g + (m+1));
! 381:
! 382: for (i=1; i<=m; i++) { g[i] = gpt; gpt += (n+1); }
! 383: setcard_obj(g, m); return g;
! 384: }
! 385:
! 386: /* swap args ! Return an empty RESOLVANTE */
! 387: #define allocresolv(n,m) alloc_pobj(m, n)
! 388:
! 389: static GROUP
! 390: allocgroup(long n, long card)
! 391: {
! 392: GROUP gr = alloc_pobj(n,card);
! 393: long i;
! 394:
! 395: for (i=1; i<=card; i++) gr[i][0]=(char)n;
! 396: return gr;
! 397: }
! 398:
! 399: static char *
! 400: name(char *pre, long n, long n1, long n2, long no)
! 401: {
! 402: static char chn[128];
! 403: char ch[6];
! 404:
! 405: sprintf(chn, "%s%ld_%ld_%ld", pre,n,n1,n2);
! 406: if (no) { sprintf(ch,"_%ld",no); strcat(chn, ch); }
! 407: return chn;
! 408: }
! 409:
! 410: static long
! 411: galopen(char *s)
! 412: {
! 413: #ifdef WINCE
! 414: HANDLE h;
! 415: short ws[256];
! 416: MultiByteToWideChar(CP_ACP, 0, s, strlen(s)+1, ws, 256);
! 417: h = CreateFile(ws,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
! 418: if (h == INVALID_HANDLE_VALUE)
! 419: err(talker, "galois files not available in this version, sorry");
! 420: if (DEBUGLEVEL > 3) msgtimer("opening %s", s);
! 421: return (long)h;
! 422: #else
! 423: long fd = open(s,O_RDONLY);
! 424:
! 425: if (fd == -1)
! 426: err(talker,"galois files not available in this version, sorry");
! 427:
! 428: if (DEBUGLEVEL > 3) msgtimer("opening %s",s);
! 429: return fd;
! 430: #endif
! 431: }
! 432:
! 433: static char
! 434: bin(char c)
! 435: {
! 436: if (c>='0' && c<='9') c=c-'0';
! 437: else if (c>='A' && c<='Z') c=c-'A'+10;
! 438: else if (c>='a' && c<='z') c=c-'a'+36;
! 439: else err(talker,"incorrect value in bin()");
! 440: return c;
! 441: }
! 442:
! 443: #define BUFFS 512
! 444: /* fill in g[i][j] (i<=n, j<=m) with (buffered) data from fd */
! 445: static void
! 446: read_obj(POBJ g, long fd, long n, long m)
! 447: {
! 448: char ch[BUFFS];
! 449: long i,j, k = BUFFS;
! 450:
! 451: i = j = 1;
! 452: for(;;)
! 453: {
! 454: #ifdef WINCE
! 455: if (k==BUFFS) { DWORD chRead; ReadFile((HANDLE)fd, ch, BUFFS, &chRead, NULL); k=0; }
! 456: #else
! 457: if (k==BUFFS) { read(fd,ch,BUFFS); k=0; }
! 458: #endif
! 459: g[i][j++] = bin(ch[k++]);
! 460: if (j>m) { j=1; i++; if (i>n) break; }
! 461: }
! 462: #ifdef WINCE
! 463: CloseHandle((HANDLE)fd); if (DEBUGLEVEL > 3) msgtimer("read_object");
! 464: #else
! 465: close(fd); if (DEBUGLEVEL > 3) msgtimer("read_object");
! 466: #endif
! 467: }
! 468: #undef BUFFS
! 469:
! 470: /* the first 8 bytes contain size data (possibly padded with \0) */
! 471: static GROUP
! 472: lirecoset(long n1, long n2, long n)
! 473: {
! 474: GROUP gr, grptr;
! 475: char c, ch[8];
! 476: long no,m,cardgr,fd;
! 477:
! 478: #ifdef WINCE
! 479: long chRead;
! 480: if (n<11 || n1<8)
! 481: {
! 482: fd = galopen(name(str_coset, n, n1, n2, 0));
! 483: ReadFile((HANDLE)fd,&c,1, &chRead, NULL); m=bin(c); ReadFile((HANDLE)fd,&c,1, &chRead, NULL);
! 484: ReadFile((HANDLE)fd,ch,6, &chRead, NULL); cardgr=atol(ch); gr=allocgroup(m,cardgr);
! 485: read_obj(gr, fd,cardgr,m); return gr;
! 486: }
! 487: m = 11; cardgr = 45360;
! 488: gr = grptr = allocgroup(n, 8 * cardgr);
! 489: for (no=1; no<=8; no++)
! 490: {
! 491: fd = galopen(name(str_coset, n, n1, n2, no)); ReadFile((HANDLE)fd,ch,8, &chRead, NULL);
! 492: read_obj(grptr, fd,cardgr,m); grptr += cardgr;
! 493: }
! 494: return gr;
! 495: #else
! 496: if (n<11 || n1<8)
! 497: {
! 498: fd = galopen(name(str_coset, n, n1, n2, 0));
! 499: read(fd,&c,1); m=bin(c); read(fd,&c,1);
! 500: read(fd,ch,6); cardgr=atol(ch); gr=allocgroup(m,cardgr);
! 501: read_obj(gr, fd,cardgr,m); return gr;
! 502: }
! 503: m = 11; cardgr = 45360;
! 504: gr = grptr = allocgroup(n, 8 * cardgr);
! 505: for (no=1; no<=8; no++)
! 506: {
! 507: fd = galopen(name(str_coset, n, n1, n2, no)); read(fd,ch,8);
! 508: read_obj(grptr, fd,cardgr,m); grptr += cardgr;
! 509: }
! 510: return gr;
! 511: #endif
! 512: }
! 513:
! 514: static RESOLVANTE
! 515: lireresolv(long n1, long n2, long n, long *nv, long *nm)
! 516: {
! 517: RESOLVANTE b;
! 518: char ch[5];
! 519: long fd;
! 520:
! 521: #ifdef WINCE
! 522: long chRead;
! 523: fd = galopen(name(str_resolv, n, n1, n2, 0));
! 524: ReadFile((HANDLE)fd,ch,5, &chRead, NULL); *nm=atol(ch);
! 525: ReadFile((HANDLE)fd,ch,3, &chRead, NULL); *nv=atol(ch);
! 526: b = allocresolv(*nm,*nv);
! 527: read_obj(b, fd,*nm,*nv); return b;
! 528: #else
! 529: fd = galopen(name(str_resolv, n, n1, n2, 0));
! 530: read(fd,ch,5); *nm=atol(ch);
! 531: read(fd,ch,3); *nv=atol(ch);
! 532: b = allocresolv(*nm,*nv);
! 533: read_obj(b, fd,*nm,*nv); return b;
! 534: #endif
! 535: }
! 536:
! 537: static GEN
! 538: monomial(GEN r, PERM bb, long nbv)
! 539: {
! 540: long i; GEN p1 = (GEN)r[(int)bb[1]];
! 541:
! 542: for (i=2; i<=nbv; i++) p1 = gmul(p1, (GEN)r[(int)bb[i]]);
! 543: return p1;
! 544: }
! 545:
! 546: static GEN
! 547: gpolynomial(GEN r, RESOLVANTE aa, long nbm, long nbv)
! 548: {
! 549: long i; GEN p1 = monomial(r,aa[1],nbv);
! 550:
! 551: for (i=2; i<=nbm; i++) p1 = gadd(p1, monomial(r,aa[i],nbv));
! 552: return p1;
! 553: }
! 554:
! 555: static void
! 556: zaux1(GEN *z, GEN *r)
! 557: {
! 558: GEN p2,p1;
! 559: p2=gsub(r[1],gadd(r[2],r[5]));
! 560: p2=gmul(p2,gsub(r[2],r[5]));
! 561: p1=gmul(p2,r[1]);
! 562: p2=gsub(r[3],gadd(r[2],r[4]));
! 563: p2=gmul(p2,gsub(r[4],r[2]));
! 564: p1=gadd(p1,gmul(p2,r[3]));
! 565: p2=gmul(r[5],gsub(r[4],r[5]));
! 566: z[1]=gadd(p1,gmul(p2,r[4]));
! 567:
! 568: p2=gsub(r[1],gadd(r[3],r[4]));
! 569: p2=gmul(p2,gsub(r[3],r[4]));
! 570: p1=gmul(p2,r[1]);
! 571: p2=gsub(r[5],gadd(r[3],r[2]));
! 572: p2=gmul(p2,gsub(r[2],r[3]));
! 573: p1=gadd(p1,gmul(p2,r[5]));
! 574: p2=gmul(r[4],gsub(r[2],r[4]));
! 575: z[2]=gadd(p1,gmul(p2,r[2]));
! 576: }
! 577:
! 578: static void
! 579: zaux(GEN *z, GEN *r)
! 580: {
! 581: zaux1(z, r); zaux1(z+2, r+5);
! 582: }
! 583:
! 584: static GEN
! 585: gpoly(GEN rr, long n1, long n2)
! 586: {
! 587: GEN p1,p2,z[6], *r = (GEN*)rr; /* syntaxic kludge */
! 588: long i,j;
! 589:
! 590: if (N==8)
! 591: {
! 592: if (n1==47 && n2==46)
! 593: {
! 594: p1=gsub(r[3],r[4]);
! 595: for (i=1; i<3; i++) for (j=i+1; j<5; j++) p1 = gmul(p1,gsub(r[i],r[j]));
! 596: for (i=5; i<8; i++) for (j=i+1; j<9; j++) p1 = gmul(p1,gsub(r[i],r[j]));
! 597: p2=r[1];
! 598: for (i=2; i<5; i++) p2=gadd(p2,r[i]);
! 599: for (i=5; i<9; i++) p2=gsub(p2,r[i]);
! 600: }
! 601: else /* n1==44 && n2==40 */
! 602: {
! 603: for (i=1; i<5; i++) z[i] = gadd(r[2*i-1],r[2*i]);
! 604: p1 = gsub(r[1],r[2]);
! 605: for (i=2; i<5; i++) p1 = gmul(p1,gsub(r[2*i-1],r[2*i]));
! 606: p2=gsub(z[3],z[4]);
! 607: for (i=1; i<3; i++) for (j=i+1; j<5; j++) p2 = gmul(p2,gsub(z[i],z[j]));
! 608: }
! 609: return gmul(p1,p2);
! 610: }
! 611:
! 612: if (N==9)
! 613: {
! 614: if (n1==31 && n2==29)
! 615: {
! 616: p1=gsub(r[2],r[3]);
! 617: for (j=2; j<4; j++) p1 = gmul(p1,gsub(r[1],r[j]));
! 618: for (i=4; i<6; i++) for (j=i+1; j<7; j++) p1 = gmul(p1,gsub(r[i],r[j]));
! 619: p2 = gsub(r[8],r[9]);
! 620: for (j=8; j<10; j++) p2 = gmul(p2,gsub(r[7],r[j]));
! 621: }
! 622: else /* ((n1==34 && n2==31) || (n1=33 && n2==30)) */
! 623: {
! 624: p1=r[1]; for (i=2; i<4; i++) p1=gadd(p1,r[i]);
! 625: p2=r[4]; for (i=5; i<7; i++) p2=gadd(p2,r[i]);
! 626: p1=gmul(p1,p2);
! 627: p2=r[7]; for (i=8; i<10; i++) p2=gadd(p2,r[i]);
! 628: }
! 629: return gmul(p1,p2);
! 630: }
! 631:
! 632: if (N==10)
! 633: {
! 634: if ((n1==45 && n2==43) || (n1==44 && n2==42))
! 635: {
! 636: p1=r[1]; for (i=2; i<6; i++) p1=gadd(p1,r[i]);
! 637: p2=r[6]; for (i=7; i<11; i++) p2=gadd(p2,r[i]);
! 638: return gmul(p1,p2);
! 639: }
! 640: else if ((n1==45 && n2==39) || (n1==44 && n2==37))
! 641: {
! 642: p1 = gadd(r[1],r[2]);
! 643: for (i=2; i<6; i++) p1 = gmul(p1,gadd(r[2*i-1],r[2*i]));
! 644: return p1;
! 645: }
! 646: else if ((n1==43 && n2==41) || (n1==33 && n2==27))
! 647: {
! 648: p1=gsub(r[4],r[5]);
! 649: for (i=1; i<4; i++) for (j=i+1; j<6; j++) p1=gmul(p1,gsub(r[i],r[j]));
! 650: p2=gsub(r[9],r[10]);
! 651: for (i=6; i<9; i++) for (j=i+1; j<11; j++) p2=gmul(p2,gsub(r[i],r[j]));
! 652: return gmul(p1,p2);
! 653: }
! 654: else if ((n1==43 && n2==33) || (n1==42 && n2==28) || (n1==41 && n2==27)
! 655: || (n1==40 && n2==21))
! 656: {
! 657: p2=gadd(r[2],r[5]);
! 658: p2=gsub(p2,gadd(r[3],r[4]));
! 659: p1=gmul(p2,r[1]);
! 660: p2=gsub(r[3],gadd(r[4],r[5]));
! 661: p1=gadd(p1,gmul(p2,r[2]));
! 662: p2=gsub(r[4],r[5]);
! 663: p1=gadd(p1,gmul(p2,r[3]));
! 664: z[1]=gadd(p1,gmul(r[4],r[5]));
! 665:
! 666: p2=gadd(r[7],r[10]);
! 667: p2=gsub(p2,gadd(r[8],r[9]));
! 668: p1=gmul(p2,r[6]);
! 669: p2=gsub(r[8],gadd(r[9],r[10]));
! 670: p1=gadd(p1,gmul(p2,r[7]));
! 671: p2=gsub(r[9],r[10]);
! 672: p1=gadd(p1,gmul(p2,r[8]));
! 673: z[2]=gadd(p1,gmul(r[9],r[10]));
! 674: return gadd(gsqr(z[1]), gsqr(z[2]));
! 675: }
! 676: else if (n1==41 && n2==40)
! 677: {
! 678: p1=gsub(r[4],r[5]);
! 679: for (i=1; i<4; i++) for (j=i+1; j<6; j++) p1 = gmul(p1,gsub(r[i],r[j]));
! 680: p2=gsub(r[9],r[10]);
! 681: for (i=6; i<9; i++) for (j=i+1; j<11; j++) p2 = gmul(p2,gsub(r[i],r[j]));
! 682: return gadd(p1,p2);
! 683: }
! 684: else if ((n1==41 && n2==22) || (n1==40 && n2==11) || (n1==17 && n2==5)
! 685: || (n1==10 && n2==4) || (n1==9 && n2==3) || (n1==6 && n2==1))
! 686: {
! 687: p1=gadd(r[1],r[6]);
! 688: for (i=2; i<6; i++) p1=gmul(p1,gadd(r[i],r[i+5]));
! 689: return p1;
! 690: }
! 691: else if ((n1==39 && n2==38) || (n1==29 && n2==25))
! 692: {
! 693: for (i=1; i<6; i++) z[i]=gadd(r[2*i-1],r[2*i]);
! 694: p1=gsub(r[1],r[2]);
! 695: for (i=2; i<6; i++) p1=gmul(p1,gsub(r[2*i-1],r[2*i]));
! 696: p2=gsub(z[4],z[5]);
! 697: for (i=1; i<4; i++) for (j=i+1; j<6; j++) p2=gmul(p2,gsub(z[i],z[j]));
! 698: return gmul(p1,p2);
! 699: }
! 700: else if ((n1==39 && n2==36) || (n1==37 && n2==34) || (n1==29 && n2==23)
! 701: || (n1==24 && n2==15))
! 702: {
! 703: for (i=1; i<6; i++) z[i]=gadd(r[2*i-1],r[2*i]);
! 704: p1=gsub(z[4],z[5]); p2=gmul(gsub(z[3],z[4]),gsub(z[3],z[5]));
! 705: for (i=1; i<3; i++) for (j=i+1; j<6; j++) p2=gmul(p2,gsub(z[i],z[j]));
! 706: return gmul(p1,p2);
! 707: }
! 708: else if ((n1==39 && n2==29) || (n1==38 && n2==25) || (n1==37 && n2==24)
! 709: || (n1==36 && n2==23) || (n1==34 && n2==15))
! 710: {
! 711: for (i=1; i<6; i++) z[i]=gadd(r[2*i-1],r[2*i]);
! 712: p2=gadd(z[2],z[5]); p2=gsub(p2,gadd(z[3],z[4]));
! 713: p1=gmul(p2,z[1]);
! 714: p2=gsub(z[3],gadd(z[4],z[5]));
! 715: p1=gadd(p1,gmul(p2,z[2]));
! 716: p2=gsub(z[4],z[5]);
! 717: p1=gadd(p1,gmul(p2,z[3]));
! 718: p1=gadd(p1,gmul(z[4],z[5])); return gsqr(p1);
! 719: }
! 720: else if ((n1==39 && n2==22) || (n1==38 && n2==12) || (n1==36 && n2==11)
! 721: || (n1==29 && n2== 5) || (n1==25 && n2== 4) || (n1==23 && n2== 3)
! 722: || (n1==16 && n2== 2) || (n1==14 && n2== 1))
! 723: {
! 724: p1=r[1]; for (i=2; i<6; i++) p1=gadd(p1,r[2*i-1]);
! 725: p2=r[2]; for (i=2; i<6; i++) p2=gadd(p2,r[2*i]);
! 726: return gmul(p1,p2);
! 727: }
! 728: else if (n1==28 && n2==18)
! 729: {
! 730: zaux(z, r);
! 731: p1=gmul(z[1],gsub(z[3],z[4]));
! 732: p2=gmul(z[2],gadd(z[3],z[4])); return gadd(p1,p2);
! 733: }
! 734: else if (n1==27 && n2==20)
! 735: {
! 736: zaux(z, r); p1=gmul(z[1],z[3]); p2=gmul(z[2],z[4]);
! 737: p1 = gsub(p1,p2); p2=r[1];
! 738: for (i=2; i<6 ; i++) p2=gadd(p2,r[i]);
! 739: for ( ; i<11; i++) p2=gsub(p2,r[i]);
! 740: return gmul(p1,p2);
! 741: }
! 742: else if (n1==27 && n2==19)
! 743: {
! 744: zaux(z, r); p1=gmul(z[1],z[3]); p2=gmul(z[2],z[4]);
! 745: return gsub(p1,p2);
! 746: }
! 747: else if ((n1==27 && n2==17) || (n1==21 && n2==9))
! 748: {
! 749: zaux(z, r); p1=gmul(z[1],z[3]); p2=gmul(z[2],z[4]);
! 750: return gadd(p1,p2);
! 751: }
! 752: else if (n1==23 && n2==16)
! 753: {
! 754: for (i=1; i<6; i++) z[i]=gadd(r[2*i-1],r[2*i]);
! 755: p1=gsub(z[1],gadd(z[2],z[5])); p1=gmul(p1,gsub(z[2],z[5]));
! 756: p2=gmul(p1,z[1]); p1=gsub(z[3],gadd(z[2],z[4]));
! 757: p1=gmul( p1,gsub(z[4],z[2])); p2=gadd(p2,gmul(p1,z[3]));
! 758: p1=gmul(z[5],gsub(z[4],z[5])); p2=gadd(p2,gmul(p1,z[4]));
! 759: p1=gsub(r[1],r[2]);
! 760: for (i=2; i<6; i++) p1=gmul(p1,gsub(r[2*i-1],r[2*i]));
! 761: return gmul(p1,p2);
! 762: }
! 763: else if (n1==22 && n2==12)
! 764: {
! 765: for (i=1; i<6; i++) z[i]=gadd(r[i],r[i+5]);
! 766: p1=gsub(r[1],r[6]);
! 767: for (i=2; i<6; i++) p1=gmul(p1,gsub(r[i],r[i+5]));
! 768: p2=gsub(z[4],z[5]);
! 769: for (i=1; i<4; i++) for (j=i+1; j<6; j++) p2=gmul(p2,gsub(z[i],z[j]));
! 770: return gmul(p1,p2);
! 771: }
! 772: else if ((n1==22 && n2==11) || (n1==5 && n2==3))
! 773: {
! 774: for (i=1; i<6; i++) z[i]=gadd(r[i],r[i+5]);
! 775: p1=gsub(z[4],z[5]); p2=gmul(gsub(z[3],z[4]),gsub(z[3],z[5]));
! 776: for (i=1; i<3; i++) for (j=i+1; j<6; j++) p2=gmul(p2,gsub(z[i],z[j]));
! 777: return gmul(p1,p2);
! 778: }
! 779: else if ((n1==22 && n2==5) || (n1==12 && n2==4) || (n1==11 && n2==3))
! 780: {
! 781: for (i=1; i<6; i++) z[i]=gadd(r[i],r[i+5]);
! 782: p2=gadd(z[2],z[5]); p2=gsub(p2,gadd(z[3],z[4])); p1=gmul(p2,z[1]);
! 783: p2=gsub(z[3],gadd(z[4],z[5])); p1=gadd(p1,gmul(p2,z[2]));
! 784: p2=gsub(z[4],z[5]);
! 785: p1=gadd(p1,gmul(p2,z[3])); p1=gadd(p1,gmul(z[4],z[5]));
! 786: return gsqr(p1);
! 787: }
! 788: else if (n1==21 && n2==10)
! 789: {
! 790: zaux(z, r); p1=gmul(z[1],z[4]); p2=gmul(z[2],z[3]);
! 791: return gsub(p1,p2);
! 792: }
! 793: }
! 794: err(talker,"indefinite invariant polynomial in gpoly()");
! 795: return NULL; /* not reached */
! 796: }
! 797:
! 798: static void
! 799: tschirn(GEN po, GEN *r, long pr)
! 800: {
! 801: long av0 = avma, a[NMAX],v,i,d;
! 802: GEN h,u;
! 803:
! 804: d = TSCHMAX+1;
! 805: if (d>=N)
! 806: err(talker,"too large degree for Tschirnhaus transformation in tschirn");
! 807: if (DEBUGLEVEL)
! 808: {
! 809: fprintferr("\n$$$$$ Tschirnhaus transformation of degree %ld: $$$$$\n",d);
! 810: flusherr();
! 811: }
! 812: v=varn(po); h=polun[v];
! 813: do
! 814: {
! 815: avma = av0;
! 816: for (i=0; i<d; i++)
! 817: {
! 818: a[i] = ((mymyrand()>>4) & 7) + 1;
! 819: h = gaddsg(a[i],gmul(polx[v],h));
! 820: }
! 821: u=caract(gmodulcp(h,po),v);
! 822: }
! 823: while (lgef(srgcd(u,deriv(u,v))) > 3);
! 824: if (DEBUGLEVEL>2) { bruterr(u,'g',-1); fprintferr("\n"); flusherr(); }
! 825:
! 826: avma = av0; d = TSCHMAX;
! 827: for (i=0; i<=d; i++) coeff[d][i] = a[i];
! 828: preci(r,PRMAX); r[d]=cgetg(N+1,t_VEC);
! 829: new_pol(r,a,d); preci(r,pr); TSCHMAX++;
! 830: }
! 831:
! 832: static GEN
! 833: get_pol_perm(PERM S1, PERM S2, GEN rr, RESOLVANTE a,
! 834: long nbm, long nbv)
! 835: {
! 836: static long r[NMAX+1];
! 837: long i;
! 838:
! 839: for (i=1; i<=N; i++) r[i] = rr[(int)S1[(int)S2[i]]];
! 840: return a? gpolynomial(r,a,nbm,nbv): gpoly(r,nbm,nbv);
! 841: }
! 842:
! 843: static void
! 844: dbg_rac(long nri,long nbracint,long numi[],GEN racint[],long multi[])
! 845: {
! 846: long k;
! 847: if (nbracint>nri+1)
! 848: fprintferr(" there are %ld rational integer roots:\n",nbracint-nri);
! 849: else if (nbracint==nri+1)
! 850: fprintferr(" there is 1 rational integer root:\n");
! 851: else
! 852: fprintferr(" there is no rational integer root.\n");
! 853: for (k=nri+1; k<=nbracint; k++)
! 854: {
! 855: fprintferr(" number%2ld: ",numi[k]);
! 856: bruterr(racint[k],'g',-1); fprintferr(", order %ld.\n",multi[k]);
! 857: }
! 858: flusherr();
! 859: }
! 860:
! 861: static GEN
! 862: is_int(GEN g)
! 863: {
! 864: GEN gint,p1;
! 865: long av;
! 866:
! 867: if (typ(g) == t_COMPLEX)
! 868: {
! 869: p1 = (GEN)g[2];
! 870: if (signe(p1) && expo(p1) >= - (bit_accuracy(lg(p1))>>1)) return NULL;
! 871: g = (GEN)g[1];
! 872: }
! 873: gint = ground(g); av=avma; p1 = subri(g,gint);
! 874: if (signe(p1) && expo(p1) >= - (bit_accuracy(lg(p1))>>1)) return NULL;
! 875: avma=av; return gint;
! 876: }
! 877:
! 878: static PERM
! 879: isin_end(PERM S, PERM uu, PERM s0, GEN gpol, long av1)
! 880: {
! 881: PERM vv = permmul(S,uu), ww = permmul(vv,s0);
! 882:
! 883: if (DEBUGLEVEL)
! 884: {
! 885: fprintferr(" testing roots reordering: ");
! 886: bruterr(gpol,'g',-1); flusherr();
! 887: }
! 888: free(vv); avma = av1; return ww;
! 889: }
! 890:
! 891: #define M 2521
! 892: /* return NULL if not included, the permutation of the roots otherwise */
! 893: static PERM
! 894: check_isin(GEN po,GEN *r,long nbm,long nbv, POBJ a, POBJ tau, POBJ ss, PERM s0)
! 895: {
! 896: long pr = PREC, av1 = avma, av2,nogr,nocos,init,i,j,k,l,d,nrm,nri,sp;
! 897: long nbgr,nbcos,nbracint,nbrac,lastnbri,lastnbrm;
! 898: static long numi[M],numj[M],lastnum[M],multi[M],norac[M],lastnor[M];
! 899: GEN rr,ro,roint,racint[M];
! 900: PERM uu;
! 901:
! 902: nbcos = getcard_obj(ss);
! 903: nbgr = getcard_obj(tau);
! 904: lastnbri = lastnbrm = -1; /* for lint */
! 905: for (nogr=1; nogr<=nbgr; nogr++)
! 906: {
! 907: if (DEBUGLEVEL)
! 908: { fprintferr(" ----> Group # %ld/%ld:\n",nogr,nbgr); flusherr(); }
! 909: init = 0;
! 910: for (d=1; ; d++)
! 911: {
! 912: if (d > 1)
! 913: {
! 914: if (DEBUGLEVEL)
! 915: {
! 916: fprintferr(" all integer roots are double roots\n");
! 917: fprintferr(" Working with polynomial #%ld:\n", d); flusherr();
! 918: }
! 919: if (d > TSCHMAX) { tschirn(po,r,pr); av1 = avma; }
! 920: }
! 921: if (!init)
! 922: {
! 923: init = 1;
! 924: for(;;)
! 925: {
! 926: av2=avma; rr = r[d-1]; nbrac = nbracint = 0;
! 927: for (nocos=1; nocos<=nbcos; nocos++)
! 928: {
! 929: ro = get_pol_perm(tau[nogr], ss[nocos], rr,a,nbm,nbv);
! 930: sp = suffprec(ro); if (sp > 0) break;
! 931: roint = is_int(ro);
! 932: if (roint)
! 933: {
! 934: nbrac++;
! 935: if (nbrac >= M)
! 936: {
! 937: err(warner, "more than %ld rational integer roots\n", M);
! 938: avma = av1; init = 0; break;
! 939: }
! 940: for (j=1; j<=nbracint; j++)
! 941: if (gegal(roint,racint[j])) { multi[j]++; break; }
! 942: if (j > nbracint)
! 943: {
! 944: nbracint = j; multi[j]=1; numi[j]=nocos;
! 945: racint[j] = gerepileupto(av2,roint); av2=avma;
! 946: }
! 947: numj[nbrac]=nocos; norac[nbrac]=j;
! 948: }
! 949: avma=av2;
! 950: }
! 951: if (sp <= 0) break;
! 952: avma = av1; pr+=sp; moreprec(po,r,pr); av1 = avma;
! 953: }
! 954: if (!init) continue;
! 955:
! 956: if (DEBUGLEVEL) dbg_rac(0,nbracint,numi,racint,multi);
! 957: for (i=1; i<=nbracint; i++)
! 958: if (multi[i]==1)
! 959: {
! 960: uu = ss[numi[i]];
! 961: ro = DEBUGLEVEL? get_pol_perm(SID,uu,rr,a,nbm,nbv): (GEN)NULL;
! 962: return isin_end(tau[nogr], uu, s0, ro, av1);
! 963: }
! 964: }
! 965: else
! 966: {
! 967: nrm = nri = 0;
! 968: for (l=1; l<=lastnbri; l++)
! 969: {
! 970: for(;;)
! 971: {
! 972: av2=avma; rr = r[d-1]; nbrac=nrm; nbracint=nri;
! 973: for (k=1; k<=lastnbrm; k++)
! 974: if (lastnor[k]==l)
! 975: {
! 976: nocos = lastnum[k];
! 977: ro = get_pol_perm(tau[nogr], ss[nocos], rr,a,nbm,nbv);
! 978: sp = suffprec(ro); if (sp > 0) break;
! 979: roint = is_int(ro);
! 980: if (roint)
! 981: {
! 982: nbrac++;
! 983: for (j=nri+1; j<=nbracint; j++)
! 984: if (gegal(roint,racint[j])) { multi[j]++; break; }
! 985: if (j > nbracint)
! 986: {
! 987: nbracint = j; multi[j]=1; numi[j]=nocos;
! 988: racint[j] = gerepileupto(av2,roint); av2=avma;
! 989: }
! 990: numj[nbrac]=nocos; norac[nbrac]=j;
! 991: }
! 992: avma=av2;
! 993: }
! 994: if (sp <= 0) break;
! 995: avma = av1; pr+=sp; moreprec(po,r,pr); av1 = avma;
! 996: }
! 997: if (DEBUGLEVEL) dbg_rac(nri,nbracint,numi,racint,multi);
! 998: for (i=nri+1; i<=nbracint; i++)
! 999: if (multi[i]==1)
! 1000: {
! 1001: uu = ss[numi[i]];
! 1002: ro = DEBUGLEVEL? get_pol_perm(SID,uu,rr,a,nbm,nbv): (GEN)NULL;
! 1003: return isin_end(tau[nogr], uu, s0, ro, av1);
! 1004: }
! 1005: avma = av1; nri=nbracint; nrm=nbrac;
! 1006: }
! 1007: }
! 1008: avma = av1; if (!nbracint) break;
! 1009:
! 1010: lastnbri=nbracint; lastnbrm=nbrac;
! 1011: for (j=1; j<=nbrac; j++)
! 1012: { lastnum[j]=numj[j]; lastnor[j]=norac[j]; }
! 1013: }
! 1014: }
! 1015: return NULL;
! 1016: }
! 1017: #undef M
! 1018:
! 1019: /* BIBLIOTHEQUE POUR LE DEGRE 8 */
! 1020:
! 1021: static long
! 1022: galoisprim8(GEN po, GEN *r)
! 1023: {
! 1024: long rep;
! 1025:
! 1026: /* PRIM_8_1: */
! 1027: rep=isin_G_H(po,r,50,43);
! 1028: if (rep) return CAR? 37: 43;
! 1029: /* PRIM_8_2: */
! 1030: if (!CAR) return 50;
! 1031: /* PRIM_8_3: */
! 1032: rep=isin_G_H(po,r,49,48);
! 1033: if (!rep) return 49;
! 1034: /* PRIM_8_4: */
! 1035: rep=isin_G_H(po,r,48,36);
! 1036: if (!rep) return 48;
! 1037: /* PRIM_8_5: */
! 1038: rep=isin_G_H(po,r,36,25);
! 1039: return rep? 25: 36;
! 1040: }
! 1041:
! 1042: static long
! 1043: galoisimpodd8(GEN po, GEN *r, long nh)
! 1044: {
! 1045: long rep;
! 1046: /* IMPODD_8_1: */
! 1047: if (nh!=47) goto IMPODD_8_6;
! 1048: /* IMPODD_8_2: */
! 1049: rep=isin_G_H(po,r,47,46);
! 1050: if (!rep) goto IMPODD_8_5;
! 1051: /* IMPODD_8_4: */
! 1052: rep=isin_G_H(po,r,46,28);
! 1053: if (rep) goto IMPODD_8_7; else return 46;
! 1054:
! 1055: IMPODD_8_5:
! 1056: rep=isin_G_H(po,r,47,35);
! 1057: if (rep) goto IMPODD_8_9; else return 47;
! 1058:
! 1059: IMPODD_8_6:
! 1060: rep=isin_G_H(po,r,44,40);
! 1061: if (rep) goto IMPODD_8_10; else goto IMPODD_8_11;
! 1062:
! 1063: IMPODD_8_7:
! 1064: rep=isin_G_H(po,r,28,21);
! 1065: if (rep) return 21; else goto IMPODD_8_33;
! 1066:
! 1067: IMPODD_8_9:
! 1068: rep=isin_G_H(po,r,35,31);
! 1069: if (rep) goto IMPODD_8_13; else goto IMPODD_8_14;
! 1070:
! 1071: IMPODD_8_10:
! 1072: rep=isin_G_H(po,r,40,26);
! 1073: if (rep) goto IMPODD_8_15; else goto IMPODD_8_16;
! 1074:
! 1075: IMPODD_8_11:
! 1076: rep=isin_G_H(po,r,44,38);
! 1077: if (rep) goto IMPODD_8_17; else goto IMPODD_8_18;
! 1078:
! 1079: IMPODD_8_12:
! 1080: rep=isin_G_H(po,r,16,7);
! 1081: if (rep) goto IMPODD_8_19; else return 16;
! 1082:
! 1083: IMPODD_8_13:
! 1084: rep=isin_G_H(po,r,31,21);
! 1085: return rep? 21: 31;
! 1086:
! 1087: IMPODD_8_14:
! 1088: rep=isin_G_H(po,r,35,30);
! 1089: if (rep) goto IMPODD_8_34; else goto IMPODD_8_20;
! 1090:
! 1091: IMPODD_8_15:
! 1092: rep=isin_G_H(po,r,26,16);
! 1093: if (rep) goto IMPODD_8_12; else goto IMPODD_8_21;
! 1094:
! 1095: IMPODD_8_16:
! 1096: rep=isin_G_H(po,r,40,23);
! 1097: if (rep) goto IMPODD_8_22; else return 40;
! 1098:
! 1099: IMPODD_8_17:
! 1100: rep=isin_G_H(po,r,38,31);
! 1101: if (rep) goto IMPODD_8_13; else return 38;
! 1102:
! 1103: IMPODD_8_18:
! 1104: rep=isin_G_H(po,r,44,35);
! 1105: if (rep) goto IMPODD_8_9; else return 44;
! 1106:
! 1107: IMPODD_8_19:
! 1108: rep=isin_G_H(po,r,7,1);
! 1109: return rep? 1: 7;
! 1110:
! 1111: IMPODD_8_20:
! 1112: rep=isin_G_H(po,r,35,28);
! 1113: if (rep) goto IMPODD_8_7; else goto IMPODD_8_23;
! 1114:
! 1115: IMPODD_8_21:
! 1116: rep=isin_G_H(po,r,26,17);
! 1117: if (rep) goto IMPODD_8_24; else goto IMPODD_8_25;
! 1118:
! 1119: IMPODD_8_22:
! 1120: rep=isin_G_H(po,r,23,8);
! 1121: if (rep) goto IMPODD_8_26; else return 23;
! 1122:
! 1123: IMPODD_8_23:
! 1124: rep=isin_G_H(po,r,35,27);
! 1125: if (rep) goto IMPODD_8_27; else goto IMPODD_8_28;
! 1126:
! 1127: IMPODD_8_24:
! 1128: rep=isin_G_H(po,r,17,7);
! 1129: if (rep) goto IMPODD_8_19; else return 17;
! 1130:
! 1131: IMPODD_8_25:
! 1132: rep=isin_G_H(po,r,26,15);
! 1133: if (rep) goto IMPODD_8_29; else return 26;
! 1134:
! 1135: IMPODD_8_26:
! 1136: rep=isin_G_H(po,r,8,1);
! 1137: return rep? 1: 8;
! 1138:
! 1139: IMPODD_8_27:
! 1140: rep=isin_G_H(po,r,27,16);
! 1141: if (rep) goto IMPODD_8_12; else return 27;
! 1142:
! 1143: IMPODD_8_28:
! 1144: rep=isin_G_H(po,r,35,26);
! 1145: if (rep) goto IMPODD_8_15; else return 35;
! 1146:
! 1147: IMPODD_8_29:
! 1148: rep=isin_G_H(po,r,15,7);
! 1149: if (rep) goto IMPODD_8_19;
! 1150: /* IMPODD_8_30: */
! 1151: rep=isin_G_H(po,r,15,6);
! 1152: if (!rep) goto IMPODD_8_32;
! 1153: /* IMPODD_8_31: */
! 1154: rep=isin_G_H(po,r,6,1);
! 1155: return rep? 1: 6;
! 1156:
! 1157: IMPODD_8_32:
! 1158: rep=isin_G_H(po,r,15,8);
! 1159: if (rep) goto IMPODD_8_26; else return 15;
! 1160:
! 1161: IMPODD_8_33:
! 1162: rep=isin_G_H(po,r,28,16);
! 1163: if (rep) goto IMPODD_8_12; else return 28;
! 1164:
! 1165: IMPODD_8_34:
! 1166: rep=isin_G_H(po,r,30,21);
! 1167: return rep? 21: 30;
! 1168: }
! 1169:
! 1170: static long
! 1171: galoisimpeven8(GEN po, GEN *r, long nh)
! 1172: {
! 1173: long rep;
! 1174: /* IMPEVEN_8_1: */
! 1175: if (nh!=45) goto IMPEVEN_8_6;
! 1176: /* IMPEVEN_8_2: */
! 1177: rep=isin_G_H(po,r,45,42);
! 1178: if (!rep) goto IMPEVEN_8_5;
! 1179: /* IMPEVEN_8_4: */
! 1180: rep=isin_G_H(po,r,42,34);
! 1181: if (rep) goto IMPEVEN_8_7; else goto IMPEVEN_8_8;
! 1182:
! 1183: IMPEVEN_8_5:
! 1184: rep=isin_G_H(po,r,45,41);
! 1185: if (rep) goto IMPEVEN_8_9; else return 45;
! 1186:
! 1187: IMPEVEN_8_6:
! 1188: rep=isin_G_H(po,r,39,32);
! 1189: if (rep) goto IMPEVEN_8_10; else goto IMPEVEN_8_11;
! 1190:
! 1191: IMPEVEN_8_7:
! 1192: rep=isin_G_H(po,r,34,18);
! 1193: if (rep) goto IMPEVEN_8_21; else goto IMPEVEN_8_45;
! 1194:
! 1195: IMPEVEN_8_8:
! 1196: rep=isin_G_H(po,r,42,33);
! 1197: if (rep) goto IMPEVEN_8_14; else return 42;
! 1198:
! 1199: IMPEVEN_8_9:
! 1200: rep=isin_G_H(po,r,41,34);
! 1201: if (rep) goto IMPEVEN_8_7; else goto IMPEVEN_8_15;
! 1202:
! 1203: IMPEVEN_8_10:
! 1204: rep=isin_G_H(po,r,32,22);
! 1205: if (rep) goto IMPEVEN_8_16; else goto IMPEVEN_8_17;
! 1206:
! 1207: IMPEVEN_8_11:
! 1208: rep=isin_G_H(po,r,39,29);
! 1209: if (rep) goto IMPEVEN_8_18; else goto IMPEVEN_8_19;
! 1210:
! 1211: IMPEVEN_8_12:
! 1212: rep=isin_G_H(po,r,14,4);
! 1213: return rep? 4: 14;
! 1214:
! 1215: IMPEVEN_8_14:
! 1216: rep=isin_G_H(po,r,33,18);
! 1217: if (rep) goto IMPEVEN_8_21; else goto IMPEVEN_8_22;
! 1218:
! 1219: IMPEVEN_8_15:
! 1220: rep=isin_G_H(po,r,41,33);
! 1221: if (rep) goto IMPEVEN_8_14; else goto IMPEVEN_8_23;
! 1222:
! 1223: IMPEVEN_8_16:
! 1224: rep=isin_G_H(po,r,22,11);
! 1225: if (rep) goto IMPEVEN_8_24; else goto IMPEVEN_8_25;
! 1226:
! 1227: IMPEVEN_8_17:
! 1228: rep=isin_G_H(po,r,32,13);
! 1229: if (rep) goto IMPEVEN_8_26; else goto IMPEVEN_8_27;
! 1230:
! 1231: IMPEVEN_8_18:
! 1232: rep=isin_G_H(po,r,29,22);
! 1233: if (rep) goto IMPEVEN_8_16; else goto IMPEVEN_8_28;
! 1234:
! 1235: IMPEVEN_8_19:
! 1236: rep=isin_G_H(po,r,39,24);
! 1237: if (rep) goto IMPEVEN_8_29; else return 39;
! 1238:
! 1239: IMPEVEN_8_20:
! 1240: rep=isin_G_H(po,r,9,4);
! 1241: if (rep) return 4; else goto IMPEVEN_8_30;
! 1242:
! 1243: IMPEVEN_8_21:
! 1244: rep=isin_G_H(po,r,18,10);
! 1245: if (rep) goto IMPEVEN_8_31; else goto IMPEVEN_8_32;
! 1246:
! 1247: IMPEVEN_8_22:
! 1248: rep=isin_G_H(po,r,33,13);
! 1249: if (rep) goto IMPEVEN_8_26; else return 33;
! 1250:
! 1251: IMPEVEN_8_23:
! 1252: rep=isin_G_H(po,r,41,29);
! 1253: if (rep) goto IMPEVEN_8_18; else goto IMPEVEN_8_33;
! 1254:
! 1255: IMPEVEN_8_24:
! 1256: rep=isin_G_H(po,r,11,5);
! 1257: if (rep) return 5; else goto IMPEVEN_8_34;
! 1258:
! 1259: IMPEVEN_8_25:
! 1260: rep=isin_G_H(po,r,22,9);
! 1261: if (rep) goto IMPEVEN_8_20; else return 22;
! 1262:
! 1263: IMPEVEN_8_26:
! 1264: rep=isin_G_H(po,r,13,3);
! 1265: return rep? 3: 13;
! 1266:
! 1267: IMPEVEN_8_27:
! 1268: rep=isin_G_H(po,r,32,12);
! 1269: if (rep) goto IMPEVEN_8_35; else return 32;
! 1270:
! 1271: IMPEVEN_8_28:
! 1272: rep=isin_G_H(po,r,29,20);
! 1273: if (rep) goto IMPEVEN_8_36; else goto IMPEVEN_8_37;
! 1274:
! 1275: IMPEVEN_8_29:
! 1276: rep=isin_G_H(po,r,24,14);
! 1277: if (rep) goto IMPEVEN_8_12; else goto IMPEVEN_8_38;
! 1278:
! 1279: IMPEVEN_8_30:
! 1280: rep=isin_G_H(po,r,9,3);
! 1281: if (rep) return 3; else goto IMPEVEN_8_39;
! 1282:
! 1283: IMPEVEN_8_31:
! 1284: rep=isin_G_H(po,r,10,2);
! 1285: return rep? 2: 10;
! 1286:
! 1287: IMPEVEN_8_32:
! 1288: rep=isin_G_H(po,r,18,9);
! 1289: if (rep) goto IMPEVEN_8_20; else return 18;
! 1290:
! 1291: IMPEVEN_8_33:
! 1292: rep=isin_G_H(po,r,41,24);
! 1293: if (rep) goto IMPEVEN_8_29; else return 41;
! 1294:
! 1295: IMPEVEN_8_34:
! 1296: rep=isin_G_H(po,r,11,4);
! 1297: if (rep) return 4; else goto IMPEVEN_8_44;
! 1298:
! 1299: IMPEVEN_8_35:
! 1300: rep=isin_G_H(po,r,12,5);
! 1301: return rep? 5: 12;
! 1302:
! 1303: IMPEVEN_8_36:
! 1304: rep=isin_G_H(po,r,20,10);
! 1305: if (rep) goto IMPEVEN_8_31; else return 20;
! 1306:
! 1307: IMPEVEN_8_37:
! 1308: rep=isin_G_H(po,r,29,19);
! 1309: if (rep) goto IMPEVEN_8_40; else goto IMPEVEN_8_41;
! 1310:
! 1311: IMPEVEN_8_38:
! 1312: rep=isin_G_H(po,r,24,13);
! 1313: if (rep) goto IMPEVEN_8_26; else goto IMPEVEN_8_42;
! 1314:
! 1315: IMPEVEN_8_39:
! 1316: rep=isin_G_H(po,r,9,2);
! 1317: return rep? 2: 9;
! 1318:
! 1319: IMPEVEN_8_40:
! 1320: rep=isin_G_H(po,r,19,10);
! 1321: if (rep) goto IMPEVEN_8_31; else goto IMPEVEN_8_43;
! 1322:
! 1323: IMPEVEN_8_41:
! 1324: rep=isin_G_H(po,r,29,18);
! 1325: if (rep) goto IMPEVEN_8_21; else return 29;
! 1326:
! 1327: IMPEVEN_8_42:
! 1328: rep=isin_G_H(po,r,24,9);
! 1329: if (rep) goto IMPEVEN_8_20; else return 24;
! 1330:
! 1331: IMPEVEN_8_43:
! 1332: rep=isin_G_H(po,r,19,9);
! 1333: if (rep) goto IMPEVEN_8_20; else return 19;
! 1334:
! 1335: IMPEVEN_8_44:
! 1336: rep=isin_G_H(po,r,11,2);
! 1337: return rep? 2: 11;
! 1338:
! 1339: IMPEVEN_8_45:
! 1340: rep=isin_G_H(po,r,34,14);
! 1341: if (rep) goto IMPEVEN_8_12; else return 34;
! 1342: }
! 1343:
! 1344: static long
! 1345: closure8(GEN po)
! 1346: {
! 1347: long nbrac,rep;
! 1348: GEN r[NMAX];
! 1349:
! 1350: r[0]=myroots(po,PRMAX); nbrac=lg(r[0])-1;
! 1351: if (nbrac!=N) err(talker,"incompatible number of roots in closure8()");
! 1352: preci(r,PREC);
! 1353: if (!CAR)
! 1354: {
! 1355: /* CLOS_8_1: */
! 1356: rep=isin_G_H(po,r,50,47);
! 1357: if (rep) return galoisimpodd8(po,r,47);
! 1358: /* CLOS_8_2: */
! 1359: rep=isin_G_H(po,r,50,44);
! 1360: if (rep) return galoisimpodd8(po,r,44);
! 1361: }
! 1362: else
! 1363: {
! 1364: /* CLOS_8_3: */
! 1365: rep=isin_G_H(po,r,49,45);
! 1366: if (rep) return galoisimpeven8(po,r,45);
! 1367: /* CLOS_8_4: */
! 1368: rep=isin_G_H(po,r,49,39);
! 1369: if (rep) return galoisimpeven8(po,r,39);
! 1370: }
! 1371: return galoisprim8(po,r);
! 1372: }
! 1373:
! 1374: static GROUP
! 1375: initgroup(long n, long nbgr)
! 1376: {
! 1377: GROUP t = allocgroup(n,nbgr);
! 1378: t[1] = SID; return t;
! 1379: }
! 1380:
! 1381: static PERM
! 1382: data8(long n1, long n2, GROUP *t)
! 1383: {
! 1384: switch(n1)
! 1385: {
! 1386: case 7: if (n2!=1) break;
! 1387: *t=initgroup(N,2);
! 1388: _aff((*t)[2], 1, 2, 3, 4, 6, 5, 8, 7);
! 1389: return SID;
! 1390: case 9: if (n2!=4) break;
! 1391: *t=initgroup(N,2);
! 1392: _aff((*t)[2], 1, 2, 4, 3, 5, 6, 8, 7);
! 1393: return SID;
! 1394: case 10: if (n2!=2) break;
! 1395: *t=initgroup(N,2);
! 1396: _aff((*t)[2], 1, 2, 3, 4, 6, 5, 8, 7);
! 1397: return SID;
! 1398: case 11:
! 1399: switch(n2)
! 1400: {
! 1401: case 2:
! 1402: *t=initgroup(N,2);
! 1403: _aff((*t)[2], 1, 2, 5, 6, 3, 4, 8, 7);
! 1404: return _cr(1, 3, 5, 8, 2, 4, 6, 7);
! 1405: case 4:
! 1406: *t=initgroup(N,1);
! 1407: return _cr(1, 3, 7, 5, 2, 4, 8, 6);
! 1408: }break;
! 1409: case 14: if (n2!=4) break;
! 1410: *t=initgroup(N,1);
! 1411: return _cr(1, 2, 4, 3, 5, 6, 8, 7);
! 1412: case 15: if (n2!=6 && n2!=8) break;
! 1413: *t=initgroup(N,2);
! 1414: _aff((*t)[2], 1, 2, 3, 4, 6, 5, 8, 7);
! 1415: return SID;
! 1416: case 16: if (n2!=7) break;
! 1417: *t=initgroup(N,2);
! 1418: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 7);
! 1419: return SID;
! 1420: case 18:
! 1421: switch(n2)
! 1422: {
! 1423: case 9: *t=initgroup(N,3);
! 1424: _aff((*t)[2], 1, 5, 3, 7, 2, 6, 4, 8);
! 1425: _aff((*t)[3], 1, 2, 3, 4, 6, 5, 8, 7);
! 1426: return SID;
! 1427: case 10: *t=initgroup(N,3);
! 1428: _aff((*t)[2], 1, 6, 3, 8, 2, 5, 4, 7);
! 1429: _aff((*t)[3], 1, 5, 3, 7, 2, 6, 4, 8);
! 1430: return SID;
! 1431: }break;
! 1432: case 19: if (n2!=9) break;
! 1433: *t=initgroup(N,1);
! 1434: return _cr(1, 5, 3, 8, 2, 6, 4, 7);
! 1435: case 20: if (n2!=10) break;
! 1436: *t=initgroup(N,2);
! 1437: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 7);
! 1438: return SID;
! 1439: case 22:
! 1440: switch(n2)
! 1441: {
! 1442: case 9: *t=initgroup(N,6);
! 1443: _aff((*t)[2], 1, 2, 7, 8, 3, 4, 6, 5);
! 1444: _aff((*t)[3], 1, 2, 7, 8, 3, 4, 5, 6);
! 1445: _aff((*t)[4], 1, 2, 5, 6, 3, 4, 8, 7);
! 1446: _aff((*t)[5], 1, 2, 5, 6, 3, 4, 7, 8);
! 1447: _aff((*t)[6], 1, 2, 3, 4, 5, 6, 8, 7);
! 1448: return _cr(1, 3, 5, 7, 2, 4, 6, 8);
! 1449: case 11: *t=initgroup(N,6);
! 1450: _aff((*t)[2], 1, 2, 5, 6, 7, 8, 4, 3);
! 1451: _aff((*t)[3], 1, 2, 5, 6, 7, 8, 3, 4);
! 1452: _aff((*t)[4], 1, 2, 3, 4, 7, 8, 6, 5);
! 1453: _aff((*t)[5], 1, 2, 3, 4, 7, 8, 5, 6);
! 1454: _aff((*t)[6], 1, 2, 3, 4, 5, 6, 8, 7);
! 1455: return SID;
! 1456: }break;
! 1457: case 23: if (n2!=8) break;
! 1458: *t=initgroup(N,1);
! 1459: return _cr(1, 2, 3, 4, 6, 5, 8, 7);
! 1460: case 26: if (n2!=15 && n2!=17) break;
! 1461: *t=initgroup(N,2);
! 1462: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 7);
! 1463: return SID;
! 1464: case 28: if (n2!=21) break;
! 1465: *t=initgroup(N,1);
! 1466: return _cr(1, 2, 3, 4, 7, 8, 5, 6);
! 1467: case 29: if (n2!=18 && n2!=19) break;
! 1468: *t=initgroup(N,2);
! 1469: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 7);
! 1470: return SID;
! 1471: case 30: if (n2!=21) break;
! 1472: *t=initgroup(N,1);
! 1473: return _cr(1, 2, 3, 4, 7, 8, 5, 6);
! 1474: case 31: if (n2!=21) break;
! 1475: *t=initgroup(N,3);
! 1476: _aff((*t)[2], 1, 2, 3, 4, 7, 8, 5, 6);
! 1477: _aff((*t)[3], 1, 2, 5, 6, 7, 8, 3, 4);
! 1478: return SID;
! 1479: case 32: if (n2!=12 && n2!=13) break;
! 1480: *t=initgroup(N,2);
! 1481: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 7);
! 1482: return SID;
! 1483: case 33:
! 1484: switch(n2)
! 1485: {
! 1486: case 13: *t=initgroup(N,1);
! 1487: return _cr(1, 5, 2, 6, 3, 7, 4, 8);
! 1488: case 18: *t=initgroup(N,1);
! 1489: return _cr(1, 2, 5, 6, 3, 4, 7, 8);
! 1490: }break;
! 1491: case 34:
! 1492: switch(n2)
! 1493: {
! 1494: case 14: *t=initgroup(N,3);
! 1495: _aff((*t)[2], 1, 2, 3, 4, 5, 8, 6, 7);
! 1496: _aff((*t)[3], 1, 2, 3, 4, 5, 7, 8, 6);
! 1497: return _cr(1, 5, 2, 6, 3, 7, 4, 8);
! 1498: case 18: *t=initgroup(N,1);
! 1499: return _cr(1, 2, 5, 6, 3, 4, 8, 7);
! 1500: }break;
! 1501: case 39: if (n2!=24) break;
! 1502: *t=initgroup(N,2);
! 1503: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 7);
! 1504: return SID;
! 1505: case 40: if (n2!=23) break;
! 1506: *t=initgroup(N,2);
! 1507: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 7);
! 1508: return SID;
! 1509: case 41:
! 1510: switch(n2)
! 1511: {
! 1512: case 24: *t=initgroup(N,1);
! 1513: return _cr(1, 5, 2, 6, 3, 7, 4, 8);
! 1514: case 29: *t=initgroup(N,1);
! 1515: return _cr(1, 2, 5, 6, 3, 4, 7, 8);
! 1516: }break;
! 1517: case 42: if (n2!=34) break;
! 1518: *t=initgroup(N,1);
! 1519: return _cr(1, 2, 3, 4, 5, 6, 8, 7);
! 1520: case 45: if (n2!=41 && n2!=42) break;
! 1521: *t=initgroup(N,2);
! 1522: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 7);
! 1523: return SID;
! 1524: case 46: if (n2!=28) break;
! 1525: *t=initgroup(N,1);
! 1526: return _cr(1, 2, 5, 6, 3, 4, 7, 8);
! 1527: case 47: if (n2!=35) break;
! 1528: *t=initgroup(N,1);
! 1529: return _cr(1, 2, 5, 6, 3, 4, 7, 8);
! 1530: case 49: if (n2!=48) break;
! 1531: *t=initgroup(N,2);
! 1532: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 7);
! 1533: return SID;
! 1534: }
! 1535: *t=initgroup(N,1); return SID;
! 1536: }
! 1537:
! 1538: static long
! 1539: galoismodulo8(GEN pol, GEN dpol)
! 1540: {
! 1541: long av = avma, res, gr[51];
! 1542: long **TYP = partitions(8), **GR = (long**)cgeti(49);
! 1543:
! 1544: /* List of possible types in group j: GR[j][0] = #GR[j] if
! 1545: * the group is odd, - #GR[j] if even */
! 1546: GR[ 1]= _gr( 4, 1,5,15,22);
! 1547: GR[ 2]= _gr( -3, 1,5,15);
! 1548: GR[ 3]= _gr( -2, 1,5);
! 1549: GR[ 4]= _gr( -3, 1,5,15);
! 1550: GR[ 5]= _gr( -3, 1,5,15);
! 1551: GR[ 6]= _gr( 5, 1,4,5,15,22);
! 1552: GR[ 7]= _gr( 5, 1,3,5,15,22);
! 1553: GR[ 8]= _gr( 5, 1,4,5,15,22);
! 1554: GR[ 9]= _gr( -4, 1,3,5,15);
! 1555: GR[10]= _gr( -4, 1,3,5,15);
! 1556: GR[11]= _gr( -4, 1,3,5,15);
! 1557: GR[12]= _gr( -5, 1,5,9,15,20);
! 1558: GR[13]= _gr( -4, 1,5,9,20);
! 1559: GR[14]= _gr( -4, 1,5,9,15);
! 1560: GR[15]= _gr( 6, 1,3,4,5,15,22);
! 1561: GR[16]= _gr( 5, 1,3,5,15,22);
! 1562: GR[17]= _gr( 7, 1,3,5,11,13,15,22);
! 1563: GR[18]= _gr( -4, 1,3,5,15);
! 1564: GR[19]= _gr( -5, 1,3,5,12,15);
! 1565: GR[20]= _gr( -4, 1,3,5,15);
! 1566: GR[21]= _gr( 5, 1,3,5,13,15);
! 1567: GR[22]= _gr( -4, 1,3,5,15);
! 1568: GR[23]= _gr( 7, 1,4,5,9,15,20,22);
! 1569: GR[24]= _gr( -6, 1,3,5,9,15,20);
! 1570: GR[25]= _gr( -3, 1,5,21);
! 1571: GR[26]= _gr( 8, 1,3,4,5,11,13,15,22);
! 1572: GR[27]= _gr( 8, 1,2,3,4,5,13,15,22);
! 1573: GR[28]= _gr( 7, 1,3,5,12,13,15,22);
! 1574: GR[29]= _gr( -5, 1,3,5,12,15);
! 1575: GR[30]= _gr( 7, 1,3,4,5,11,13,15);
! 1576: GR[31]= _gr( 7, 1,2,3,4,5,13,15);
! 1577: GR[32]= _gr( -6, 1,3,5,9,15,20);
! 1578: GR[33]= _gr( -6, 1,3,5,9,15,20);
! 1579: GR[34]= _gr( -5, 1,3,5,9,15);
! 1580: GR[35]= _gr( 10, 1,2,3,4,5,11,12,13,15,22);
! 1581: GR[36]= _gr( -5, 1,5,9,20,21);
! 1582: GR[37]= _gr( -5, 1,5,9,15,21);
! 1583: GR[38]= _gr( 11, 1,2,3,4,5,9,10,13,15,19,20);
! 1584: GR[39]= _gr( -7, 1,3,5,9,12,15,20);
! 1585: GR[40]= _gr( 10, 1,3,4,5,9,11,13,15,20,22);
! 1586: GR[41]= _gr( -7, 1,3,5,9,12,15,20);
! 1587: GR[42]= _gr( -8, 1,3,5,6,8,9,15,20);
! 1588: GR[43]= _gr( 8, 1,4,5,9,15,19,21,22);
! 1589: GR[44]= _gr( 14, 1,2,3,4,5,9,10,11,12,13,15,19,20,22);
! 1590: GR[45]= _gr( -9, 1,3,5,6,8,9,12,15,20);
! 1591: GR[46]= _gr( 10, 1,3,5,6,8,9,12,13,15,22);
! 1592: GR[47]= _gr( 16, 1,2,3,4,5,6,7,8,9,11,12,13,14,15,20,22);
! 1593: GR[48]= _gr( -8, 1,3,5,9,12,15,20,21);
! 1594:
! 1595: gr[0]=51; res = galmodp(pol,dpol,TYP,gr,GR);
! 1596: avma=av; if (!res) return 0;
! 1597: return CAR? 49: 50;
! 1598: }
! 1599:
! 1600: /* BIBLIOTHEQUE POUR LE DEGRE 9 */
! 1601: static long
! 1602: galoisprim9(GEN po, GEN *r)
! 1603: {
! 1604: long rep;
! 1605:
! 1606: if (!CAR)
! 1607: {
! 1608: /* PRIM_9_1: */
! 1609: rep=isin_G_H(po,r,34,26);
! 1610: if (!rep) return 34;
! 1611: /* PRIM_9_2: */
! 1612: rep=isin_G_H(po,r,26,19);
! 1613: if (!rep) return 26;
! 1614: /* PRIM_9_3: */
! 1615: rep=isin_G_H(po,r,19,16);
! 1616: if (rep) return 16;
! 1617: /* PRIM_9_4: */
! 1618: rep=isin_G_H(po,r,19,15);
! 1619: return rep? 15: 19;
! 1620: }
! 1621: /* PRIM_9_5: */
! 1622: rep=isin_G_H(po,r,33,32);
! 1623: if (!rep) goto PRIM_9_7;
! 1624: /* PRIM_9_6: */
! 1625: rep=isin_G_H(po,r,32,27);
! 1626: return rep? 27: 32;
! 1627:
! 1628: PRIM_9_7:
! 1629: rep=isin_G_H(po,r,33,23);
! 1630: if (!rep) return 33;
! 1631: /* PRIM_9_8: */
! 1632: rep=isin_G_H(po,r,23,14);
! 1633: if (!rep) return 23;
! 1634: /* PRIM_9_9: */
! 1635: rep=isin_G_H(po,r,14,9);
! 1636: return rep? 9: 14;
! 1637: }
! 1638:
! 1639: static long
! 1640: galoisimpodd9(GEN po, GEN *r)
! 1641: {
! 1642: long rep;
! 1643:
! 1644: /* IMPODD_9_1: */
! 1645: rep=isin_G_H(po,r,31,29);
! 1646: if (!rep) goto IMPODD_9_5;
! 1647: /* IMPODD_9_2: */
! 1648: rep=isin_G_H(po,r,29,20);
! 1649: if (!rep) return 29;
! 1650: IMPODD_9_3:
! 1651: rep=isin_G_H(po,r,20,12);
! 1652: if (!rep) return 20;
! 1653: IMPODD_9_4:
! 1654: rep=isin_G_H(po,r,12,4);
! 1655: return rep? 4: 12;
! 1656:
! 1657: IMPODD_9_5:
! 1658: rep=isin_G_H(po,r,31,28);
! 1659: if (!rep) goto IMPODD_9_9;
! 1660: /* IMPODD_9_6: */
! 1661: rep=isin_G_H(po,r,28,22);
! 1662: if (!rep) return 28;
! 1663: IMPODD_9_7:
! 1664: rep=isin_G_H(po,r,22,13);
! 1665: if (!rep) return 22;
! 1666: IMPODD_9_8:
! 1667: rep=isin_G_H(po,r,13,4);
! 1668: return rep? 4: 13;
! 1669:
! 1670: IMPODD_9_9:
! 1671: rep=isin_G_H(po,r,31,24);
! 1672: if (!rep) return 31;
! 1673: /* IMPODD_9_10: */
! 1674: rep=isin_G_H(po,r,24,22);
! 1675: if (rep) goto IMPODD_9_7;
! 1676: /* IMPODD_9_11: */
! 1677: rep=isin_G_H(po,r,24,20);
! 1678: if (rep) goto IMPODD_9_3;
! 1679: /* IMPODD_9_12: */
! 1680: rep=isin_G_H(po,r,24,18);
! 1681: if (!rep) return 24;
! 1682: /* IMPODD_9_13: */
! 1683: rep=isin_G_H(po,r,18,13);
! 1684: if (rep) goto IMPODD_9_8;
! 1685: /* IMPODD_9_14: */
! 1686: rep=isin_G_H(po,r,18,12);
! 1687: if (rep) goto IMPODD_9_4;
! 1688: /* IMPODD_9_15: */
! 1689: rep=isin_G_H(po,r,18,8);
! 1690: if (!rep) return 18;
! 1691: /* IMPODD_9_16: */
! 1692: rep=isin_G_H(po,r,8,4);
! 1693: return rep? 4: 8;
! 1694: }
! 1695:
! 1696: static long
! 1697: galoisimpeven9(GEN po, GEN *r)
! 1698: {
! 1699: long rep;
! 1700:
! 1701: /* IMPEVEN_9_1: */
! 1702: rep=isin_G_H(po,r,30,25);
! 1703: if (!rep) goto IMPEVEN_9_7;
! 1704: /* IMPEVEN_9_2: */
! 1705: rep=isin_G_H(po,r,25,17);
! 1706: if (!rep) return 25;
! 1707: IMPEVEN_9_3:
! 1708: rep=isin_G_H(po,r,17,7);
! 1709: if (!rep) goto IMPEVEN_9_5;
! 1710: IMPEVEN_9_4:
! 1711: rep=isin_G_H(po,r,7,2);
! 1712: return rep? 2: 7;
! 1713:
! 1714: IMPEVEN_9_5:
! 1715: rep=isin_G_H(po,r,17,6);
! 1716: if (!rep) return 17;
! 1717: IMPEVEN_9_6:
! 1718: rep=isin_G_H(po,r,6,1);
! 1719: return rep? 1: 6;
! 1720:
! 1721: IMPEVEN_9_7:
! 1722: rep=isin_G_H(po,r,30,21);
! 1723: if (!rep) return 30;
! 1724: /* IMPEVEN_9_8: */
! 1725: rep=isin_G_H(po,r,21,17);
! 1726: if (rep) goto IMPEVEN_9_3;
! 1727: /* IMPEVEN_9_9: */
! 1728: rep=isin_G_H(po,r,21,11);
! 1729: if (!rep) goto IMPEVEN_9_13;
! 1730: /* IMPEVEN_9_10: */
! 1731: rep=isin_G_H(po,r,11,7);
! 1732: if (rep) goto IMPEVEN_9_4;
! 1733: /* IMPEVEN_9_11: */
! 1734: rep=isin_G_H(po,r,11,5);
! 1735: if (!rep) return 11;
! 1736: /* IMPEVEN_9_12: */
! 1737: rep=isin_G_H(po,r,5,2);
! 1738: return rep? 2: 5;
! 1739:
! 1740: IMPEVEN_9_13:
! 1741: rep=isin_G_H(po,r,21,10);
! 1742: if (!rep) return 21;
! 1743: /* IMPEVEN_9_14: */
! 1744: rep=isin_G_H(po,r,10,6);
! 1745: if (rep) goto IMPEVEN_9_6;
! 1746: /* IMPEVEN_9_15: */
! 1747: rep=isin_G_H(po,r,10,3);
! 1748: if (!rep) return 10;
! 1749: /* IMPEVEN_9_16: */
! 1750: rep=isin_G_H(po,r,3,1);
! 1751: return rep? 1: 3;
! 1752: }
! 1753:
! 1754: static long
! 1755: closure9(GEN po)
! 1756: {
! 1757: long nbrac,rep;
! 1758: GEN r[NMAX];
! 1759:
! 1760: r[0]=myroots(po,PRMAX); nbrac=lg(r[0])-1;
! 1761: if (nbrac!=N) err(talker,"incompatible number of roots in closure9()");
! 1762: preci(r,PREC);
! 1763: if (!CAR)
! 1764: {
! 1765: /* CLOS_9_1: */
! 1766: rep=isin_G_H(po,r,34,31);
! 1767: if (rep) return galoisimpodd9(po,r);
! 1768: }
! 1769: else
! 1770: {
! 1771: /* CLOS_9_2: */
! 1772: rep=isin_G_H(po,r,33,30);
! 1773: if (rep) return galoisimpeven9(po,r);
! 1774: }
! 1775: return galoisprim9(po,r);
! 1776: }
! 1777:
! 1778: static PERM
! 1779: data9(long n1, long n2, GROUP *t)
! 1780: {
! 1781: switch(n1)
! 1782: {
! 1783: case 6: if (n2!=1) break;
! 1784: *t=initgroup(N,3);
! 1785: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 9, 7);
! 1786: _aff((*t)[3], 1, 2, 3, 4, 5, 6, 9, 7, 8);
! 1787: return SID;
! 1788: case 7: if (n2!=2) break;
! 1789: *t=initgroup(N,3);
! 1790: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 9, 7);
! 1791: _aff((*t)[3], 1, 2, 3, 4, 5, 6, 9, 7, 8);
! 1792: return SID;
! 1793: case 8: if (n2!=4) break;
! 1794: *t=initgroup(N,2);
! 1795: _aff((*t)[2], 1, 4, 7, 2, 5, 8, 3, 6, 9);
! 1796: return SID;
! 1797: case 12: if (n2!=4) break;
! 1798: *t=initgroup(N,3);
! 1799: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 9, 7);
! 1800: _aff((*t)[3], 1, 2, 3, 4, 5, 6, 9, 7, 8);
! 1801: return SID;
! 1802: case 13: if (n2!=4) break;
! 1803: *t=initgroup(N,1);
! 1804: return _cr(1, 4, 7, 2, 5, 8, 3, 6, 9);
! 1805: case 14: if (n2!=9) break;
! 1806: *t=initgroup(N,3);
! 1807: _aff((*t)[2], 1, 2, 3, 5, 6, 4, 9, 7, 8);
! 1808: _aff((*t)[3], 1, 2, 3, 6, 4, 5, 8, 9, 7);
! 1809: return SID;
! 1810: case 17: if (n2!=6) break;
! 1811: *t=initgroup(N,2);
! 1812: _aff((*t)[2], 1, 2, 3, 7, 8, 9, 4, 5, 6);
! 1813: return SID;
! 1814: case 21: if (n2!=10) break;
! 1815: *t=initgroup(N,2);
! 1816: _aff((*t)[2], 1, 2, 3, 7, 8, 9, 4, 5, 6);
! 1817: return SID;
! 1818: case 33: if (n2!=32) break;
! 1819: *t=initgroup(N,2);
! 1820: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 7, 9, 8);
! 1821: return SID;
! 1822: }
! 1823: *t=initgroup(N,1); return SID;
! 1824: }
! 1825:
! 1826: static long
! 1827: galoismodulo9(GEN pol, GEN dpol)
! 1828: {
! 1829: long av = avma, res, gr[35];
! 1830: long **TYP = partitions(9), **GR = (long**) cgeti(33);
! 1831:
! 1832: /* 42 TYPES ORDONNES CROISSANT (T[1],...,T[30])*/
! 1833:
! 1834: GR[ 1]= _gr( -3, 1,12,30);
! 1835: GR[ 2]= _gr( -2, 1,12);
! 1836: GR[ 3]= _gr( -4, 1,5,12,30);
! 1837: GR[ 4]= _gr( 4, 1,4,12,26);
! 1838: GR[ 5]= _gr( -3, 1,5,12);
! 1839: GR[ 6]= _gr( -4, 1,10,12,30);
! 1840: GR[ 7]= _gr( -3, 1,10,12);
! 1841: GR[ 8]= _gr( 5, 1,4,5,12,26);
! 1842: GR[ 9]= _gr( -4, 1,5,12,18);
! 1843: GR[10]= _gr( -6, 1,5,10,12,25,30);
! 1844: GR[11]= _gr( -5, 1,5,10,12,25);
! 1845: GR[12]= _gr( 5, 1,4,10,12,26);
! 1846: GR[13]= _gr( 5, 1,4,10,12,26);
! 1847: GR[14]= _gr( -4, 1,5,12,18);
! 1848: GR[15]= _gr( 5, 1,5,12,18,29);
! 1849: GR[16]= _gr( 6, 1,4,5,12,18,26);
! 1850: GR[17]= _gr( -5, 1,6,10,12,30);
! 1851: GR[18]= _gr( 7, 1,4,5,10,12,25,26);
! 1852: GR[19]= _gr( 7, 1,4,5,12,18,26,29);
! 1853: GR[20]= _gr( 9, 1,4,6,9,10,12,24,26,30);
! 1854: GR[21]= _gr( -7, 1,5,6,10,12,25,30);
! 1855: GR[22]= _gr( 7, 1,4,6,10,12,26,30);
! 1856: GR[23]= _gr( -6, 1,5,10,12,18,25);
! 1857: GR[24]= _gr( 11, 1,4,5,6,9,10,12,24,25,26,30);
! 1858: GR[25]= _gr( -7, 1,3,6,8,10,12,30);
! 1859: GR[26]= _gr( 9, 1,4,5,10,12,18,25,26,29);
! 1860: GR[27]= _gr( -5, 1,5,12,27,30);
! 1861: GR[28]= _gr( 12, 1,2,3,4,6,7,8,10,11,12,26,30);
! 1862: GR[29]= _gr( 12, 1,3,4,6,8,9,10,12,15,24,26,30);
! 1863: GR[30]= _gr(-11, 1,3,5,6,8,10,12,14,17,25,30);
! 1864: GR[31]= _gr( 19, 1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,24,25,26,30);
! 1865: GR[32]= _gr( -7, 1,5,10,12,25,27,30);
! 1866:
! 1867: gr[0]=35; res = galmodp(pol,dpol,TYP,gr,GR);
! 1868: avma=av; if (!res) return 0;
! 1869: return CAR? 33: 34;
! 1870: }
! 1871:
! 1872: /* BIBLIOTHEQUE POUR LE DEGRE 10 */
! 1873: static long
! 1874: galoisprim10(GEN po, GEN *r)
! 1875: {
! 1876: long rep;
! 1877: if (CAR)
! 1878: {
! 1879: /* PRIM_10_1: */
! 1880: rep=isin_G_H(po,r,44,31);
! 1881: if (!rep) return 44;
! 1882: /* PRIM_10_2: */
! 1883: rep=isin_G_H(po,r,31,26);
! 1884: if (!rep) return 31;
! 1885: /* PRIM_10_3: */
! 1886: rep=isin_G_H(po,r,26,7);
! 1887: return rep? 7: 26;
! 1888: }
! 1889: else
! 1890: {
! 1891: /* PRIM_10_4: */
! 1892: rep=isin_G_H(po,r,45,35);
! 1893: if (!rep) return 45;
! 1894: /* PRIM_10_5: */
! 1895: rep=isin_G_H(po,r,35,32);
! 1896: if (!rep) goto PRIM_10_7;
! 1897: /* PRIM_10_6: */
! 1898: rep=isin_G_H(po,r,32,13);
! 1899: return rep? 13: 32;
! 1900:
! 1901: PRIM_10_7:
! 1902: rep=isin_G_H(po,r,35,30);
! 1903: return rep? 30: 35;
! 1904: }
! 1905: }
! 1906:
! 1907: static long
! 1908: galoisimpeven10(GEN po, GEN *r, long nogr)
! 1909: {
! 1910: long rep;
! 1911: if (nogr==42)
! 1912: {
! 1913: /* IMPEVEN_10_1: */
! 1914: rep=isin_G_H(po,r,42,28);
! 1915: if (!rep) return 42;
! 1916: /* IMPEVEN_10_2: */
! 1917: rep=isin_G_H(po,r,28,18);
! 1918: return rep? 18: 28;
! 1919: }
! 1920: else
! 1921: {
! 1922: /* IMPEVEN_10_3: */
! 1923: rep=isin_G_H(po,r,37,34);
! 1924: if (!rep) goto IMPEVEN_10_5;
! 1925: /* IMPEVEN_10_4: */
! 1926: rep=isin_G_H(po,r,34,15);
! 1927: if (rep) goto IMPEVEN_10_7; else return 34;
! 1928:
! 1929: IMPEVEN_10_5:
! 1930: rep=isin_G_H(po,r,37,24);
! 1931: if (!rep) return 37;
! 1932: /* IMPEVEN_10_6: */
! 1933: rep=isin_G_H(po,r,24,15);
! 1934: if (!rep) return 24;
! 1935: IMPEVEN_10_7:
! 1936: rep=isin_G_H(po,r,15,8);
! 1937: return rep? 8: 15;
! 1938: }
! 1939: }
! 1940:
! 1941: static long
! 1942: galoisimpodd10(GEN po, GEN *r, long nogr)
! 1943: {
! 1944: long rep;
! 1945: if (nogr==43)
! 1946: {
! 1947: /* IMPODD_10_1: */
! 1948: rep=isin_G_H(po,r,43,41);
! 1949: if (!rep) goto IMPODD_10_3;
! 1950: /* IMPODD_10_2: */
! 1951: rep=isin_G_H(po,r,41,40);
! 1952: if (rep) goto IMPODD_10_4; else goto IMPODD_10_5;
! 1953:
! 1954: IMPODD_10_3:
! 1955: rep=isin_G_H(po,r,43,33);
! 1956: if (rep) goto IMPODD_10_6; else return 43;
! 1957:
! 1958: IMPODD_10_4:
! 1959: rep=isin_G_H(po,r,40,21);
! 1960: if (rep) goto IMPODD_10_7; else goto IMPODD_10_8;
! 1961:
! 1962: IMPODD_10_5:
! 1963: rep=isin_G_H(po,r,41,27);
! 1964: if (rep) goto IMPODD_10_9; else goto IMPODD_10_10;
! 1965:
! 1966: IMPODD_10_6:
! 1967: rep=isin_G_H(po,r,33,27);
! 1968: if (rep) goto IMPODD_10_9; else return 33;
! 1969:
! 1970: IMPODD_10_7:
! 1971: rep=isin_G_H(po,r,21,10);
! 1972: if (rep) goto IMPODD_10_12; else goto IMPODD_10_13;
! 1973:
! 1974: IMPODD_10_8:
! 1975: rep=isin_G_H(po,r,40,12);
! 1976: if (rep) goto IMPODD_10_14; else goto IMPODD_10_15;
! 1977:
! 1978: IMPODD_10_9:
! 1979: rep=isin_G_H(po,r,27,21);
! 1980: if (rep) goto IMPODD_10_7; else goto IMPODD_10_16;
! 1981:
! 1982: IMPODD_10_10:
! 1983: rep=isin_G_H(po,r,41,22);
! 1984: if (!rep) return 41;
! 1985: /* IMPODD_10_11: */
! 1986: rep=isin_G_H(po,r,22,12);
! 1987: if (rep) goto IMPODD_10_14; else goto IMPODD_10_18;
! 1988:
! 1989: IMPODD_10_12:
! 1990: rep=isin_G_H(po,r,10,4);
! 1991: return rep? 4: 10;
! 1992:
! 1993: IMPODD_10_13:
! 1994: rep=isin_G_H(po,r,21,9);
! 1995: if (rep) goto IMPODD_10_19; else return 21;
! 1996: IMPODD_10_14:
! 1997: rep=isin_G_H(po,r,12,4);
! 1998: return rep? 4: 12;
! 1999:
! 2000: IMPODD_10_15:
! 2001: rep=isin_G_H(po,r,40,11);
! 2002: if (rep) goto IMPODD_10_20; else return 40;
! 2003: IMPODD_10_16:
! 2004: rep=isin_G_H(po,r,27,20);
! 2005: if (!rep) goto IMPODD_10_21;
! 2006: /* IMPODD_10_17: */
! 2007: rep=isin_G_H(po,r,20,10);
! 2008: if (rep) goto IMPODD_10_12; return 20;
! 2009:
! 2010: IMPODD_10_18:
! 2011: rep=isin_G_H(po,r,22,11);
! 2012: if (rep) goto IMPODD_10_20; else goto IMPODD_10_23;
! 2013:
! 2014: IMPODD_10_19:
! 2015: rep=isin_G_H(po,r,9,6);
! 2016: if (rep) goto IMPODD_10_24; else goto IMPODD_10_25;
! 2017:
! 2018: IMPODD_10_20:
! 2019: rep=isin_G_H(po,r,11,3);
! 2020: if (rep) goto IMPODD_10_26; else return 11;
! 2021:
! 2022: IMPODD_10_21:
! 2023: rep=isin_G_H(po,r,27,19);
! 2024: if (rep) goto IMPODD_10_27;
! 2025: /* IMPODD_10_22: */
! 2026: rep=isin_G_H(po,r,27,17);
! 2027: if (rep) goto IMPODD_10_28; else return 27;
! 2028:
! 2029: IMPODD_10_23:
! 2030: rep=isin_G_H(po,r,22,5);
! 2031: if (rep) goto IMPODD_10_29; else return 22;
! 2032:
! 2033: IMPODD_10_24:
! 2034: rep=isin_G_H(po,r,6,2);
! 2035: if (rep) return 2; else goto IMPODD_10_30;
! 2036:
! 2037: IMPODD_10_25:
! 2038: rep=isin_G_H(po,r,9,3);
! 2039: if (!rep) return 9;
! 2040: IMPODD_10_26:
! 2041: rep=isin_G_H(po,r,3,2);
! 2042: if (rep) return 2; else goto IMPODD_10_31;
! 2043:
! 2044: IMPODD_10_27:
! 2045: rep=isin_G_H(po,r,19,9);
! 2046: if (rep) goto IMPODD_10_19; else return 19;
! 2047:
! 2048: IMPODD_10_28:
! 2049: rep=isin_G_H(po,r,17,10);
! 2050: if (rep) goto IMPODD_10_12; else goto IMPODD_10_32;
! 2051:
! 2052: IMPODD_10_29:
! 2053: rep=isin_G_H(po,r,5,4);
! 2054: if (rep) return 4; else goto IMPODD_10_33;
! 2055:
! 2056: IMPODD_10_30:
! 2057: rep=isin_G_H(po,r,6,1);
! 2058: return rep? 1: 6;
! 2059:
! 2060: IMPODD_10_31:
! 2061: rep=isin_G_H(po,r,3,1);
! 2062: return rep? 1: 3;
! 2063:
! 2064: IMPODD_10_32:
! 2065: rep=isin_G_H(po,r,17,9);
! 2066: if (rep) goto IMPODD_10_19; else goto IMPODD_10_60;
! 2067:
! 2068: IMPODD_10_33:
! 2069: rep=isin_G_H(po,r,5,3);
! 2070: if (rep) goto IMPODD_10_26; else return 5;
! 2071:
! 2072: IMPODD_10_60:
! 2073: rep=isin_G_H(po,r,17,5);
! 2074: if (rep) goto IMPODD_10_29; else return 17;
! 2075: }
! 2076: else
! 2077: {
! 2078: /* IMPODD_10_34: */
! 2079: rep=isin_G_H(po,r,39,38);
! 2080: if (!rep) goto IMPODD_10_36;
! 2081: /* IMPODD_10_35: */
! 2082: rep=isin_G_H(po,r,38,25);
! 2083: if (rep) goto IMPODD_10_37; else goto IMPODD_10_38;
! 2084:
! 2085: IMPODD_10_36:
! 2086: rep=isin_G_H(po,r,39,36);
! 2087: if (rep) goto IMPODD_10_39; else goto IMPODD_10_40;
! 2088:
! 2089: IMPODD_10_37:
! 2090: rep=isin_G_H(po,r,25,4);
! 2091: return rep? 4: 25;
! 2092:
! 2093: IMPODD_10_38:
! 2094: rep=isin_G_H(po,r,38,12);
! 2095: if (rep) goto IMPODD_10_41; else return 38;
! 2096:
! 2097: IMPODD_10_39:
! 2098: rep=isin_G_H(po,r,36,23);
! 2099: if (rep) goto IMPODD_10_42; else goto IMPODD_10_43;
! 2100:
! 2101: IMPODD_10_40:
! 2102: rep=isin_G_H(po,r,39,29);
! 2103: if (rep) goto IMPODD_10_44; else goto IMPODD_10_45;
! 2104:
! 2105: IMPODD_10_41:
! 2106: rep=isin_G_H(po,r,12,4);
! 2107: return rep? 4: 12;
! 2108:
! 2109: IMPODD_10_42:
! 2110: rep=isin_G_H(po,r,23,16);
! 2111: if (rep) goto IMPODD_10_46; else goto IMPODD_10_47;
! 2112:
! 2113: IMPODD_10_43:
! 2114: rep=isin_G_H(po,r,36,11);
! 2115: if (rep) goto IMPODD_10_48; else return 36;
! 2116:
! 2117: IMPODD_10_44:
! 2118: rep=isin_G_H(po,r,29,25);
! 2119: if (rep) goto IMPODD_10_37; else goto IMPODD_10_49;
! 2120:
! 2121: IMPODD_10_45:
! 2122: rep=isin_G_H(po,r,39,22);
! 2123: if (rep) goto IMPODD_10_50; else return 39;
! 2124:
! 2125: IMPODD_10_46:
! 2126: rep=isin_G_H(po,r,16,2);
! 2127: return rep? 2: 16;
! 2128:
! 2129: IMPODD_10_47:
! 2130: rep=isin_G_H(po,r,23,14);
! 2131: if (rep) goto IMPODD_10_51; else goto IMPODD_10_52;
! 2132:
! 2133: IMPODD_10_48:
! 2134: rep=isin_G_H(po,r,11,3);
! 2135: if (rep) goto IMPODD_10_53; else return 11;
! 2136:
! 2137: IMPODD_10_49:
! 2138: rep=isin_G_H(po,r,29,23);
! 2139: if (rep) goto IMPODD_10_42; else goto IMPODD_10_54;
! 2140:
! 2141: IMPODD_10_50:
! 2142: rep=isin_G_H(po,r,22,12);
! 2143: if (rep) goto IMPODD_10_41; else goto IMPODD_10_55;
! 2144:
! 2145: IMPODD_10_51:
! 2146: rep=isin_G_H(po,r,14,1);
! 2147: return rep? 1: 14;
! 2148:
! 2149: IMPODD_10_52:
! 2150: rep=isin_G_H(po,r,23,3);
! 2151: if (!rep) return 23;
! 2152: IMPODD_10_53:
! 2153: rep=isin_G_H(po,r,3,2);
! 2154: if (rep) return 2; else goto IMPODD_10_57;
! 2155:
! 2156: IMPODD_10_54:
! 2157: rep=isin_G_H(po,r,29,5);
! 2158: if (rep) goto IMPODD_10_58; else return 29;
! 2159:
! 2160: IMPODD_10_55:
! 2161: rep=isin_G_H(po,r,22,11);
! 2162: if (rep) goto IMPODD_10_48;
! 2163: /* IMPODD_10_56: */
! 2164: rep=isin_G_H(po,r,22,5);
! 2165: if (rep) goto IMPODD_10_58; else return 22;
! 2166:
! 2167: IMPODD_10_57:
! 2168: rep=isin_G_H(po,r,3,1);
! 2169: return rep? 1: 3;
! 2170:
! 2171: IMPODD_10_58:
! 2172: rep=isin_G_H(po,r,5,4);
! 2173: if (rep) return 4;
! 2174: /* IMPODD_10_59: */
! 2175: rep=isin_G_H(po,r,5,3);
! 2176: if (rep) goto IMPODD_10_53; else return 5;
! 2177: }
! 2178: }
! 2179:
! 2180: static long
! 2181: closure10(GEN po)
! 2182: {
! 2183: long nbrac,rep;
! 2184: GEN r[NMAX];
! 2185:
! 2186: r[0]=myroots(po,PRMAX); nbrac=lg(r[0])-1;
! 2187: if (nbrac!=N) err(talker,"incompatible number of roots in closure10()");
! 2188:
! 2189: preci(r,PREC);
! 2190: if (CAR)
! 2191: {
! 2192: /* CLOS_10_1: */
! 2193: rep=isin_G_H(po,r,44,42);
! 2194: if (rep) return galoisimpeven10(po,r,42);
! 2195: /* CLOS_10_2: */
! 2196: rep=isin_G_H(po,r,44,37);
! 2197: if (rep) return galoisimpeven10(po,r,37);
! 2198: }
! 2199: else
! 2200: {
! 2201: /* CLOS_10_3: */
! 2202: rep=isin_G_H(po,r,45,43);
! 2203: if (rep) return galoisimpodd10(po,r,43);
! 2204: /* CLOS_10_4: */
! 2205: rep=isin_G_H(po,r,45,39);
! 2206: if (rep) return galoisimpodd10(po,r,39);
! 2207: }
! 2208: return galoisprim10(po,r);
! 2209: }
! 2210:
! 2211: static PERM
! 2212: data10(long n1,long n2,GROUP *t)
! 2213: {
! 2214: switch(n1)
! 2215: {
! 2216: case 6: if (n2!=2) break;
! 2217: *t=initgroup(N,1);
! 2218: return _cr(1, 2, 3, 4, 5, 6, 10, 9, 8, 7);
! 2219: case 9: if (n2!=3 && n2!=6) break;
! 2220: *t=initgroup(N,2);
! 2221: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 10, 9, 8, 7);
! 2222: return SID;
! 2223: case 10: *t=initgroup(N,2);
! 2224: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 10, 9, 8, 7);
! 2225: return SID;
! 2226: case 14: case 16:*t=initgroup(N,1);
! 2227: return _cr(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
! 2228: case 17: if (n2!=5) break;
! 2229: *t=initgroup(N,2);
! 2230: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 10, 9, 8, 7);
! 2231: return SID;
! 2232: case 19: case 20: *t=initgroup(N,2);
! 2233: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 10, 7, 9);
! 2234: return SID;
! 2235: case 21: if (n2!=10) break;
! 2236: *t=initgroup(N,1);
! 2237: return _cr(1, 2, 3, 4, 5, 6, 8, 10, 7, 9);
! 2238: case 23: if (n2!=3) break;
! 2239: *t=initgroup(N,1);
! 2240: return _cr(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
! 2241: case 25: *t=initgroup(N,1);
! 2242: return _cr(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
! 2243: case 26: *t=initgroup(N,2);
! 2244: _aff((*t)[2], 1, 2, 4, 9, 6, 8, 10, 3, 7, 5);
! 2245: return _cr(1, 2, 3, 10, 6, 5, 7, 4, 8, 9);
! 2246: case 27: if (n2!=17 && n2!=21) break;
! 2247: *t=initgroup(N,2);
! 2248: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 10, 7, 9);
! 2249: return SID;
! 2250: case 28: *t=initgroup(N,2);
! 2251: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 8, 10, 7, 9);
! 2252: return SID;
! 2253: case 29: if (n2!=5) break;
! 2254: *t=initgroup(N,1);
! 2255: return _cr(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
! 2256: case 32: *t=initgroup(N,2);
! 2257: _aff((*t)[2], 1, 2, 4, 9, 6, 8, 10, 3, 7, 5);
! 2258: return _cr(1, 2, 3, 10, 6, 5, 7, 4, 8, 9);
! 2259: case 36: if (n2!=11) break;
! 2260: *t=initgroup(N,1);
! 2261: return _cr(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
! 2262: case 38: if (n2!=12) break;
! 2263: *t=initgroup(N,1);
! 2264: return _cr(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
! 2265: case 39: if (n2!=22) break;
! 2266: *t=initgroup(N,1);
! 2267: return _cr(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
! 2268: case 40: if (n2!=12) break;
! 2269: *t=initgroup(N,1);
! 2270: return _cr(1, 2, 3, 4, 5, 6, 7, 8, 10, 9);
! 2271: case 41: if (n2!=22 && n2!=40) break;
! 2272: *t=initgroup(N,2);
! 2273: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 7, 8, 10, 9);
! 2274: return SID;
! 2275: }
! 2276: *t=initgroup(N,1); return SID;
! 2277: }
! 2278:
! 2279: static long
! 2280: galoismodulo10(GEN pol, GEN dpol)
! 2281: {
! 2282: long av = avma, res, gr[46];
! 2283: long **TYP = partitions(10), **GR = (long**) cgeti(45);
! 2284:
! 2285: GR[ 1]= _gr( 4, 1,6,30,42);
! 2286: GR[ 2]= _gr( 3, 1,6,30);
! 2287: GR[ 3]= _gr( 5, 1,5,6,30,42);
! 2288: GR[ 4]= _gr( 4, 1,5,23,30);
! 2289: GR[ 5]= _gr( 7, 1,5,6,22,23,30,42);
! 2290: GR[ 6]= _gr( 5, 1,6,24,30,42);
! 2291: GR[ 7]= _gr( -4, 1,5,14,30);
! 2292: GR[ 8]= _gr( -4, 1,3,5,30);
! 2293: GR[ 9]= _gr( 6, 1,5,6,24,30,42);
! 2294: GR[10]= _gr( 5, 1,5,23,24,30);
! 2295: GR[11]= _gr( 7, 1,5,6,11,30,33,42);
! 2296: GR[12]= _gr( 7, 1,5,6,11,23,30,33);
! 2297: GR[13]= _gr( 7, 1,4,5,14,23,30,34);
! 2298: GR[14]= _gr( 8, 1,2,3,4,5,6,30,42);
! 2299: GR[15]= _gr( -6, 1,3,5,18,22,30);
! 2300: GR[16]= _gr( 7, 1,3,5,6,17,23,30);
! 2301: GR[17]= _gr( 8, 1,5,6,22,23,24,30,42);
! 2302: GR[18]= _gr( -6, 1,5,22,24,30,40);
! 2303: GR[19]= _gr( 7, 1,5,6,22,24,30,42);
! 2304: GR[20]= _gr( 6, 1,5,22,23,24,30);
! 2305: GR[21]= _gr( 9, 1,3,5,6,23,24,26,30,42);
! 2306: GR[22]= _gr( 11, 1,3,5,6,11,13,22,23,30,33,42);
! 2307: GR[23]= _gr( 12, 1,2,3,4,5,6,17,18,22,23,30,42);
! 2308: GR[24]= _gr( -7, 1,3,5,18,22,30,40);
! 2309: GR[25]= _gr( 8, 1,3,5,18,22,23,30,39);
! 2310: GR[26]= _gr( -5, 1,5,14,22,30);
! 2311: GR[27]= _gr( 10, 1,3,5,6,22,23,24,26,30,42);
! 2312: GR[28]= _gr( -8, 1,3,5,22,24,26,30,40);
! 2313: GR[29]= _gr( 14, 1,2,3,4,5,6,17,18,22,23,30,39,40,42);
! 2314: GR[30]= _gr( 8, 1,5,6,14,22,30,39,42);
! 2315: GR[31]= _gr( -6, 1,5,14,22,30,40);
! 2316: GR[32]= _gr( 8, 1,4,5,14,22,23,30,34);
! 2317: GR[33]= _gr( 14, 1,3,5,6,15,17,22,23,24,26,29,30,40,42);
! 2318: GR[34]= _gr( -9, 1,3,5,11,13,18,22,30,32);
! 2319: GR[35]= _gr( 12, 1,4,5,6,14,22,23,30,34,39,40,42);
! 2320: GR[36]= _gr( 18, 1,2,3,4,5,6,11,12,13,17,18,22,23,30,31,32,33,42);
! 2321: GR[37]= _gr(-12, 1,3,5,11,13,16,18,22,30,32,35,40);
! 2322: GR[38]= _gr( 18, 1,3,4,5,6,11,13,15,17,18,21,22,23,30,32,33,35,39);
! 2323: GR[39]= _gr( 24, 1,2,3,4,5,6,11,12,13,15,16,17,18,21,22,23,30,31,32,33,35,39,40,42);
! 2324: GR[40]= _gr( 14, 1,3,5,6,7,9,11,23,24,26,27,30,33,42);
! 2325: GR[41]= _gr( 18, 1,3,5,6,7,9,11,13,16,20,22,23,24,26,27,30,33,42);
! 2326: GR[42]= _gr(-17, 1,3,5,7,9,11,13,16,18,20,22,24,26,27,30,35,40);
! 2327: GR[43]= _gr( 32, 1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,33,35,40,42);
! 2328: GR[44]= _gr(-22, 1,3,5,7,9,11,13,14,16,18,20,22,24,26,27,30,32,35,36,38,40,41);
! 2329:
! 2330: gr[0]=46; res = galmodp(pol,dpol,TYP,gr,GR);
! 2331: avma=av; if (!res) return 0;
! 2332: return CAR? 44: 45;
! 2333: }
! 2334:
! 2335: /* BIBLIOTHEQUE POUR LE DEGRE 11 */
! 2336:
! 2337: static long
! 2338: closure11(GEN po)
! 2339: {
! 2340: long nbrac,rep;
! 2341: GEN r[NMAX];
! 2342:
! 2343: r[0]=myroots(po,PRMAX); nbrac=lg(r[0])-1;
! 2344: if (nbrac!=N) err(talker,"incompatible number of roots in closure11()");
! 2345: preci(r,PREC);
! 2346: if (CAR)
! 2347: {
! 2348: /* EVEN_11_1: */
! 2349: rep=isin_G_H(po,r,7,6);
! 2350: if (!rep) return 7;
! 2351: /* EVEN_11_2: */
! 2352: rep=isin_G_H(po,r,6,5);
! 2353: if (!rep) return 6;
! 2354: /* EVEN_11_3: */
! 2355: rep=isin_G_H(po,r,5,3);
! 2356: if (!rep) return 5;
! 2357: /* EVEN_11_4: */
! 2358: rep=isin_G_H(po,r,3,1);
! 2359: return rep? 1: 3;
! 2360: }
! 2361: else
! 2362: {
! 2363: /* ODD_11_1: */
! 2364: rep=isin_G_H(po,r,8,4);
! 2365: if (!rep) return 8;
! 2366: /* ODD_11_2: */
! 2367: rep=isin_G_H(po,r,4,2);
! 2368: return rep? 2: 4;
! 2369: }
! 2370: }
! 2371:
! 2372: static PERM
! 2373: data11(long n1, GROUP *t)
! 2374: {
! 2375: switch(n1)
! 2376: {
! 2377: case 5: *t=initgroup(N,1);
! 2378: return _cr(1, 2, 3, 7, 8, 6, 11, 5, 9, 4, 10);
! 2379: case 6: *t=initgroup(N,1);
! 2380: return _cr(1, 2, 3, 4, 6, 10, 11, 9, 7, 5, 8);
! 2381: case 7: *t=initgroup(N,2);
! 2382: _aff((*t)[2], 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10);
! 2383: return SID;
! 2384: }
! 2385: *t=initgroup(N,1); return SID;
! 2386: }
! 2387:
! 2388: static long
! 2389: galoismodulo11(GEN pol, GEN dpol)
! 2390: {
! 2391: long av = avma, res, gr[6] = {0, 1,1,1,1,1};
! 2392: long **TYP = (long**) cgeti(9);
! 2393:
! 2394: TYP[0] = new_chunk(1);
! 2395: TYP[1] = _gr(11, 11,0,0,0,0,0,0,0,0,0,0);
! 2396: if (CAR)
! 2397: {
! 2398: TYP[2] = _gr(11, 8,2,1,0,0,0,0,0,0,0,0);
! 2399: TYP[3] = _gr(11, 6,3,2,0,0,0,0,0,0,0,0);
! 2400: TYP[4] = _gr(11, 5,5,1,0,0,0,0,0,0,0,0);
! 2401: TYP[5] = _gr(11, 4,4,1,1,1,0,0,0,0,0,0);
! 2402: TYP[6] = _gr(11, 3,3,3,1,1,0,0,0,0,0,0);
! 2403: TYP[7] = _gr(11, 2,2,2,2,1,1,1,0,0,0,0);
! 2404: TYP[8] = _gr(11, 1,1,1,1,1,1,1,1,1,1,1);
! 2405: TYP[0][0] = 8;
! 2406: }
! 2407: else
! 2408: {
! 2409: TYP[2] = _gr(11,10,1,0,0,0,0,0,0,0,0,0);
! 2410: TYP[3] = _gr(11, 5,5,1,0,0,0,0,0,0,0,0);
! 2411: TYP[4] = _gr(11, 2,2,2,2,2,1,0,0,0,0,0);
! 2412: TYP[5] = _gr(11, 1,1,1,1,1,1,1,1,1,1,1);
! 2413: TYP[0][0] = 5;
! 2414: }
! 2415: res = galmodp(pol,dpol,TYP,gr,NULL);
! 2416: avma=av; if (!res) return 0;
! 2417: return CAR? 7: 8;
! 2418: }
! 2419:
! 2420: /* return 1 iff we need to read a resolvent */
! 2421: static long
! 2422: init_isin(long n1, long n2, GROUP *tau, GROUP *ss, PERM *s0)
! 2423: {
! 2424: long fl = 1;
! 2425: if (DEBUGLEVEL) {
! 2426: fprintferr("\n*** Entering isin_%ld_G_H_(%ld,%ld)\n",N,n1,n2); flusherr();
! 2427: }
! 2428: switch(N)
! 2429: {
! 2430: case 8:
! 2431: if ((n1==47 && n2==46) || (n1==44 && n2==40)) fl=0;
! 2432: *s0=data8(n1,n2,tau); break;
! 2433: case 9:
! 2434: if ((n1==31 && n2==29) || (n1==34 && n2==31) || (n1==33 && n2==30)) fl=0;
! 2435: *s0=data9(n1,n2,tau); break;
! 2436: case 10:
! 2437: if ((n1==45 && (n2==43||n2==39))
! 2438: || (n1==44 && (n2==42||n2==37))
! 2439: || (n1==43 && (n2==41||n2==33))
! 2440: || (n1==42 && n2==28)
! 2441: || (n1==41 && (n2==40||n2==27||n2==22))
! 2442: || (n1==40 && (n2==21||n2==11))
! 2443: || (n1==39 && (n2==38||n2==36||n2==29||n2==22))
! 2444: || (n1==38 && (n2==25||n2==12))
! 2445: || (n1==37 && (n2==34||n2==24))
! 2446: || (n1==36 && (n2==23||n2==11))
! 2447: || (n1==34 && n2==15)
! 2448: || (n1==33 && n2==27)
! 2449: || (n1==29 && (n2==25||n2==23||n2==5))
! 2450: || (n1==28 && n2==18)
! 2451: || (n1==27 && (n2==20||n2==19||n2==17))
! 2452: || (n1==25 && n2==4)
! 2453: || (n1==24 && n2==15)
! 2454: || (n1==23 && (n2==16||n2==3))
! 2455: || (n1==22 && (n2==12||n2==11||n2==5))
! 2456: || (n1==21 && (n2==10||n2==9))
! 2457: || (n1==17 && n2==5)
! 2458: || (n1==16 && n2==2)
! 2459: || (n1==14 && n2==1)
! 2460: || (n1==12 && n2==4)
! 2461: || (n1==11 && n2==3)
! 2462: || (n1==10 && n2==4)
! 2463: || (n1== 9 && n2==3)
! 2464: || (n1== 6 && n2==1)
! 2465: || (n1== 5 && n2==3)) fl = 0;
! 2466: *s0=data10(n1,n2,tau); break;
! 2467: case 11:
! 2468: *s0=data11(n1,tau); break;
! 2469: }
! 2470: *ss = lirecoset(n1,n2,N); return fl;
! 2471: }
! 2472:
! 2473: static long
! 2474: isin_G_H(GEN po, GEN *r, long n1, long n2)
! 2475: {
! 2476: long nbv,nbm,i,j;
! 2477: PERM s0, ww;
! 2478: RESOLVANTE a;
! 2479: GROUP ss,tau;
! 2480:
! 2481: if (init_isin(n1,n2, &tau, &ss, &s0))
! 2482: a = lireresolv(n1,n2,N,&nbv,&nbm);
! 2483: else
! 2484: { a = NULL; nbm=n1; nbv=n2; }
! 2485: ww = check_isin(po,r,nbm,nbv,a,tau,ss,s0);
! 2486: if (getpreci(r) != PREC) preci(r,PREC);
! 2487: free(ss); free(tau); if (a) free(a);
! 2488: if (ww)
! 2489: {
! 2490: long z[NMAX+1];
! 2491:
! 2492: if (DEBUGLEVEL)
! 2493: {
! 2494: fprintferr("\n Output of isin_%ld_G_H(%ld,%ld): %ld",N,n1,n2,n2);
! 2495: fprintferr("\n Reordering of the roots: "); printperm(ww);
! 2496: flusherr();
! 2497: }
! 2498: for (i=0; i<TSCHMAX; i++)
! 2499: {
! 2500: GEN p1 = r[i];
! 2501: for (j=1; j<=N; j++) z[j]=p1[(int)ww[j]];
! 2502: for (j=1; j<=N; j++) p1[j]=z[j];
! 2503: }
! 2504: free(ww); return n2;
! 2505: }
! 2506: if (DEBUGLEVEL)
! 2507: {
! 2508: fprintferr(" Output of isin_%ld_G_H(%ld,%ld): not included.\n",N,n1,n2);
! 2509: flusherr();
! 2510: }
! 2511: return 0;
! 2512: }
! 2513:
! 2514: GEN
! 2515: galoisbig(GEN pol, long prec)
! 2516: {
! 2517: GEN dpol, res = cgetg(4,t_VEC);
! 2518: long *tab,t, av = avma;
! 2519: long tab8[]={0,
! 2520: 8,8,8,8,8,16,16,16,16,16, 16,24,24,24,32,32,32,32,32,32,
! 2521: 32,32,48,48,56,64,64,64,64,64, 64,96,96,96,128,168,168,192,192,192,
! 2522: 192,288,336,384,576,576,1152,1344,20160,40320};
! 2523: long tab9[]={0,
! 2524: 9,9,18,18,18,27,27,36,36,54, 54,54,54,72,72,72,81,108,144,162,
! 2525: 162,162,216,324,324,432,504,648,648,648, 1296,1512,181440,362880};
! 2526: long tab10[]={0,
! 2527: 10,10,20,20,40,50,60,80,100,100, 120,120,120,160,160,160,200,200,200,200,
! 2528: 200,240,320,320,320,360,400,400,640,720, 720,720,800,960,1440,
! 2529: 1920,1920,1920,3840,7200,14400,14400,28800,1814400,3628800};
! 2530: long tab11[]={0, 11,22,55,110,660,7920,19958400,39916800};
! 2531:
! 2532: N = lgef(pol)-3; dpol = discsr(pol); CAR = carreparfait(dpol);
! 2533: prec += 2 * (MEDDEFAULTPREC-2);
! 2534: PREC = prec;
! 2535: if (DEBUGLEVEL)
! 2536: {
! 2537: fprintferr("Entering galoisbig (prec = %ld)\n",prec);
! 2538: fprintferr("Working with reduced polynomial #1 = "); bruterr(pol,'g',-1);
! 2539: fprintferr("\ndiscriminant = "); bruterr(dpol,'g',-1);
! 2540: fprintferr(CAR? "\nEVEN group\n": "\nODD group\n"); flusherr();
! 2541: }
! 2542: PRMAX = prec+5; TSCHMAX = 1; SID[0] = N;
! 2543: switch(N)
! 2544: {
! 2545: case 8: t = galoismodulo8(pol,dpol);
! 2546: if (!t) t = closure8(pol);
! 2547: tab=tab8; break;
! 2548:
! 2549: case 9: t = galoismodulo9(pol,dpol);
! 2550: if (!t) t = closure9(pol);
! 2551: tab=tab9; break;
! 2552:
! 2553: case 10: t = galoismodulo10(pol,dpol);
! 2554: if (!t) t = closure10(pol);
! 2555: tab=tab10; break;
! 2556:
! 2557: case 11: t = galoismodulo11(pol,dpol);
! 2558: if (!t) t = closure11(pol);
! 2559: tab=tab11; break;
! 2560:
! 2561: default: err(impl,"galois in degree > 11");
! 2562: }
! 2563: avma = av;
! 2564: res[1]=lstoi(tab[t]);
! 2565: res[2]=lstoi(CAR? 1 : -1);
! 2566: res[3]=lstoi(t); return res;
! 2567: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>