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>