[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     ! 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>