Annotation of OpenXM_contrib/pari-2.2/src/basemath/trans3.c, Revision 1.1.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>