[BACK]Return to base1.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari / src / basemath

Annotation of OpenXM_contrib/pari/src/basemath/base1.c, Revision 1.1.1.1

1.1       maekawa     1: /**************************************************************/
                      2: /*                                                            */
                      3: /*                        NUMBER FIELDS                       */
                      4: /*                                                            */
                      5: /**************************************************************/
                      6: /* $Id: base1.c,v 1.2 1999/09/23 17:50:55 karim Exp $ */
                      7: #include "pari.h"
                      8: #include "parinf.h"
                      9:
                     10: void
                     11: checkrnf(GEN rnf)
                     12: {
                     13:   if (typ(rnf)!=t_VEC) err(idealer1);
                     14:   if (lg(rnf)!=12) err(idealer1);
                     15: }
                     16:
                     17: GEN
                     18: checkbnf(GEN bnf)
                     19: {
                     20:   if (typ(bnf)!=t_VEC) err(idealer1);
                     21:   switch (lg(bnf))
                     22:   {
                     23:     case 11: return bnf;
                     24:     case 10:
                     25:       if (typ(bnf[1])==t_POL)
                     26:         err(talker,"please apply bnfinit first");
                     27:       break;
                     28:     case 7:
                     29:       return checkbnf((GEN)bnf[1]);
                     30:
                     31:     case 3:
                     32:       if (typ(bnf[2])==t_POLMOD)
                     33:         return checkbnf((GEN)bnf[1]);
                     34:   }
                     35:   err(idealer1);
                     36:   return NULL; /* not reached */
                     37: }
                     38:
                     39: GEN
                     40: checknf(GEN nf)
                     41: {
                     42:   if (typ(nf)==t_POL) err(talker,"please apply nfinit first");
                     43:   if (typ(nf)!=t_VEC) err(idealer1);
                     44:   switch(lg(nf))
                     45:   {
                     46:     case 10: return nf;
                     47:     case 11: return checknf((GEN)nf[7]);
                     48:     case 3: if (typ(nf[2]) == t_POLMOD) return checknf((GEN)nf[1]);
                     49:   }
                     50:   err(idealer1);
                     51:   return NULL; /* not reached */
                     52: }
                     53:
                     54: void
                     55: checkbnr(GEN bnr)
                     56: {
                     57:   if (typ(bnr)!=t_VEC || lg(bnr)!=7)
                     58:     err(talker,"incorrect bigray field");
                     59:   (void)checkbnf((GEN)bnr[1]);
                     60: }
                     61:
                     62: void
                     63: checkbnrgen(GEN bnr)
                     64: {
                     65:   checkbnr(bnr);
                     66:   if (lg(bnr[5])<=3)
                     67:     err(talker,"please apply bnrinit(,,1) and not bnrinit(,)");
                     68: }
                     69:
                     70: GEN
                     71: check_units(GEN bnf, char *f)
                     72: {
                     73:   GEN nf, x;
                     74:   bnf = checkbnf(bnf); nf = checknf(bnf);
                     75:   x = (GEN)bnf[8];
                     76:   if (lg(x) < 7 || (lg(x[5]) == 1 && lg(nf[6]) > 2))
                     77:     err(talker,"missing units in %s", f);
                     78:   return (GEN)x[5];
                     79: }
                     80:
                     81: void
                     82: checkid(GEN x, long N)
                     83: {
                     84:   if (typ(x)!=t_MAT) err(idealer2);
                     85:   if (lg(x) == 1 || lg(x[1]) != N+1)
                     86:     err(talker,"incorrect matrix for ideal");
                     87: }
                     88:
                     89: void
                     90: checkbid(GEN bid)
                     91: {
                     92:   if (typ(bid)!=t_VEC || lg(bid)!=6 || lg(bid[1])!=3)
                     93:     err(talker,"incorrect bigideal");
                     94: }
                     95:
                     96: void
                     97: checkprimeid(GEN id)
                     98: {
                     99:   if (typ(id) != t_VEC || lg(id) != 6)
                    100:     err(talker,"incorrect prime ideal");
                    101: }
                    102:
                    103: void
                    104: checkprhall(GEN prhall)
                    105: {
                    106:   if (typ(prhall) != t_VEC || lg(prhall) != 3 || typ(prhall[1]) != t_MAT)
                    107:     err(talker,"incorrect prhall format");
                    108: }
                    109:
                    110: void
                    111: check_pol_int(GEN x)
                    112: {
                    113:   long k = lg(x)-1;
                    114:   for ( ; k>1; k--)
                    115:     if (typ(x[k])!=t_INT) err(talker,"polynomial not in Z[X]");
                    116: }
                    117:
                    118: GEN
                    119: get_primeid(GEN x)
                    120: {
                    121:   if (typ(x) != t_VEC) return NULL;
                    122:   if (lg(x) == 3) x = (GEN)x[1];
                    123:   if (lg(x) != 6 || typ(x[3]) != t_INT) return NULL;
                    124:   return x;
                    125: }
                    126:
                    127: GEN
                    128: get_bnf(GEN x, int *t)
                    129: {
                    130:   switch(typ(x))
                    131:   {
                    132:     case t_POL: *t = typ_POL;  return NULL;
                    133:     case t_QUAD: *t = typ_Q  ; return NULL;
                    134:     case t_VEC:
                    135:       switch(lg(x))
                    136:       {
                    137:         case 3:
                    138:           if (typ(x[2]) != t_POLMOD) break;
                    139:           return get_bnf((GEN)x[1],t);
                    140:         case 6 : *t = typ_QUA; return NULL;
                    141:         case 10: *t = typ_NF; return NULL;
                    142:         case 11: *t = typ_BNF; return x;
                    143:         case 7 : *t = typ_BNR;
                    144:           x = (GEN)x[1]; if (typ(x)!=t_VEC || lg(x)!=11) break;
                    145:           return x;
                    146:       }
                    147:     case t_MAT:
                    148:       if (lg(x)==2)
                    149:         switch(lg(x[1]))
                    150:         {
                    151:           case 8: case 11:
                    152:             *t = typ_CLA; return NULL;
                    153:         }
                    154:   }
                    155:   *t = typ_NULL; return NULL;
                    156: }
                    157:
                    158: GEN
                    159: get_nf(GEN x, int *t)
                    160: {
                    161:   switch(typ(x))
                    162:   {
                    163:     case t_POL : *t = typ_POL; return NULL;
                    164:     case t_QUAD: *t = typ_Q  ; return NULL;
                    165:     case t_VEC:
                    166:       switch(lg(x))
                    167:       {
                    168:         case 3:
                    169:           if (typ(x[2]) != t_POLMOD) break;
                    170:           return get_nf((GEN)x[1],t);
                    171:         case 10: *t = typ_NF; return x;
                    172:         case 11: *t = typ_BNF;
                    173:           x = (GEN)x[7]; if (typ(x)!=t_VEC || lg(x)!=10) break;
                    174:           return x;
                    175:         case 7 : *t = typ_BNR;
                    176:           x = (GEN)x[1]; if (typ(x)!=t_VEC || lg(x)!=11) break;
                    177:           x = (GEN)x[7]; if (typ(x)!=t_VEC || lg(x)!=10) break;
                    178:           return x;
                    179:
                    180:         case 14: case 20:
                    181:           *t = typ_ELL; return NULL;
                    182:       }break;
                    183:     case t_MAT:
                    184:       if (lg(x)==2)
                    185:         switch(lg(x[1]))
                    186:         {
                    187:           case 8: case 11:
                    188:             *t = typ_CLA; return NULL;
                    189:         }
                    190:   }
                    191:   *t = typ_NULL; return NULL;
                    192: }
                    193:
                    194: /*************************************************************************/
                    195: /**                                                                    **/
                    196: /**                           GALOIS GROUP                             **/
                    197: /**                                                                    **/
                    198: /*************************************************************************/
                    199:
                    200: /* exchange elements i and j in vector x */
                    201: static GEN
                    202: transroot(GEN x, int i, int j)
                    203: {
                    204:   long k;
                    205:   x = dummycopy(x);
                    206:   k=x[i]; x[i]=x[j]; x[j]=k; return x;
                    207: }
                    208:
                    209: #define randshift (BITS_IN_RANDOM - 3)
                    210:
                    211: GEN
                    212: tschirnhaus(GEN x)
                    213: {
                    214:   long a, v = varn(x), av = avma;
                    215:   GEN u, p1 = cgetg(5,t_POL);
                    216:
                    217:   if (typ(x)!=t_POL) err(notpoler,"tschirnhaus");
                    218:   if (lgef(x) < 4) err(constpoler,"tschirnhaus");
                    219:   if (v) { u=dummycopy(x); setvarn(u,0); x=u; }
                    220:   p1[1] = evalsigne(1)|evalvarn(0)|evallgef(5);
                    221:   do
                    222:   {
                    223:     a = mymyrand() >> randshift; if (a==0) a =1; p1[4]=lstoi(a);
                    224:     a = mymyrand() >> (randshift-1); if (a>=4) a-=8; p1[3]=lstoi(a);
                    225:     a = mymyrand() >> (randshift-1); if (a>=4) a-=8; p1[2]=lstoi(a);
                    226:     u = caract2(x,p1,v); a=avma;
                    227:   }
                    228:   while (lgef(srgcd(u,derivpol(u))) > 3); /* while u not separable */
                    229:   if (DEBUGLEVEL>1)
                    230:     fprintferr("Tschirnhaus transform. New pol: %Z",u);
                    231:   avma=a; return gerepileupto(av,u);
                    232: }
                    233: #undef randshift
                    234:
                    235: int
                    236: gpolcomp(GEN p1, GEN p2)
                    237: {
                    238:   int s,j = lgef(p1)-2;
                    239:
                    240:   if (lgef(p2)-2 != j)
                    241:     err(bugparier,"gpolcomp (different degrees)");
                    242:   for (; j>=2; j--)
                    243:   {
                    244:     s = absi_cmp((GEN)p1[j], (GEN)p2[j]);
                    245:     if (s) return s;
                    246:   }
                    247:   return 0;
                    248: }
                    249:
                    250: /* pol is assumed to be non-zero, primitive and integral */
                    251: static GEN
                    252: primitive_pol_to_monic(GEN pol, GEN *ptlead)
                    253: {
                    254:   long n = lgef(pol)-1;
                    255:   GEN p1,lead,res;
                    256:
                    257:   if (gcmp1((GEN)pol[n])) { if (ptlead) *ptlead = NULL; return pol; }
                    258:   res = cgetg(n+1,t_POL); res[1]=pol[1];
                    259:   lead = (GEN) pol[n]; p1 = gun;
                    260:   res[n] = un; n--;
                    261:   if (n>1) res[n] = pol[n];
                    262:   for (n--; n>1; n--)
                    263:   {
                    264:     p1 = mulii(lead,p1);
                    265:     res[n] = lmulii(p1,(GEN)pol[n]);
                    266:   }
                    267:   if (ptlead) *ptlead = lead; return res;
                    268: }
                    269:
                    270: /* compute x1*x2^2 + x2*x3^2 + x3*x4^2 + x4*x1^2 */
                    271: static GEN
                    272: get_F4(GEN x)
                    273: {
                    274:   GEN p1=gzero;
                    275:   long i;
                    276:
                    277:   for (i=1; i<=4; i++)
                    278:     p1 = gadd(p1, gmul((GEN)x[i], gsqr((GEN)x[(i&3)+1])));
                    279:   return p1;
                    280: }
                    281:
                    282: GEN galoisbig(GEN x, long prec);
                    283: GEN roots_to_pol(GEN a, long v);
                    284:
                    285: GEN
                    286: galois(GEN x, long prec)
                    287: {
                    288:   long av=avma,av1,i,j,k,n,f,l,l2,e,e1,pr,ind;
                    289:   GEN x1,p1,p2,p3,p4,p5,p6,w,y,z,ee;
                    290:   static int ind5[20]={2,5,3,4, 1,3,4,5, 1,5,2,4, 1,2,3,5, 1,4,2,3};
                    291:   static int ind6[60]={3,5,4,6, 2,6,4,5, 2,3,5,6, 2,4,3,6, 2,5,3,4,
                    292:                        1,4,5,6, 1,5,3,6, 1,6,3,4, 1,3,4,5, 1,6,2,5,
                    293:                        1,2,4,6, 1,5,2,4, 1,3,2,6, 1,2,3,5, 1,4,2,3};
                    294:   if (typ(x)!=t_POL) err(notpoler,"galois");
                    295:   n=lgef(x)-3; if (n<=0) err(constpoler,"galois");
                    296:   if (n>11) err(impl,"galois of degree higher than 11");
                    297:   x = gdiv(x,content(x));
                    298:   for (i=2; i<=n+2; i++)
                    299:     if (typ(x[i])!=t_INT) err(polrationer,"galois");
                    300:   if (gisirreducible(x) != gun)
                    301:     err(impl,"galois of reducible polynomial");
                    302:
                    303:   if (n<4)
                    304:   {
                    305:     if (n<3)
                    306:     {
                    307:       avma=av; y=cgetg(4,t_VEC);
                    308:       y[1] = (n==1)? un: deux;
                    309:       y[2]=lnegi(gun);
                    310:     }
                    311:     else /* n=3 */
                    312:     {
                    313:       f=carreparfait(discsr(x));
                    314:       avma=av; y=cgetg(4,t_VEC);
                    315:       if (f) { y[1]=lstoi(3); y[2]=un; }
                    316:       else   { y[1]=lstoi(6); y[2]=lnegi(gun); }
                    317:     }
                    318:     y[3]=un; return y;
                    319:   }
                    320:   x1 = x = primitive_pol_to_monic(x,NULL); av1=avma;
                    321:   if (n>7) return galoisbig(x,prec);
                    322:   for(;;)
                    323:   {
                    324:     switch(n)
                    325:     {
                    326:       case 4: z = cgetg(7,t_VEC);
                    327:         for(;;)
                    328:        {
                    329:          p1=roots(x,prec);
                    330:           z[1] = (long)get_F4(p1);
                    331:           z[2] = (long)get_F4(transroot(p1,1,2));
                    332:           z[3] = (long)get_F4(transroot(p1,1,3));
                    333:           z[4] = (long)get_F4(transroot(p1,1,4));
                    334:           z[5] = (long)get_F4(transroot(p1,2,3));
                    335:           z[6] = (long)get_F4(transroot(p1,3,4));
                    336:           p4 = roots_to_pol(z,0);
                    337:           p5=grndtoi(greal(p4),&e);
                    338:           e1=gexpo(gimag(p4)); if (e1>e) e=e1;
                    339:           if (e <= -10) break;
                    340:          prec = (prec<<1)-2;
                    341:        }
                    342:        p6 = modulargcd(p5, derivpol(p5));
                    343:        if (typ(p6)==t_POL && lgef(p6)>3) goto tchi;
                    344:        p2 = (GEN)factor(p5)[1];
                    345:        switch(lg(p2)-1)
                    346:        {
                    347:          case 1: f=carreparfait(discsr(x)); avma=av; y=cgetg(4,t_VEC);
                    348:            y[3]=un;
                    349:            if (f) { y[2]=un; y[1]=lstoi(12); return y; }
                    350:            y[2]=lnegi(gun); y[1]=lstoi(24); return y;
                    351:
                    352:          case 2: avma=av; y=cgetg(4,t_VEC);
                    353:            y[3]=un; y[2]=lnegi(gun); y[1]=lstoi(8); return y;
                    354:
                    355:          case 3: avma=av; y=cgetg(4,t_VEC);
                    356:            y[1]=lstoi(4); y[3]=un;
                    357:            y[2] = (lgef(p2[1])==5)? un: lnegi(gun);
                    358:            return y;
                    359:
                    360:          default: err(bugparier,"galois (bug1)");
                    361:        }
                    362:
                    363:       case 5: z = cgetg(7,t_VEC);
                    364:         ee = new_chunk(7); w = new_chunk(7);
                    365:         for(;;)
                    366:        {
                    367:           for(;;)
                    368:          {
                    369:            p1=roots(x,prec);
                    370:            for (l=1; l<=6; l++)
                    371:            {
                    372:              p2=(l==1)?p1: ((l<6)?transroot(p1,1,l): transroot(p1,2,5));
                    373:              p3=gzero;
                    374:               for (k=0,i=1; i<=5; i++,k+=4)
                    375:              {
                    376:                p5 = gadd(gmul((GEN)p2[ind5[k]],(GEN)p2[ind5[k+1]]),
                    377:                          gmul((GEN)p2[ind5[k+2]],(GEN)p2[ind5[k+3]]));
                    378:                p3 = gadd(p3, gmul(gsqr((GEN)p2[i]),p5));
                    379:              }
                    380:              w[l]=lrndtoi(greal(p3),&e);
                    381:               e1 = gexpo(gimag(p3)); if (e1>e) e=e1;
                    382:               ee[l]=e; z[l] = (long)p3;
                    383:            }
                    384:             p4 = roots_to_pol(z,0);
                    385:            p5=grndtoi(greal(p4),&e);
                    386:             e1 = gexpo(gimag(p4)); if (e1>e) e=e1;
                    387:             if (e <= -10) break;
                    388:            prec = (prec<<1)-2;
                    389:          }
                    390:          p6 = modulargcd(p5,derivpol(p5));
                    391:          if (typ(p6)==t_POL && lgef(p6)>3) goto tchi;
                    392:          p3=(GEN)factor(p5)[1];
                    393:          f=carreparfait(discsr(x));
                    394:          if (lg(p3)-1==1)
                    395:          {
                    396:            avma=av; y=cgetg(4,t_VEC); y[3]=un;
                    397:            if (f) { y[2]=un; y[1]=lstoi(60); return y; }
                    398:            else { y[2]=lneg(gun); y[1]=lstoi(120); return y; }
                    399:          }
                    400:          if (!f)
                    401:          {
                    402:            avma=av; y=cgetg(4,t_VEC);
                    403:            y[3]=un; y[2]=lneg(gun); y[1]=lstoi(20); return y;
                    404:          }
                    405:           pr = - (bit_accuracy(prec) >> 1);
                    406:           for (l=1; l<=6; l++)
                    407:            if (ee[l] <= pr && gcmp0(poleval(p5,(GEN)w[l]))) break;
                    408:          if (l>6) err(bugparier,"galois (bug4)");
                    409:          p2=(l==6)? transroot(p1,2,5):transroot(p1,1,l);
                    410:          p3=gzero;
                    411:          for (i=1; i<=5; i++)
                    412:          {
                    413:            j=(i%5)+1;
                    414:            p3=gadd(p3,gmul(gmul((GEN)p2[i],(GEN)p2[j]),
                    415:                            gsub((GEN)p2[j],(GEN)p2[i])));
                    416:          }
                    417:          p5=gsqr(p3); p4=grndtoi(greal(p5),&e);
                    418:           e1 = gexpo(gimag(p5)); if (e1>e) e=e1;
                    419:          if (e <= -10)
                    420:          {
                    421:            if (gcmp0(p4)) goto tchi;
                    422:            f=carreparfait(p4); avma=av; y=cgetg(4,t_VEC);
                    423:            y[3]=y[2]=un; y[1]=lstoi(f?5:10);
                    424:            return y;
                    425:          }
                    426:          prec=(prec<<1)-2;
                    427:        }
                    428:
                    429:       case 6: z = cgetg(7, t_VEC);
                    430:         for(;;)
                    431:        {
                    432:           for(;;)
                    433:          {
                    434:            p1=roots(x,prec);
                    435:            for (l=1; l<=6; l++)
                    436:            {
                    437:              p2=(l==1)?p1:transroot(p1,1,l);
                    438:              p3=gzero; k=0;
                    439:               for (i=1; i<=5; i++) for (j=i+1; j<=6; j++)
                    440:              {
                    441:                p5=gadd(gmul((GEN)p2[ind6[k]],(GEN)p2[ind6[k+1]]),
                    442:                        gmul((GEN)p2[ind6[k+2]],(GEN)p2[ind6[k+3]]));
                    443:                p3=gadd(p3,gmul(gsqr(gmul((GEN)p2[i],(GEN)p2[j])),p5)); k+=4;
                    444:              }
                    445:              z[l] = (long)p3;
                    446:            }
                    447:             p4=roots_to_pol(z,0);
                    448:            p5=grndtoi(greal(p4),&e);
                    449:             e1 = gexpo(gimag(p4)); if (e1>e) e=e1;
                    450:             if (e <= -10) break;
                    451:            prec=(prec<<1)-2;
                    452:          }
                    453:          p6 = modulargcd(p5,derivpol(p5));
                    454:          if (typ(p6)==t_POL && lgef(p6)>3) goto tchi;
                    455:          p2=(GEN)factor(p5)[1];
                    456:          switch(lg(p2)-1)
                    457:          {
                    458:            case 1:
                    459:               z = cgetg(11,t_VEC); ind=0;
                    460:              p3=gadd(gmul(gmul((GEN)p1[1],(GEN)p1[2]),(GEN)p1[3]),
                    461:                      gmul(gmul((GEN)p1[4],(GEN)p1[5]),(GEN)p1[6]));
                    462:               z[++ind] = (long)p3;
                    463:              for (i=1; i<=3; i++)
                    464:                for (j=4; j<=6; j++)
                    465:                {
                    466:                  p2=transroot(p1,i,j);
                    467:                  p3=gadd(gmul(gmul((GEN)p2[1],(GEN)p2[2]),(GEN)p2[3]),
                    468:                          gmul(gmul((GEN)p2[4],(GEN)p2[5]),(GEN)p2[6]));
                    469:                  z[++ind] = (long)p3;
                    470:                }
                    471:               p4 = roots_to_pol(z,0);
                    472:              p5=grndtoi(greal(p4),&e);
                    473:               e1 = gexpo(gimag(p4)); if (e1>e) e=e1;
                    474:              if (e <= -10)
                    475:              {
                    476:                p6 = modulargcd(p5,derivpol(p5));
                    477:                if (typ(p6)==t_POL && lgef(p6)>3) goto tchi;
                    478:                p2=(GEN)factor(p5)[1];
                    479:                f=carreparfait(discsr(x));
                    480:                avma=av; y=cgetg(4,t_VEC); y[3]=un;
                    481:                if (lg(p2)-1==1)
                    482:                {
                    483:                  if (f) { y[2]=un; y[1]=lstoi(360); }
                    484:                  else { y[2]=lnegi(gun); y[1]=lstoi(720); }
                    485:                }
                    486:                else
                    487:                {
                    488:                  if (f) { y[2]=un; y[1]=lstoi(36); }
                    489:                  else { y[2]=lnegi(gun); y[1]=lstoi(72); }
                    490:                }
                    491:                 return y;
                    492:              }
                    493:              prec=(prec<<1)-2; break;
                    494:
                    495:            case 2: l2=lgef(p2[1])-3; if (l2>3) l2=6-l2;
                    496:              switch(l2)
                    497:              {
                    498:                case 1: f=carreparfait(discsr(x));
                    499:                  avma=av; y=cgetg(4,t_VEC); y[3]=un;
                    500:                  if (f) { y[2]=un; y[1]=lstoi(60); }
                    501:                  else { y[2]=lneg(gun); y[1]=lstoi(120); }
                    502:                  return y;
                    503:                case 2: f=carreparfait(discsr(x));
                    504:                  if (f)
                    505:                  {
                    506:                    avma=av; y=cgetg(4,t_VEC);
                    507:                    y[3]=y[2]=un; y[1]=lstoi(24);
                    508:                  }
                    509:                  else
                    510:                  {
                    511:                    p3=(lgef(p2[1])==5) ? (GEN)p2[2]:(GEN)p2[1];
                    512:                    f=carreparfait(discsr(p3));
                    513:                    avma=av; y=cgetg(4,t_VEC); y[2]=lneg(gun);
                    514:                    if (f) { y[1]=lstoi(24); y[3]=deux; }
                    515:                    else { y[1]=lstoi(48); y[3]=un; }
                    516:                  }
                    517:                  return y;
                    518:                case 3: f=carreparfait(discsr((GEN)p2[1]))
                    519:                       || carreparfait(discsr((GEN)p2[2]));
                    520:                  avma=av; y=cgetg(4,t_VEC);
                    521:                  y[3]=un; y[2]=lneg(gun); y[1]=lstoi(f? 18: 36);
                    522:                  return y;
                    523:              }
                    524:            case 3:
                    525:              for (l2=1; l2<=3; l2++)
                    526:                if (lgef(p2[l2])>=6) p3=(GEN)p2[l2];
                    527:              if (lgef(p3)==6)
                    528:              {
                    529:                f=carreparfait(discsr(p3)); avma=av; y=cgetg(4,t_VEC);
                    530:                 y[2]=lneg(gun); y[1]=lstoi(f? 6: 12);
                    531:              }
                    532:              else
                    533:              {
                    534:                f=carreparfait(discsr(x)); avma=av; y=cgetg(4,t_VEC);
                    535:                if (f) { y[2]=un; y[1]=lstoi(12); }
                    536:                else { y[2]=lneg(gun); y[1]=lstoi(24); }
                    537:              }
                    538:               y[3]=un; return y;
                    539:            case 4: avma=av; y=cgetg(4,t_VEC);
                    540:              y[1]=lstoi(6); y[2]=lneg(gun); y[3]=deux; return y;
                    541:             default: err(bugparier,"galois (bug3)");
                    542:          }
                    543:        }
                    544:
                    545:       case 7: z = cgetg(36,t_VEC);
                    546:         for(;;)
                    547:        {
                    548:          ind = 0; p1=roots(x,prec); p4=gun;
                    549:          for (i=1; i<=5; i++)
                    550:            for (j=i+1; j<=6; j++)
                    551:             {
                    552:               p6 = gadd((GEN)p1[i],(GEN)p1[j]);
                    553:              for (k=j+1; k<=7; k++)
                    554:                 z[++ind] = (long) gadd(p6,(GEN)p1[k]);
                    555:             }
                    556:           p4 = roots_to_pol(z,0);
                    557:           p5 = grndtoi(greal(p4),&e);
                    558:           e1 = gexpo(gimag(p4)); if (e1>e) e=e1;
                    559:          if (e <= -10) break;
                    560:           prec = (prec<<1)-2;
                    561:        }
                    562:        p6 = modulargcd(p5,derivpol(p5));
                    563:        if (typ(p6)==t_POL && lgef(p6)>3) goto tchi;
                    564:        p2=(GEN)factor(p5)[1];
                    565:        switch(lg(p2)-1)
                    566:        {
                    567:          case 1: f=carreparfait(discsr(x)); avma=av; y=cgetg(4,t_VEC); y[3]=un;
                    568:            if (f) { y[2]=un; y[1]=lstoi(2520); }
                    569:            else { y[2]=lneg(gun); y[1]=lstoi(5040); }
                    570:            return y;
                    571:          case 2: f=lgef(p2[1])-3; avma=av; y=cgetg(4,t_VEC); y[3]=un;
                    572:            if (f==7 || f==28) { y[2]=un; y[1]=lstoi(168); }
                    573:            else { y[2]=lneg(gun); y[1]=lstoi(42); }
                    574:            return y;
                    575:          case 3: avma=av; y=cgetg(4,t_VEC);
                    576:            y[3]=y[2]=un; y[1]=lstoi(21); return y;
                    577:          case 4: avma=av; y=cgetg(4,t_VEC);
                    578:            y[3]=un; y[2]=lneg(gun); y[1]=lstoi(14); return y;
                    579:          case 5: avma=av; y=cgetg(4,t_VEC);
                    580:            y[3]=y[2]=un; y[1]=lstoi(7); return y;
                    581:           default: err(talker,"galois (bug2)");
                    582:        }
                    583:     }
                    584:     tchi: avma=av1; x=tschirnhaus(x1);
                    585:   }
                    586: }
                    587:
                    588: GEN
                    589: galoisapply(GEN nf, GEN aut, GEN x)
                    590: {
                    591:   long av=avma,tetpil,lx,j,N;
                    592:   GEN p,p1,y,pol;
                    593:
                    594:   nf=checknf(nf); pol=(GEN)nf[1];
                    595:   if (typ(aut)==t_POL) aut = gmodulcp(aut,pol);
                    596:   else
                    597:   {
                    598:     if (typ(aut)!=t_POLMOD || !gegal((GEN)aut[1],pol))
                    599:       err(talker,"incorrect galois automorphism in galoisapply");
                    600:   }
                    601:   switch(typ(x))
                    602:   {
                    603:     case t_INT: case t_INTMOD: case t_FRAC: case t_FRACN: case t_PADIC:
                    604:       avma=av; return gcopy(x);
                    605:
                    606:     case t_POLMOD: x = (GEN) x[2]; /* fall through */
                    607:     case t_POL:
                    608:       p1 = gsubst(x,varn(pol),aut);
                    609:       if (typ(p1)!=t_POLMOD || !gegal((GEN)p1[1],pol)) p1 = gmodulcp(p1,pol);
                    610:       return gerepileupto(av,p1);
                    611:
                    612:     case t_VEC:
                    613:       if (lg(x)==3)
                    614:       {
                    615:        y=cgetg(3,t_VEC);
                    616:        y[1]=(long)galoisapply(nf,aut,(GEN)x[1]);
                    617:         y[2]=lcopy((GEN)x[2]); return gerepileupto(av, y);
                    618:       }
                    619:       if (lg(x)!=6) err(typeer,"galoisapply");
                    620:       y=cgetg(6,t_VEC); y[1]=x[1]; y[3]=x[3]; y[4]=x[4];
                    621:       p = (GEN)x[1];
                    622:       p1=centermod(galoisapply(nf,aut,(GEN)x[2]), p);
                    623:       if (is_pm1(x[3]))
                    624:        if (ggval(subres(gmul((GEN)nf[7],p1),pol), p) > itos((GEN)x[4]))
                    625:          p1[1] =  (signe(p1[1]) > 0)? lsub((GEN)p1[1], p)
                    626:                                     : ladd((GEN)p1[1], p);
                    627:       y[2]=(long)p1;
                    628:       y[5]=(long)centermod(galoisapply(nf,aut,(GEN)x[5]), p);
                    629:       tetpil=avma; return gerepile(av,tetpil,gcopy(y));
                    630:
                    631:     case t_COL:
                    632:       N=lgef(pol)-3;
                    633:       if (lg(x)!=N+1) err(typeer,"galoisapply");
                    634:       p1=galoisapply(nf,aut,gmul((GEN)nf[7],x)); tetpil=avma;
                    635:       return gerepile(av,tetpil,algtobasis(nf,p1));
                    636:
                    637:     case t_MAT:
                    638:       lx=lg(x); if (lx==1) return cgetg(1,t_MAT);
                    639:       N=lgef(pol)-3;
                    640:       if (lg(x[1])!=N+1) err(typeer,"galoisapply");
                    641:       p1=cgetg(lx,t_MAT);
                    642:       for (j=1; j<lx; j++) p1[j]=(long)galoisapply(nf,aut,(GEN)x[j]);
                    643:       if (lx==N+1) p1 = idealhermite(nf,p1);
                    644:       return gerepileupto(av,p1);
                    645:   }
                    646:   err(typeer,"galoisapply");
                    647:   return NULL; /* not reached */
                    648: }
                    649:
                    650: GEN pol_to_monic(GEN pol, GEN *lead);
                    651: int cmp_pol(GEN x, GEN y);
                    652:
                    653: static GEN
                    654: get_nfpol(GEN x, GEN *nf)
                    655: {
                    656:   if (typ(x) == t_POL) { *nf = NULL; return x; }
                    657:   *nf = checknf(x); return (GEN)(*nf)[1];
                    658: }
                    659:
                    660: /* if fliso test for isomorphism, for inclusion otherwise. */
                    661: static GEN
                    662: nfiso0(GEN a, GEN b, long fliso)
                    663: {
                    664:   long av=avma,tetpil,n,m,i,vb,lx;
                    665:   GEN nfa,nfb,p1,y,la,lb;
                    666:
                    667:   a = get_nfpol(a, &nfa);
                    668:   b = get_nfpol(b, &nfb);
                    669:   if (fliso && nfa && !nfb) { p1=a; a=b; b=p1; p1=nfa; nfa=nfb; nfb=p1; }
                    670:   m=lgef(a)-3;
                    671:   n=lgef(b)-3; if (m<=0 || n<=0) err(constpoler,"nfiso or nfincl");
                    672:   if (fliso)
                    673:     { if (n!=m) return gzero; }
                    674:   else
                    675:     { if (n%m) return gzero; }
                    676:
                    677:   if (nfb) lb = NULL; else b = pol_to_monic(b,&lb);
                    678:   if (nfa) la = NULL; else a = pol_to_monic(a,&la);
                    679:   if (nfa && nfb)
                    680:   {
                    681:     if (fliso)
                    682:     {
                    683:       if (!gegal((GEN)nfa[2],(GEN)nfb[2])
                    684:        || !gegal((GEN)nfa[3],(GEN)nfb[3])) return gzero;
                    685:     }
                    686:     else
                    687:       if (!divise((GEN)nfb[3], gpowgs((GEN)nfa[3],n/m))) return gzero;
                    688:   }
                    689:   else
                    690:   {
                    691:     GEN da = nfa? (GEN)nfa[3]: discsr(a);
                    692:     GEN db = nfb? (GEN)nfb[3]: discsr(b);
                    693:     if (fliso)
                    694:     {
                    695:       p1=gdiv(da,db);
                    696:       if (typ(p1)==t_FRAC) p1=mulii((GEN)p1[1],(GEN)p1[2]);
                    697:       if (!carreparfait(p1)) { avma=av; return gzero; }
                    698:     }
                    699:     else
                    700:     {
                    701:       long q=n/m;
                    702:       GEN fa=factor(da), ex=(GEN)fa[2];
                    703:       fa=(GEN)fa[1]; lx=lg(fa);
                    704:       for (i=1; i<lx; i++)
                    705:         if (mod2((GEN)ex[i]) && !divise(db,gpowgs((GEN)fa[i],q)))
                    706:           { avma=av; return gzero; }
                    707:     }
                    708:   }
                    709:   a = dummycopy(a); setvarn(a,0);
                    710:   b = dummycopy(b); vb=varn(b);
                    711:   if (nfb)
                    712:   {
                    713:     if (vb == 0) nfb = gsubst(nfb, 0, polx[MAXVARN]);
                    714:     y = lift_intern(nfroots(nfb,a));
                    715:   }
                    716:   else
                    717:   {
                    718:     if (vb == 0) setvarn(b, fetch_var());
                    719:     y = (GEN)polfnf(a,b)[1]; lx = lg(y);
                    720:     for (i=1; i<lx; i++)
                    721:     {
                    722:       if (lgef(y[i]) != 4) { setlg(y,i); break; }
                    723:       y[i] = (long)gneg_i(lift_intern(gmael(y,i,2)));
                    724:     }
                    725:     y = gen_sort(y, 0, cmp_pol);
                    726:     settyp(y, t_VEC);
                    727:     if (vb == 0) delete_var();
                    728:   }
                    729:   lx = lg(y); if (lx==1) { avma=av; return gzero; }
                    730:   for (i=1; i<lx; i++)
                    731:   {
                    732:     p1 = (GEN)y[i]; setvarn(p1, vb);
                    733:     if (lb) p1 = poleval(p1, gmul(polx[vb],lb));
                    734:     y[i] = la? ldiv(p1,la): (long)p1;
                    735:   }
                    736:   tetpil=avma; return gerepile(av,tetpil,gcopy(y));
                    737: }
                    738:
                    739: GEN
                    740: nfisisom(GEN a, GEN b)
                    741: {
                    742:   return nfiso0(a,b,1);
                    743: }
                    744:
                    745: GEN
                    746: nfisincl(GEN a, GEN b)
                    747: {
                    748:   return nfiso0(a,b,0);
                    749: }
                    750:
                    751: /*************************************************************************/
                    752: /**                                                                    **/
                    753: /**                           INITALG                                  **/
                    754: /**                                                                    **/
                    755: /*************************************************************************/
                    756: GEN LLL_nfbasis(GEN *x, GEN polr, GEN base, long prec);
                    757: GEN eleval(GEN f,GEN h,GEN a);
                    758: int canon_pol(GEN z);
                    759: GEN mat_to_vecpol(GEN x, long v);
                    760: GEN vecpol_to_mat(GEN v, long n);
                    761:
                    762: /* For internal use. compute trace(x mod pol), sym=polsym(pol,deg(pol)-1) */
                    763: GEN
                    764: quicktrace(GEN x, GEN sym)
                    765: {
                    766:   GEN p1 = gzero;
                    767:   long i;
                    768:
                    769:   if (signe(x))
                    770:   {
                    771:     sym--;
                    772:     for (i=lgef(x)-1; i>1; i--)
                    773:       p1 = gadd(p1, gmul((GEN)x[i],(GEN)sym[i]));
                    774:   }
                    775:   return p1;
                    776: }
                    777:
                    778: /* Seek a new, simpler, polynomial pol defining the same number field as
                    779:  * x (assumed to be monic at this point).
                    780:  * *ptx   receives pol
                    781:  * *ptdx  receives disc(pol)
                    782:  * *ptrev expresses the new root in terms of the old one.
                    783:  * base updated in place.
                    784:  * prec = 0 <==> field is totally real
                    785:  */
                    786: static void
                    787: nfinit_reduce(long flag, GEN *px, GEN *pdx, GEN *prev, GEN *pbase, long prec)
                    788: {
                    789:   GEN chbas,a,phimax,dxn,s,sn,p1,p2,p3,polmax,rev,polr;
                    790:   GEN x = *px, dx = *pdx, base = *pbase;
                    791:   long i,j,nmax,numb,flc,v=varn(x), n=lg(base)-1;
                    792:
                    793:   if (n == 1)
                    794:   {
                    795:     *px = gsub(polx[v],gun); *pdx = gun;
                    796:     *prev = polymodrecip(gmodulcp(gun, x)); return;
                    797:   }
                    798:   polr = prec? roots(x, prec): NULL;
                    799:   if (polr)
                    800:     for (s=gzero,i=1; i<=n; i++) s = gadd(s,gnorm((GEN)polr[i]));
                    801:   else
                    802:     s = subii(sqri((GEN)x[n+1]), shifti((GEN)x[n],1));
                    803:
                    804:   chbas = LLL_nfbasis(&x,polr,base,prec);
                    805:   if (DEBUGLEVEL) msgtimer("LLL basis");
                    806:
                    807:   phimax=polx[v]; polmax=dummycopy(x);
                    808:   nmax=(flag & nf_PARTIAL)?min(n,3):n;
                    809:
                    810:   for (numb=0,i=2; i<=nmax || (!numb && i<=n); i++)
                    811:   { /* cf pols_for_polred */
                    812:     if (DEBUGLEVEL>2) { fprintferr("i = %ld\n",i); flusherr(); }
                    813:     p1 = a = gmul(base,(GEN)chbas[i]); p3=content(p1);
                    814:     if (gcmp1(p3)) p3 = NULL; else p1 = gdiv(p1,p3);
                    815:     p1 = caract2(x,p1,v);
                    816:     if (p3)
                    817:       for (p2=gun, j=lgef(p1)-2; j>=2; j--)
                    818:       {
                    819:         p2 = gmul(p2,p3); p1[j] = lmul((GEN)p1[j], p2);
                    820:       }
                    821:     p2 = modulargcd(derivpol(p1),p1);
                    822:     if (lgef(p2) > 3) continue;
                    823:
                    824:     if (DEBUGLEVEL>3) outerr(p1);
                    825:     dxn=discsr(p1); flc=absi_cmp(dxn,dx); numb++;
                    826:     if (flc>0) continue;
                    827:
                    828:     if (polr)
                    829:       for (sn=gzero,j=1; j<=n; j++)
                    830:         sn = gadd(sn,gnorm(poleval(a,(GEN)polr[j])));
                    831:     else
                    832:       sn = subii(sqri((GEN)p1[n+1]), shifti((GEN)p1[n],1));
                    833:     if (flc>=0)
                    834:     {
                    835:       flc=gcmp(sn,s);
                    836:       if (flc>0 || (!flc && gpolcomp(p1,polmax) >= 0)) continue;
                    837:     }
                    838:     dx=dxn; s=sn; polmax=p1; phimax=a;
                    839:   }
                    840:   if (!numb)
                    841:   {
                    842:     if (gisirreducible(x)!=gun) err(redpoler,"nfinit_reduce");
                    843:     err(talker,"you have found a counter-example to a conjecture, "
                    844:                "please send us\nthe polynomial as soon as possible");
                    845:   }
                    846:   if (phimax == polx[v]) /* no improvement */
                    847:     rev = gmodulcp(phimax,x);
                    848:   else
                    849:   {
                    850:     if (canon_pol(polmax) < 0) phimax = gneg_i(phimax);
                    851:     if (DEBUGLEVEL>1) fprintferr("polmax = %Z\n",polmax);
                    852:     p2 = gmodulcp(phimax,x); rev = polymodrecip(p2);
                    853:     a = base; base = cgetg(n+1,t_VEC);
                    854:     p1 = (GEN)rev[2];
                    855:     for (i=1; i<=n; i++)
                    856:       base[i] = (long)eleval(polmax, (GEN)a[i], p1);
                    857:     p1 = vecpol_to_mat(base,n); p2=denom(p1); p1=gmul(p2,p1);
                    858:     p1 = gdiv(hnfmod(p1,detint(p1)), p2);
                    859:     base = mat_to_vecpol(p1,v);
                    860:   }
                    861:   *px=polmax; *pdx=dx; *prev=rev; *pbase = base;
                    862: }
                    863:
                    864: /* pol belonging to Z[x], return a monic polynomial generating the same field
                    865:  * as pol (x-> ax+b)) set lead = NULL if pol was monic (after dividing
                    866:  * by the content), and to to leading coeff otherwise.
                    867:  * No garbage collecting done.
                    868:  */
                    869: GEN
                    870: pol_to_monic(GEN pol, GEN *lead)
                    871: {
                    872:   long n = lgef(pol)-1;
                    873:   GEN p1;
                    874:
                    875:   if (n==1 || gcmp1((GEN)pol[n])) { *lead = NULL; return pol; }
                    876:
                    877:   p1=content(pol); if (!gcmp1(p1)) pol = gdiv(pol,p1);
                    878:   return primitive_pol_to_monic(pol,lead);
                    879: }
                    880:
                    881: GEN
                    882: make_TI(GEN nf, GEN TI, GEN con)
                    883: {
                    884:   GEN z, p1 = hnfmod(TI,detint(TI)), d = dethnf(p1);
                    885:   long n = lg(TI)-1;
                    886:
                    887:   d = mulii(d, gpowgs(con, n));
                    888:   p1 = ideal_two_elt(nf, p1); p1 = gmul(p1,con);
                    889:   z = cgetg(4,t_VEC);
                    890:   z[1]=p1[1]; z[2]=p1[2]; z[3]=(long)d; return z;
                    891: }
                    892:
                    893: /* basis = integer basis. roo = real part of the roots */
                    894: GEN
                    895: make_M(long n,long ru,GEN basis,GEN roo)
                    896: {
                    897:   GEN p1,res = cgetg(n+1,t_MAT);
                    898:   long i,j;
                    899:
                    900:   for (j=1; j<=n; j++)
                    901:   {
                    902:     p1=cgetg(ru+1,t_COL); res[j]=(long)p1;
                    903:     for (i=1; i<=ru; i++)
                    904:       p1[i]=(long)poleval((GEN)basis[j],(GEN)roo[i]);
                    905:   }
                    906:   if (DEBUGLEVEL>4) msgtimer("matrix M");
                    907:   return res;
                    908: }
                    909:
                    910: GEN
                    911: make_MC(long n,long r1,long ru,GEN M)
                    912: {
                    913:   GEN p1,p2,res=cgetg(ru+1,t_MAT);
                    914:   long i,j,av,tetpil;
                    915:
                    916:   for (j=1; j<=ru; j++)
                    917:   {
                    918:     p1=cgetg(n+1,t_COL); res[j]=(long)p1;
                    919:     for (i=1; i<=n; i++)
                    920:     {
                    921:       av=avma; p2=gconj(gcoeff(M,j,i)); tetpil=avma;
                    922:       p1[i] = (j<=r1)? (long)p2: lpile(av,tetpil,gmul2n(p2,1));
                    923:     }
                    924:   }
                    925:   if (DEBUGLEVEL>4) msgtimer("matrix MC");
                    926:   return res;
                    927: }
                    928:
                    929: GEN
                    930: get_roots(GEN x,long r1,long ru,long prec)
                    931: {
                    932:   GEN roo = (typ(x)==t_VEC)? dummycopy(x): roots(x,prec);
                    933:   long i;
                    934:
                    935:   for (i=1; i<=r1; i++) roo[i]=lreal((GEN)roo[i]);
                    936:   for (   ; i<=ru; i++) roo[i]=roo[(i<<1)-r1];
                    937:   roo[0]=evaltyp(t_VEC)|evallg(ru+1); return roo;
                    938: }
                    939:
                    940: GEN
                    941: get_mul_table(GEN x,GEN bas,GEN *ptT)
                    942: {
                    943:   long i,j,k, n = lgef(x)-3;
                    944:   GEN T,sym,mul=cgetg(n*n+1,t_MAT);
                    945:
                    946:   for (j=1; j<=n*n; j++) mul[j]=lgetg(n+1,t_COL);
                    947:   if (ptT)
                    948:   {
                    949:     sym = polsym(x,n-1); T=cgetg(n+1,t_MAT); *ptT = T;
                    950:     for (j=1; j<=n; j++) T[j]=lgetg(n+1,t_COL);
                    951:   }
                    952:   for (i=1; i<=n; i++)
                    953:     for (j=i; j<=n; j++)
                    954:     {
                    955:       GEN t = gres(gmul((GEN)bas[j],(GEN)bas[i]), x);
                    956:       GEN a = (GEN)mul[j+(i-1)*n];
                    957:       GEN b = (GEN)mul[i+(j-1)*n];
                    958:       long l = lgef(t)-1;
                    959:       for (k=1; k<l ; k++) a[k] = b[k] = t[k+1];
                    960:       for (   ; k<=n; k++) a[k] = b[k] = zero;
                    961:       if (ptT) coeff(T,i,j) = coeff(T,j,i) = (long)quicktrace(t,sym);
                    962:     }
                    963:   return mul;
                    964: }
                    965:
                    966: /* Initialize the number field defined by the polynomial x (in variable v)
                    967:  * flag & nf_REGULAR
                    968:  *    regular behaviour (no different).
                    969:  * flag & nf_DIFFERENT
                    970:  *    compute the different.
                    971:  * flag & nf_SMALL
                    972:  *    compute only nf[1] (pol), nf[2] (signature), nf[5][3] (T2) and
                    973:  *    nf[7] (integer basis), the other components are filled with gzero.
                    974:  * flag & nf_REDUCE
                    975:  *    try a polred first.
                    976:  * flag & nf_PARTIAL
                    977:  *    do a partial polred, not a polredabs
                    978:  * flag & nf_ORIG
                    979:  *    do a polred and return [nfinit(x),Mod(a,red)], where
                    980:  *    Mod(a,red)=Mod(v,x) (i.e return the base change).
                    981:  */
                    982:
                    983: /* here x can be a polynomial, an nf or a bnf */
                    984: GEN
                    985: initalgall0(GEN x, long flag, long prec)
                    986: {
                    987:   GEN lead = NULL,nf,ro,bas,mul,mat,M,MC,T,p1,rev,dK,dx,index,fa,res;
                    988:   long av=avma,n,i,r1,r2,ru,PRECREG;
                    989:
                    990:   if (DEBUGLEVEL) timer2();
                    991:   if (typ(x)==t_POL)
                    992:   {
                    993:     n=lgef(x)-3; if (n<=0) err(constpoler,"initalgall0");
                    994:     check_pol_int(x);
                    995:     if (gisirreducible(x) == gzero) err(redpoler,"nfinit");
                    996:     if (!gcmp1((GEN)x[n+2]))
                    997:     {
                    998:       x = pol_to_monic(x,&lead);
                    999:       if (!(flag & nf_SMALL))
                   1000:       {
                   1001:         if (!(flag & nf_REDUCE))
                   1002:           err(warner,"non-monic polynomial. Result of the form [nf,c].");
                   1003:         flag = flag | nf_REDUCE | nf_ORIG;
                   1004:       }
                   1005:     }
                   1006:     bas=allbase4(x,0,&dK,&fa);
                   1007:     if (DEBUGLEVEL) msgtimer("round4");
                   1008:     dx = discsr(x); r1 = sturm(x);
                   1009:   }
                   1010:   else
                   1011:   {
                   1012:     i = lg(x);
                   1013:     if (typ(x) == t_VEC && i<=4 && i>=3 && typ(x[1])==t_POL)
                   1014:     { /* polynomial + integer basis */
                   1015:       bas=(GEN)x[2]; x=(GEN)x[1]; n=lgef(x)-3;
                   1016:       if (gisirreducible(x) == gzero) err(redpoler,"nfinit");
                   1017:       dx=discsr(x);
                   1018:       if (typ(bas) == t_MAT) { mat = bas; bas = mat_to_vecpol(mat,varn(x)); }
                   1019:       else mat = vecpol_to_mat(bas,n);
                   1020:       dK = gmul(dx, gsqr(det2(mat)));
                   1021:       r1 = sturm(x);
                   1022:     }
                   1023:     else
                   1024:     {
                   1025:       nf=checknf(x);
                   1026:       bas=(GEN)nf[7]; x=(GEN)nf[1]; n=lgef(x)-3;
                   1027:       dK=(GEN)nf[3]; dx=mulii(dK, sqri((GEN)nf[4]));
                   1028:       r1 = itos(gmael(nf,2,1));
                   1029:     }
                   1030:     bas[1]=lpolun[varn(x)]; /* it may be gun => SEGV later */
                   1031:     if (flag & nf_DIFFERENT) fa = factor(absi(dK));
                   1032:   }
                   1033:   r2=(n-r1)>>1; ru=r1+r2;
                   1034:   PRECREG = prec + (expi(dK)>>(TWOPOTBITS_IN_LONG+1))
                   1035:                  + (long)((sqrt((double)n)+3) / sizeof(long) * 4);
                   1036:   if (flag & nf_REDUCE)
                   1037:   {
                   1038:     nfinit_reduce(flag, &x, &dx, &rev, &bas, r1==n? 0: prec);
                   1039:     if (DEBUGLEVEL) msgtimer("polred");
                   1040:   }
                   1041:   if (!carrecomplet(divii(dx,dK),&index))
                   1042:     err(bugparier,"nfinit (incorrect discriminant)");
                   1043:
                   1044:   if (!(flag & nf_SMALL))
                   1045:   {
                   1046:     mul = get_mul_table(x,bas, &T);
                   1047:     if (DEBUGLEVEL) msgtimer("mult. table");
                   1048:     p1=vecpol_to_mat(bas,n);
                   1049:   }
                   1050:
                   1051:   ro=get_roots(x,r1,ru,PRECREG);
                   1052:   if (DEBUGLEVEL) msgtimer("roots");
                   1053:
                   1054:   if (flag & nf_ORIG)
                   1055:   {
                   1056:     if (!(flag & nf_REDUCE)) err(talker,"bad flag in initalgall0");
                   1057:     res = cgetg(3,t_VEC);
                   1058:   }
                   1059:   nf=cgetg(10,t_VEC);
                   1060:   nf[1]=lcopy(x);
                   1061:   nf[2]=lgetg(3,t_VEC);
                   1062:   mael(nf,2,1)=lstoi(r1);
                   1063:   mael(nf,2,2)=lstoi(r2);
                   1064:   nf[3]=lcopy(dK);
                   1065:   nf[4]=lcopy(index); mat = cgetg(8,t_VEC);
                   1066:   nf[5]=(long)mat;
                   1067:   nf[6]=lcopy(ro);
                   1068:   nf[7]=lcopy(bas);
                   1069:   if (flag & nf_SMALL) nf[8]=nf[9]=zero;
                   1070:   else
                   1071:   {
                   1072:     nf[8]=linvmat(p1);
                   1073:     nf[9]=lmul((GEN)nf[8],mul);
                   1074:   }
                   1075:
                   1076:   M = make_M(n,ru,bas,ro);
                   1077:   MC = make_MC(n,r1,ru,M);
                   1078:   mat[1]=(long)M;
                   1079:   mat[5]=zero; /* dummy for the different */
                   1080:   mat[3]=(long)mulmat_real(MC,M);
                   1081:   if (flag & nf_SMALL)
                   1082:     mat[2]=mat[4]=mat[6]=mat[7]=zero;
                   1083:   else
                   1084:   {
                   1085:     long av2, av3;
                   1086:     GEN a2;
                   1087:
                   1088:     mat[2]=(long)MC;
                   1089:     mat[4]=lcopy(T);
                   1090:
                   1091:     av2=avma; p1=ginv(T); av3=avma;
                   1092:     mat[6] = lpile(av2,av3, gmul(p1,dK));
                   1093:
                   1094:     av2=avma; p1=content((GEN)mat[6]); a2=gdiv((GEN)mat[6],p1);
                   1095:     a2 = make_TI(nf,a2,p1); av3=avma;
                   1096:     /* Ideal basis for discriminant * (inverse of different) */
                   1097:     mat[7] = lpile(av2,av3,gcopy(a2));
                   1098:   }
                   1099:   if (DEBUGLEVEL>=2) msgtimer("matrices");
                   1100:
                   1101:   if (flag & nf_DIFFERENT)
                   1102:   {
                   1103:     mat[5]=(long)differente(nf,fa);
                   1104:     if (DEBUGLEVEL) msgtimer("different");
                   1105:   }
                   1106:   if (!(flag & nf_ORIG)) res = nf;
                   1107:   else
                   1108:   {
                   1109:     res[1]=(long)nf;
                   1110:     res[2]=lead? ldiv(rev,lead): lcopy(rev);
                   1111:   }
                   1112:   return gerepileupto(av,res);
                   1113: }
                   1114:
                   1115: GEN
                   1116: initalgred(GEN x, long prec)
                   1117: {
                   1118:   return initalgall0(x,nf_REDUCE|nf_DIFFERENT,prec);
                   1119: }
                   1120:
                   1121: GEN
                   1122: initalgred2(GEN x, long prec)
                   1123: {
                   1124:   return initalgall0(x,nf_REDUCE|nf_DIFFERENT|nf_ORIG,prec);
                   1125: }
                   1126:
                   1127: GEN
                   1128: nfinit0(GEN x, long flag,long prec)
                   1129: {
                   1130:   switch(flag)
                   1131:   {
                   1132:     case 0: return initalgall0(x,nf_DIFFERENT,prec);
                   1133:     case 1: return initalgall0(x,nf_REGULAR,prec);
                   1134:     case 2: return initalgall0(x,nf_REDUCE|nf_DIFFERENT,prec);
                   1135:     case 3: return initalgall0(x,nf_REDUCE|nf_ORIG|nf_DIFFERENT,prec);
                   1136:     case 4: return initalgall0(x,nf_REDUCE|nf_PARTIAL|nf_DIFFERENT,prec);
                   1137:     case 5: return initalgall0(x,nf_REDUCE|nf_ORIG|nf_PARTIAL|nf_DIFFERENT,prec);
                   1138:     case 6: return initalgall0(x,nf_SMALL,prec);
                   1139:     default: err(flagerr,"nfinit");
                   1140:   }
                   1141:   return NULL; /* not reached */
                   1142: }
                   1143:
                   1144: GEN
                   1145: initalg(GEN x, long prec)
                   1146: {
                   1147:   return initalgall0(x,nf_DIFFERENT,prec);
                   1148: }
                   1149:
                   1150: GEN
                   1151: nfnewprec(GEN nf, long prec)
                   1152: {
                   1153:   long av=avma,i,r1,r2,ru,n,nf_small,tetpil;
                   1154:   GEN y,pol,ro,bas,MC,mat,M;
                   1155:
                   1156:   if (typ(nf) != t_VEC) err(talker,"incorrect nf in nfnewprec");
                   1157:   if (lg(nf) == 11) return bnfnewprec(nf,prec);
                   1158:   if (prec <= 0)
                   1159:   {
                   1160:     ro = (GEN)nf[6];
                   1161:     prec = (typ(ro)==t_VEC)?precision((GEN)ro[1]): DEFAULTPREC;
                   1162:     return (GEN)prec;
                   1163:   }
                   1164:
                   1165:   y=cgetg(10,t_VEC);
                   1166:   for (i=1; i<=4; i++) y[i]=nf[i];
                   1167:   for (i=6; i<=9; i++) y[i]=nf[i];
                   1168:   nf_small = gcmp0((GEN)nf[8]);
                   1169:   pol=(GEN)nf[1]; n=degree(pol);
                   1170:   r1=itos(gmael(nf,2,1)); r2=itos(gmael(nf,2,2)); ru=r1+r2;
                   1171:   mat=cgetg(8,t_VEC); y[5]=(long)mat;
                   1172:   bas=(GEN)nf[7]; ro=get_roots(pol,r1,ru,prec);
                   1173:   M = make_M(n,ru,bas,ro);
                   1174:   MC = make_MC(n,r1,ru,M);
                   1175:   if (nf_small) mat[2]=mat[4]=mat[5]=mat[6]=mat[7]=zero;
                   1176:   else
                   1177:   {
                   1178:     GEN matrices=(GEN)nf[5];
                   1179:     y[6]=(long)ro;
                   1180:     mat[2]=(long)MC;
                   1181:     for (i=4; i<=7; i++) mat[i]=matrices[i];
                   1182:   }
                   1183:   mat[1]=(long)M;
                   1184:   mat[3]=lreal(gmul(MC,M));
                   1185:   tetpil=avma; return gerepile(av,tetpil,gcopy(y));
                   1186: }
                   1187:
                   1188: static long
                   1189: nf_pm1(GEN y)
                   1190: {
                   1191:   long i,l;
                   1192:
                   1193:   if (!is_pm1(y[1])) return 0;
                   1194:   l = lg(y);
                   1195:   for (i=2; i<l; i++)
                   1196:     if (signe(y[i])) return 0;
                   1197:   return signe(y[1]);
                   1198:
                   1199: }
                   1200:
                   1201: static GEN
                   1202: is_primitive_root(GEN nf, GEN fa, GEN x, long w)
                   1203: {
                   1204:   GEN y, exp = stoi(2), pp = (GEN)fa[1];
                   1205:   long i,p, l = lg(pp);
                   1206:
                   1207:   for (i=1; i<l; i++)
                   1208:   {
                   1209:     p = itos((GEN)pp[i]);
                   1210:     exp[2] = w / p; y = element_pow(nf,x,exp);
                   1211:     if (nf_pm1(y) > 0) /* y = 1 */
                   1212:     {
                   1213:       if (p!=2 || !gcmp1(gcoeff(fa,i,2))) return NULL;
                   1214:       x = gneg_i(x);
                   1215:     }
                   1216:   }
                   1217:   return x;
                   1218: }
                   1219:
                   1220: GEN
                   1221: rootsof1(GEN nf)
                   1222: {
                   1223:   long av,tetpil,N,k,i,ws,prec;
                   1224:   GEN algun,p1,y,R1,d,list,w;
                   1225:
                   1226:   y=cgetg(3,t_VEC); av=avma; nf=checknf(nf);
                   1227:   R1=gmael(nf,2,1); algun=gmael(nf,8,1);
                   1228:   if (signe(R1))
                   1229:   {
                   1230:     y[1]=deux;
                   1231:     y[2]=lneg(algun); return y;
                   1232:   }
                   1233:   N=lgef(nf[1])-3; prec=gprecision((GEN)nf[6]);
                   1234: #ifdef LONG_IS_32BIT
                   1235:   if (prec < 10) prec = 10;
                   1236: #else
                   1237:   if (prec < 6) prec = 6;
                   1238: #endif
                   1239:   for (i=1; ; i++)
                   1240:   {
                   1241:     p1 = fincke_pohst(gmael(nf,5,3),stoi(N),stoi(1000),1,prec,NULL);
                   1242:     if (p1) break;
                   1243:     if (i == MAXITERPOL) err(accurer,"rootsof1");
                   1244:     prec=(prec<<1)-2;
                   1245:     if (DEBUGLEVEL) err(warnprec,"rootsof1",prec);
                   1246:     nf=nfnewprec(nf,prec);
                   1247:   }
                   1248:   if (itos(ground((GEN)p1[2])) != N) err(bugparier,"rootsof1 (bug1)");
                   1249:   w=(GEN)p1[1]; ws = itos(w);
                   1250:   if (ws == 2)
                   1251:   {
                   1252:     y[1]=deux; avma=av;
                   1253:     y[2]=lneg(algun); return y;
                   1254:   }
                   1255:
                   1256:   d = decomp(w); list = (GEN)p1[3]; k = lg(list);
                   1257:   for (i=1; i<k; i++)
                   1258:   {
                   1259:     p1 = (GEN)list[i];
                   1260:     p1 = is_primitive_root(nf,d,p1,ws);
                   1261:     if (p1)
                   1262:     {
                   1263:       tetpil=avma;
                   1264:       y[2]=lpile(av,tetpil,gcopy(p1));
                   1265:       y[1]=lstoi(ws); return y;
                   1266:     }
                   1267:   }
                   1268:   err(bugparier,"rootsof1");
                   1269:   return NULL; /* not reached */
                   1270: }
                   1271:
                   1272: /*******************************************************************/
                   1273: /*                                                                 */
                   1274: /*                     DEDEKIND ZETA FUNCTION                      */
                   1275: /*                                                                 */
                   1276: /*******************************************************************/
                   1277:
                   1278: ulong smulss(ulong x, ulong y, ulong *rem);
                   1279:
                   1280: static GEN
                   1281: dirzetak0(GEN nf, long N0)
                   1282: {
                   1283:   GEN vect,p1,pol,disc,c,c2;
                   1284:   long av=avma,i,j,k,lx;
                   1285:   ulong limk,q,p,rem;
                   1286:   byteptr d=diffptr;
                   1287:   long court[] = {evaltyp(t_INT)|m_evallg(3), evalsigne(1)|evallgefint(3),0};
                   1288:
                   1289:   pol=(GEN)nf[1]; disc=(GEN)nf[4];
                   1290:   c  = (GEN) gpmalloc((N0+1)*sizeof(long));
                   1291:   c2 = (GEN) gpmalloc((N0+1)*sizeof(long));
                   1292:   c2[0]=c[0]=evaltyp(t_VEC) | evallg(N0+1);
                   1293:   c2[1]=c[1]=1; for (i=2; i<=N0; i++) c[i]=0;
                   1294:   court[2] = 0;
                   1295:
                   1296:   while (court[2]<=N0)
                   1297:   {
                   1298:     court[2] += *d++; if (! *d) err(primer1);
                   1299:     if (smodis(disc,court[2])) /* court does not divide index */
                   1300:       { vect = (GEN) simplefactmod(pol,court)[1]; lx=lg(vect); }
                   1301:     else
                   1302:     {
                   1303:       p1=primedec(nf,court); lx=lg(p1); vect=cgetg(lx,t_COL);
                   1304:       for (i=1; i<lx; i++) vect[i]=mael(p1,i,4);
                   1305:     }
                   1306:     for (j=1; j<lx; j++)
                   1307:     {
                   1308:       p1=powgi(court, (GEN)vect[j]); /* p1 = court^f */
                   1309:       if (cmpis(p1,N0) <= 0)
                   1310:       {
                   1311:         q=p=p1[2]; limk=N0/q;
                   1312:         for (k=2; k<=N0; k++) c2[k]=c[k];
                   1313:         while (q<=N0)
                   1314:         {
                   1315:           for (k=1; k<=limk; k++) c2[k*q] += c[k];
                   1316:           q = smulss(q,p,&rem);
                   1317:           if (rem) break;
                   1318:           limk /= p;
                   1319:         }
                   1320:         p1=c; c=c2; c2=p1;
                   1321:       }
                   1322:     }
                   1323:     avma=av;
                   1324:     if (DEBUGLEVEL>6) fprintferr(" %ld",court[2]);
                   1325:   }
                   1326:   if (DEBUGLEVEL>6) { fprintferr("\n"); flusherr(); }
                   1327:   free(c2); return c;
                   1328: }
                   1329:
                   1330: GEN
                   1331: dirzetak(GEN nf, GEN b)
                   1332: {
                   1333:   GEN z,c;
                   1334:   long i;
                   1335:
                   1336:   if (typ(b)!=t_INT) err(talker,"not an integer type in dirzetak");
                   1337:   if (signe(b)<=0) return cgetg(1,t_VEC);
                   1338:   nf = checknf(nf);
                   1339:   if (is_bigint(b)) err(talker,"too many terms in dirzetak");
                   1340:   c = dirzetak0(nf,itos(b));
                   1341:   i = lg(c); z=cgetg(i,t_VEC);
                   1342:   for (i-- ; i; i--) z[i]=lstoi(c[i]);
                   1343:   free(c); return z;
                   1344: }
                   1345:
                   1346: GEN
                   1347: initzeta(GEN pol, long prec)
                   1348: {
                   1349:   GEN nfz,nf,alpha,beta,mu,gr1,gr2,gru,p1,p2,cst,A0,c0,c1,c2,eps,coef;
                   1350:   GEN limx,bnf,resi,zet,C,coeflog,racpi,aij,tabj,colzero, *tabcstn, *tabcstni;
                   1351:   GEN c_even,ck_even,c_odd,ck_odd,serie_even,serie_odd,serie_exp,Pi;
                   1352:   long N0,imin,imax,r1,r2,ru,R,N,i,j,k,n, av,av2,tetpil;
                   1353:   long court[] = {evaltyp(t_INT)|m_evallg(3), evalsigne(1)|evallgefint(3),0};
                   1354:   stackzone *zone, *zone0, *zone1;
                   1355:
                   1356:   /*************** Calcul du residu et des constantes ***************/
                   1357:   eps=gmul2n(gun,-bit_accuracy(prec)-6); p1=dbltor(0.5);
                   1358:   nfz=cgetg(10,t_VEC);
                   1359:   bnf=buchinit(pol,p1,p1,prec+1); prec=(prec<<1)-1;
                   1360:   Pi = mppi(prec); racpi=gsqrt(Pi,prec);
                   1361:
                   1362:   /* Nb de classes et regulateur */
                   1363:   nf=(GEN)bnf[7]; N=lgef(nf[1])-3;
                   1364:   gr1=gmael(nf,2,1); gr2=gmael(nf,2,2);
                   1365:   r1=itos(gr1); r2=itos(gr2); ru=r1+r2; R=ru+2;
                   1366:   av=avma; p1=(GEN)bnf[8]; p2 = gmul(gmul2n(gmael(p1,1,1),r1), (GEN)p1[2]);
                   1367:   tetpil = avma; resi=gerepile(av,tetpil,gdiv(p2, gmael(p1,4,1)));
                   1368:
                   1369:   /* Calcul de N0 */
                   1370:   cst = cgetr(prec); av = avma;
                   1371:   mu = gadd(gmul2n(gr1,-1),gr2);
                   1372:   alpha = gmul2n(stoi(ru+1),-1);
                   1373:   beta = gpui(gdeux,gmul2n(gr1,-1),DEFAULTPREC);
                   1374:   A0 = gmul2n(gpowgs(mu,R),r1);
                   1375:   A0 = gmul(A0,gpowgs(gmul2n(Pi,1),1-ru));
                   1376:   A0 = gsqrt(A0,DEFAULTPREC);
                   1377:
                   1378:   c1 = gmul(mu,gpui(beta,ginv(mu),DEFAULTPREC));
                   1379:   c0 = gdiv(gmul(A0,gpowgs(gmul2n(Pi,1),ru-1)),mu);
                   1380:   c0 = gmul(c0,gpui(c1,gneg_i(alpha),DEFAULTPREC));
                   1381:   c2 = gdiv(alpha,mu);
                   1382:
                   1383:   p1 = glog(gdiv(c0,eps),DEFAULTPREC);
                   1384:   limx = gdiv(gsub(glog(p1,DEFAULTPREC),glog(c1,DEFAULTPREC)),
                   1385:               gadd(c2,gdiv(p1,mu)));
                   1386:   limx = gmul(gpui(gdiv(c1,p1),mu,DEFAULTPREC),
                   1387:               gadd(gun,gmul(alpha,limx)));
                   1388:   p1 = gsqrt(absi((GEN)nf[3]),prec);
                   1389:   p2 = gmul2n(gpowgs(racpi,N),r2);
                   1390:   gaffect(gdiv(p1,p2), cst);
                   1391:
                   1392:   av = avma; p1 = gfloor(gdiv(cst,limx)); N0 = p1[2];
                   1393:   if (is_bigint(p1) || N0 > 10000000)
                   1394:     err(talker,"discriminant too large for initzeta, sorry");
                   1395:   if (DEBUGLEVEL>=2)
                   1396:     { fprintferr("\ninitzeta:\nN0 = %ld\n",N0); flusherr(); timer2(); }
                   1397:
                   1398:   /* Calcul de imax */
                   1399:
                   1400:   imin=1; imax=1400;
                   1401:   p1 = gmul(gpowgs(gmul2n(racpi,1),r2),gpowgs(stoi(5),r1));
                   1402:   p1 = gdiv(p1,gmul(gmul(gsqrt(limx,DEFAULTPREC),gmul2n(eps,4)),
                   1403:                          gpowgs(racpi,3)));
                   1404:   while (imax-imin >= 4)
                   1405:   {
                   1406:     long itest = (imax+imin)>>1;
                   1407:     p2 = gmul(gpowgs(mpfactr(itest,DEFAULTPREC),r2),gpowgs(limx,itest));
                   1408:     p2 = gmul(p2,gpowgs(mpfactr(itest/2,DEFAULTPREC),r1));
                   1409:     if (gcmp(p2,p1) >= 0) imax=itest; else imin=itest;
                   1410:   }
                   1411:   imax -= (imax & 1); avma = av;
                   1412:   if (DEBUGLEVEL>=2) { fprintferr("imax = %ld\n",imax); flusherr(); }
                   1413:   /* Tableau des i/cst (i=1 a N0) */
                   1414:
                   1415:   i = prec*N0;
                   1416:   zone  = switch_stack(NULL,i + 2*(N0+1) + 6*prec);
                   1417:   zone1 = switch_stack(NULL,2*i);
                   1418:   zone0 = switch_stack(NULL,2*i);
                   1419:   switch_stack(zone,1);
                   1420:   tabcstn  = (GEN*) cgetg(N0+1,t_VEC);
                   1421:   tabcstni = (GEN*) cgetg(N0+1,t_VEC);
                   1422:   p1 = ginv(cst);
                   1423:   for (i=1; i<=N0; i++) { tabcstni[i] = gun; tabcstn[i] = mulsr(i,p1); }
                   1424:   switch_stack(zone,0);
                   1425:
                   1426:   /********** Calcul des coefficients a(i,j) independants de s **********/
                   1427:
                   1428:   zet=cgetg(R,t_VEC); zet[1] = lmpeuler(prec);
                   1429:   for (i=2; i<R; i++) zet[i] = (long)gzeta(stoi(i),prec);
                   1430:
                   1431:   aij=cgetg(imax+1,t_VEC);
                   1432:   for (i=1; i<=imax; i++) aij[i] = lgetg(R,t_VEC);
                   1433:
                   1434:   c_even = realun(prec);
                   1435:   c_even = gmul2n(c_even,r1);
                   1436:   c_odd = gmul(c_even,gpowgs(racpi,r1));
                   1437:   if (ru&1) c_odd=gneg_i(c_odd);
                   1438:   ck_even=cgetg(R,t_VEC); ck_odd=cgetg(r2+2,t_VEC);
                   1439:   for (k=1; k<R; k++)
                   1440:   {
                   1441:     ck_even[k]=lmul((GEN)zet[k],gadd(gr2,gmul2n(gr1,-k)));
                   1442:     if (k&1) ck_even[k]=lneg((GEN)ck_even[k]);
                   1443:   }
                   1444:   gru=stoi(ru);
                   1445:   for (k=1; k<=r2+1; k++)
                   1446:   {
                   1447:     ck_odd[k]=lmul((GEN)zet[k], gsub(gru, gmul2n(gr1,-k)));
                   1448:     if (k&1) ck_odd[k]=lneg((GEN)ck_odd[k]);
                   1449:     ck_odd[k]=ladd(gru,(GEN)ck_odd[k]);
                   1450:   }
                   1451:   ck_odd[1]=lsub((GEN)ck_odd[1],gmul(gr1,glog(gdeux,prec)));
                   1452:   serie_even =cgetg(ru+3,t_SER); serie_odd=cgetg(r2+3,t_SER);
                   1453:   serie_even[1] = serie_odd[1] = evalsigne(1)+evalvalp(1);
                   1454:   i=0;
                   1455:
                   1456:   while (i<imax/2)
                   1457:   {
                   1458:     for (k=1; k<R; k++)
                   1459:       serie_even[k+1]=ldivgs((GEN)ck_even[k],k);
                   1460:     serie_exp=gmul(c_even,gexp(serie_even,0));
                   1461:     p1=(GEN)aij[2*i+1];
                   1462:     for (j=1; j<R; j++) p1[j]=serie_exp[ru+3-j];
                   1463:
                   1464:     for (k=1; k<=r2+1; k++)
                   1465:       serie_odd[k+1]=ldivgs((GEN)ck_odd[k],k);
                   1466:     serie_exp=gmul(c_odd,gexp(serie_odd,0));
                   1467:     p1=(GEN)aij[2*i+2];
                   1468:     for (j=1; j<=r2+1; j++) p1[j]=serie_exp[r2+3-j];
                   1469:     for (   ; j<R; j++) p1[j]=zero;
                   1470:     i++;
                   1471:
                   1472:     c_even = gdiv(c_even,gmul(gpowgs(stoi(i),ru),gpowgs(stoi(2*i-1),r2)));
                   1473:     c_odd  = gdiv(c_odd, gmul(gpowgs(stoi(i),r2),gpowgs(stoi(2*i+1),ru)));
                   1474:     c_even = gmul2n(c_even,-r2);
                   1475:     c_odd  = gmul2n(c_odd,r1-r2);
                   1476:     if (r1&1) { c_even=gneg_i(c_even); c_odd=gneg_i(c_odd); }
                   1477:     p1 = gr2; p2 = gru;
                   1478:     for (k=1; k<R; k++)
                   1479:     {
                   1480:       p1=gdivgs(p1,2*i-1); p2=gdivgs(p2,2*i);
                   1481:       ck_even[k] = ladd((GEN)ck_even[k], gadd(p1,p2));
                   1482:     }
                   1483:     p1 = gru; p2 = gr2;
                   1484:     for (k=1; k<=r2+1; k++)
                   1485:     {
                   1486:       p1=gdivgs(p1,2*i+1); p2=gdivgs(p2,2*i);
                   1487:       ck_odd[k] = ladd((GEN)ck_odd[k], gadd(p1,p2));
                   1488:     }
                   1489:   }
                   1490:   tetpil=avma; aij=gerepile(av,tetpil,gcopy(aij));
                   1491:   if (DEBUGLEVEL>=2) msgtimer("a(i,j)");
                   1492:   p1=cgetg(5,t_VEC);
                   1493:   p1[1]=lstoi(r1); p1[2]=lstoi(r2); p1[3]=lstoi(imax); p1[4]=(long)bnf;
                   1494:   nfz[1]=(long)p1;
                   1495:   nfz[2]=(long)resi;
                   1496:   nfz[5]=(long)cst;
                   1497:   nfz[6]=llog(cst,prec);
                   1498:   nfz[7]=(long)aij;
                   1499:
                   1500:   /************* Calcul du nombre d'ideaux de norme donnee *************/
                   1501:   coef = dirzetak0(nf,N0); tabj = cgetg(N0+1,t_MAT);
                   1502:   if (DEBUGLEVEL>=2) msgtimer("coef");
                   1503:   colzero=cgetg(ru+2,t_COL); for (j=1; j<=ru+1; j++) colzero[j]=zero;
                   1504:   for (i=1; i<=N0; i++)
                   1505:     if (coef[i])
                   1506:     {
                   1507:       GEN t = cgetg(ru+2,t_COL);
                   1508:       p1 = glog((GEN)tabcstn[i],prec); setsigne(p1, -signe(p1));
                   1509:       t[1] = lstoi(coef[i]); t[2] = lmul((GEN)t[1],p1);
                   1510:       for (j=2; j<=ru; j++)
                   1511:       {
                   1512:         long av2 = avma; p2 = gmul((GEN)t[j],p1);
                   1513:         t[j+1] = (long)gerepileuptoleaf(av2, divrs(p2,j));
                   1514:       }
                   1515:       /* tabj[n,j]=coef(n)*ln(c/n)^(j-1)/(j-1)! */
                   1516:       tabj[i] = (long)t;
                   1517:     }
                   1518:     else tabj[i]=(long)colzero;
                   1519:   if (DEBUGLEVEL>=2) msgtimer("a(n)");
                   1520:
                   1521:   coeflog=cgetg(N0+1,t_VEC); coeflog[1]=zero;
                   1522:   for (i=2; i<=N0; i++)
                   1523:     if (coef[i])
                   1524:     {
                   1525:       court[2]=i; p1=glog(court,prec);
                   1526:       setsigne(p1,-1); coeflog[i]=(long)p1;
                   1527:     }
                   1528:     else coeflog[i] = zero;
                   1529:   if (DEBUGLEVEL>=2) msgtimer("log(n)");
                   1530:
                   1531:   nfz[3]=(long)tabj;
                   1532:   p1 = cgetg(N0+1,t_VECSMALL);
                   1533:   for (i=1; i<=N0; i++) p1[i] = coef[i];
                   1534:   nfz[8]=(long)p1;
                   1535:   nfz[9]=(long)coeflog;
                   1536:
                   1537:   /******************** Calcul des coefficients Cik ********************/
                   1538:
                   1539:   C = cgetg(ru+1,t_MAT);
                   1540:   for (k=1; k<=ru; k++) C[k] = lgetg(imax+1,t_COL);
                   1541:   av2 = avma;
                   1542:   for (i=1; i<=imax; i++)
                   1543:   {
                   1544:     stackzone *z;
                   1545:     for (k=1; k<=ru; k++)
                   1546:     {
                   1547:       p1 = NULL;
                   1548:       for (n=1; n<=N0; n++)
                   1549:         if (coef[n])
                   1550:           for (j=1; j<=ru-k+1; j++)
                   1551:           {
                   1552:             p2 = gmul(tabcstni[n],
                   1553:                       gmul(gmael(aij,i,j+k), gmael(tabj,n,j)));
                   1554:             p1 = p1? gadd(p1,p2): p2;
                   1555:           }
                   1556:       coeff(C,i,k) = p1? (long)gerepileupto(av2,p1): zero;
                   1557:       av2 = avma;
                   1558:     }
                   1559:     /* use a parallel stack */
                   1560:     z = i&1? zone1: zone0;
                   1561:     switch_stack(z, 1);
                   1562:     for (n=1; n<=N0; n++)
                   1563:       if (coef[n]) tabcstni[n] = mpmul(tabcstni[n],tabcstn[n]);
                   1564:     /* come back */
                   1565:     switch_stack(z, 0);
                   1566:   }
                   1567:   nfz[4] = (long) C;
                   1568:   if (DEBUGLEVEL>=2) msgtimer("Cik");
                   1569:   gunclone(aij);
                   1570:   free((void*)zone); free((void*)zone1); free((void*)zone0);
                   1571:   free((void*)coef); return nfz;
                   1572: }
                   1573:
                   1574: GEN
                   1575: gzetakall(GEN nfz, GEN s, long flag, long prec2)
                   1576: {
                   1577:   GEN resi,C,cst,cstlog,coeflog,cs,coef;
                   1578:   GEN lambd,gammas,gammaunmoins,gammas2,gammaunmoins2,var1,var2;
                   1579:   GEN p1,unmoins,gexpro,gar,val,valm,valk,valkm;
                   1580:   long ts = typ(s), r1,r2,ru,imax,i,j,k,N0,sl,prec,bigprec, av = avma;
                   1581:
                   1582:   if (typ(nfz)!=t_VEC || lg(nfz)!=10 || typ(nfz[1]) != t_VEC)
                   1583:     err(talker,"not a zeta number field in zetakall");
                   1584:   if (! is_intreal_t(ts) && ts != t_COMPLEX && ! is_frac_t(ts))
                   1585:     err(typeer,"gzetakall");
                   1586:   resi=(GEN)nfz[2]; C=(GEN)nfz[4]; cst=(GEN)nfz[5];
                   1587:   cstlog=(GEN)nfz[6]; coef=(GEN)nfz[8]; coeflog=(GEN)nfz[9];
                   1588:   r1  =itos(gmael(nfz,1,1));
                   1589:   r2  =itos(gmael(nfz,1,2));
                   1590:   imax=itos(gmael(nfz,1,3));
                   1591:   N0=lg(coef)-1; ru=r1+r2;
                   1592:   /* from initzeta. Certainly excessive, at least if LONG_IS_64BIT */
                   1593:   bigprec = min(precision(cst), (prec2<<1) - 1);
                   1594:   prec = prec2+1;
                   1595:
                   1596:   if (ts==t_COMPLEX && gcmp0(gimag(s))) { s=greal(s); ts = typ(s); }
                   1597:   if (ts==t_REAL && !signe(gfrac(s))) { s=mptrunc(s); ts = t_INT; }
                   1598:   if (ts==t_INT)
                   1599:   {
                   1600:     sl=itos(s);
                   1601:     if (sl==1) err(talker,"s = 1 is a pole (gzetakall)");
                   1602:     if (sl==0)
                   1603:     {
                   1604:       if (flag) err(talker,"s = 0 is a pole (gzetakall)");
                   1605:       if (ru == 1)
                   1606:       {
                   1607:         if (r1) return gneg(ghalf);
                   1608:         return gneg(resi);
                   1609:       }
                   1610:       return gzero;
                   1611:     }
                   1612:     if (sl<0 && (r2 || !odd(sl)))
                   1613:     {
                   1614:       if (!flag) return gzero;
                   1615:       s = subsi(1,s); sl = 1-sl;
                   1616:     }
                   1617:     unmoins=subsi(1,s);
                   1618:     lambd = gdiv(resi, mulis(s,sl-1));
                   1619:     gammas2=ggamma(gmul2n(s,-1),prec);
                   1620:     gar=gpowgs(gammas2,r1);
                   1621:     cs=gexp(gmul(cstlog,s),prec);
                   1622:     val=s; valm=unmoins;
                   1623:     if (sl<0) /* r2 = 0 && odd(sl) */
                   1624:     {
                   1625:       gammaunmoins2=ggamma(gmul2n(unmoins,-1),prec);
                   1626:       var1=var2=gun;
                   1627:       for (i=2; i<=N0; i++)
                   1628:        if (coef[i])
                   1629:        {
                   1630:           gexpro=gexp(gmul((GEN)coeflog[i],s),bigprec);
                   1631:          var1 = gadd(var1,gmulsg(coef[i],gexpro));
                   1632:          var2 = gadd(var2,gdivsg(coef[i],gmulsg(i,gexpro)));
                   1633:        }
                   1634:       lambd=gadd(lambd,gmul(gmul(var1,cs),gar));
                   1635:       lambd=gadd(lambd,gmul(gmul(var2,gdiv(cst,cs)),
                   1636:                            gpowgs(gammaunmoins2,r1)));
                   1637:       for (i=1; i<=imax; i+=2)
                   1638:       {
                   1639:        valk  = val;
                   1640:         valkm = valm;
                   1641:        for (k=1; k<=ru; k++)
                   1642:        {
                   1643:           p1 = gcoeff(C,i,k);
                   1644:          lambd = gsub(lambd,gdiv(p1,valk )); valk  = mulii(val,valk);
                   1645:          lambd = gsub(lambd,gdiv(p1,valkm)); valkm = mulii(valm,valkm);
                   1646:        }
                   1647:        val  = addis(val, 2);
                   1648:         valm = addis(valm,2);
                   1649:       }
                   1650:     }
                   1651:     else
                   1652:     {
                   1653:       GEN tabj=(GEN)nfz[3], aij=(GEN)nfz[7];
                   1654:
                   1655:       gar = gmul(gar,gpowgs(ggamma(s,prec),r2));
                   1656:       var1=var2=gzero;
                   1657:       for (i=1; i<=N0; i++)
                   1658:        if (coef[i])
                   1659:        {
                   1660:          gexpro=gexp(gmul((GEN)coeflog[i],s),bigprec);
                   1661:          var1 = gadd(var1,gmulsg(coef[i],gexpro));
                   1662:           if (sl <= imax)
                   1663:           {
                   1664:             p1=gzero;
                   1665:             for (j=1; j<=ru+1; j++)
                   1666:               p1 = gadd(p1, gmul(gmael(aij,sl,j), gmael(tabj,i,j)));
                   1667:             var2=gadd(var2,gdiv(p1,gmulsg(i,gexpro)));
                   1668:           }
                   1669:        }
                   1670:       lambd=gadd(lambd,gmul(gmul(var1,cs),gar));
                   1671:       lambd=gadd(lambd,gmul(var2,gdiv(cst,cs)));
                   1672:       for (i=1; i<=imax; i++)
                   1673:       {
                   1674:        valk  = val;
                   1675:         valkm = valm;
                   1676:         if (i == sl)
                   1677:           for (k=1; k<=ru; k++)
                   1678:           {
                   1679:             p1 = gcoeff(C,i,k);
                   1680:             lambd = gsub(lambd,gdiv(p1,valk)); valk = mulii(val,valk);
                   1681:           }
                   1682:         else
                   1683:        for (k=1; k<=ru; k++)
                   1684:        {
                   1685:             p1 = gcoeff(C,i,k);
                   1686:             lambd = gsub(lambd,gdiv(p1,valk )); valk  = mulii(val,valk);
                   1687:             lambd = gsub(lambd,gdiv(p1,valkm)); valkm = mulii(valm,valkm);
                   1688:        }
                   1689:        val  = addis(val,1);
                   1690:         valm = addis(valm,1);
                   1691:       }
                   1692:     }
                   1693:   }
                   1694:   else
                   1695:   {
                   1696:     GEN Pi = mppi(prec);
                   1697:     if (is_frac_t(ts))
                   1698:       s = gmul(s, realun(bigprec));
                   1699:     else
                   1700:       s = gprec_w(s, bigprec);
                   1701:
                   1702:     unmoins = gsub(gun,s);
                   1703:     lambd = gdiv(resi,gmul(s,gsub(s,gun)));
                   1704:     gammas = ggamma(s,prec);
                   1705:     gammas2= ggamma(gmul2n(s,-1),prec);
                   1706:     gar = gmul(gpowgs(gammas,r2),gpowgs(gammas2,r1));
                   1707:     cs = gexp(gmul(cstlog,s),prec);
                   1708:     var1 = gmul(Pi,s);
                   1709:     gammaunmoins = gdiv(Pi,gmul(gsin(var1,prec),gammas));
                   1710:     gammaunmoins2= gdiv(gmul(gmul(gsqrt(Pi,prec),gpui(gdeux,gsub(s,gun),prec)),
                   1711:                              gammas2),
                   1712:                         gmul(gcos(gmul2n(var1,-1),prec),gammas));
                   1713:     var1 = var2 = gun;
                   1714:     for (i=2; i<=N0; i++)
                   1715:       if (coef[i])
                   1716:       {
                   1717:         gexpro = gexp(gmul((GEN)coeflog[i],s),bigprec);
                   1718:        var1 = gadd(var1,gmulsg(coef[i], gexpro));
                   1719:        var2 = gadd(var2,gdivsg(coef[i], gmulsg(i,gexpro)));
                   1720:       }
                   1721:     lambd = gadd(lambd,gmul(gmul(var1,cs),gar));
                   1722:     lambd = gadd(lambd,gmul(gmul(gmul(var2,gdiv(cst,cs)),
                   1723:                                 gpowgs(gammaunmoins,r2)),
                   1724:                             gpowgs(gammaunmoins2,r1)));
                   1725:     val  = s;
                   1726:     valm = unmoins;
                   1727:     for (i=1; i<=imax; i++)
                   1728:     {
                   1729:       valk  = val;
                   1730:       valkm = valm;
                   1731:       for (k=1; k<=ru; k++)
                   1732:       {
                   1733:         p1 = gcoeff(C,i,k);
                   1734:        lambd = gsub(lambd,gdiv(p1,valk )); valk  = gmul(val, valk);
                   1735:        lambd = gsub(lambd,gdiv(p1,valkm)); valkm = gmul(valm,valkm);
                   1736:       }
                   1737:       if (r2)
                   1738:       {
                   1739:        val  = gadd(val, gun);
                   1740:         valm = gadd(valm,gun);
                   1741:        }
                   1742:       else
                   1743:       {
                   1744:        val  = gadd(val, gdeux);
                   1745:         valm = gadd(valm,gdeux); i++;
                   1746:       }
                   1747:     }
                   1748:   }
                   1749:   if (!flag) lambd = gdiv(lambd,gmul(gar,cs)); /* zetak */
                   1750:   return gerepileupto(av, gprec_w(lambd, prec2));
                   1751: }
                   1752:
                   1753: GEN
                   1754: gzetak(GEN nfz, GEN s, long prec)
                   1755: {
                   1756:   return gzetakall(nfz,s,0,prec);
                   1757: }
                   1758:
                   1759: GEN
                   1760: glambdak(GEN nfz, GEN s, long prec)
                   1761: {
                   1762:   return gzetakall(nfz,s,1,prec);
                   1763: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>