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>