Blame specfunc/zeta.c

Packit 67cb25
/* specfunc/zeta.c
Packit 67cb25
 * 
Packit 67cb25
 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
Packit 67cb25
 * 
Packit 67cb25
 * This program is free software; you can redistribute it and/or modify
Packit 67cb25
 * it under the terms of the GNU General Public License as published by
Packit 67cb25
 * the Free Software Foundation; either version 3 of the License, or (at
Packit 67cb25
 * your option) any later version.
Packit 67cb25
 * 
Packit 67cb25
 * This program is distributed in the hope that it will be useful, but
Packit 67cb25
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 67cb25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 67cb25
 * General Public License for more details.
Packit 67cb25
 * 
Packit 67cb25
 * You should have received a copy of the GNU General Public License
Packit 67cb25
 * along with this program; if not, write to the Free Software
Packit 67cb25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
/* Author:  G. Jungman */
Packit 67cb25
Packit 67cb25
#include <config.h>
Packit 67cb25
#include <gsl/gsl_math.h>
Packit 67cb25
#include <gsl/gsl_errno.h>
Packit 67cb25
#include <gsl/gsl_sf_elementary.h>
Packit 67cb25
#include <gsl/gsl_sf_exp.h>
Packit 67cb25
#include <gsl/gsl_sf_gamma.h>
Packit 67cb25
#include <gsl/gsl_sf_pow_int.h>
Packit 67cb25
#include <gsl/gsl_sf_zeta.h>
Packit 67cb25
Packit 67cb25
#include "error.h"
Packit 67cb25
Packit 67cb25
#include "chebyshev.h"
Packit 67cb25
#include "cheb_eval.c"
Packit 67cb25
Packit 67cb25
#define LogTwoPi_  1.8378770664093454835606594728111235279723
Packit 67cb25
Packit 67cb25
Packit 67cb25
/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
Packit 67cb25
Packit 67cb25
/* chebyshev fit for (s(t)-1)Zeta[s(t)]
Packit 67cb25
 * s(t)= (t+1)/2
Packit 67cb25
 * -1 <= t <= 1
Packit 67cb25
 */
