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

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

1.1       maekawa     1: /********************************************************************/
                      2: /**                                                                **/
                      3: /**                   TRANSCENDENTAL FONCTIONS                     **/
                      4: /**                          (part 3)                              **/
                      5: /**                                                                **/
                      6: /********************************************************************/
                      7: /* $Id: trans3.c,v 1.2 1999/09/23 17:50:57 karim Exp $ */
                      8: #include "pari.h"
                      9:
                     10: /***********************************************************************/
                     11: /**                                                                   **/
                     12: /**                       K BESSEL FUNCTION                           **/
                     13: /**                                                                   **/
                     14: /***********************************************************************/
                     15:
                     16: GEN
                     17: kbessel0(GEN nu, GEN gx, long flag, long prec)
                     18: {
                     19:   switch(flag)
                     20:   {
                     21:     case 0: return kbessel(nu,gx,prec);
                     22:     case 1: return kbessel2(nu,gx,prec);
                     23:     default: err(flagerr,"besselk");
                     24:   }
                     25:   return NULL; /* not reached */
                     26: }
                     27:
                     28: GEN
                     29: kbessel(GEN nu, GEN gx, long prec)
                     30: {
                     31:   GEN x,y,p1,p2,zf,zz,s,t,q,r,u,v,e,f,c,d,ak,pitemp,nu2,w;
                     32:   long l,lbin,av,av1,k,k2,l1,n2,n;
                     33:
                     34:   if (typ(nu)==t_COMPLEX) return kbessel2(nu,gx,prec);
                     35:   if (typ(gx)!=t_REAL)
                     36:     { l=prec; k=1; }
                     37:   else
                     38:     { l=lg(gx); k=0; x=gx; }
                     39:   y=cgetr(l); l1=l+1;
                     40:   av=avma; if (k) gaffect(gx,x=cgetr(l));
                     41:   u=cgetr(l1); v=cgetr(l1); c=cgetr(l1); d=cgetr(l1);
                     42:   e=cgetr(l1); f=cgetr(l1);
                     43:   nu2=gmulgs(gsqr(nu),-4);
                     44:   n = (long) (bit_accuracy(l)*LOG2 + PI*sqrt(gtodouble(gnorm(nu)))) / 2;
                     45:   n2=(n<<1); pitemp=mppi(l1);
                     46:   /* this 10 should really be a 5, but then kbessel(15.99) enters oo loop */
                     47:   lbin = 10 - bit_accuracy(l); av1=avma;
                     48:   if (gcmpgs(x,n)<0)
                     49:   {
                     50:     zf=gsqrt(gdivgs(pitemp,n2),prec);
                     51:     zz=cgetr(l1); gaffect(ginv(stoi(n2<<2)), zz);
                     52:     s=gun; t=gzero;
                     53:     for (k=n2,k2=2*n2-1; k > 0; k--,k2-=2)
                     54:     {
                     55:       if (k2 & ~(MAXHALFULONG>>1))
                     56:         p1 = gadd(mulss(k2,k2),nu2);
                     57:       else
                     58:         p1 = gaddsg(k2*k2,nu2);
                     59:       ak=gdivgs(gmul(p1,zz),-k);
                     60:       s=gadd(gun,gmul(ak,s));
                     61:       t=gaddsg(k2,gmul(ak,t));
                     62:     }
                     63:     gmulz(s,zf,u); t=gmul2n(t,-1);
                     64:     gdivgsz(gadd(gmul(t,zf),gmul(u,nu)),-n2,v); avma=av1;
                     65:     affsr(n2,q=cgetr(l1));
                     66:     r=gmul2n(x,1); av1=avma;
                     67:     for(;;)
                     68:     {
                     69:       p1=divsr(5,q); if (expo(p1) >= -1) p1=ghalf;
                     70:       p2=subsr(1,divrr(r,q));
                     71:       if (gcmp(p1,p2)>0) p1=p2;
                     72:       gnegz(p1,c); gaffsg(1,d); affrr(u,e); affrr(v,f);
                     73:       for (k=1; ; k++)
                     74:       {
                     75:        w=gadd(gmul(gsubsg(k,ghalf),u), gmul(subrs(q,k),v));
                     76:        w=gadd(w, gmul(nu,gsub(u,gmul2n(v,1))));
                     77:        gdivgsz(gmul(q,v),k,u);
                     78:        gdivgsz(w,k,v);
                     79:        gmulz(d,c,d);
                     80:        gaddz(e,gmul(d,u),e); p1=gmul(d,v);
                     81:        gaddz(f,p1,f);
                     82:        if (gexpo(p1)-gexpo(f) <= lbin) break;
                     83:        avma=av1;
                     84:       }
                     85:       p1=u; u=e; e=p1;
                     86:       p1=v; v=f; f=p1;
                     87:       gmulz(q,gaddsg(1,c),q);
                     88:       if (expo(subrr(q,r)) <= lbin) break;
                     89:     }
                     90:     gmulz(u,gpui(gdivgs(x,n),nu,prec),y);
                     91:   }
                     92:   else
                     93:   {
                     94:     p2=gmul2n(x,1);
                     95:     zf=gsqrt(gdiv(pitemp,p2),prec);
                     96:     zz=ginv(gmul2n(p2,2)); s=gun;
                     97:     for (k=n2,k2=2*n2-1; k > 0; k--,k2-=2)
                     98:     {
                     99:       if (k2 & ~(MAXHALFULONG>>1))
                    100:         p1=gadd(mulss(k2,k2),nu2);
                    101:       else
                    102:         p1=gaddsg(k2*k2,nu2);
                    103:       ak=gdivgs(gmul(p1,zz),k);
                    104:       s=gsub(gun,gmul(ak,s));
                    105:     }
                    106:     gmulz(s,zf,y);
                    107:   }
                    108:   gdivz(y,mpexp(x),y); avma=av; return y;
                    109: }
                    110:
                    111: /***********************************************************************/
                    112: /*                                                                    **/
                    113: /**                    FONCTION U(a,b,z) GENERALE                     **/
                    114: /**                         ET CAS PARTICULIERS                       **/
                    115: /**                                                                   **/
                    116: /***********************************************************************/
                    117:
                    118: /* Assume gx > 0 and a,b real */
                    119: GEN
                    120: hyperu(GEN a, GEN b, GEN gx, long prec)
                    121: {
                    122:   GEN x,y,p1,p2,p3,zf,zz,s,t,q,r,u,v,e,f,c,d,w,a1,gn;
                    123:   long l,lbin,av,av1,av2,k,l1,n,ex;
                    124:
                    125:   if (typ(gx)!=t_REAL)
                    126:     { l=prec; k=1; }
                    127:   else
                    128:     { l=lg(gx); k=0; x=gx; }
                    129:   ex = (iscomplex(a) || iscomplex(b));
                    130:   if (ex) { y=cgetg(3,t_COMPLEX); y[1]=lgetr(l); y[2]=lgetr(l); }
                    131:   else y=cgetr(l);
                    132:   l1=l+1; av=avma; if (k) gaffect(gx,x=cgetr(l));
                    133:   a1=gaddsg(1,gsub(a,b));
                    134:   if (ex)
                    135:   {
                    136:     u=cgetg(3,t_COMPLEX); u[1]=lgetr(l1); u[2]=lgetr(l1);
                    137:     v=cgetg(3,t_COMPLEX); v[1]=lgetr(l1); v[2]=lgetr(l1);
                    138:     c=cgetg(3,t_COMPLEX); c[1]=lgetr(l1); c[2]=lgetr(l1);
                    139:     d=cgetg(3,t_COMPLEX); d[1]=lgetr(l1); d[2]=lgetr(l1);
                    140:     e=cgetg(3,t_COMPLEX); e[1]=lgetr(l1); e[2]=lgetr(l1);
                    141:     f=cgetg(3,t_COMPLEX); f[1]=lgetr(l1); f[2]=lgetr(l1);
                    142:   }
                    143:   else
                    144:   {
                    145:     u=cgetr(l1); v=cgetr(l1); c=cgetr(l1);
                    146:     d=cgetr(l1); e=cgetr(l1); f=cgetr(l1);
                    147:   }
                    148:   n=(long)(bit_accuracy(l)*LOG2 + PI*sqrt(gtodouble(gabs(gmul(a,a1),l1))));
                    149:   lbin = 10-bit_accuracy(l); av1=avma;
                    150:   if (gcmpgs(x,n)<0)
                    151:   {
                    152:     gn=stoi(n); zf=gpui(gn,gneg_i(a),l1);
                    153:     zz=gdivsg(-1,gn); s=gun; t=gzero;
                    154:     for (k=n-1; k>=0; k--)
                    155:     {
                    156:       p1=gdivgs(gmul(gmul(gaddgs(a,k),gaddgs(a1,k)),zz),k+1);
                    157:       s=gaddsg(1,gmul(p1,s));
                    158:       t=gadd(gaddsg(k,a),gmul(p1,t));
                    159:     }
                    160:     gmulz(s,zf,u); t=gmul(t,zz); gmulz(t,zf,v); avma=av1;
                    161:     q=cgetr(l1); affsr(n,q); r=x; av1=avma;
                    162:     do
                    163:     {
                    164:       p1=divsr(5,q); if (expo(p1)>= -1) p1=ghalf;
                    165:       p2=subsr(1,divrr(r,q)); if (gcmp(p1,p2)>0) p1=p2;
                    166:       gnegz(p1,c); avma=av1;
                    167:       k=0; gaffsg(1,d);
                    168:       gaffect(u,e); gaffect(v,f);
                    169:       p3=gsub(q,b); av2=avma;
                    170:       for(;;)
                    171:       {
                    172:        w=gadd(gmul(gaddsg(k,a),u),gmul(gaddsg(-k,p3),v));
                    173:        k++; gdivgsz(gmul(q,v),k,u);
                    174:        gdivgsz(w,k,v);
                    175:        gmulz(d,c,d);
                    176:        gaddz(e,gmul(d,u),e); p1=gmul(d,v);
                    177:        gaddz(f,p1,f);
                    178:        if (gexpo(p1)-gexpo(f) <= lbin) break;
                    179:        avma=av2;
                    180:       }
                    181:       p1=u; u=e; e=p1;
                    182:       p1=v; v=f; f=p1;
                    183:       gmulz(q,gadd(gun,c),q);
                    184:       p1=subrr(q,r); ex=expo(p1); avma=av1;
                    185:     }
                    186:     while (ex>lbin);
                    187:   }
                    188:   else
                    189:   {
                    190:     zf=gpui(x,gneg_i(a),l1);
                    191:     zz=gdivsg(-1,x); s=gun;
                    192:     for (k=n-1; k>=0; k--)
                    193:     {
                    194:       p1=gdivgs(gmul(gmul(gaddgs(a,k),gaddgs(a1,k)),zz),k+1);
                    195:       s=gadd(gun,gmul(p1,s));
                    196:     }
                    197:     u = gmul(s,zf);
                    198:   }
                    199:   gaffect(u,y); avma=av; return y;
                    200: }
                    201:
                    202: GEN
                    203: kbessel2(GEN nu, GEN x, long prec)
                    204: {
                    205:   long av = avma,tetpil;
                    206:   GEN p1,p2,x2,a,pitemp;
                    207:
                    208:   if (typ(x)==t_REAL) prec = lg(x);
                    209:   x2=gshift(x,1); pitemp=mppi(prec);
                    210:   if (gcmp0(gimag(nu))) a=cgetr(prec);
                    211:   else
                    212:   { a=cgetg(3,t_COMPLEX); a[1]=lgetr(prec); a[2]=lgetr(prec); }
                    213:   gaddz(gun,gshift(nu,1),a);
                    214:   p1=hyperu(gshift(a,-1),a,x2,prec);
                    215:   p1=gmul(gmul(p1,gpui(x2,nu,prec)),mpsqrt(pitemp));
                    216:   p2=gexp(x,prec); tetpil=avma;
                    217:   return gerepile(av,tetpil,gdiv(p1,p2));
                    218: }
                    219:
                    220: GEN
                    221: incgam(GEN a, GEN x, long prec)
                    222: {
                    223:   GEN p1,z = cgetr(prec);
                    224:   long av = avma;
                    225:
                    226:   if (typ(x)!=t_REAL) { gaffect(x,z); x=z; }
                    227:   if (gcmp(subrs(x,1),a) > 0 || gsigne(greal(a)) <= 0)
                    228:     p1 = incgam2(a,x,prec);
                    229:   else
                    230:     p1 = gsub(ggamma(a,prec), incgam3(a,x,prec));
                    231:   affrr(p1,z); avma = av; return z;
                    232: }
                    233:
                    234: /* = incgam2(0, x, prec). typ(x) = t_REAL. Optimized for eint1 */
                    235: static GEN
                    236: incgam2_0(GEN x)
                    237: {
                    238:   long l,n,i;
                    239:   GEN p1;
                    240:   double m,mx;
                    241:
                    242:   l = lg(x); mx = rtodbl(x);
                    243:   m = (bit_accuracy(l)*LOG2 + mx)/4; n=(long)(1+m*m/mx);
                    244:   p1 = divsr(-n, addsr(n<<1,x));
                    245:   for (i=n-1; i >= 1; i--)
                    246:     p1 = divsr(-i, addrr(addsr(i<<1,x), mulsr(i,p1)));
                    247:   return mulrr(divrr(mpexp(negr(x)), x), addrr(realun(l),p1));
                    248: }
                    249:
                    250: GEN
                    251: incgam1(GEN a, GEN x, long prec)
                    252: {
                    253:   GEN p2,p3,y, z = cgetr(prec);
                    254:   long av=avma, av1, l,n,i;
                    255:   double m,mx;
                    256:
                    257:   if (typ(x) != t_REAL) { gaffect(x,z); x=z; }
                    258:   l=lg(x); mx=rtodbl(x);
                    259:   m=(long) bit_accuracy(l)*LOG2; n=(long)(m/(log(m)-(1+log(mx))));
                    260:   p2 = cgetr(l); affrr(addir(gun,gsub(x,a)), p2);
                    261:   p3 = subrs(p2, n+1); av1 = avma;
                    262:   for (i=n; i>=1; i--)
                    263:   {
                    264:     affrr(addrr(subrs(p2,i), divrr(mulsr(i,x),p3)), p3);
                    265:     avma = av1;
                    266:   }
                    267:   y = mulrr(mpexp(negr(x)),gpui(x,a,prec));
                    268:   affrr(divrr(y,p3), z);
                    269:   avma = av; return z;
                    270: }
                    271:
                    272: GEN
                    273: incgam2(GEN a, GEN x, long prec)
                    274: {
                    275:   GEN b,p1,p2,p3,y, z = cgetr(prec);
                    276:   long av = avma,av1,l,n,i;
                    277:   double m,mx;
                    278:
                    279:   if (typ(x) != t_REAL) { gaffect(x,z); x=z; }
                    280:   if (gcmp0(a)) { affrr(incgam2_0(x), z); avma = av; return z; }
                    281:   l=lg(x); mx=rtodbl(x);
                    282:   m = (bit_accuracy(l)*LOG2 + mx)/4; n=(long)(1+m*m/mx);
                    283:   i = typ(a);
                    284:   if (i == t_REAL) b = addsr(-1,a);
                    285:   else
                    286:   { /* keep b integral : final powering more efficient */
                    287:     gaffect(a,p1=cgetr(prec));
                    288:     b = (i == t_INT)? addsi(-1,a): addsr(-1,p1);
                    289:     a = p1;
                    290:   }
                    291:   p2 = cgetr(l); gaffect(subrr(x,a),p2);
                    292:   p3 = divrr(addsr(-n,a), addrs(p2,n<<1));
                    293:   av1 = avma;
                    294:   for (i=n-1; i>=1; i--)
                    295:   {
                    296:     affrr(divrr(addsr(-i,a), addrr(addrs(p2,i<<1),mulsr(i,p3))), p3);
                    297:     avma = av1;
                    298:   }
                    299:   y = gmul(mpexp(negr(x)), gpui(x,b,prec));
                    300:   affrr(mulrr(y, addsr(1,p3)), z);
                    301:   avma = av; return z;
                    302: }
                    303:
                    304: GEN
                    305: incgam3(GEN a, GEN x, long prec)
                    306: {
                    307:   GEN b,p1,p2,p3,y, z = cgetr(prec);
                    308:   long av = avma, av1,l,n,i;
                    309:
                    310:   if (typ(x) != t_REAL) { gaffect(x,z); x=z; }
                    311:   l=lg(x); n = -bit_accuracy(l)-1;
                    312:   p3 = realun(l);
                    313:   p2 = rcopy(p3);
                    314:   i = typ(a);
                    315:   if (i == t_REAL) b = a;
                    316:   else
                    317:   {
                    318:     gaffect(a,p1=cgetr(prec));
                    319:     b = (i == t_INT)? a: p1;
                    320:     a = p1;
                    321:   }
                    322:   av1 = avma;
                    323:   for (i=1; expo(p2) >= n; i++)
                    324:   {
                    325:     affrr(divrr(mulrr(x,p2), addsr(i,a)), p2);
                    326:     affrr(addrr(p2,p3), p3); avma = av1;
                    327:   }
                    328:   y = gdiv(mulrr(mpexp(negr(x)), gpui(x,b,prec)), a);
                    329:   affrr(mulrr(y,p3), z);
                    330:   avma = av; return z;
                    331: }
                    332:
                    333: /* Assumes that g=gamma(a,prec). Unchecked */
                    334: GEN
                    335: incgam4(GEN a, GEN x, GEN g, long prec)
                    336: {
                    337:   GEN p1, z = cgetr(prec);
                    338:   long av = avma;
                    339:
                    340:   if (typ(x) != t_REAL) { gaffect(x,z); x=z; }
                    341:   if (gcmp(subrs(x,1),a) > 0 || gsigne(greal(a)) <= 0)
                    342:     p1 = incgam2(a,x,prec);
                    343:   else
                    344:     p1 = gsub(g, incgam3(a,x,prec));
                    345:   affrr(p1, z);
                    346:   avma = av; return z;
                    347: }
                    348:
                    349: GEN
                    350: incgam0(GEN a, GEN x, GEN z,long prec)
                    351: {
                    352:   return z? incgam4(a,x,z,prec): incgam(a,x,prec);
                    353: }
                    354:
                    355: GEN
                    356: eint1(GEN x, long prec)
                    357: {
                    358:   long av = avma,tetpil,l,n,i;
                    359:   GEN p1,p2,p3,p4,run,y;
                    360:
                    361:   if (typ(x) != t_REAL) { gaffect(x,p1=cgetr(prec)); x = p1;}
                    362:   if (signe(x) >= 0)
                    363:   {
                    364:     if (expo(x) >= 4)
                    365:       return gerepileupto(av, incgam2_0(x));
                    366:
                    367:     l = lg(x); consteuler(l);
                    368:     n = -bit_accuracy(l)-1;
                    369:
                    370:     run = realun(l);
                    371:     p4 = p3 = p2 = p1 = run;
                    372:     for (i=2; expo(p2)>=n; i++)
                    373:     {
                    374:       p1 = addrr(p1,divrs(run,i)); /* p1 = sum_{i=1} 1/i */
                    375:       p4 = divrs(mulrr(x,p4),i);   /* p4 = sum_{i=1} x^(i-1)/i */
                    376:       p2 = mulrr(p4,p1);
                    377:       p3 = addrr(p2,p3);
                    378:     }
                    379:     p3 = mulrr(x,mulrr(mpexp(negr(x)),p3));
                    380:     p1 = addrr(mplog(x),geuler);
                    381:     return gerepileupto(av, subrr(p3,p1));
                    382:   }
                    383:   else
                    384:   { /* written by Manfred Radimersky */
                    385:     l  = lg(x);
                    386:     n  = bit_accuracy(l);
                    387:     /* IS: line split to avoid a Workshop cc-5.0 bug (Sun BugID #4254959) */
                    388:     n  = 3 * n / 4;
                    389:     y  = negr(x);
                    390:     if(gcmpgs(y, n) < 0) {
                    391:       p1 = p2 = p3 = y;
                    392:       p4 = gzero;
                    393:       i  = 2;
                    394:       while(gcmp(p3, p4)) {
                    395:         p4 = p3;
                    396:         p1 = gmul(p1, gdivgs(y, i));
                    397:         p2 = gdivgs(p1, i);
                    398:         p3 = gadd(p3, p2);
                    399:         i++;
                    400:       }
                    401:       consteuler(l);
                    402:       p1 = gadd(mplog(y), geuler);
                    403:       y  = gadd(p3, p1);
                    404:     } else {
                    405:       p1 = gdivsg(1, y);
                    406:       p2 = realun(l);
                    407:       p3 = p2;
                    408:       p4 = gzero;
                    409:       i  = 1;
                    410:       while(gcmp(p3, p4)) {
                    411:         p4 = p3;
                    412:         p2 = gmulgs(p2, i);
                    413:         p2 = gmul(p2, p1);
                    414:         p3 = gadd(p3, p2);
                    415:         i++;
                    416:       }
                    417:       p1 = gdiv(mpexp(y), y);
                    418:       y  = gmul(p3, p1);
                    419:     }
                    420:     tetpil = avma;
                    421:     y  = gerepile(av, tetpil, negr(y));
                    422:   }
                    423:   return y;
                    424: }
                    425:
                    426: GEN
                    427: veceint1(GEN C, GEN nmax, long prec)
                    428: {
                    429:   long av,av1,k,n,nstop,i,cd,nmin,G,a;
                    430:   GEN y,e1,e2,F0,F,M2,f,den,minvn,mcn,p1,vdiff,ap,unr,zeror,deninit;
                    431:
                    432:   if (!nmax) return eint1(C,prec);
                    433:
                    434:   if (signe(nmax)<=0) return cgetg(1,t_VEC);
                    435:   if (DEBUGLEVEL>1) fprintferr("Entering veceint1:\n");
                    436:   if (typ(C) != t_REAL || lg(C) > prec)
                    437:     { y = cgetr(prec); gaffect(C,y); C = y; }
                    438:   if (signe(C) <= 0) err(talker,"negative or zero constant in veceint1");
                    439:
                    440:   G = -bit_accuracy(prec);
                    441:   n=itos(nmax); y=cgetg(n+1,t_VEC);
                    442:   for(i=1; i<=n; i++) y[i]=lgetr(prec);
                    443:   av=avma;
                    444:
                    445:   nstop = itos(gceil(divsr(4,C)));
                    446:   if (nstop<1) nstop=1;
                    447:   if (nstop>n) nstop=n;
                    448:   nmin=n-10; if (nmin<nstop) nmin=nstop;
                    449:   if(DEBUGLEVEL>1) fprintferr("nstop = %ld\n",nstop);
                    450:
                    451:   e1=mpexp(negr(mulsr(n,C)));
                    452:   e2=mpexp(mulsr(10,C));
                    453:   unr = realun(prec);
                    454:   zeror=realzero(prec); deninit=negr(unr);
                    455:   f=cgetg(3,t_COL); M2=cgetg(3,t_VEC); av1=avma;
                    456:
                    457:   F0=(GEN)y[n];
                    458:   affrr(eint1(mulsr(n,C),prec), F0);
                    459:   do
                    460:   {
                    461:     if (DEBUGLEVEL>1) fprintferr("%ld ",n);
                    462:     minvn=divrs(unr,-n); mcn=mulrr(C,minvn);
                    463:     M2[1] = (long)zeror; M2[2] = lsubrr(minvn,C);
                    464:     f[1]=(long)zeror; f[2]=ldivrs(e1,-n);
                    465:     affrr(mulrr(e1,e2), e1);
                    466:     vdiff=cgetg(2,t_VEC); vdiff[1]=f[2];
                    467:     for (cd=a=1,n--; n>=nmin; n--,a++)
                    468:     {
                    469:       F = F0;
                    470:       ap = stoi(a); den = deninit;
                    471:       for (k=1;;)
                    472:       {
                    473:        if (k>cd)
                    474:         {
                    475:           cd++; p1 = (GEN)f[2];
                    476:           f[2] = lmul(M2,f);
                    477:           f[1] = (long)p1;
                    478:           M2[1] = laddrr((GEN)M2[1],mcn);
                    479:           M2[2] = laddrr((GEN)M2[2],minvn);
                    480:           vdiff = concatsp(vdiff,(GEN)f[2]);
                    481:         }
                    482:        p1 = mulrr(mulri(den,ap),(GEN)vdiff[k]);
                    483:         if (expo(p1) < G) { affrr(F,(GEN)y[n]); break; }
                    484:        F = addrr(F,p1); ap = mulis(ap,a);
                    485:        k++; den = divrs(den,-k);
                    486:       }
                    487:     }
                    488:     avma=av1; n++; F0=(GEN)y[n]; nmin -= 10;
                    489:     if (nmin < nstop) nmin=nstop;
                    490:   }
                    491:   while(n>nstop);
                    492:   for(i=1; i<=nstop; i++)
                    493:     affrr(eint1(mulsr(i,C),prec), (GEN)y[i]);
                    494:   if (DEBUGLEVEL>1) fprintferr("\n");
                    495:   avma=av; return y;
                    496: }
                    497:
                    498: GEN
                    499: gerfc(GEN x, long prec)
                    500: {
                    501:   long av=avma;
                    502:   GEN p1,p2;
                    503:
                    504:   if (typ(x)!=t_REAL) { p1=cgetr(prec); gaffect(x,p1); x=p1; }
                    505:   av = avma; p1 = incgam(ghalf,gsqr(x),prec);
                    506:   p2 = mpsqrt(mppi(lg(x)));
                    507:   p1 = divrr(p1,p2);
                    508:   if (signe(x) < 0) p1 = subsr(2,p1);
                    509:   return gerepileupto(av,p1);
                    510: }
                    511:
                    512: /***********************************************************************/
                    513: /**                                                                  **/
                    514: /**                    FONCTION ZETA DE RIEMANN                      **/
                    515: /**                                                                  **/
                    516: /***********************************************************************/
                    517:
                    518: static GEN
                    519: czeta(GEN s, long prec)
                    520: {
                    521:   long av,n,p,n1,l,flag1,flag2,flag3,i,i2;
                    522:   double st,sp,sn,ssig,ns,alpha,beta,maxbeta,xinf;
                    523:   GEN y,z,res,sig,ms,p1,p2,p3,p31,pitemp;
                    524:
                    525:   l=precision(s);
                    526:   if (typ(s)==t_COMPLEX)
                    527:   {
                    528:     if (!l) l=prec;
                    529:     res=cgetg(3,t_COMPLEX); res[1]=lgetr(l); res[2]=lgetr(l);
                    530:     av=avma;
                    531:     p1=cgetg(3,t_COMPLEX); p1[1]=lgetr(l+1); p1[2]=lgetr(l+1);
                    532:     gaffect(s,p1); s=p1; sig=(GEN)s[1];
                    533:   }
                    534:   else
                    535:   {
                    536:     res = cgetr(l); av=avma;
                    537:     p1=cgetr(l+1); affrr(s,p1); sig=s=p1;
                    538:   }
                    539:
                    540:   if (signe(sig)>0 && expo(sig)>-2) flag1 = 0;
                    541:   else
                    542:   {
                    543:     if (gcmp0(gimag(s)) && gcmp0(gfrac(gmul2n(sig,-1))))
                    544:     {
                    545:       if (gcmp0(sig)) gaffect(gneg_i(ghalf),res); else gaffsg(0,res);
                    546:       avma=av; return res;
                    547:     }
                    548:     flag1=1; s=gsub(gun,s); sig=greal(s);
                    549:   }
                    550:   ssig=rtodbl(sig); st=fabs(rtodbl(gimag(s))); maxbeta = pow(3.0,-2.5);
                    551:   if (st)
                    552:   {
                    553:     ns = ssig*ssig + st*st;
                    554:     alpha=pariC2*(prec-2)-0.39-0.5*(ssig-1.0)*log(ns)-log(ssig)+ssig*2*pariC1;
                    555:     beta=(alpha+ssig)/st-atan(ssig/st);
                    556:     if (beta<=0)
                    557:     {
                    558:       if (ssig>=1.0)
                    559:       {
                    560:        p=0; sn=sqrt(ns);
                    561:        n=(long)(ceil(exp(pariC2*(prec-2)/ssig)*pow(sn/(2*ssig),1.0/ssig)));
                    562:       }
                    563:       else
                    564:       {
                    565:        p=1; sn=ssig+1; n=(long)ceil(sqrt(sn*sn+st*st)/(2*PI));
                    566:       }
                    567:     }
                    568:     else
                    569:     {
                    570:       if (beta<maxbeta) xinf=beta+pow(3*beta,1.0/3.0);
                    571:       else
                    572:       {
                    573:        double eps=0.0087, x00 = beta+PI/2.0, y00,x11;
                    574:         for(;;)
                    575:        {
                    576:          y00=x00*x00; x11=(beta+atan(x00))*(1+y00)/y00-1/x00;
                    577:          if (x00-x11 < eps) break;
                    578:          x00 = x11;
                    579:        }
                    580:        xinf=x11;
                    581:       }
                    582:       sp=1.0-ssig+st*xinf;
                    583:       if (sp>0)
                    584:       {
                    585:        p=(long)ceil(sp/2.0); sn=ssig+2*p-1;
                    586:        n=(long)ceil(sqrt(sn*sn+st*st)/(2*PI));
                    587:       }
                    588:       else
                    589:       {
                    590:        p=0; sn=sqrt(ns);
                    591:        n=(long)ceil(exp(pariC2*(prec-2)/ssig)*pow(sn/(2*ssig),1.0/ssig));
                    592:       }
                    593:     }
                    594:   }
                    595:   else
                    596:   {
                    597:     beta=pariC2*(prec-2)+0.61+ssig*2*pariC1-ssig*log(ssig);
                    598:     if (beta>0)
                    599:     {
                    600:       p=(long)ceil(beta/2.0); sn=ssig+2*p-1;
                    601:       n=(long)ceil(sqrt(sn*sn+st*st)/(2*PI));
                    602:     }
                    603:     else
                    604:     {
                    605:       p=0; sn=sqrt(ssig*ssig+st*st);
                    606:       n=(long)ceil(exp(pariC2*(prec-2)/ssig)*pow(sn/(2*ssig),1.0/ssig));
                    607:     }
                    608:   }
                    609:   if (n < 46340) { flag2=1; n1=n*n; } else flag2=0;
                    610:   y=gun; ms=gneg_i(s); p1=cgetr(prec+1);
                    611:   for (i=2; i<=n; i++)
                    612:   {
                    613:     affsr(i,p1); p2 = gexp(gmul(ms,mplog(p1)), prec+1);
                    614:     y = gadd(y,p2);
                    615:   }
                    616:   flag3 = (2*p < 46340);
                    617:   mpbern(p,prec+1); p31=cgetr(prec+1); z=gzero;
                    618:   for (i=p; i>=1; i--)
                    619:   {
                    620:     i2=i<<1;
                    621:     p1=gmul(gaddsg(i2-1,s),gaddsg(i2,s));
                    622:     p1=flag3? gdivgs(p1,i2*(i2+1)): gdivgs(gdivgs(p1,i2),i2+1);
                    623:     p1=flag2? gdivgs(p1,n1): gdivgs(gdivgs(p1,n),n);
                    624:     p3 = bern(i);
                    625:     if (bernzone[2]>prec+1) { affrr(p3,p31); p3=p31; }
                    626:     z=gadd(divrs(p3,i),gmul(p1,z));
                    627:   }
                    628:   p1=gsub(gdivsg(n,gsubgs(s,1)),ghalf);
                    629:   z=gmul(gadd(p1,gmul(s,gdivgs(z,n<<1))),p2);
                    630:   y = gadd(y,z);
                    631:   if (flag1)
                    632:   {
                    633:     pitemp=mppi(prec+1); setexpo(pitemp,2);
                    634:     y=gmul(gmul(y,ggamma(s,prec+1)),gpui(pitemp,ms,prec+1));
                    635:     setexpo(pitemp,0);
                    636:     y=gmul2n(gmul(y,gcos(gmul(pitemp,s),prec+1)),1);
                    637:   }
                    638:   gaffect(y,res); avma=av; return res;
                    639: }
                    640:
                    641: /* y = binomial(n,k-2). Return binomial(n,k) */
                    642: static GEN
                    643: next_bin(GEN y, long n, long k)
                    644: {
                    645:   y = divrs(mulrs(y, n-k+2), k-1);
                    646:   return divrs(mulrs(y, n-k+1), k);
                    647: }
                    648:
                    649: static GEN
                    650: izeta(long k, long prec)
                    651: {
                    652:   long av=avma,av2,tetpil,kk,n,li, limit;
                    653:   GEN y,p1,pitemp,qn,z,q,binom;
                    654:
                    655:   if (!k) return gneg(ghalf);
                    656:   if (k<0)
                    657:   {
                    658:     if ((k&1) == 0) return gzero;
                    659:     y=bernreal(1-k,prec); tetpil=avma;
                    660:     return gerepile(av,tetpil,divrs(y,k-1));
                    661:   }
                    662:   if (k > bit_accuracy(prec)+1) return realun(prec);
                    663:   pitemp=mppi(prec); setexpo(pitemp,2);
                    664:   if ((k&1) == 0)
                    665:   {
                    666:     p1 = mulrr(gpuigs(pitemp,k),absr(bernreal(k,prec)));
                    667:     y = mpfactr(k,prec); tetpil=avma;
                    668:     y=divrr(p1,y); setexpo(y,expo(y)-1);
                    669:     return gerepile(av,tetpil,y);
                    670:   }
                    671:   binom = realun(prec+1);
                    672:   q = mpexp(pitemp); kk = k+1;
                    673:   li = -(1+bit_accuracy(prec));
                    674:   if ((k&3)==3)
                    675:   {
                    676:     for (n=0; n <= kk>>1; n+=2)
                    677:     {
                    678:       p1 = mulrr(bernreal(kk-n,prec),bernreal(n,prec));
                    679:       if (n) { binom = next_bin(binom,kk,n); setlg(binom,prec+1); }
                    680:       p1 = mulrr(binom,p1);
                    681:       if (n == kk>>1) setexpo(p1, expo(p1)-1);
                    682:       if ((n>>1)&1) setsigne(p1,-signe(p1));
                    683:       y = n? addrr(y,p1): p1;
                    684:     }
                    685:     y=mulrr(divrr(gpuigs(pitemp,k),mpfactr(kk,prec)),y);
                    686:
                    687:     av2 = avma; limit = stack_lim(av2,1);
                    688:     qn=gsqr(q); z=divsr(1,addrs(q,-1));
                    689:     for (n=2; ; n++)
                    690:     {
                    691:       p1=divsr(1,mulir(gpuigs(stoi(n),k),addrs(qn,-1)));
                    692:
                    693:       z=addrr(z,p1); if (expo(p1)< li) break;
                    694:       qn=mulrr(qn,q);
                    695:       if (low_stack(limit,stack_lim(av2,1)))
                    696:       {
                    697:         GEN *gptr[2]; gptr[0]=&z; gptr[1]=&qn;
                    698:         if (DEBUGMEM>1) err(warnmem,"izeta");
                    699:         gerepilemany(av2,gptr,2);
                    700:       }
                    701:     }
                    702:     setexpo(z,expo(z)+1); tetpil = avma;
                    703:     y = addrr(y,z); setsigne(y,-signe(y));
                    704:   }
                    705:   else
                    706:   {
                    707:     GEN p2 = divrs(pitemp, k-1);
                    708:     for (n=0; n <= k>>1; n+=2)
                    709:     {
                    710:       p1 = mulrr(bernreal(kk-n,prec),bernreal(n,prec));
                    711:       if (n) binom = next_bin(binom,kk,n);
                    712:       p1 = mulrr(binom,p1);
                    713:       p1 = mulsr(kk-(n<<1),p1);
                    714:       if ((n>>1)&1) setsigne(p1,-signe(p1));
                    715:       y = n? addrr(y,p1): p1;
                    716:     }
                    717:     y = mulrr(divrr(gpuigs(pitemp,k),mpfactr(kk,prec)),y);
                    718:     y = divrs(y,k-1);
                    719:     av2 = avma; limit = stack_lim(av2,1);
                    720:     qn = q; z=gzero;
                    721:     for (n=1; ; n++)
                    722:     {
                    723:       p1=mulir(gpuigs(stoi(n),k),gsqr(addrs(qn,-1)));
                    724:       p1=divrr(addrs(mulrr(qn,addsr(1,mulsr(n<<1,p2))),-1),p1);
                    725:
                    726:       z=addrr(z,p1); if (expo(p1) < li) break;
                    727:       qn=mulrr(qn,q);
                    728:       if (low_stack(limit,stack_lim(av2,1)))
                    729:       {
                    730:         GEN *gptr[2]; gptr[0]=&z; gptr[1]=&qn;
                    731:         if (DEBUGMEM>1) err(warnmem,"izeta");
                    732:         gerepilemany(av2,gptr,2);
                    733:       }
                    734:     }
                    735:     setexpo(z,expo(z)+1); tetpil = avma;
                    736:     y = subrr(y,z);
                    737:   }
                    738:   return gerepile(av,tetpil,y);
                    739: }
                    740:
                    741: GEN
                    742: gzeta(GEN x, long prec)
                    743: {
                    744:   if (gcmp1(x)) err(talker,"argument equal to one in zeta");
                    745:   switch(typ(x))
                    746:   {
                    747:     case t_INT:
                    748:       return izeta(itos(x),prec);
                    749:
                    750:     case t_REAL: case t_COMPLEX:
                    751:       return czeta(x,prec);
                    752:
                    753:     case t_INTMOD: case t_PADIC:
                    754:       err(typeer,"gzeta");
                    755:     case t_SER:
                    756:       err(impl,"zeta of power series");
                    757:   }
                    758:   return transc(gzeta,x,prec);
                    759: }
                    760:
                    761: void
                    762: gzetaz(GEN x, GEN y)
                    763: {
                    764:   long av=avma, prec = precision(y);
                    765:
                    766:   if (!prec) err(infprecer,"gzetaz");
                    767:   gaffect(gzeta(x,prec),y); avma=av;
                    768: }
                    769:
                    770: /***********************************************************************/
                    771: /**                                                                   **/
                    772: /**                    FONCTIONS POLYLOGARITHME                       **/
                    773: /**                                                                   **/
                    774: /***********************************************************************/
                    775:
                    776: /* validity domain contains .005 < |x| < 230 */
                    777: static GEN
                    778: cxpolylog(long m, GEN x, long prec)
                    779: {
                    780:   long av=avma,li,i,n,bern_upto;
                    781:   GEN p1,z,h,q,s;
                    782:
                    783:   if (gcmp1(x)) return izeta(m,prec);
                    784:   z=glog(x,prec); h=gneg_i(glog(gneg_i(z),prec));
                    785:   for (i=1; i<m; i++) h = gadd(h,ginv(stoi(i)));
                    786:
                    787:   bern_upto=m+50; mpbern(bern_upto,prec);
                    788:   q=gun; s=izeta(m,prec);
                    789:   for (n=1; n<=m+1; n++)
                    790:   {
                    791:     q=gdivgs(gmul(q,z),n);
                    792:     s=gadd(s,gmul((n==(m-1))? h: izeta(m-n,prec),q));
                    793:   }
                    794:
                    795:   n = m+3; z=gsqr(z); li = -(bit_accuracy(prec)+1);
                    796:
                    797:   for(;;)
                    798:   {
                    799:     q = gdivgs(gmul(q,z),(n-1)*n);
                    800:     p1 = gmul(izeta(m-n,prec),q);
                    801:     s = gadd(s,p1);
                    802:     if (gexpo(p1) < li) break;
                    803:     n+=2;
                    804:     if (n>=bern_upto) { bern_upto += 50; mpbern(bern_upto,prec); }
                    805:   }
                    806:   return gerepileupto(av,s);
                    807: }
                    808:
                    809: GEN
                    810: polylog(long m, GEN x, long prec)
                    811: {
                    812:   long av,av1,limpile,tetpil,l,e,sx,i;
                    813:   GEN p1,p2,n,y,logx,logx2;
                    814:   GEN *gptr[4];
                    815:
                    816:   if (m<0) err(talker,"negative index in polylog");
                    817:   if (!m) return gneg(ghalf);
                    818:   if (gcmp0(x)) return gcopy(x);
                    819:   av=avma;
                    820:   if (m==1)
                    821:   {
                    822:     p1=glog(gsub(gun,x),prec); tetpil=avma;
                    823:     return gerepile(av,tetpil,gneg(p1));
                    824:   }
                    825:   l=precision(x);
                    826:   if (!l) { l=prec; x=gmul(x, realun(l)); }
                    827:   e=gexpo(gnorm(x)); if (!e || e== -1) return cxpolylog(m,x,prec);
                    828:   if (e>0)
                    829:   {
                    830:     logx=glog(x,l); sx=gsigne(gimag(x));
                    831:     if (!sx)
                    832:     {
                    833:       if (m&1)
                    834:         sx = gsigne(greal(gsub(gun,x)));
                    835:       else
                    836:         sx = -gsigne(greal(x));
                    837:     }
                    838:     x=ginv(x);
                    839:   }
                    840:   av1=avma; limpile=stack_lim(av1,1);
                    841:   y=x; n=gun; p1=x;
                    842:   do
                    843:   {
                    844:     n=addsi(1,n); p1=gmul(x,p1); p2=gdiv(p1,gpuigs(n,m));
                    845:     y=gadd(y,p2);
                    846:     if (low_stack(limpile, stack_lim(av1,1)))
                    847:     {
                    848:       if(DEBUGMEM>1) err(warnmem,"polylog");
                    849:       gptr[0]=&y; gptr[1]=&n; gptr[2]=&p1; gptr[3]=&p2;
                    850:       gerepilemany(av1,gptr,4);
                    851:     }
                    852:   }
                    853:   while (gexpo(p2) > -bit_accuracy(l));
                    854:   tetpil=avma;
                    855:   if (e<=0) return gerepile(av,tetpil,gcopy(y));
                    856:   logx2=gsqr(logx); p1=gneg_i(ghalf);
                    857:   for (i=m-2; i>=0; i-=2)
                    858:   {
                    859:     p1 = gadd(izeta(m-i,l), gmul(p1,gdivgs(logx2,(i+1)*(i+2))));
                    860:   }
                    861:   if (m&1) p1 = gmul(logx,p1);
                    862:   p2=cgetg(3,t_COMPLEX); p2[1]=zero;
                    863:   p2[2]=ldiv(gmulsg(sx,mppi(l)),mpfact(m-1));
                    864:   p1=gadd(gmul2n(p1,1), gmul(p2,gpuigs(logx,m-1)));
                    865:   if ((m&1) == 0) y = gneg_i(y);
                    866:   tetpil=avma; return gerepile(av,tetpil,gadd(p1,y));
                    867: }
                    868:
                    869: GEN
                    870: dilog(GEN x, long prec)
                    871: {
                    872:   GEN p1,p2,p3,y;
                    873:   long av=avma,tetpil;
                    874:
                    875:   if (gcmpgs(gnorm(x),1)<1)
                    876:   {
                    877:     tetpil=avma; return gerepile(av,tetpil,polylog(2,x,prec));
                    878:   }
                    879:   y=gneg_i(polylog(2,ginv(x),prec)); p3=mppi(prec); p2=gdivgs(gsqr(p3),6);
                    880:   p1=glog(gneg_i(x),prec); p1=gadd(p2,gmul2n(gsqr(p1),-1));
                    881:   p1 = gneg_i(p1); tetpil=avma;
                    882:   return gerepile(av,tetpil,gadd(y,p1));
                    883: }
                    884:
                    885: GEN
                    886: polylogd0(long m, GEN x, long flag, long prec)
                    887: {
                    888:   long k,l,av,tetpil,fl,m2;
                    889:   GEN p1,p2,p3,y;
                    890:
                    891:   m2=m&1; av=avma;
                    892:   if (gcmp0(x)) return gcopy(x);
                    893:   if (gcmp1(x) && m>=2) return m2?izeta(m,prec):gzero;
                    894:   l=precision(x);
                    895:   if (!l) { l=prec; x=gmul(x,realun(l)); }
                    896:   p1=gabs(x,prec); fl=0;
                    897:   if (gcmpgs(p1,1)>0) { x=ginv(x); p1=gabs(x,prec); fl=!m2; }
                    898:
                    899:   p1=gneg_i(glog(p1,prec)); p2=gun;
                    900:   y=polylog(m,x,prec); y=m2?greal(y):gimag(y);
                    901:   for (k=1; k<m; k++)
                    902:   {
                    903:     p2=gdivgs(gmul(p2,p1),k);
                    904:     p3=m2?greal(polylog(m-k,x,prec)):gimag(polylog(m-k,x,prec));
                    905:     tetpil=avma; y=gadd(y,gmul(p2,p3));
                    906:   }
                    907:   if (m2)
                    908:   {
                    909:     if (flag)
                    910:       p2 = gdivgs(gmul(p2,p1),-2*m);
                    911:     else
                    912:       p2 = gdivgs(gmul(glog(gnorm(gsub(gun,x)),prec),p2),2*m);
                    913:     tetpil=avma; y=gadd(y,p2);
                    914:   }
                    915:   if (fl) { tetpil=avma; return gerepile(av,tetpil,gneg(y)); }
                    916:   return gerepile(av,tetpil,y);
                    917: }
                    918:
                    919: GEN
                    920: polylogd(long m, GEN x, long prec)
                    921: {
                    922:   return polylogd0(m,x,0,prec);
                    923: }
                    924:
                    925: GEN
                    926: polylogdold(long m, GEN x, long prec)
                    927: {
                    928:   return polylogd0(m,x,1,prec);
                    929: }
                    930:
                    931: GEN
                    932: polylogp(long m, GEN x, long prec)
                    933: {
                    934:   long k,l,av,tetpil,fl,m2;
                    935:   GEN p1,y;
                    936:
                    937:   m2=m&1; av=avma;
                    938:   if (gcmp0(x)) return gcopy(x);
                    939:   if (gcmp1(x) && m>=2) return m2?izeta(m,prec):gzero;
                    940:   l=precision(x);
                    941:   if (!l) { l=prec; x=gmul(x,realun(l)); }
                    942:   p1=gabs(x,prec); fl=0;
                    943:   if (gcmpgs(p1,1)>0) { x=ginv(x); p1=gabs(x,prec); fl=!m2; }
                    944:
                    945:   p1=gmul2n(glog(p1,prec),1); mpbern(m>>1,prec);
                    946:   y=polylog(m,x,prec); y=m2?greal(y):gimag(y);
                    947:
                    948:   if (m==1)
                    949:   {
                    950:     p1=gmul2n(p1,-2); tetpil=avma; y=gadd(y,p1);
                    951:   }
                    952:   else
                    953:   {
                    954:     GEN p2=gun, p3, p4, p5, p51=cgetr(prec);
                    955:
                    956:     for (k=1; k<m; k++)
                    957:     {
                    958:       p2=gdivgs(gmul(p2,p1),k);
                    959:       if (!(k&1) || k==1)
                    960:       {
                    961:        if (k!=1)
                    962:        {
                    963:          p5=(GEN)bern(k>>1);
                    964:          if (bernzone[2]>prec) { affrr(p5,p51); p5=p51; }
                    965:          p4=gmul(p2,p5);
                    966:        }
                    967:        else p4=gneg_i(gmul2n(p2,-1));
                    968:        p3=polylog(m-k,x,prec); p3=m2?greal(p3):gimag(p3);
                    969:        tetpil=avma; y=gadd(y,gmul(p4,p3));
                    970:       }
                    971:     }
                    972:   }
                    973:   if (fl) { tetpil=avma; return gerepile(av,tetpil,gneg(y)); }
                    974:   return gerepile(av,tetpil,y);
                    975: }
                    976:
                    977: GEN
                    978: gpolylog(long m, GEN x, long prec)
                    979: {
                    980:   long i,lx,av=avma,tetpil,v,n;
                    981:   GEN y,p1,p2;
                    982:
                    983:   if (m<=0)
                    984:   {
                    985:     p1=polx[0]; p2=gsub(gun,p1);
                    986:     for (i=1; i<=(-m); i++)
                    987:       p1=gmul(polx[0],gadd(gmul(p2,derivpol(p1)),gmulsg(i,p1)));
                    988:     p1=gdiv(p1,gpuigs(p2,1-m)); tetpil=avma;
                    989:     return gerepile(av,tetpil,poleval(p1,x));
                    990:   }
                    991:
                    992:   switch(typ(x))
                    993:   {
                    994:     case t_INT: case t_REAL: case t_FRAC: case t_FRACN:
                    995:     case t_COMPLEX: case t_QUAD:
                    996:       return polylog(m,x,prec);
                    997:
                    998:     case t_INTMOD: case t_PADIC: case t_POLMOD:
                    999:       p1=roots((GEN)x[1],prec); lx=lg(p1); p2=cgetg(lx,t_COL);
                   1000:       for (i=1; i<lx; i++) p2[i]=lpoleval((GEN)x[2],(GEN)p1[i]);
                   1001:       tetpil=avma; y=cgetg(lx,t_COL);
                   1002:       for (i=1; i<lx; i++) y[i]=(long)polylog(m,(GEN)p2[i],prec);
                   1003:       return gerepile(av,tetpil,y);
                   1004:
                   1005:     case t_POL: case t_RFRAC: case t_RFRACN:
                   1006:       p1=tayl(x,gvar(x),precdl); tetpil=avma;
                   1007:       return gerepile(av,tetpil,gpolylog(m,p1,prec));
                   1008:
                   1009:     case t_SER:
                   1010:       if (!m) return gneg(ghalf);
                   1011:       if (m==1)
                   1012:       {
                   1013:        p1=glog(gsub(gun,x),prec); tetpil=avma;
                   1014:        return gerepile(av,tetpil,gneg(p1));
                   1015:       }
                   1016:       if (valp(x)<=0) err(impl,"polylog around a!=0");
                   1017:       v=varn(x); n=(lg(x)-2)/valp(x); y=ggrando(polx[v],lg(x)-2);
                   1018:       for (i=n; i>=1; i--)
                   1019:       {
                   1020:        p1=gadd(gpuigs(stoi(i),-m),y); tetpil=avma;
                   1021:        y=gmul(x,p1);
                   1022:       }
                   1023:       return gerepile(av,tetpil,y);
                   1024:
                   1025:     case t_VEC: case t_COL: case t_MAT:
                   1026:       lx=lg(x); y=cgetg(lx,typ(x));
                   1027:       for (i=1; i<lx; i++)
                   1028:        y[i]=(long)gpolylog(m,(GEN)x[i],prec);
                   1029:       return y;
                   1030:   }
                   1031:   err(typeer,"gpolylog");
                   1032:   return NULL; /* not reached */
                   1033: }
                   1034:
                   1035: void
                   1036: gpolylogz(long m, GEN x, GEN y)
                   1037: {
                   1038:   long av=avma, prec = precision(y);
                   1039:
                   1040:   if (!prec) err(infprecer,"gpolylogz");
                   1041:   gaffect(gpolylog(m,x,prec),y); avma=av;
                   1042: }
                   1043:
                   1044: GEN
                   1045: polylog0(long m, GEN x, long flag, long prec)
                   1046: {
                   1047:   switch(flag)
                   1048:   {
                   1049:     case 0: return gpolylog(m,x,prec);
                   1050:     case 1: return polylogd(m,x,prec);
                   1051:     case 2: return polylogdold(m,x,prec);
                   1052:     case 3: return polylogp(m,x,prec);
                   1053:     default: err(flagerr,"polylog");
                   1054:   }
                   1055:   return NULL; /* not reached */
                   1056: }
                   1057:
                   1058: static GEN
                   1059: qq(GEN x, long prec)
                   1060: {
                   1061:   long tx=typ(x);
                   1062:
                   1063:   if (tx==t_PADIC) return x;
                   1064:   if (is_scalar_t(tx))
                   1065:   {
                   1066:     long l=precision(x);
                   1067:     GEN p1,p2,q;
                   1068:
                   1069:     if (tx != t_COMPLEX || gcmp((GEN)x[2],gzero)<=0)
                   1070:       err(talker,"argument must belong to upper half-plane");
                   1071:
                   1072:     if (!l) l=prec; p1=mppi(l); setexpo(p1,2);
                   1073:     p2=cgetg(3,t_COMPLEX); p2[1]=zero; p2[2]=(long)p1; /* 2*I*Pi */
                   1074:     q=gmul(x,p2); return gexp(q,prec);
                   1075:   }
                   1076:   if (tx != t_POL && tx != t_SER)
                   1077:     err(talker,"bad argument for modular function");
                   1078:
                   1079:   return tayl(x,gvar(x),precdl);
                   1080: }
                   1081:
                   1082: static GEN
                   1083: inteta(GEN q)
                   1084: {
                   1085:   long tx=typ(q);
                   1086:   GEN p1,ps,qn,y;
                   1087:
                   1088:   y=gun; qn=gun; ps=gun;
                   1089:   if (tx==t_PADIC)
                   1090:   {
                   1091:     for(;;)
                   1092:     {
                   1093:       p1=gneg_i(gmul(ps,gmul(q,gsqr(qn))));
                   1094:       y=gadd(y,p1); qn=gmul(qn,q); ps=gmul(p1,qn);
                   1095:       p1=y; y=gadd(y,ps); if (gegal(p1,y)) return y;
                   1096:     }
                   1097:   }
                   1098:   else
                   1099:   {
                   1100:     long l,v, av = avma, lim = stack_lim(av,3);
                   1101:
                   1102:     if (is_scalar_t(tx)) l = -bit_accuracy(precision(q));
                   1103:     else
                   1104:       { v=gvar(q); tx = 0; }
                   1105:     for(;;)
                   1106:     {
                   1107:       p1=gneg_i(gmul(ps,gmul(q,gsqr(qn))));
                   1108:       y=gadd(y,p1); qn=gmul(qn,q); ps=gmul(p1,qn);
                   1109:       y=gadd(y,ps);
                   1110:       if (tx)
                   1111:         { if (gexpo(ps)-gexpo(y) < l) return y; }
                   1112:       else
                   1113:         { if (gval(ps,v)>=precdl) return y; }
                   1114:       if (low_stack(lim, stack_lim(av,3)))
                   1115:       {
                   1116:         GEN *gptr[3];
                   1117:         if(DEBUGMEM>1) err(warnmem,"inteta");
                   1118:         gptr[0]=&y; gptr[1]=&qn; gptr[2]=&ps;
                   1119:         gerepilemany(av,gptr,3);
                   1120:       }
                   1121:     }
                   1122:   }
                   1123: }
                   1124:
                   1125: GEN
                   1126: eta(GEN x, long prec)
                   1127: {
                   1128:   long av = avma;
                   1129:   GEN q = qq(x,prec);
                   1130:   return gerepileupto(av,inteta(q));
                   1131: }
                   1132:
                   1133: /* returns the true value of eta(x) for Im(x) > 0, using reduction */
                   1134: GEN
                   1135: trueeta(GEN x, long prec)
                   1136: {
                   1137:   long tx=typ(x), av=avma, tetpil,l;
                   1138:   GEN p1,p2,q,q24,n,z,m,unapprox;
                   1139:
                   1140:   if (!is_scalar_t(tx)) err(typeer,"trueeta");
                   1141:   if (tx != t_COMPLEX || gsigne((GEN)x[2])<=0)
                   1142:     err(talker,"argument must belong to upper half-plane");
                   1143:   l=precision(x); if (l) prec=l;
                   1144:   p1=mppi(prec); setexpo(p1,2);
                   1145:   p2=cgetg(3,t_COMPLEX); p2[1]=zero; p2[2]=(long)p1; /* 2*I*Pi */
                   1146:   z=gexp(gdivgs(p2,24),prec); /* exp(2*I*Pi/24) */
                   1147:   unapprox=gsub(gun,gpuigs(stoi(10),-8));
                   1148:   m=gun;
                   1149:   for(;;)
                   1150:   {
                   1151:     n=ground(greal(x));
                   1152:     if (signe(n)) {x=gsub(x,n); m=gmul(m,powgi(z,n));}
                   1153:     if (gcmp(gnorm(x), unapprox)>=0) break;
                   1154:     m=gmul(m,gsqrt(gdiv(gi,x),prec)); x=gdivsg(-1,x);
                   1155:   }
                   1156:   q=gmul(p2,x);
                   1157:   q24=gexp(gdivgs(q,24),prec); q=gpuigs(q24,24);
                   1158:   p1=gmul(m,q24); q = inteta(q); tetpil=avma;
                   1159:   return gerepile(av,tetpil,gmul(p1,q));
                   1160: }
                   1161:
                   1162: GEN
                   1163: eta0(GEN x, long flag,long prec)
                   1164: {
                   1165:   return flag? trueeta(x,prec): eta(x,prec);
                   1166: }
                   1167:
                   1168: GEN
                   1169: jell(GEN x, long prec)
                   1170: {
                   1171:   long av=avma,tetpil,tx = typ(x);
                   1172:   GEN p1;
                   1173:
                   1174:   if (!is_scalar_t(tx))
                   1175:   {
                   1176:     GEN p2,q = qq(x,prec);
                   1177:     p1=gdiv(inteta(gsqr(q)), inteta(q));
                   1178:     p1=gmul2n(gsqr(p1),1);
                   1179:     p1=gmul(q,gpuigs(p1,12));
                   1180:     p2=gaddsg(768,gadd(gsqr(p1),gdivsg(4096,p1)));
                   1181:     p1=gmulsg(48,p1); tetpil=avma;
                   1182:     return gerepile(av,tetpil,gadd(p2,p1));
                   1183:   }
                   1184:   p1=gdiv(trueeta(gmul2n(x,1),prec),trueeta(x,prec));
                   1185:   p1=gsqr(gsqr(gsqr(p1)));
                   1186:   p1=gadd(gmul2n(gsqr(p1),8), ginv(p1)); tetpil=avma;
                   1187:   return gerepile(av,tetpil,gpuigs(p1,3));
                   1188: }
                   1189:
                   1190: GEN
                   1191: wf2(GEN x, long prec)
                   1192: {
                   1193:   long av=avma,tetpil;
                   1194:   GEN p1,p2;
                   1195:
                   1196:   p1=gsqrt(gdeux,prec);
                   1197:   p2=gdiv(trueeta(gmul2n(x,1),prec),trueeta(x,prec));
                   1198:   tetpil=avma;
                   1199:   return gerepile(av,tetpil,gmul(p1,p2));
                   1200: }
                   1201:
                   1202: GEN
                   1203: wf1(GEN x, long prec)
                   1204: {
                   1205:   long av=avma,tetpil;
                   1206:   GEN p1,p2;
                   1207:
                   1208:   p1=trueeta(gmul2n(x,-1),prec); p2=trueeta(x,prec);
                   1209:   tetpil=avma;
                   1210:   return gerepile(av,tetpil,gdiv(p1,p2));
                   1211: }
                   1212:
                   1213: GEN
                   1214: wf(GEN x, long prec)
                   1215: {
                   1216:   long av=avma,tetpil;
                   1217:   GEN p1,p2;
                   1218:
                   1219:   p1=gdiv(trueeta(gmul2n(gaddgs(x,1),-1),prec),trueeta(x,prec));
                   1220:   p2=cgetg(3,t_COMPLEX); p2[1]=zero; p2[2]=ldivrs(mppi(prec),-24);
                   1221:   p2=gexp(p2,prec); tetpil=avma;
                   1222:   return gerepile(av,tetpil,gmul(p1,p2));
                   1223: }
                   1224:
                   1225: GEN
                   1226: weber0(GEN x, long flag,long prec)
                   1227: {
                   1228:   switch(flag)
                   1229:   {
                   1230:     case 0: return wf(x,prec);
                   1231:     case 1: return wf1(x,prec);
                   1232:     case 2: return wf2(x,prec);
                   1233:     default: err(flagerr,"weber");
                   1234:   }
                   1235:   return NULL; /* not reached */
                   1236: }
                   1237:
                   1238: static GEN
                   1239: sagm(GEN x, long prec)
                   1240: {
                   1241:   GEN p1,a,b,a1,b1,y;
                   1242:   long av,tetpil,l,ep;
                   1243:
                   1244:   if (gcmp0(x)) return gcopy(x);
                   1245:   switch(typ(x))
                   1246:   {
                   1247:     case t_REAL:
                   1248:       l = precision(x); y = cgetr(l); av=avma;
                   1249:       a1 = x; b1 = realun(l);
                   1250:       l = 5-bit_accuracy(prec);
                   1251:       do
                   1252:       {
                   1253:        a=a1; b=b1; a1 = addrr(a,b);
                   1254:         setexpo(a1,expo(a1)-1);
                   1255:        b1=mpsqrt(mulrr(a,b));
                   1256:       }
                   1257:       while (expo(subrr(b1,a1))-expo(b1) >= l);
                   1258:       affrr(a1,y); avma=av; return y;
                   1259:
                   1260:     case t_COMPLEX:
                   1261:       if (gcmp0((GEN)x[2]))
                   1262:         return transc(sagm,(GEN)x[1],prec);
                   1263:       av=avma; l=precision(x); if (l) prec=l;
                   1264:       a1=x; b1=gun; l = 5-bit_accuracy(prec);
                   1265:       do
                   1266:       {
                   1267:        a=a1; b=b1;
                   1268:        a1=gmul2n(gadd(a,b),-1);
                   1269:        b1=gsqrt(gmul(a,b),prec);
                   1270:       }
                   1271:       while (gexpo(gsub(b1,a1))-gexpo(b1) >= l);
                   1272:       tetpil=avma; return gerepile(av,tetpil,gcopy(a1));
                   1273:
                   1274:     case t_PADIC:
                   1275:       av=avma; a1=x; b1=gun; l=precp(x);
                   1276:       do
                   1277:       {
                   1278:        a=a1; b=b1;
                   1279:        a1=gmul2n(gadd(a,b),-1); b1=gsqrt(gmul(a,b),0);
                   1280:        p1=gsub(b1,a1); ep=valp(p1)-valp(b1);
                   1281:        if (ep<=0) { b1=gneg_i(b1); p1=gsub(b1,a1); ep=valp(p1)-valp(b1); }
                   1282:       }
                   1283:       while (ep<l && !gcmp0(p1));
                   1284:       tetpil=avma; return gerepile(av,tetpil,gcopy(a1));
                   1285:
                   1286:     case t_SER:
                   1287:       av=avma; a1=x; b1=gun; l=lg(x)-2;
                   1288:       do
                   1289:       {
                   1290:        a=a1; b=b1;
                   1291:        a1=gmul2n(gadd(a,b),-1); b1=gsqrt(gmul(a,b),0);
                   1292:        p1=gsub(b1,a1); ep=valp(p1)-valp(b1);
                   1293:       }
                   1294:       while (ep<l && !gcmp0(p1));
                   1295:       tetpil=avma; return gerepile(av,tetpil,gcopy(a1));
                   1296:
                   1297:     case t_INTMOD:
                   1298:       err(impl,"agm of mod");
                   1299:   }
                   1300:   return transc(sagm,x,prec);
                   1301: }
                   1302:
                   1303: GEN
                   1304: agm(GEN x, GEN y, long prec)
                   1305: {
                   1306:   long av,tetpil, ty=typ(y);
                   1307:   GEN z;
                   1308:
                   1309:   if (is_matvec_t(ty))
                   1310:   {
                   1311:     ty=typ(x);
                   1312:     if (is_matvec_t(ty)) err(talker,"agm of two vector/matrices");
                   1313:     z=x; x=y; y=z;
                   1314:   }
                   1315:   if (gcmp0(y)) return gcopy(y);
                   1316:   av=avma; z=sagm(gdiv(x,y),prec); tetpil=avma;
                   1317:   return gerepile(av,tetpil,gmul(y,z));
                   1318: }
                   1319:
                   1320: GEN
                   1321: logagm(GEN q)
                   1322: {
                   1323:   long av=avma,prec=lg(q),tetpil,s,n,lim;
                   1324:   GEN y,q4,q1;
                   1325:
                   1326:   if (typ(q)!=t_REAL) err(typeer,"logagm");
                   1327:   if (signe(q)<=0) err(talker,"non positive argument in logagm");
                   1328:   if (expo(q)<0) s=1; else { q=ginv(q); s=0; }
                   1329:   lim = - (bit_accuracy(prec) >> 1);
                   1330:   for (n=0; expo(q)>=lim ; n++) { q1=q; q=gsqr(q); }
                   1331:   q4=gmul2n(q,2);
                   1332:   if (!n) q1=gsqrt(q,prec);
                   1333:   y=divrr(mppi(prec), agm(addsr(1,q4),gmul2n(q1,2),prec));
                   1334:   tetpil=avma; y=gmul2n(y,-n); if (s) setsigne(y,-1);
                   1335:   return gerepile(av,tetpil,y);
                   1336: }
                   1337:
                   1338: GEN
                   1339: glogagm(GEN x, long prec)
                   1340: {
                   1341:   long av,tetpil;
                   1342:   GEN y,p1,p2;
                   1343:
                   1344:   switch(typ(x))
                   1345:   {
                   1346:     case t_REAL:
                   1347:       if (signe(x)>=0) return logagm(x);
                   1348:
                   1349:       y=cgetg(3,t_COMPLEX); y[2]=lmppi(lg(x));
                   1350:       setsigne(x,1); y[1]=(long)logagm(x);
                   1351:       setsigne(x,-1); return y;
                   1352:
                   1353:     case t_COMPLEX:
                   1354:       y=cgetg(3,t_COMPLEX); y[2]=larg(x,prec);
                   1355:       av=avma; p1=glogagm(gnorm(x),prec); tetpil=avma;
                   1356:       y[1]=lpile(av,tetpil,gmul2n(p1,-1));
                   1357:       return y;
                   1358:
                   1359:     case t_PADIC:
                   1360:       return palog(x);
                   1361:
                   1362:     case t_SER:
                   1363:       av=avma; if (valp(x)) err(negexper,"glogagm");
                   1364:       p1=gdiv(derivser(x),x);
                   1365:       p1=integ(p1,varn(x));
                   1366:       if (gcmp1((GEN)x[2])) return gerepileupto(av,p1);
                   1367:       p2=glogagm((GEN)x[2],prec); tetpil=avma;
                   1368:       return gerepile(av,tetpil,gadd(p1,p2));
                   1369:
                   1370:     case t_INTMOD:
                   1371:       err(typeer,"glogagm");
                   1372:   }
                   1373:   return transc(glogagm,x,prec);
                   1374: }
                   1375:
                   1376: GEN
                   1377: theta(GEN q, GEN z, long prec)
                   1378: {
                   1379:   long av=avma,tetpil,l,n;
                   1380:   GEN ps,qn,qnold,y,zy,lq,ps2,p1,k,zold;
                   1381:
                   1382:   if (gexpo(q)>=0) err(thetaer1);
                   1383:   l=precision(q); if (l) prec=l;
                   1384:   p1=realun(prec); z=gmul(p1,z);
                   1385:   if (!l) q=gmul(p1,q);
                   1386:   zy = gimag(z);
                   1387:   if (gcmp0(zy)) k=gzero;
                   1388:   else
                   1389:   {
                   1390:     lq=glog(q,prec); k=ground(gdiv(zy,greal(lq)));
                   1391:     if (!gcmp0(k)) { zold=z; z=gadd(z,gdiv(gmul(lq,k),gi)); }
                   1392:   }
                   1393:   y=gsin(z,prec); n=0; qn=gun;
                   1394:   ps2=gsqr(q); ps=gneg_i(ps2);
                   1395:   do
                   1396:   {
                   1397:     n++; p1=gsin(gmulsg(2*n+1,z),prec);
                   1398:     qnold=qn; qn=gmul(qn,ps);
                   1399:     ps=gmul(ps,ps2); p1=gmul(p1,qn); y=gadd(y,p1);
                   1400:   }
                   1401:   while (gexpo(qnold) >= -bit_accuracy(prec));
                   1402:   if (signe(k))
                   1403:   {
                   1404:     y=gmul(y,gmul(gpui(q,gsqr(k),prec),
                   1405:                   gexp(gmul2n(gmul(gmul(gi,zold),k),1),prec)));
                   1406:     if (mod2(k)) y=gneg_i(y);
                   1407:   }
                   1408:   p1=gmul2n(gsqrt(gsqrt(q,prec),prec),1); tetpil=avma;
                   1409:   return gerepile(av,tetpil,gmul(p1,y));
                   1410: }
                   1411:
                   1412: GEN
                   1413: thetanullk(GEN q, long k, long prec)
                   1414: {
                   1415:   long av=avma,tetpil,l,n;
                   1416:   GEN p1,ps,qn,y,ps2;
                   1417:
                   1418:   if (gexpo(q)>=0) err(thetaer1);
                   1419:   if (!(k&1)) return gzero;
                   1420:   n=0; qn=gun; ps2=gsqr(q); ps=gneg_i(ps2);
                   1421:   y=gun; l=precision(q);
                   1422:   if (!l) { l=prec; q=gmul(q,realun(l)); }
                   1423:
                   1424:   do
                   1425:   {
                   1426:     n++; p1=gpuigs(stoi(n+n+1),k); qn=gmul(qn,ps);
                   1427:     ps=gmul(ps,ps2); p1=gmul(p1,qn); y=gadd(y,p1);
                   1428:   }
                   1429:   while (gexpo(p1) >= -bit_accuracy(l));
                   1430:   p1=gmul2n(gsqrt(gsqrt(q,prec),prec),1); tetpil=avma;
                   1431:   if (k&2) { p1=gneg_i(p1); tetpil=avma; }
                   1432:   return gerepile(av,tetpil,gmul(p1,y));
                   1433: }
                   1434:
                   1435: GEN
                   1436: jbesselh(GEN n, GEN z, long prec)
                   1437: {
                   1438:   long av,tetpil,k,l,i,lz;
                   1439:   GEN y,p1,p2,zinv,p0,s,c;
                   1440:
                   1441:   if (typ(n)!=t_INT) err(talker,"not an integer index in jbesselh");
                   1442:   k=itos(n); if (k<0) err(impl,"ybesselh");
                   1443:
                   1444:   switch(typ(z))
                   1445:   {
                   1446:     case t_REAL: case t_COMPLEX:
                   1447:       if (gcmp0(z)) return gzero;
                   1448:       av=avma; zinv=ginv(z);
                   1449:       l=precision(z); if (l>prec) prec=l;
                   1450:       gsincos(z,&s,&c,prec);
                   1451:       p1=gmul(zinv,s);
                   1452:       if (k)
                   1453:       {
                   1454:         p0=p1; p1=gmul(zinv,gsub(p0,c));
                   1455:        for (i=2; i<=k; i++)
                   1456:        {
                   1457:          p2=gsub(gmul(gmulsg(2*i-1,zinv),p1),p0);
                   1458:           p0=p1; p1=p2;
                   1459:        }
                   1460:       }
                   1461:       p2=gsqrt(gdiv(gmul2n(z,1),mppi(prec)),prec);
                   1462:       tetpil=avma; return gerepile(av,tetpil,gmul(p2,p1));
                   1463:
                   1464:     case t_VEC: case t_COL: case t_MAT:
                   1465:       lz=lg(z); y=cgetg(lz,typ(z));
                   1466:       for (i=1; i<lz; i++)
                   1467:        y[i]=(long)jbesselh(n,(GEN)z[i],prec);
                   1468:       return y;
                   1469:
                   1470:     case t_INT: case t_FRAC: case t_FRACN:
                   1471:       av=avma; p1=cgetr(prec); gaffect(z,p1); tetpil=avma;
                   1472:       return gerepile(av,tetpil,jbesselh(n,p1,prec));
                   1473:
                   1474:     case t_QUAD:
                   1475:       av=avma; p1=gmul(z,realun(prec)); tetpil=avma;
                   1476:       return gerepile(av,tetpil,jbesselh(n,p1,prec));
                   1477:
                   1478:     case t_POL: case t_RFRAC: case t_RFRACN:
                   1479:       av=avma; p1=tayl(z,gvar(z),precdl); tetpil=avma;
                   1480:       return gerepile(av,tetpil,jbesselh(n,p1,prec));
                   1481:
                   1482:     case t_POLMOD:
                   1483:       av=avma; p1=roots((GEN)z[1],prec); lz=lg(p1); p2=cgetg(lz,t_COL);
                   1484:       for (i=1; i<lz; i++) p2[i]=lpoleval((GEN)z[2],(GEN)p1[i]);
                   1485:       tetpil=avma; y=cgetg(lz,t_COL);
                   1486:       for (i=1; i<lz; i++) y[i]=(long)jbesselh(n,(GEN)p2[i],prec);
                   1487:       return gerepile(av,tetpil,y);
                   1488:
                   1489:     case t_PADIC:
                   1490:       err(impl,"p-adic jbessel function");
                   1491:     case t_SER:
                   1492:       err(impl,"jbessel of power series");
                   1493:   }
                   1494:   err(typeer,"jbesselh");
                   1495:   return NULL; /* not reached */
                   1496: }

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