3 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or (at
8 * your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 /* Author: G. Jungman */
23 #include <gsl/gsl_math.h>
24 #include <gsl/gsl_errno.h>
25 #include <gsl/gsl_sf_elementary.h>
26 #include <gsl/gsl_sf_exp.h>
27 #include <gsl/gsl_sf_gamma.h>
28 #include <gsl/gsl_sf_pow_int.h>
29 #include <gsl/gsl_sf_zeta.h>
33 #include "chebyshev.h"
34 #include "cheb_eval.c"
36 #define LogTwoPi_ 1.8378770664093454835606594728111235279723
39 /*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
41 /* chebyshev fit for (s(t)-1)Zeta[s(t)]
45 static double zeta_xlt1_data[14] = {
46 1.48018677156931561235192914649,
47 0.25012062539889426471999938167,
48 0.00991137502135360774243761467,
49 -0.00012084759656676410329833091,
50 -4.7585866367662556504652535281e-06,
51 2.2229946694466391855561441361e-07,
52 -2.2237496498030257121309056582e-09,
53 -1.0173226513229028319420799028e-10,
54 4.3756643450424558284466248449e-12,
55 -6.2229632593100551465504090814e-14,
56 -6.6116201003272207115277520305e-16,
57 4.9477279533373912324518463830e-17,
58 -1.0429819093456189719660003522e-18,
59 6.9925216166580021051464412040e-21,
61 static cheb_series zeta_xlt1_cs = {
68 /* chebyshev fit for (s(t)-1)Zeta[s(t)]
72 static double zeta_xgt1_data[30] = {
73 19.3918515726724119415911269006,
74 9.1525329692510756181581271500,
75 0.2427897658867379985365270155,
76 -0.1339000688262027338316641329,
77 0.0577827064065028595578410202,
78 -0.0187625983754002298566409700,
79 0.0039403014258320354840823803,
80 -0.0000581508273158127963598882,
81 -0.0003756148907214820704594549,
82 0.0001892530548109214349092999,
83 -0.0000549032199695513496115090,
84 8.7086484008939038610413331863e-6,
85 6.4609477924811889068410083425e-7,
86 -9.6749773915059089205835337136e-7,
87 3.6585400766767257736982342461e-7,
88 -8.4592516427275164351876072573e-8,
89 9.9956786144497936572288988883e-9,
90 1.4260036420951118112457144842e-9,
91 -1.1761968823382879195380320948e-9,
92 3.7114575899785204664648987295e-10,
93 -7.4756855194210961661210215325e-11,
94 7.8536934209183700456512982968e-12,
95 9.9827182259685539619810406271e-13,
96 -7.5276687030192221587850302453e-13,
97 2.1955026393964279988917878654e-13,
98 -4.1934859852834647427576319246e-14,
99 4.6341149635933550715779074274e-15,
100 2.3742488509048340106830309402e-16,
101 -2.7276516388124786119323824391e-16,
102 7.8473570134636044722154797225e-17
104 static cheb_series zeta_xgt1_cs = {
112 /* chebyshev fit for Ln[Zeta[s(t)] - 1 - 2^(-s(t))]
114 * -1 <= t <= 1; 5 <= s <= 15
116 static double zetam1_inter_data[24] = {
117 -21.7509435653088483422022339374,
118 -5.63036877698121782876372020472,
119 0.0528041358684229425504861579635,
120 -0.0156381809179670789342700883562,
121 0.00408218474372355881195080781927,
122 -0.0010264867349474874045036628282,
123 0.000260469880409886900143834962387,
124 -0.0000676175847209968878098566819447,
125 0.0000179284472587833525426660171124,
126 -4.83238651318556188834107605116e-6,
127 1.31913788964999288471371329447e-6,
128 -3.63760500656329972578222188542e-7,
129 1.01146847513194744989748396574e-7,
130 -2.83215225141806501619105289509e-8,
131 7.97733710252021423361012829496e-9,
132 -2.25850168553956886676250696891e-9,
133 6.42269392950164306086395744145e-10,
134 -1.83363861846127284505060843614e-10,
135 5.25309763895283179960368072104e-11,
136 -1.50958687042589821074710575446e-11,
137 4.34997545516049244697776942981e-12,
138 -1.25597782748190416118082322061e-12,
139 3.61280740072222650030134104162e-13,
140 -9.66437239205745207188920348801e-14
142 static cheb_series zetam1_inter_cs = {
151 /* assumes s >= 0 and s != 1.0 */
154 riemann_zeta_sgt0(double s, gsl_sf_result * result)
158 cheb_eval_e(&zeta_xlt1_cs, 2.0*s - 1.0, &c);
159 result->val = c.val / (s - 1.0);
160 result->err = c.err / fabs(s-1.0) + GSL_DBL_EPSILON * fabs(result->val);
164 double x = (2.0*s - 21.0)/19.0;
166 cheb_eval_e(&zeta_xgt1_cs, x, &c);
167 result->val = c.val / (s - 1.0);
168 result->err = c.err / (s - 1.0) + GSL_DBL_EPSILON * fabs(result->val);
172 double f2 = 1.0 - pow(2.0,-s);
173 double f3 = 1.0 - pow(3.0,-s);
174 double f5 = 1.0 - pow(5.0,-s);
175 double f7 = 1.0 - pow(7.0,-s);
176 result->val = 1.0/(f2*f3*f5*f7);
177 result->err = 3.0 * GSL_DBL_EPSILON * fabs(result->val);
185 riemann_zeta1ms_slt0(double s, gsl_sf_result * result)
188 double x = (-19 - 2.0*s)/19.0;
190 cheb_eval_e(&zeta_xgt1_cs, x, &c);
191 result->val = c.val / (-s);
192 result->err = c.err / (-s) + GSL_DBL_EPSILON * fabs(result->val);
196 double f2 = 1.0 - pow(2.0,-(1.0-s));
197 double f3 = 1.0 - pow(3.0,-(1.0-s));
198 double f5 = 1.0 - pow(5.0,-(1.0-s));
199 double f7 = 1.0 - pow(7.0,-(1.0-s));
200 result->val = 1.0/(f2*f3*f5*f7);
201 result->err = 3.0 * GSL_DBL_EPSILON * fabs(result->val);
207 /* works for 5 < s < 15*/
209 riemann_zeta_minus_1_intermediate_s(double s, gsl_sf_result * result)
211 double t = (s - 10.0)/5.0;
213 cheb_eval_e(&zetam1_inter_cs, t, &c);
214 result->val = exp(c.val) + pow(2.0, -s);
215 result->err = (c.err + 2.0*GSL_DBL_EPSILON)*result->val;
220 /* assumes s is large and positive
221 * write: zeta(s) - 1 = zeta(s) * (1 - 1/zeta(s))
222 * and expand a few terms of the product formula to evaluate 1 - 1/zeta(s)
224 * works well for s > 15
227 riemann_zeta_minus1_large_s(double s, gsl_sf_result * result)
229 double a = pow( 2.0,-s);
230 double b = pow( 3.0,-s);
231 double c = pow( 5.0,-s);
232 double d = pow( 7.0,-s);
233 double e = pow(11.0,-s);
234 double f = pow(13.0,-s);
235 double t1 = a + b + c + d + e + f;
236 double t2 = a*(b+c+d+e+f) + b*(c+d+e+f) + c*(d+e+f) + d*(e+f) + e*f;
238 double t3 = a*(b*(c+d+e+f) + c*(d+e+f) + d*(e+f) + e*f) +
239 b*(c*(d+e+f) + d*(e+f) + e*f) +
242 double t4 = a*(b*(c*(d + e + f) + d*(e + f) + e*f) + c*(d*(e+f) + e*f) + d*e*f) +
243 b*(c*(d*(e+f) + e*f) + d*e*f) +
245 double t5 = b*c*d*e*f + a*c*d*e*f+ a*b*d*e*f+ a*b*c*e*f+ a*b*c*d*f+ a*b*c*d*e;
246 double t6 = a*b*c*d*e*f;
248 double numt = t1 - t2 /* + t3 - t4 + t5 - t6 */;
249 double zeta = 1.0/((1.0-a)*(1.0-b)*(1.0-c)*(1.0-d)*(1.0-e)*(1.0-f));
250 result->val = numt*zeta;
251 result->err = (15.0/s + 1.0) * 6.0*GSL_DBL_EPSILON*result->val;
258 #define ZETA_POS_TABLE_NMAX 100
259 static double zeta_pos_int_table_OLD[ZETA_POS_TABLE_NMAX+1] = {
260 -0.50000000000000000000000000000, /* zeta(0) */
261 0.0 /* FIXME: DirectedInfinity() */, /* zeta(1) */
262 1.64493406684822643647241516665, /* ... */
263 1.20205690315959428539973816151,
264 1.08232323371113819151600369654,
265 1.03692775514336992633136548646,
266 1.01734306198444913971451792979,
267 1.00834927738192282683979754985,
268 1.00407735619794433937868523851,
269 1.00200839282608221441785276923,
270 1.00099457512781808533714595890,
271 1.00049418860411946455870228253,
272 1.00024608655330804829863799805,
273 1.00012271334757848914675183653,
274 1.00006124813505870482925854511,
275 1.00003058823630702049355172851,
276 1.00001528225940865187173257149,
277 1.00000763719763789976227360029,
278 1.00000381729326499983985646164,
279 1.00000190821271655393892565696,
280 1.00000095396203387279611315204,
281 1.00000047693298678780646311672,
282 1.00000023845050272773299000365,
283 1.00000011921992596531107306779,
284 1.00000005960818905125947961244,
285 1.00000002980350351465228018606,
286 1.00000001490155482836504123466,
287 1.00000000745071178983542949198,
288 1.00000000372533402478845705482,
289 1.00000000186265972351304900640,
290 1.00000000093132743241966818287,
291 1.00000000046566290650337840730,
292 1.00000000023283118336765054920,
293 1.00000000011641550172700519776,
294 1.00000000005820772087902700889,
295 1.00000000002910385044497099687,
296 1.00000000001455192189104198424,
297 1.00000000000727595983505748101,
298 1.00000000000363797954737865119,
299 1.00000000000181898965030706595,
300 1.00000000000090949478402638893,
301 1.00000000000045474737830421540,
302 1.00000000000022737368458246525,
303 1.00000000000011368684076802278,
304 1.00000000000005684341987627586,
305 1.00000000000002842170976889302,
306 1.00000000000001421085482803161,
307 1.00000000000000710542739521085,
308 1.00000000000000355271369133711,
309 1.00000000000000177635684357912,
310 1.00000000000000088817842109308,
311 1.00000000000000044408921031438,
312 1.00000000000000022204460507980,
313 1.00000000000000011102230251411,
314 1.00000000000000005551115124845,
315 1.00000000000000002775557562136,
316 1.00000000000000001387778780973,
317 1.00000000000000000693889390454,
318 1.00000000000000000346944695217,
319 1.00000000000000000173472347605,
320 1.00000000000000000086736173801,
321 1.00000000000000000043368086900,
322 1.00000000000000000021684043450,
323 1.00000000000000000010842021725,
324 1.00000000000000000005421010862,
325 1.00000000000000000002710505431,
326 1.00000000000000000001355252716,
327 1.00000000000000000000677626358,
328 1.00000000000000000000338813179,
329 1.00000000000000000000169406589,
330 1.00000000000000000000084703295,
331 1.00000000000000000000042351647,
332 1.00000000000000000000021175824,
333 1.00000000000000000000010587912,
334 1.00000000000000000000005293956,
335 1.00000000000000000000002646978,
336 1.00000000000000000000001323489,
337 1.00000000000000000000000661744,
338 1.00000000000000000000000330872,
339 1.00000000000000000000000165436,
340 1.00000000000000000000000082718,
341 1.00000000000000000000000041359,
342 1.00000000000000000000000020680,
343 1.00000000000000000000000010340,
344 1.00000000000000000000000005170,
345 1.00000000000000000000000002585,
346 1.00000000000000000000000001292,
347 1.00000000000000000000000000646,
348 1.00000000000000000000000000323,
349 1.00000000000000000000000000162,
350 1.00000000000000000000000000081,
351 1.00000000000000000000000000040,
352 1.00000000000000000000000000020,
353 1.00000000000000000000000000010,
354 1.00000000000000000000000000005,
355 1.00000000000000000000000000003,
356 1.00000000000000000000000000001,
357 1.00000000000000000000000000001,
358 1.00000000000000000000000000000,
359 1.00000000000000000000000000000,
360 1.00000000000000000000000000000
366 #define ZETA_POS_TABLE_NMAX 100
367 static double zetam1_pos_int_table[ZETA_POS_TABLE_NMAX+1] = {
369 0.0, /* FIXME: Infinity */ /* zeta(1) - 1 */
370 0.644934066848226436472415166646, /* zeta(2) - 1 */
371 0.202056903159594285399738161511,
372 0.082323233711138191516003696541,
373 0.036927755143369926331365486457,
374 0.017343061984449139714517929790,
375 0.008349277381922826839797549849,
376 0.004077356197944339378685238508,
377 0.002008392826082214417852769232,
378 0.000994575127818085337145958900,
379 0.000494188604119464558702282526,
380 0.000246086553308048298637998047,
381 0.000122713347578489146751836526,
382 0.000061248135058704829258545105,
383 0.000030588236307020493551728510,
384 0.000015282259408651871732571487,
385 7.6371976378997622736002935630e-6,
386 3.8172932649998398564616446219e-6,
387 1.9082127165539389256569577951e-6,
388 9.5396203387279611315203868344e-7,
389 4.7693298678780646311671960437e-7,
390 2.3845050272773299000364818675e-7,
391 1.1921992596531107306778871888e-7,
392 5.9608189051259479612440207935e-8,
393 2.9803503514652280186063705069e-8,
394 1.4901554828365041234658506630e-8,
395 7.4507117898354294919810041706e-9,
396 3.7253340247884570548192040184e-9,
397 1.8626597235130490064039099454e-9,
398 9.3132743241966818287176473502e-10,
399 4.6566290650337840729892332512e-10,
400 2.3283118336765054920014559759e-10,
401 1.1641550172700519775929738354e-10,
402 5.8207720879027008892436859891e-11,
403 2.9103850444970996869294252278e-11,
404 1.4551921891041984235929632245e-11,
405 7.2759598350574810145208690123e-12,
406 3.6379795473786511902372363558e-12,
407 1.8189896503070659475848321007e-12,
408 9.0949478402638892825331183869e-13,
409 4.5474737830421540267991120294e-13,
410 2.2737368458246525152268215779e-13,
411 1.1368684076802278493491048380e-13,
412 5.6843419876275856092771829675e-14,
413 2.8421709768893018554550737049e-14,
414 1.4210854828031606769834307141e-14,
415 7.1054273952108527128773544799e-15,
416 3.5527136913371136732984695340e-15,
417 1.7763568435791203274733490144e-15,
418 8.8817842109308159030960913863e-16,
419 4.4408921031438133641977709402e-16,
420 2.2204460507980419839993200942e-16,
421 1.1102230251410661337205445699e-16,
422 5.5511151248454812437237365905e-17,
423 2.7755575621361241725816324538e-17,
424 1.3877787809725232762839094906e-17,
425 6.9388939045441536974460853262e-18,
426 3.4694469521659226247442714961e-18,
427 1.7347234760475765720489729699e-18,
428 8.6736173801199337283420550673e-19,
429 4.3368086900206504874970235659e-19,
430 2.1684043449972197850139101683e-19,
431 1.0842021724942414063012711165e-19,
432 5.4210108624566454109187004043e-20,
433 2.7105054312234688319546213119e-20,
434 1.3552527156101164581485233996e-20,
435 6.7762635780451890979952987415e-21,
436 3.3881317890207968180857031004e-21,
437 1.6940658945097991654064927471e-21,
438 8.4703294725469983482469926091e-22,
439 4.2351647362728333478622704833e-22,
440 2.1175823681361947318442094398e-22,
441 1.0587911840680233852265001539e-22,
442 5.2939559203398703238139123029e-23,
443 2.6469779601698529611341166842e-23,
444 1.3234889800848990803094510250e-23,
445 6.6174449004244040673552453323e-24,
446 3.3087224502121715889469563843e-24,
447 1.6543612251060756462299236771e-24,
448 8.2718061255303444036711056167e-25,
449 4.1359030627651609260093824555e-25,
450 2.0679515313825767043959679193e-25,
451 1.0339757656912870993284095591e-25,
452 5.1698788284564313204101332166e-26,
453 2.5849394142282142681277617708e-26,
454 1.2924697071141066700381126118e-26,
455 6.4623485355705318034380021611e-27,
456 3.2311742677852653861348141180e-27,
457 1.6155871338926325212060114057e-27,
458 8.0779356694631620331587381863e-28,
459 4.0389678347315808256222628129e-28,
460 2.0194839173657903491587626465e-28,
461 1.0097419586828951533619250700e-28,
462 5.0487097934144756960847711725e-29,
463 2.5243548967072378244674341938e-29,
464 1.2621774483536189043753999660e-29,
465 6.3108872417680944956826093943e-30,
466 3.1554436208840472391098412184e-30,
467 1.5777218104420236166444327830e-30,
468 7.8886090522101180735205378276e-31
472 #define ZETA_NEG_TABLE_NMAX 99
473 #define ZETA_NEG_TABLE_SIZE 50
474 static double zeta_neg_int_table[ZETA_NEG_TABLE_SIZE] = {
475 -0.083333333333333333333333333333, /* zeta(-1) */
476 0.008333333333333333333333333333, /* zeta(-3) */
477 -0.003968253968253968253968253968, /* ... */
478 0.004166666666666666666666666667,
479 -0.007575757575757575757575757576,
480 0.021092796092796092796092796093,
481 -0.083333333333333333333333333333,
482 0.44325980392156862745098039216,
483 -3.05395433027011974380395433027,
484 26.4562121212121212121212121212,
485 -281.460144927536231884057971014,
486 3607.5105463980463980463980464,
487 -54827.583333333333333333333333,
488 974936.82385057471264367816092,
489 -2.0052695796688078946143462272e+07,
490 4.7238486772162990196078431373e+08,
491 -1.2635724795916666666666666667e+10,
492 3.8087931125245368811553022079e+11,
493 -1.2850850499305083333333333333e+13,
494 4.8241448354850170371581670362e+14,
495 -2.0040310656516252738108421663e+16,
496 9.1677436031953307756992753623e+17,
497 -4.5979888343656503490437943262e+19,
498 2.5180471921451095697089023320e+21,
499 -1.5001733492153928733711440151e+23,
500 9.6899578874635940656497942895e+24,
501 -6.7645882379292820990945242302e+26,
502 5.0890659468662289689766332916e+28,
503 -4.1147288792557978697665486068e+30,
504 3.5666582095375556109684574609e+32,
505 -3.3066089876577576725680214670e+34,
506 3.2715634236478716264211227016e+36,
507 -3.4473782558278053878256455080e+38,
508 3.8614279832705258893092720200e+40,
509 -4.5892974432454332168863989006e+42,
510 5.7775386342770431824884825688e+44,
511 -7.6919858759507135167410075972e+46,
512 1.0813635449971654696354033351e+49,
513 -1.6029364522008965406067102346e+51,
514 2.5019479041560462843656661499e+53,
515 -4.1067052335810212479752045004e+55,
516 7.0798774408494580617452972433e+57,
517 -1.2804546887939508790190849756e+60,
518 2.4267340392333524078020892067e+62,
519 -4.8143218874045769355129570066e+64,
520 9.9875574175727530680652777408e+66,
521 -2.1645634868435185631335136160e+69,
522 4.8962327039620553206849224516e+71, /* ... */
523 -1.1549023923963519663954271692e+74, /* zeta(-97) */
524 2.8382249570693706959264156336e+76 /* zeta(-99) */
528 /* coefficients for Maclaurin summation in hzeta()
531 static double hzeta_c[15] = {
532 1.00000000000000000000000000000,
533 0.083333333333333333333333333333,
534 -0.00138888888888888888888888888889,
535 0.000033068783068783068783068783069,
536 -8.2671957671957671957671957672e-07,
537 2.0876756987868098979210090321e-08,
538 -5.2841901386874931848476822022e-10,
539 1.3382536530684678832826980975e-11,
540 -3.3896802963225828668301953912e-13,
541 8.5860620562778445641359054504e-15,
542 -2.1748686985580618730415164239e-16,
543 5.5090028283602295152026526089e-18,
544 -1.3954464685812523340707686264e-19,
545 3.5347070396294674716932299778e-21,
546 -8.9535174270375468504026113181e-23
549 #define ETA_POS_TABLE_NMAX 100
550 static double eta_pos_int_table[ETA_POS_TABLE_NMAX+1] = {
551 0.50000000000000000000000000000, /* eta(0) */
553 0.82246703342411321823620758332, /* ... */
554 0.90154267736969571404980362113,
555 0.94703282949724591757650323447,
556 0.97211977044690930593565514355,
557 0.98555109129743510409843924448,
558 0.99259381992283028267042571313,
559 0.99623300185264789922728926008,
560 0.99809429754160533076778303185,
561 0.99903950759827156563922184570,
562 0.99951714349806075414409417483,
563 0.99975768514385819085317967871,
564 0.99987854276326511549217499282,
565 0.99993917034597971817095419226,
566 0.99996955121309923808263293263,
567 0.99998476421490610644168277496,
568 0.99999237829204101197693787224,
569 0.99999618786961011347968922641,
570 0.99999809350817167510685649297,
571 0.99999904661158152211505084256,
572 0.99999952325821554281631666433,
573 0.99999976161323082254789720494,
574 0.99999988080131843950322382485,
575 0.99999994039889239462836140314,
576 0.99999997019885696283441513311,
577 0.99999998509923199656878766181,
578 0.99999999254955048496351585274,
579 0.99999999627475340010872752767,
580 0.99999999813736941811218674656,
581 0.99999999906868228145397862728,
582 0.99999999953434033145421751469,
583 0.99999999976716989595149082282,
584 0.99999999988358485804603047265,
585 0.99999999994179239904531592388,
586 0.99999999997089618952980952258,
587 0.99999999998544809143388476396,
588 0.99999999999272404460658475006,
589 0.99999999999636202193316875550,
590 0.99999999999818101084320873555,
591 0.99999999999909050538047887809,
592 0.99999999999954525267653087357,
593 0.99999999999977262633369589773,
594 0.99999999999988631316532476488,
595 0.99999999999994315658215465336,
596 0.99999999999997157829090808339,
597 0.99999999999998578914539762720,
598 0.99999999999999289457268000875,
599 0.99999999999999644728633373609,
600 0.99999999999999822364316477861,
601 0.99999999999999911182158169283,
602 0.99999999999999955591079061426,
603 0.99999999999999977795539522974,
604 0.99999999999999988897769758908,
605 0.99999999999999994448884878594,
606 0.99999999999999997224442439010,
607 0.99999999999999998612221219410,
608 0.99999999999999999306110609673,
609 0.99999999999999999653055304826,
610 0.99999999999999999826527652409,
611 0.99999999999999999913263826204,
612 0.99999999999999999956631913101,
613 0.99999999999999999978315956551,
614 0.99999999999999999989157978275,
615 0.99999999999999999994578989138,
616 0.99999999999999999997289494569,
617 0.99999999999999999998644747284,
618 0.99999999999999999999322373642,
619 0.99999999999999999999661186821,
620 0.99999999999999999999830593411,
621 0.99999999999999999999915296705,
622 0.99999999999999999999957648353,
623 0.99999999999999999999978824176,
624 0.99999999999999999999989412088,
625 0.99999999999999999999994706044,
626 0.99999999999999999999997353022,
627 0.99999999999999999999998676511,
628 0.99999999999999999999999338256,
629 0.99999999999999999999999669128,
630 0.99999999999999999999999834564,
631 0.99999999999999999999999917282,
632 0.99999999999999999999999958641,
633 0.99999999999999999999999979320,
634 0.99999999999999999999999989660,
635 0.99999999999999999999999994830,
636 0.99999999999999999999999997415,
637 0.99999999999999999999999998708,
638 0.99999999999999999999999999354,
639 0.99999999999999999999999999677,
640 0.99999999999999999999999999838,
641 0.99999999999999999999999999919,
642 0.99999999999999999999999999960,
643 0.99999999999999999999999999980,
644 0.99999999999999999999999999990,
645 0.99999999999999999999999999995,
646 0.99999999999999999999999999997,
647 0.99999999999999999999999999999,
648 0.99999999999999999999999999999,
649 1.00000000000000000000000000000,
650 1.00000000000000000000000000000,
651 1.00000000000000000000000000000,
655 #define ETA_NEG_TABLE_NMAX 99
656 #define ETA_NEG_TABLE_SIZE 50
657 static double eta_neg_int_table[ETA_NEG_TABLE_SIZE] = {
658 0.25000000000000000000000000000, /* eta(-1) */
659 -0.12500000000000000000000000000, /* eta(-3) */
660 0.25000000000000000000000000000, /* ... */
661 -1.06250000000000000000000000000,
662 7.75000000000000000000000000000,
663 -86.3750000000000000000000000000,
664 1365.25000000000000000000000000,
665 -29049.0312500000000000000000000,
666 800572.750000000000000000000000,
667 -2.7741322625000000000000000000e+7,
668 1.1805291302500000000000000000e+9,
669 -6.0523980051687500000000000000e+10,
670 3.6794167785377500000000000000e+12,
671 -2.6170760990658387500000000000e+14,
672 2.1531418140800295250000000000e+16,
673 -2.0288775575173015930156250000e+18,
674 2.1708009902623770590275000000e+20,
675 -2.6173826968455814932120125000e+22,
676 3.5324148876863877826668602500e+24,
677 -5.3042033406864906641493838981e+26,
678 8.8138218364311576767253114668e+28,
679 -1.6128065107490778547354654864e+31,
680 3.2355470001722734208527794569e+33,
681 -7.0876727476537493198506645215e+35,
682 1.6890450341293965779175629389e+38,
683 -4.3639690731216831157655651358e+40,
684 1.2185998827061261322605065672e+43,
685 -3.6670584803153006180101262324e+45,
686 1.1859898526302099104271449748e+48,
687 -4.1120769493584015047981746438e+50,
688 1.5249042436787620309090168687e+53,
689 -6.0349693196941307074572991901e+55,
690 2.5437161764210695823197691519e+58,
691 -1.1396923802632287851130360170e+61,
692 5.4180861064753979196802726455e+63,
693 -2.7283654799994373847287197104e+66,
694 1.4529750514918543238511171663e+69,
695 -8.1705519371067450079777183386e+71,
696 4.8445781606678367790247757259e+74,
697 -3.0246694206649519336179448018e+77,
698 1.9858807961690493054169047970e+80,
699 -1.3694474620720086994386818232e+83,
700 9.9070382984295807826303785989e+85,
701 -7.5103780796592645925968460677e+88,
702 5.9598418264260880840077992227e+91,
703 -4.9455988887500020399263196307e+94,
704 4.2873596927020241277675775935e+97,
705 -3.8791952037716162900707994047e+100,
706 3.6600317773156342245401829308e+103,
707 -3.5978775704117283875784869570e+106 /* eta(-99) */
711 /*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
714 int gsl_sf_hzeta_e(const double s, const double q, gsl_sf_result * result)
716 /* CHECK_POINTER(result) */
718 if(s <= 1.0 || q <= 0.0) {
719 DOMAIN_ERROR(result);
722 const double max_bits = 54.0;
723 const double ln_term0 = -s * log(q);
725 if(ln_term0 < GSL_LOG_DBL_MIN + 1.0) {
726 UNDERFLOW_ERROR(result);
728 else if(ln_term0 > GSL_LOG_DBL_MAX - 1.0) {
729 OVERFLOW_ERROR (result);
731 else if((s > max_bits && q < 1.0) || (s > 0.5*max_bits && q < 0.25)) {
732 result->val = pow(q, -s);
733 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
736 else if(s > 0.5*max_bits && q < 1.0) {
737 const double p1 = pow(q, -s);
738 const double p2 = pow(q/(1.0+q), s);
739 const double p3 = pow(q/(2.0+q), s);
740 result->val = p1 * (1.0 + p2 + p3);
741 result->err = GSL_DBL_EPSILON * (0.5*s + 2.0) * fabs(result->val);
745 /* Euler-Maclaurin summation formula
746 * [Moshier, p. 400, with several typo corrections]
751 const double pmax = pow(kmax + q, -s);
753 double pcp = pmax / (kmax + q);
754 double ans = pmax*((kmax+q)/(s-1.0) + 0.5);
756 for(k=0; k<kmax; k++) {
757 ans += pow(k + q, -s);
760 for(j=0; j<=jmax; j++) {
761 double delta = hzeta_c[j+1] * scp * pcp;
763 if(fabs(delta/ans) < 0.5*GSL_DBL_EPSILON) break;
764 scp *= (s+2*j+1)*(s+2*j+2);
765 pcp /= (kmax + q)*(kmax + q);
769 result->err = 2.0 * (jmax + 1.0) * GSL_DBL_EPSILON * fabs(ans);
776 int gsl_sf_zeta_e(const double s, gsl_sf_result * result)
778 /* CHECK_POINTER(result) */
781 DOMAIN_ERROR(result);
784 return riemann_zeta_sgt0(s, result);
787 /* reflection formula, [Abramowitz+Stegun, 23.2.5] */
789 gsl_sf_result zeta_one_minus_s;
790 const int stat_zoms = riemann_zeta1ms_slt0(s, &zeta_one_minus_s);
791 const double sin_term = (fmod(s,2.0) == 0.0) ? 0.0 : sin(0.5*M_PI*fmod(s,4.0))/M_PI;
793 if(sin_term == 0.0) {
799 /* We have to be careful about losing digits
800 * in calculating pow(2 Pi, s). The gamma
801 * function is fine because we were careful
802 * with that implementation.
803 * We keep an array of (2 Pi)^(10 n).
805 const double twopi_pow[18] = { 1.0,
806 9.589560061550901348e+007,
807 9.195966217409212684e+015,
808 8.818527036583869903e+023,
809 8.456579467173150313e+031,
810 8.109487671573504384e+039,
811 7.776641909496069036e+047,
812 7.457457466828644277e+055,
813 7.151373628461452286e+063,
814 6.857852693272229709e+071,
815 6.576379029540265771e+079,
816 6.306458169130020789e+087,
817 6.047615938853066678e+095,
818 5.799397627482402614e+103,
819 5.561367186955830005e+111,
820 5.333106466365131227e+119,
821 5.114214477385391780e+127,
822 4.904306689854036836e+135
824 const int n = floor((-s)/10.0);
825 const double fs = s + 10.0*n;
826 const double p = pow(2.0*M_PI, fs) / twopi_pow[n];
829 const int stat_g = gsl_sf_gamma_e(1.0-s, &g);
830 result->val = p * g.val * sin_term * zeta_one_minus_s.val;
831 result->err = fabs(p * g.val * sin_term) * zeta_one_minus_s.err;
832 result->err += fabs(p * sin_term * zeta_one_minus_s.val) * g.err;
833 result->err += GSL_DBL_EPSILON * (fabs(s)+2.0) * fabs(result->val);
834 return GSL_ERROR_SELECT_2(stat_g, stat_zoms);
837 /* The actual zeta function may or may not
838 * overflow here. But we have no easy way
839 * to calculate it when the prefactor(s)
840 * overflow. Trying to use log's and exp
841 * is no good because we loose a couple
842 * digits to the exp error amplification.
843 * When we gather a little more patience,
844 * we can implement something here. Until
847 OVERFLOW_ERROR(result);
853 int gsl_sf_zeta_int_e(const int n, gsl_sf_result * result)
855 /* CHECK_POINTER(result) */
859 result->val = 0.0; /* exactly zero at even negative integers */
863 else if(n > -ZETA_NEG_TABLE_NMAX) {
864 result->val = zeta_neg_int_table[-(n+1)/2];
865 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
869 return gsl_sf_zeta_e((double)n, result);
873 DOMAIN_ERROR(result);
875 else if(n <= ZETA_POS_TABLE_NMAX){
876 result->val = 1.0 + zetam1_pos_int_table[n];
877 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
882 result->err = GSL_DBL_EPSILON;
888 int gsl_sf_zetam1_e(const double s, gsl_sf_result * result)
892 int stat = gsl_sf_zeta_e(s, result);
893 result->val = result->val - 1.0;
898 return riemann_zeta_minus_1_intermediate_s(s, result);
902 return riemann_zeta_minus1_large_s(s, result);
907 int gsl_sf_zetam1_int_e(const int n, gsl_sf_result * result)
911 result->val = -1.0; /* at even negative integers zetam1 == -1 since zeta is exactly zero */
915 else if(n > -ZETA_NEG_TABLE_NMAX) {
916 result->val = zeta_neg_int_table[-(n+1)/2] - 1.0;
917 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
921 /* could use gsl_sf_zetam1_e here but subtracting 1 makes no difference
922 for such large values, so go straight to the result */
923 return gsl_sf_zeta_e((double)n, result);
927 DOMAIN_ERROR(result);
929 else if(n <= ZETA_POS_TABLE_NMAX){
930 result->val = zetam1_pos_int_table[n];
931 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
935 return gsl_sf_zetam1_e(n, result);
940 int gsl_sf_eta_int_e(int n, gsl_sf_result * result)
942 if(n > ETA_POS_TABLE_NMAX) {
944 result->err = GSL_DBL_EPSILON;
948 result->val = eta_pos_int_table[n];
949 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
956 /* exactly zero at even negative integers */
961 else if(n > -ETA_NEG_TABLE_NMAX) {
962 result->val = eta_neg_int_table[-(n+1)/2];
963 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
969 int stat_z = gsl_sf_zeta_int_e(n, &z);
970 int stat_p = gsl_sf_exp_e((1.0-n)*M_LN2, &p);
971 int stat_m = gsl_sf_multiply_e(-p.val, z.val, result);
972 result->err = fabs(p.err * (M_LN2*(1.0-n)) * z.val) + z.err * fabs(p.val);
973 result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
974 return GSL_ERROR_SELECT_3(stat_m, stat_p, stat_z);
980 int gsl_sf_eta_e(const double s, gsl_sf_result * result)
982 /* CHECK_POINTER(result) */
986 result->err = GSL_DBL_EPSILON;
989 else if(fabs(s-1.0) < 10.0*GSL_ROOT5_DBL_EPSILON) {
992 double c1 = M_LN2 * (M_EULER - 0.5*M_LN2);
993 double c2 = -0.0326862962794492996;
994 double c3 = 0.0015689917054155150;
995 double c4 = 0.00074987242112047532;
996 result->val = c0 + del * (c1 + del * (c2 + del * (c3 + del * c4)));
997 result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
1003 int stat_z = gsl_sf_zeta_e(s, &z);
1004 int stat_p = gsl_sf_exp_e((1.0-s)*M_LN2, &p);
1005 int stat_m = gsl_sf_multiply_e(1.0-p.val, z.val, result);
1006 result->err = fabs(p.err * (M_LN2*(1.0-s)) * z.val) + z.err * fabs(p.val);
1007 result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
1008 return GSL_ERROR_SELECT_3(stat_m, stat_p, stat_z);
1013 /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
1017 double gsl_sf_zeta(const double s)
1019 EVAL_RESULT(gsl_sf_zeta_e(s, &result));
1022 double gsl_sf_hzeta(const double s, const double a)
1024 EVAL_RESULT(gsl_sf_hzeta_e(s, a, &result));
1027 double gsl_sf_zeta_int(const int s)
1029 EVAL_RESULT(gsl_sf_zeta_int_e(s, &result));
1032 double gsl_sf_zetam1(const double s)
1034 EVAL_RESULT(gsl_sf_zetam1_e(s, &result));
1037 double gsl_sf_zetam1_int(const int s)
1039 EVAL_RESULT(gsl_sf_zetam1_int_e(s, &result));
1042 double gsl_sf_eta_int(const int s)
1044 EVAL_RESULT(gsl_sf_eta_int_e(s, &result));
1047 double gsl_sf_eta(const double s)
1049 EVAL_RESULT(gsl_sf_eta_e(s, &result));