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

Annotation of OpenXM_contrib/pari-2.2/src/basemath/trans3.c, Revision 1.1

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

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