Packit 67cb25
static double zeta_xlt1_data[14] = {
Packit 67cb25
  1.48018677156931561235192914649,
Packit 67cb25
  0.25012062539889426471999938167,
Packit 67cb25
  0.00991137502135360774243761467,
Packit 67cb25
 -0.00012084759656676410329833091,
Packit 67cb25
 -4.7585866367662556504652535281e-06,
Packit 67cb25
  2.2229946694466391855561441361e-07,
Packit 67cb25
 -2.2237496498030257121309056582e-09,
Packit 67cb25
 -1.0173226513229028319420799028e-10,
Packit 67cb25
  4.3756643450424558284466248449e-12,
Packit 67cb25
 -6.2229632593100551465504090814e-14,
Packit 67cb25
 -6.6116201003272207115277520305e-16,
Packit 67cb25
  4.9477279533373912324518463830e-17,
Packit 67cb25
 -1.0429819093456189719660003522e-18,
Packit 67cb25
  6.9925216166580021051464412040e-21,
Packit 67cb25
};
Packit 67cb25
static cheb_series zeta_xlt1_cs = {
Packit 67cb25
  zeta_xlt1_data,
Packit 67cb25
  13,
Packit 67cb25
  -1, 1,
Packit 67cb25
  8
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
/* chebyshev fit for (s(t)-1)Zeta[s(t)]
Packit 67cb25
 * s(t)= (19t+21)/2
Packit 67cb25
 * -1 <= t <= 1
Packit 67cb25
 */
Packit 67cb25
static double zeta_xgt1_data[30] = {
Packit 67cb25
  19.3918515726724119415911269006,
Packit 67cb25
   9.1525329692510756181581271500,
Packit 67cb25
   0.2427897658867379985365270155,
Packit 67cb25
  -0.1339000688262027338316641329,
Packit 67cb25
   0.0577827064065028595578410202,
Packit 67cb25
  -0.0187625983754002298566409700,
Packit 67cb25
   0.0039403014258320354840823803,
Packit 67cb25
  -0.0000581508273158127963598882,
Packit 67cb25
  -0.0003756148907214820704594549,
Packit 67cb25
   0.0001892530548109214349092999,
Packit 67cb25
  -0.0000549032199695513496115090,
Packit 67cb25
   8.7086484008939038610413331863e-6,
Packit 67cb25
   6.4609477924811889068410083425e-7,
Packit 67cb25
  -9.6749773915059089205835337136e-7,
Packit 67cb25
   3.6585400766767257736982342461e-7,
Packit 67cb25
  -8.4592516427275164351876072573e-8,
Packit 67cb25
   9.9956786144497936572288988883e-9,
Packit 67cb25
   1.4260036420951118112457144842e-9,
Packit 67cb25
  -1.1761968823382879195380320948e-9,
Packit 67cb25
   3.7114575899785204664648987295e-10,
Packit 67cb25
  -7.4756855194210961661210215325e-11,
Packit 67cb25
   7.8536934209183700456512982968e-12,
Packit 67cb25
   9.9827182259685539619810406271e-13,
Packit 67cb25
  -7.5276687030192221587850302453e-13,
Packit 67cb25
   2.1955026393964279988917878654e-13,
Packit 67cb25
  -4.1934859852834647427576319246e-14,
Packit 67cb25
   4.6341149635933550715779074274e-15,
Packit 67cb25
   2.3742488509048340106830309402e-16,
Packit 67cb25
  -2.7276516388124786119323824391e-16,
Packit 67cb25
   7.8473570134636044722154797225e-17
Packit 67cb25
};
Packit 67cb25
static cheb_series zeta_xgt1_cs = {
Packit 67cb25
  zeta_xgt1_data,
Packit 67cb25
  29,
Packit 67cb25
  -1, 1,
Packit 67cb25
  17
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* chebyshev fit for Ln[Zeta[s(t)] - 1 - 2^(-s(t))]
Packit 67cb25
 * s(t)= 10 + 5t
Packit 67cb25
 * -1 <= t <= 1; 5 <= s <= 15
Packit 67cb25
 */
Packit 67cb25
static double zetam1_inter_data[24] = {
Packit 67cb25
  -21.7509435653088483422022339374,
Packit 67cb25
  -5.63036877698121782876372020472,
Packit 67cb25
   0.0528041358684229425504861579635,
Packit 67cb25
  -0.0156381809179670789342700883562,
Packit 67cb25
   0.00408218474372355881195080781927,
Packit 67cb25
  -0.0010264867349474874045036628282,
Packit 67cb25
   0.000260469880409886900143834962387,
Packit 67cb25
  -0.0000676175847209968878098566819447,
Packit 67cb25
   0.0000179284472587833525426660171124,
Packit 67cb25
  -4.83238651318556188834107605116e-6,
Packit 67cb25
   1.31913788964999288471371329447e-6,
Packit 67cb25
  -3.63760500656329972578222188542e-7,
Packit 67cb25
   1.01146847513194744989748396574e-7,
Packit 67cb25
  -2.83215225141806501619105289509e-8,
Packit 67cb25
   7.97733710252021423361012829496e-9,
Packit 67cb25
  -2.25850168553956886676250696891e-9,
Packit 67cb25
   6.42269392950164306086395744145e-10,
Packit 67cb25
  -1.83363861846127284505060843614e-10,
Packit 67cb25
   5.25309763895283179960368072104e-11,
Packit 67cb25
  -1.50958687042589821074710575446e-11,
Packit 67cb25
   4.34997545516049244697776942981e-12,
Packit 67cb25
  -1.25597782748190416118082322061e-12,
Packit 67cb25
   3.61280740072222650030134104162e-13,
Packit 67cb25
  -9.66437239205745207188920348801e-14
Packit 67cb25
}; 
Packit 67cb25
static cheb_series zetam1_inter_cs = {
Packit 67cb25
  zetam1_inter_data,
Packit 67cb25
  22,
Packit 67cb25
  -1, 1,
Packit 67cb25
  12
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* assumes s >= 0 and s != 1.0 */
Packit 67cb25
inline
Packit 67cb25
static int
Packit 67cb25
riemann_zeta_sgt0(double s, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  if(s < 1.0) {
Packit 67cb25
    gsl_sf_result c;
Packit 67cb25
    cheb_eval_e(&zeta_xlt1_cs, 2.0*s - 1.0, &c);
Packit 67cb25
    result->val = c.val / (s - 1.0);
Packit 67cb25
    result->err = c.err / fabs(s-1.0) + GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(s <= 20.0) {
Packit 67cb25
    double x = (2.0*s - 21.0)/19.0;
Packit 67cb25
    gsl_sf_result c;
Packit 67cb25
    cheb_eval_e(&zeta_xgt1_cs, x, &c);
Packit 67cb25
    result->val = c.val / (s - 1.0);
Packit 67cb25
    result->err = c.err / (s - 1.0) + GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    double f2 = 1.0 - pow(2.0,-s);
Packit 67cb25
    double f3 = 1.0 - pow(3.0,-s);
Packit 67cb25
    double f5 = 1.0 - pow(5.0,-s);
Packit 67cb25
    double f7 = 1.0 - pow(7.0,-s);
Packit 67cb25
    result->val = 1.0/(f2*f3*f5*f7);
Packit 67cb25
    result->err = 3.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
inline
Packit 67cb25
static int
Packit 67cb25
riemann_zeta1ms_slt0(double s, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  if(s > -19.0) {
Packit 67cb25
    double x = (-19 - 2.0*s)/19.0;
Packit 67cb25
    gsl_sf_result c;
Packit 67cb25
    cheb_eval_e(&zeta_xgt1_cs, x, &c);
Packit 67cb25
    result->val = c.val / (-s);
Packit 67cb25
    result->err = c.err / (-s) + GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    double f2 = 1.0 - pow(2.0,-(1.0-s));
Packit 67cb25
    double f3 = 1.0 - pow(3.0,-(1.0-s));
Packit 67cb25
    double f5 = 1.0 - pow(5.0,-(1.0-s));
Packit 67cb25
    double f7 = 1.0 - pow(7.0,-(1.0-s));
Packit 67cb25
    result->val = 1.0/(f2*f3*f5*f7);
Packit 67cb25
    result->err = 3.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* works for 5 < s < 15*/
Packit 67cb25
static int
Packit 67cb25
riemann_zeta_minus_1_intermediate_s(double s, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  double t = (s - 10.0)/5.0;
Packit 67cb25
  gsl_sf_result c;
Packit 67cb25
  cheb_eval_e(&zetam1_inter_cs, t, &c);
Packit 67cb25
  result->val = exp(c.val) + pow(2.0, -s);
Packit 67cb25
  result->err = (c.err + 2.0*GSL_DBL_EPSILON)*result->val;
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* assumes s is large and positive
Packit 67cb25
 * write: zeta(s) - 1 = zeta(s) * (1 - 1/zeta(s))
Packit 67cb25
 * and expand a few terms of the product formula to evaluate 1 - 1/zeta(s)
Packit 67cb25
 *
Packit 67cb25
 * works well for s > 15
Packit 67cb25
 */
Packit 67cb25
static int
Packit 67cb25
riemann_zeta_minus1_large_s(double s, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  double a = pow( 2.0,-s);
Packit 67cb25
  double b = pow( 3.0,-s);
Packit 67cb25
  double c = pow( 5.0,-s);
Packit 67cb25
  double d = pow( 7.0,-s);
Packit 67cb25
  double e = pow(11.0,-s);
Packit 67cb25
  double f = pow(13.0,-s);
Packit 67cb25
  double t1 = a + b + c + d + e + f;
Packit 67cb25
  double t2 = a*(b+c+d+e+f) + b*(c+d+e+f) + c*(d+e+f) + d*(e+f) + e*f;
Packit 67cb25
  /*
Packit 67cb25
  double t3 = a*(b*(c+d+e+f) + c*(d+e+f) + d*(e+f) + e*f) +
Packit 67cb25
              b*(c*(d+e+f) + d*(e+f) + e*f) +
Packit 67cb25
              c*(d*(e+f) + e*f) +
Packit 67cb25
              d*e*f;
Packit 67cb25
  double t4 = a*(b*(c*(d + e + f) + d*(e + f) + e*f) + c*(d*(e+f) + e*f) + d*e*f) +
Packit 67cb25
              b*(c*(d*(e+f) + e*f) + d*e*f) +
Packit 67cb25
              c*d*e*f;
Packit 67cb25
  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;
Packit 67cb25
  double t6 = a*b*c*d*e*f;
Packit 67cb25
  */
Packit 67cb25
  double numt = t1 - t2 /* + t3 - t4 + t5 - t6 */;
Packit 67cb25
  double zeta = 1.0/((1.0-a)*(1.0-b)*(1.0-c)*(1.0-d)*(1.0-e)*(1.0-f));
Packit 67cb25
  result->val = numt*zeta;
Packit 67cb25
  result->err = (15.0/s + 1.0) * 6.0*GSL_DBL_EPSILON*result->val;
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
#if 0
Packit 67cb25
/* zeta(n) */
Packit 67cb25
#define ZETA_POS_TABLE_NMAX   100
Packit 67cb25
static double zeta_pos_int_table_OLD[ZETA_POS_TABLE_NMAX+1] = {
Packit 67cb25
 -0.50000000000000000000000000000,       /* zeta(0) */
Packit 67cb25
  0.0 /* FIXME: DirectedInfinity() */,   /* zeta(1) */
Packit 67cb25
  1.64493406684822643647241516665,       /* ...     */
Packit 67cb25
  1.20205690315959428539973816151,
Packit 67cb25
  1.08232323371113819151600369654,
Packit 67cb25
  1.03692775514336992633136548646,
Packit 67cb25
  1.01734306198444913971451792979,
Packit 67cb25
  1.00834927738192282683979754985,
Packit 67cb25
  1.00407735619794433937868523851,
Packit 67cb25
  1.00200839282608221441785276923,
Packit 67cb25
  1.00099457512781808533714595890,
Packit 67cb25
  1.00049418860411946455870228253,
Packit 67cb25
  1.00024608655330804829863799805,
Packit 67cb25
  1.00012271334757848914675183653,
Packit 67cb25
  1.00006124813505870482925854511,
Packit 67cb25
  1.00003058823630702049355172851,
Packit 67cb25
  1.00001528225940865187173257149,
Packit 67cb25
  1.00000763719763789976227360029,
Packit 67cb25
  1.00000381729326499983985646164,
Packit 67cb25
  1.00000190821271655393892565696,
Packit 67cb25
  1.00000095396203387279611315204,
Packit 67cb25
  1.00000047693298678780646311672,
Packit 67cb25
  1.00000023845050272773299000365,
Packit 67cb25
  1.00000011921992596531107306779,
Packit 67cb25
  1.00000005960818905125947961244,
Packit 67cb25
  1.00000002980350351465228018606,
Packit 67cb25
  1.00000001490155482836504123466,
Packit 67cb25
  1.00000000745071178983542949198,
Packit 67cb25
  1.00000000372533402478845705482,
Packit 67cb25
  1.00000000186265972351304900640,
Packit 67cb25
  1.00000000093132743241966818287,
Packit 67cb25
  1.00000000046566290650337840730,
Packit 67cb25
  1.00000000023283118336765054920,
Packit 67cb25
  1.00000000011641550172700519776,
Packit 67cb25
  1.00000000005820772087902700889,
Packit 67cb25
  1.00000000002910385044497099687,
Packit 67cb25
  1.00000000001455192189104198424,
Packit 67cb25
  1.00000000000727595983505748101,
Packit 67cb25
  1.00000000000363797954737865119,
Packit 67cb25
  1.00000000000181898965030706595,
Packit 67cb25
  1.00000000000090949478402638893,
Packit 67cb25
  1.00000000000045474737830421540,
Packit 67cb25
  1.00000000000022737368458246525,
Packit 67cb25
  1.00000000000011368684076802278,
Packit 67cb25
  1.00000000000005684341987627586,
Packit 67cb25
  1.00000000000002842170976889302,
Packit 67cb25
  1.00000000000001421085482803161,
Packit 67cb25
  1.00000000000000710542739521085,
Packit 67cb25
  1.00000000000000355271369133711,
Packit 67cb25
  1.00000000000000177635684357912,
Packit 67cb25
  1.00000000000000088817842109308,
Packit 67cb25
  1.00000000000000044408921031438,
Packit 67cb25
  1.00000000000000022204460507980,
Packit 67cb25
  1.00000000000000011102230251411,
Packit 67cb25
  1.00000000000000005551115124845,
Packit 67cb25
  1.00000000000000002775557562136,
Packit 67cb25
  1.00000000000000001387778780973,
Packit 67cb25
  1.00000000000000000693889390454,
Packit 67cb25
  1.00000000000000000346944695217,
Packit 67cb25
  1.00000000000000000173472347605,
Packit 67cb25
  1.00000000000000000086736173801,
Packit 67cb25
  1.00000000000000000043368086900,
Packit 67cb25
  1.00000000000000000021684043450,
Packit 67cb25
  1.00000000000000000010842021725,
Packit 67cb25
  1.00000000000000000005421010862,
Packit 67cb25
  1.00000000000000000002710505431,
Packit 67cb25
  1.00000000000000000001355252716,
Packit 67cb25
  1.00000000000000000000677626358,
Packit 67cb25
  1.00000000000000000000338813179,
Packit 67cb25
  1.00000000000000000000169406589,
Packit 67cb25
  1.00000000000000000000084703295,
Packit 67cb25
  1.00000000000000000000042351647,
Packit 67cb25
  1.00000000000000000000021175824,
Packit 67cb25
  1.00000000000000000000010587912,
Packit 67cb25
  1.00000000000000000000005293956,
Packit 67cb25
  1.00000000000000000000002646978,
Packit 67cb25
  1.00000000000000000000001323489,
Packit 67cb25
  1.00000000000000000000000661744,
Packit 67cb25
  1.00000000000000000000000330872,
Packit 67cb25
  1.00000000000000000000000165436,
Packit 67cb25
  1.00000000000000000000000082718,
Packit 67cb25
  1.00000000000000000000000041359,
Packit 67cb25
  1.00000000000000000000000020680,
Packit 67cb25
  1.00000000000000000000000010340,
Packit 67cb25
  1.00000000000000000000000005170,
Packit 67cb25
  1.00000000000000000000000002585,
Packit 67cb25
  1.00000000000000000000000001292,
Packit 67cb25
  1.00000000000000000000000000646,
Packit 67cb25
  1.00000000000000000000000000323,
Packit 67cb25
  1.00000000000000000000000000162,
Packit 67cb25
  1.00000000000000000000000000081,
Packit 67cb25
  1.00000000000000000000000000040,
Packit 67cb25
  1.00000000000000000000000000020,
Packit 67cb25
  1.00000000000000000000000000010,
Packit 67cb25
  1.00000000000000000000000000005,
Packit 67cb25
  1.00000000000000000000000000003,
Packit 67cb25
  1.00000000000000000000000000001,
Packit 67cb25
  1.00000000000000000000000000001,
Packit 67cb25
  1.00000000000000000000000000000,
Packit 67cb25
  1.00000000000000000000000000000,
Packit 67cb25
  1.00000000000000000000000000000
Packit 67cb25
};
Packit 67cb25
#endif /* 0 */
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* zeta(n) - 1 */
Packit 67cb25
#define ZETA_POS_TABLE_NMAX   100
Packit 67cb25
static double zetam1_pos_int_table[ZETA_POS_TABLE_NMAX+1] = {
Packit 67cb25
 -1.5,                               /* zeta(0) */
Packit 67cb25
  0.0,       /* FIXME: Infinity */   /* zeta(1) - 1 */
Packit 67cb25
  0.644934066848226436472415166646,  /* zeta(2) - 1 */
Packit 67cb25
  0.202056903159594285399738161511,
Packit 67cb25
  0.082323233711138191516003696541,
Packit 67cb25
  0.036927755143369926331365486457,
Packit 67cb25
  0.017343061984449139714517929790,
Packit 67cb25
  0.008349277381922826839797549849,
Packit 67cb25
  0.004077356197944339378685238508,
Packit 67cb25
  0.002008392826082214417852769232,
Packit 67cb25
  0.000994575127818085337145958900,
Packit 67cb25
  0.000494188604119464558702282526,
Packit 67cb25
  0.000246086553308048298637998047,
Packit 67cb25
  0.000122713347578489146751836526,
Packit 67cb25
  0.000061248135058704829258545105,
Packit 67cb25
  0.000030588236307020493551728510,
Packit 67cb25
  0.000015282259408651871732571487,
Packit 67cb25
  7.6371976378997622736002935630e-6,
Packit 67cb25
  3.8172932649998398564616446219e-6,
Packit 67cb25
  1.9082127165539389256569577951e-6,
Packit 67cb25
  9.5396203387279611315203868344e-7,
Packit 67cb25
  4.7693298678780646311671960437e-7,
Packit 67cb25
  2.3845050272773299000364818675e-7,
Packit 67cb25
  1.1921992596531107306778871888e-7,
Packit 67cb25
  5.9608189051259479612440207935e-8,
Packit 67cb25
  2.9803503514652280186063705069e-8,
Packit 67cb25
  1.4901554828365041234658506630e-8,
Packit 67cb25
  7.4507117898354294919810041706e-9,
Packit 67cb25
  3.7253340247884570548192040184e-9,
Packit 67cb25
  1.8626597235130490064039099454e-9,
Packit 67cb25
  9.3132743241966818287176473502e-10,
Packit 67cb25
  4.6566290650337840729892332512e-10,
Packit 67cb25
  2.3283118336765054920014559759e-10,
Packit 67cb25
  1.1641550172700519775929738354e-10,
Packit 67cb25
  5.8207720879027008892436859891e-11,
Packit 67cb25
  2.9103850444970996869294252278e-11,
Packit 67cb25
  1.4551921891041984235929632245e-11,
Packit 67cb25
  7.2759598350574810145208690123e-12,
Packit 67cb25
  3.6379795473786511902372363558e-12,
Packit 67cb25
  1.8189896503070659475848321007e-12,
Packit 67cb25
  9.0949478402638892825331183869e-13,
Packit 67cb25
  4.5474737830421540267991120294e-13,
Packit 67cb25
  2.2737368458246525152268215779e-13,
Packit 67cb25
  1.1368684076802278493491048380e-13,
Packit 67cb25
  5.6843419876275856092771829675e-14,
Packit 67cb25
  2.8421709768893018554550737049e-14,
Packit 67cb25
  1.4210854828031606769834307141e-14,
Packit 67cb25
  7.1054273952108527128773544799e-15,
Packit 67cb25
  3.5527136913371136732984695340e-15,
Packit 67cb25
  1.7763568435791203274733490144e-15,
Packit 67cb25
  8.8817842109308159030960913863e-16,
Packit 67cb25
  4.4408921031438133641977709402e-16,
Packit 67cb25
  2.2204460507980419839993200942e-16,
Packit 67cb25
  1.1102230251410661337205445699e-16,
Packit 67cb25
  5.5511151248454812437237365905e-17,
Packit 67cb25
  2.7755575621361241725816324538e-17,
Packit 67cb25
  1.3877787809725232762839094906e-17,
Packit 67cb25
  6.9388939045441536974460853262e-18,
Packit 67cb25
  3.4694469521659226247442714961e-18,
Packit 67cb25
  1.7347234760475765720489729699e-18,
Packit 67cb25
  8.6736173801199337283420550673e-19,
Packit 67cb25
  4.3368086900206504874970235659e-19,
Packit 67cb25
  2.1684043449972197850139101683e-19,
Packit 67cb25
  1.0842021724942414063012711165e-19,
Packit 67cb25
  5.4210108624566454109187004043e-20,
Packit 67cb25
  2.7105054312234688319546213119e-20,
Packit 67cb25
  1.3552527156101164581485233996e-20,
Packit 67cb25
  6.7762635780451890979952987415e-21,
Packit 67cb25
  3.3881317890207968180857031004e-21,
Packit 67cb25
  1.6940658945097991654064927471e-21,
Packit 67cb25
  8.4703294725469983482469926091e-22,
Packit 67cb25
  4.2351647362728333478622704833e-22,
Packit 67cb25
  2.1175823681361947318442094398e-22,
Packit 67cb25
  1.0587911840680233852265001539e-22,
Packit 67cb25
  5.2939559203398703238139123029e-23,
Packit 67cb25
  2.6469779601698529611341166842e-23,
Packit 67cb25
  1.3234889800848990803094510250e-23,
Packit 67cb25
  6.6174449004244040673552453323e-24,
Packit 67cb25
  3.3087224502121715889469563843e-24,
Packit 67cb25
  1.6543612251060756462299236771e-24,
Packit 67cb25
  8.2718061255303444036711056167e-25,
Packit 67cb25
  4.1359030627651609260093824555e-25,
Packit 67cb25
  2.0679515313825767043959679193e-25,
Packit 67cb25
  1.0339757656912870993284095591e-25,
Packit 67cb25
  5.1698788284564313204101332166e-26,
Packit 67cb25
  2.5849394142282142681277617708e-26,
Packit 67cb25
  1.2924697071141066700381126118e-26,
Packit 67cb25
  6.4623485355705318034380021611e-27,
Packit 67cb25
  3.2311742677852653861348141180e-27,
Packit 67cb25
  1.6155871338926325212060114057e-27,
Packit 67cb25
  8.0779356694631620331587381863e-28,
Packit 67cb25
  4.0389678347315808256222628129e-28,
Packit 67cb25
  2.0194839173657903491587626465e-28,
Packit 67cb25
  1.0097419586828951533619250700e-28,
Packit 67cb25
  5.0487097934144756960847711725e-29,
Packit 67cb25
  2.5243548967072378244674341938e-29,
Packit 67cb25
  1.2621774483536189043753999660e-29,
Packit 67cb25
  6.3108872417680944956826093943e-30,
Packit 67cb25
  3.1554436208840472391098412184e-30,
Packit 67cb25
  1.5777218104420236166444327830e-30,
Packit 67cb25
  7.8886090522101180735205378276e-31
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
#define ZETA_NEG_TABLE_NMAX  99
Packit 67cb25
#define ZETA_NEG_TABLE_SIZE  50
Packit 67cb25
static double zeta_neg_int_table[ZETA_NEG_TABLE_SIZE] = {
Packit 67cb25
 -0.083333333333333333333333333333,     /* zeta(-1) */
Packit 67cb25
  0.008333333333333333333333333333,     /* zeta(-3) */
Packit 67cb25
 -0.003968253968253968253968253968,     /* ...      */
Packit 67cb25
  0.004166666666666666666666666667,
Packit 67cb25
 -0.007575757575757575757575757576,
Packit 67cb25
  0.021092796092796092796092796093,
Packit 67cb25
 -0.083333333333333333333333333333,
Packit 67cb25
  0.44325980392156862745098039216,
Packit 67cb25
 -3.05395433027011974380395433027,
Packit 67cb25
  26.4562121212121212121212121212,
Packit 67cb25
 -281.460144927536231884057971014,
Packit 67cb25
  3607.5105463980463980463980464,
Packit 67cb25
 -54827.583333333333333333333333,
Packit 67cb25
  974936.82385057471264367816092,
Packit 67cb25
 -2.0052695796688078946143462272e+07,
Packit 67cb25
  4.7238486772162990196078431373e+08,
Packit 67cb25
 -1.2635724795916666666666666667e+10,
Packit 67cb25
  3.8087931125245368811553022079e+11,
Packit 67cb25
 -1.2850850499305083333333333333e+13,
Packit 67cb25
  4.8241448354850170371581670362e+14,
Packit 67cb25
 -2.0040310656516252738108421663e+16,
Packit 67cb25
  9.1677436031953307756992753623e+17,
Packit 67cb25
 -4.5979888343656503490437943262e+19,
Packit 67cb25
  2.5180471921451095697089023320e+21,
Packit 67cb25
 -1.5001733492153928733711440151e+23,
Packit 67cb25
  9.6899578874635940656497942895e+24,
Packit 67cb25
 -6.7645882379292820990945242302e+26,
Packit 67cb25
  5.0890659468662289689766332916e+28,
Packit 67cb25
 -4.1147288792557978697665486068e+30,
Packit 67cb25
  3.5666582095375556109684574609e+32,
Packit 67cb25
 -3.3066089876577576725680214670e+34,
Packit 67cb25
  3.2715634236478716264211227016e+36,
Packit 67cb25
 -3.4473782558278053878256455080e+38,
Packit 67cb25
  3.8614279832705258893092720200e+40,
Packit 67cb25
 -4.5892974432454332168863989006e+42,
Packit 67cb25
  5.7775386342770431824884825688e+44,
Packit 67cb25
 -7.6919858759507135167410075972e+46,
Packit 67cb25
  1.0813635449971654696354033351e+49,
Packit 67cb25
 -1.6029364522008965406067102346e+51,
Packit 67cb25
  2.5019479041560462843656661499e+53,
Packit 67cb25
 -4.1067052335810212479752045004e+55,
Packit 67cb25
  7.0798774408494580617452972433e+57,
Packit 67cb25
 -1.2804546887939508790190849756e+60,
Packit 67cb25
  2.4267340392333524078020892067e+62,
Packit 67cb25
 -4.8143218874045769355129570066e+64,
Packit 67cb25
  9.9875574175727530680652777408e+66,
Packit 67cb25
 -2.1645634868435185631335136160e+69,
Packit 67cb25
  4.8962327039620553206849224516e+71,    /* ...        */
Packit 67cb25
 -1.1549023923963519663954271692e+74,    /* zeta(-97)  */
Packit 67cb25
  2.8382249570693706959264156336e+76     /* zeta(-99)  */
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* coefficients for Maclaurin summation in hzeta()
Packit 67cb25
 * B_{2j}/(2j)!
Packit 67cb25
 */
Packit 67cb25
static double hzeta_c[15] = {
Packit 67cb25
  1.00000000000000000000000000000,
Packit 67cb25
  0.083333333333333333333333333333,
Packit 67cb25
 -0.00138888888888888888888888888889,
Packit 67cb25
  0.000033068783068783068783068783069,
Packit 67cb25
 -8.2671957671957671957671957672e-07,
Packit 67cb25
  2.0876756987868098979210090321e-08,
Packit 67cb25
 -5.2841901386874931848476822022e-10,
Packit 67cb25
  1.3382536530684678832826980975e-11,
Packit 67cb25
 -3.3896802963225828668301953912e-13,
Packit 67cb25
  8.5860620562778445641359054504e-15,
Packit 67cb25
 -2.1748686985580618730415164239e-16,
Packit 67cb25
  5.5090028283602295152026526089e-18,
Packit 67cb25
 -1.3954464685812523340707686264e-19,
Packit 67cb25
  3.5347070396294674716932299778e-21,
Packit 67cb25
 -8.9535174270375468504026113181e-23
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
#define ETA_POS_TABLE_NMAX  100
Packit 67cb25
static double eta_pos_int_table[ETA_POS_TABLE_NMAX+1] = {
Packit 67cb25
0.50000000000000000000000000000,  /* eta(0) */
Packit 67cb25
M_LN2,                            /* eta(1) */
Packit 67cb25
0.82246703342411321823620758332,  /* ...    */
Packit 67cb25
0.90154267736969571404980362113,
Packit 67cb25
0.94703282949724591757650323447,
Packit 67cb25
0.97211977044690930593565514355,
Packit 67cb25
0.98555109129743510409843924448,
Packit 67cb25
0.99259381992283028267042571313,
Packit 67cb25
0.99623300185264789922728926008,
Packit 67cb25
0.99809429754160533076778303185,
Packit 67cb25
0.99903950759827156563922184570,
Packit 67cb25
0.99951714349806075414409417483,
Packit 67cb25
0.99975768514385819085317967871,
Packit 67cb25
0.99987854276326511549217499282,
Packit 67cb25
0.99993917034597971817095419226,
Packit 67cb25
0.99996955121309923808263293263,
Packit 67cb25
0.99998476421490610644168277496,
Packit 67cb25
0.99999237829204101197693787224,
Packit 67cb25
0.99999618786961011347968922641,
Packit 67cb25
0.99999809350817167510685649297,
Packit 67cb25
0.99999904661158152211505084256,
Packit 67cb25
0.99999952325821554281631666433,
Packit 67cb25
0.99999976161323082254789720494,
Packit 67cb25
0.99999988080131843950322382485,
Packit 67cb25
0.99999994039889239462836140314,
Packit 67cb25
0.99999997019885696283441513311,
Packit 67cb25
0.99999998509923199656878766181,
Packit 67cb25
0.99999999254955048496351585274,
Packit 67cb25
0.99999999627475340010872752767,
Packit 67cb25
0.99999999813736941811218674656,
Packit 67cb25
0.99999999906868228145397862728,
Packit 67cb25
0.99999999953434033145421751469,
Packit 67cb25
0.99999999976716989595149082282,
Packit 67cb25
0.99999999988358485804603047265,
Packit 67cb25
0.99999999994179239904531592388,
Packit 67cb25
0.99999999997089618952980952258,
Packit 67cb25
0.99999999998544809143388476396,
Packit 67cb25
0.99999999999272404460658475006,
Packit 67cb25
0.99999999999636202193316875550,
Packit 67cb25
0.99999999999818101084320873555,
Packit 67cb25
0.99999999999909050538047887809,
Packit 67cb25
0.99999999999954525267653087357,
Packit 67cb25
0.99999999999977262633369589773,
Packit 67cb25
0.99999999999988631316532476488,
Packit 67cb25
0.99999999999994315658215465336,
Packit 67cb25
0.99999999999997157829090808339,
Packit 67cb25
0.99999999999998578914539762720,
Packit 67cb25
0.99999999999999289457268000875,
Packit 67cb25
0.99999999999999644728633373609,
Packit 67cb25
0.99999999999999822364316477861,
Packit 67cb25
0.99999999999999911182158169283,
Packit 67cb25
0.99999999999999955591079061426,
Packit 67cb25
0.99999999999999977795539522974,
Packit 67cb25
0.99999999999999988897769758908,
Packit 67cb25
0.99999999999999994448884878594,
Packit 67cb25
0.99999999999999997224442439010,
Packit 67cb25
0.99999999999999998612221219410,
Packit 67cb25
0.99999999999999999306110609673,
Packit 67cb25
0.99999999999999999653055304826,
Packit 67cb25
0.99999999999999999826527652409,
Packit 67cb25
0.99999999999999999913263826204,
Packit 67cb25
0.99999999999999999956631913101,
Packit 67cb25
0.99999999999999999978315956551,
Packit 67cb25
0.99999999999999999989157978275,
Packit 67cb25
0.99999999999999999994578989138,
Packit 67cb25
0.99999999999999999997289494569,
Packit 67cb25
0.99999999999999999998644747284,
Packit 67cb25
0.99999999999999999999322373642,
Packit 67cb25
0.99999999999999999999661186821,
Packit 67cb25
0.99999999999999999999830593411,
Packit 67cb25
0.99999999999999999999915296705,
Packit 67cb25
0.99999999999999999999957648353,
Packit 67cb25
0.99999999999999999999978824176,
Packit 67cb25
0.99999999999999999999989412088,
Packit 67cb25
0.99999999999999999999994706044,
Packit 67cb25
0.99999999999999999999997353022,
Packit 67cb25
0.99999999999999999999998676511,
Packit 67cb25
0.99999999999999999999999338256,
Packit 67cb25
0.99999999999999999999999669128,
Packit 67cb25
0.99999999999999999999999834564,
Packit 67cb25
0.99999999999999999999999917282,
Packit 67cb25
0.99999999999999999999999958641,
Packit 67cb25
0.99999999999999999999999979320,
Packit 67cb25
0.99999999999999999999999989660,
Packit 67cb25
0.99999999999999999999999994830,
Packit 67cb25
0.99999999999999999999999997415,
Packit 67cb25
0.99999999999999999999999998708,
Packit 67cb25
0.99999999999999999999999999354,
Packit 67cb25
0.99999999999999999999999999677,
Packit 67cb25
0.99999999999999999999999999838,
Packit 67cb25
0.99999999999999999999999999919,
Packit 67cb25
0.99999999999999999999999999960,
Packit 67cb25
0.99999999999999999999999999980,
Packit 67cb25
0.99999999999999999999999999990,
Packit 67cb25
0.99999999999999999999999999995,
Packit 67cb25
0.99999999999999999999999999997,
Packit 67cb25
0.99999999999999999999999999999,
Packit 67cb25
0.99999999999999999999999999999,
Packit 67cb25
1.00000000000000000000000000000,
Packit 67cb25
1.00000000000000000000000000000,
Packit 67cb25
1.00000000000000000000000000000,
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
#define ETA_NEG_TABLE_NMAX  99
Packit 67cb25
#define ETA_NEG_TABLE_SIZE  50
Packit 67cb25
static double eta_neg_int_table[ETA_NEG_TABLE_SIZE] = {
Packit 67cb25
 0.25000000000000000000000000000,   /* eta(-1) */
Packit 67cb25
-0.12500000000000000000000000000,   /* eta(-3) */
Packit 67cb25
 0.25000000000000000000000000000,   /* ...      */
Packit 67cb25
-1.06250000000000000000000000000,
Packit 67cb25
 7.75000000000000000000000000000,
Packit 67cb25
-86.3750000000000000000000000000,
Packit 67cb25
 1365.25000000000000000000000000,
Packit 67cb25
-29049.0312500000000000000000000,
Packit 67cb25
 800572.750000000000000000000000,
Packit 67cb25
-2.7741322625000000000000000000e+7,
Packit 67cb25
 1.1805291302500000000000000000e+9,
Packit 67cb25
-6.0523980051687500000000000000e+10,
Packit 67cb25
 3.6794167785377500000000000000e+12,
Packit 67cb25
-2.6170760990658387500000000000e+14,
Packit 67cb25
 2.1531418140800295250000000000e+16,
Packit 67cb25
-2.0288775575173015930156250000e+18,
Packit 67cb25
 2.1708009902623770590275000000e+20,
Packit 67cb25
-2.6173826968455814932120125000e+22,
Packit 67cb25
 3.5324148876863877826668602500e+24,
Packit 67cb25
-5.3042033406864906641493838981e+26,
Packit 67cb25
 8.8138218364311576767253114668e+28,
Packit 67cb25
-1.6128065107490778547354654864e+31,
Packit 67cb25
 3.2355470001722734208527794569e+33,
Packit 67cb25
-7.0876727476537493198506645215e+35,
Packit 67cb25
 1.6890450341293965779175629389e+38,
Packit 67cb25
-4.3639690731216831157655651358e+40,
Packit 67cb25
 1.2185998827061261322605065672e+43,
Packit 67cb25
-3.6670584803153006180101262324e+45,
Packit 67cb25
 1.1859898526302099104271449748e+48,
Packit 67cb25
-4.1120769493584015047981746438e+50,
Packit 67cb25
 1.5249042436787620309090168687e+53,
Packit 67cb25
-6.0349693196941307074572991901e+55,
Packit 67cb25
 2.5437161764210695823197691519e+58,
Packit 67cb25
-1.1396923802632287851130360170e+61,
Packit 67cb25
 5.4180861064753979196802726455e+63,
Packit 67cb25
-2.7283654799994373847287197104e+66,
Packit 67cb25
 1.4529750514918543238511171663e+69,
Packit 67cb25
-8.1705519371067450079777183386e+71,
Packit 67cb25
 4.8445781606678367790247757259e+74,
Packit 67cb25
-3.0246694206649519336179448018e+77,
Packit 67cb25
 1.9858807961690493054169047970e+80,
Packit 67cb25
-1.3694474620720086994386818232e+83,
Packit 67cb25
 9.9070382984295807826303785989e+85,
Packit 67cb25
-7.5103780796592645925968460677e+88,
Packit 67cb25
 5.9598418264260880840077992227e+91,
Packit 67cb25
-4.9455988887500020399263196307e+94,
Packit 67cb25
 4.2873596927020241277675775935e+97,
Packit 67cb25
-3.8791952037716162900707994047e+100,
Packit 67cb25
 3.6600317773156342245401829308e+103,
Packit 67cb25
-3.5978775704117283875784869570e+106    /* eta(-99)  */
Packit 67cb25
};
Packit 67cb25
Packit 67cb25
Packit 67cb25
/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
Packit 67cb25
Packit 67cb25
Packit 67cb25
int gsl_sf_hzeta_e(const double s, const double q, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(s <= 1.0 || q <= 0.0) {
Packit 67cb25
    DOMAIN_ERROR(result);
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    const double max_bits = 54.0;
Packit 67cb25
    const double ln_term0 = -s * log(q);  
Packit 67cb25
Packit 67cb25
    if(ln_term0 < GSL_LOG_DBL_MIN + 1.0) {
Packit 67cb25
      UNDERFLOW_ERROR(result);
Packit 67cb25
    }
Packit 67cb25
    else if(ln_term0 > GSL_LOG_DBL_MAX - 1.0) {
Packit 67cb25
      OVERFLOW_ERROR (result);
Packit 67cb25
    }
Packit 67cb25
    else if((s > max_bits && q < 1.0) || (s > 0.5*max_bits && q < 0.25)) {
Packit 67cb25
      result->val = pow(q, -s);
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
    else if(s > 0.5*max_bits && q < 1.0) {
Packit 67cb25
      const double p1 = pow(q, -s);
Packit 67cb25
      const double p2 = pow(q/(1.0+q), s);
Packit 67cb25
      const double p3 = pow(q/(2.0+q), s);
Packit 67cb25
      result->val = p1 * (1.0 + p2 + p3);
Packit 67cb25
      result->err = GSL_DBL_EPSILON * (0.5*s + 2.0) * fabs(result->val);
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      /* Euler-Maclaurin summation formula 
Packit 67cb25
       * [Moshier, p. 400, with several typo corrections]
Packit 67cb25
       */
Packit 67cb25
      const int jmax = 12;
Packit 67cb25
      const int kmax = 10;
Packit 67cb25
      int j, k;
Packit 67cb25
      const double pmax  = pow(kmax + q, -s);
Packit 67cb25
      double scp = s;
Packit 67cb25
      double pcp = pmax / (kmax + q);
Packit 67cb25
      double ans = pmax*((kmax+q)/(s-1.0) + 0.5);
Packit 67cb25
Packit 67cb25
      for(k=0; k
Packit 67cb25
        ans += pow(k + q, -s);
Packit 67cb25
      }
Packit 67cb25
Packit 67cb25
      for(j=0; j<=jmax; j++) {
Packit 67cb25
        double delta = hzeta_c[j+1] * scp * pcp;
Packit 67cb25
        ans += delta;
Packit 67cb25
        if(fabs(delta/ans) < 0.5*GSL_DBL_EPSILON) break;
Packit 67cb25
        scp *= (s+2*j+1)*(s+2*j+2);
Packit 67cb25
        pcp /= (kmax + q)*(kmax + q);
Packit 67cb25
      }
Packit 67cb25
Packit 67cb25
      result->val = ans;
Packit 67cb25
      result->err = 2.0 * (jmax + 1.0) * GSL_DBL_EPSILON * fabs(ans);
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int gsl_sf_zeta_e(const double s, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(s == 1.0) {
Packit 67cb25
    DOMAIN_ERROR(result);
Packit 67cb25
  }
Packit 67cb25
  else if(s >= 0.0) {
Packit 67cb25
    return riemann_zeta_sgt0(s, result);
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    /* reflection formula, [Abramowitz+Stegun, 23.2.5] */
Packit 67cb25
Packit 67cb25
    gsl_sf_result zeta_one_minus_s;
Packit 67cb25
    const int stat_zoms = riemann_zeta1ms_slt0(s, &zeta_one_minus_s);
Packit 67cb25
    const double sin_term = (fmod(s,2.0) == 0.0) ? 0.0 : sin(0.5*M_PI*fmod(s,4.0))/M_PI;
Packit 67cb25
Packit 67cb25
    if(sin_term == 0.0) {
Packit 67cb25
      result->val = 0.0;
Packit 67cb25
      result->err = 0.0;
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
    else if(s > -170) {
Packit 67cb25
      /* We have to be careful about losing digits
Packit 67cb25
       * in calculating pow(2 Pi, s). The gamma
Packit 67cb25
       * function is fine because we were careful
Packit 67cb25
       * with that implementation.
Packit 67cb25
       * We keep an array of (2 Pi)^(10 n).
Packit 67cb25
       */
Packit 67cb25
      const double twopi_pow[18] = { 1.0,
Packit 67cb25
                                     9.589560061550901348e+007,
Packit 67cb25
                                     9.195966217409212684e+015,
Packit 67cb25
                                     8.818527036583869903e+023,
Packit 67cb25
                                     8.456579467173150313e+031,
Packit 67cb25
                                     8.109487671573504384e+039,
Packit 67cb25
                                     7.776641909496069036e+047,
Packit 67cb25
                                     7.457457466828644277e+055,
Packit 67cb25
                                     7.151373628461452286e+063,
Packit 67cb25
                                     6.857852693272229709e+071,
Packit 67cb25
                                     6.576379029540265771e+079,
Packit 67cb25
                                     6.306458169130020789e+087,
Packit 67cb25
                                     6.047615938853066678e+095,
Packit 67cb25
                                     5.799397627482402614e+103,
Packit 67cb25
                                     5.561367186955830005e+111,
Packit 67cb25
                                     5.333106466365131227e+119,
Packit 67cb25
                                     5.114214477385391780e+127,
Packit 67cb25
                                     4.904306689854036836e+135
Packit 67cb25
                                    };
Packit 67cb25
      const int n = floor((-s)/10.0);
Packit 67cb25
      const double fs = s + 10.0*n;
Packit 67cb25
      const double p = pow(2.0*M_PI, fs) / twopi_pow[n];
Packit 67cb25
Packit 67cb25
      gsl_sf_result g;
Packit 67cb25
      const int stat_g = gsl_sf_gamma_e(1.0-s, &g);
Packit 67cb25
      result->val  = p * g.val * sin_term * zeta_one_minus_s.val;
Packit 67cb25
      result->err  = fabs(p * g.val * sin_term) * zeta_one_minus_s.err;
Packit 67cb25
      result->err += fabs(p * sin_term * zeta_one_minus_s.val) * g.err;
Packit 67cb25
      result->err += GSL_DBL_EPSILON * (fabs(s)+2.0) * fabs(result->val);
Packit 67cb25
      return GSL_ERROR_SELECT_2(stat_g, stat_zoms);
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      /* The actual zeta function may or may not
Packit 67cb25
       * overflow here. But we have no easy way
Packit 67cb25
       * to calculate it when the prefactor(s)
Packit 67cb25
       * overflow. Trying to use log's and exp
Packit 67cb25
       * is no good because we loose a couple
Packit 67cb25
       * digits to the exp error amplification.
Packit 67cb25
       * When we gather a little more patience,
Packit 67cb25
       * we can implement something here. Until
Packit 67cb25
       * then just give up.
Packit 67cb25
       */
Packit 67cb25
      OVERFLOW_ERROR(result);
Packit 67cb25
    }
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int gsl_sf_zeta_int_e(const int n, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(n < 0) {
Packit 67cb25
    if(!GSL_IS_ODD(n)) {
Packit 67cb25
      result->val = 0.0; /* exactly zero at even negative integers */
Packit 67cb25
      result->err = 0.0;
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
    else if(n > -ZETA_NEG_TABLE_NMAX) {
Packit 67cb25
      result->val = zeta_neg_int_table[-(n+1)/2];
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      return gsl_sf_zeta_e((double)n, result);
Packit 67cb25
    }
Packit 67cb25
  }
Packit 67cb25
  else if(n == 1){
Packit 67cb25
    DOMAIN_ERROR(result);
Packit 67cb25
  }
Packit 67cb25
  else if(n <= ZETA_POS_TABLE_NMAX){
Packit 67cb25
    result->val = 1.0 + zetam1_pos_int_table[n];
Packit 67cb25
    result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    result->val = 1.0;
Packit 67cb25
    result->err = GSL_DBL_EPSILON;
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int gsl_sf_zetam1_e(const double s, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  if(s <= 5.0)
Packit 67cb25
  {
Packit 67cb25
    int stat = gsl_sf_zeta_e(s, result);
Packit 67cb25
    result->val = result->val - 1.0;
Packit 67cb25
    return stat;
Packit 67cb25
  }
Packit 67cb25
  else if(s < 15.0)
Packit 67cb25
  {
Packit 67cb25
    return riemann_zeta_minus_1_intermediate_s(s, result);
Packit 67cb25
  }
Packit 67cb25
  else
Packit 67cb25
  {
Packit 67cb25
    return riemann_zeta_minus1_large_s(s, result);
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int gsl_sf_zetam1_int_e(const int n, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  if(n < 0) {
Packit 67cb25
    if(!GSL_IS_ODD(n)) {
Packit 67cb25
      result->val = -1.0; /* at even negative integers zetam1 == -1 since zeta is exactly zero */
Packit 67cb25
      result->err = 0.0;
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
    else if(n > -ZETA_NEG_TABLE_NMAX) {
Packit 67cb25
      result->val = zeta_neg_int_table[-(n+1)/2] - 1.0;
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      /* could use gsl_sf_zetam1_e here but subtracting 1 makes no difference
Packit 67cb25
         for such large values, so go straight to the result */
Packit 67cb25
      return gsl_sf_zeta_e((double)n, result);  
Packit 67cb25
    }
Packit 67cb25
  }
Packit 67cb25
  else if(n == 1){
Packit 67cb25
    DOMAIN_ERROR(result);
Packit 67cb25
  }
Packit 67cb25
  else if(n <= ZETA_POS_TABLE_NMAX){
Packit 67cb25
    result->val = zetam1_pos_int_table[n];
Packit 67cb25
    result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    return gsl_sf_zetam1_e(n, result);
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int gsl_sf_eta_int_e(int n, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  if(n > ETA_POS_TABLE_NMAX) {
Packit 67cb25
    result->val = 1.0;
Packit 67cb25
    result->err = GSL_DBL_EPSILON;
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(n >= 0) {
Packit 67cb25
    result->val = eta_pos_int_table[n];
Packit 67cb25
    result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    /* n < 0 */
Packit 67cb25
Packit 67cb25
    if(!GSL_IS_ODD(n)) {
Packit 67cb25
      /* exactly zero at even negative integers */
Packit 67cb25
      result->val = 0.0;
Packit 67cb25
      result->err = 0.0;
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
    else if(n > -ETA_NEG_TABLE_NMAX) {
Packit 67cb25
      result->val = eta_neg_int_table[-(n+1)/2];
Packit 67cb25
      result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
      return GSL_SUCCESS;
Packit 67cb25
    }
Packit 67cb25
    else {
Packit 67cb25
      gsl_sf_result z;
Packit 67cb25
      gsl_sf_result p;
Packit 67cb25
      int stat_z = gsl_sf_zeta_int_e(n, &z);
Packit 67cb25
      int stat_p = gsl_sf_exp_e((1.0-n)*M_LN2, &p);
Packit 67cb25
      int stat_m = gsl_sf_multiply_e(-p.val, z.val, result);
Packit 67cb25
      result->err  = fabs(p.err * (M_LN2*(1.0-n)) * z.val) + z.err * fabs(p.val);
Packit 67cb25
      result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
      return GSL_ERROR_SELECT_3(stat_m, stat_p, stat_z);
Packit 67cb25
    }
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
int gsl_sf_eta_e(const double s, gsl_sf_result * result)
Packit 67cb25
{
Packit 67cb25
  /* CHECK_POINTER(result) */
Packit 67cb25
Packit 67cb25
  if(s > 100.0) {
Packit 67cb25
    result->val = 1.0;
Packit 67cb25
    result->err = GSL_DBL_EPSILON;
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else if(fabs(s-1.0) < 10.0*GSL_ROOT5_DBL_EPSILON) {
Packit 67cb25
    double del = s-1.0;
Packit 67cb25
    double c0  = M_LN2;
Packit 67cb25
    double c1  = M_LN2 * (M_EULER - 0.5*M_LN2);
Packit 67cb25
    double c2  = -0.0326862962794492996;
Packit 67cb25
    double c3  =  0.0015689917054155150;
Packit 67cb25
    double c4  =  0.00074987242112047532;
Packit 67cb25
    result->val = c0 + del * (c1 + del * (c2 + del * (c3 + del * c4)));
Packit 67cb25
    result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_SUCCESS;
Packit 67cb25
  }
Packit 67cb25
  else {
Packit 67cb25
    gsl_sf_result z;
Packit 67cb25
    gsl_sf_result p;
Packit 67cb25
    int stat_z = gsl_sf_zeta_e(s, &z);
Packit 67cb25
    int stat_p = gsl_sf_exp_e((1.0-s)*M_LN2, &p);
Packit 67cb25
    int stat_m = gsl_sf_multiply_e(1.0-p.val, z.val, result);
Packit 67cb25
    result->err  = fabs(p.err * (M_LN2*(1.0-s)) * z.val) + z.err * fabs(p.val);
Packit 67cb25
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
Packit 67cb25
    return GSL_ERROR_SELECT_3(stat_m, stat_p, stat_z);
Packit 67cb25
  }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
Packit 67cb25
Packit 67cb25
#include "eval.h"
Packit 67cb25
Packit 67cb25
double gsl_sf_zeta(const double s)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_zeta_e(s, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_hzeta(const double s, const double a)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_hzeta_e(s, a, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_zeta_int(const int s)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_zeta_int_e(s, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_zetam1(const double s)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_zetam1_e(s, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_zetam1_int(const int s)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_zetam1_int_e(s, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_eta_int(const int s)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_eta_int_e(s, &result));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double gsl_sf_eta(const double s)
Packit 67cb25
{
Packit 67cb25
  EVAL_RESULT(gsl_sf_eta_e(s, &result));
Packit 67cb25
}