1*38fd1498Szrj // Special functions -*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj // Copyright (C) 2006-2018 Free Software Foundation, Inc. 4*38fd1498Szrj // 5*38fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj // software; you can redistribute it and/or modify it under the 7*38fd1498Szrj // terms of the GNU General Public License as published by the 8*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj // any later version. 10*38fd1498Szrj // 11*38fd1498Szrj // This library is distributed in the hope that it will be useful, 12*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj // GNU General Public License for more details. 15*38fd1498Szrj // 16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj // 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj // You should have received a copy of the GNU General Public License and 21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj // <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj /** @file tr1/riemann_zeta.tcc 26*38fd1498Szrj * This is an internal header file, included by other library headers. 27*38fd1498Szrj * Do not attempt to use it directly. @headername{tr1/cmath} 28*38fd1498Szrj */ 29*38fd1498Szrj 30*38fd1498Szrj // 31*38fd1498Szrj // ISO C++ 14882 TR1: 5.2 Special functions 32*38fd1498Szrj // 33*38fd1498Szrj 34*38fd1498Szrj // Written by Edward Smith-Rowland based on: 35*38fd1498Szrj // (1) Handbook of Mathematical Functions, 36*38fd1498Szrj // Ed. by Milton Abramowitz and Irene A. Stegun, 37*38fd1498Szrj // Dover Publications, New-York, Section 5, pp. 807-808. 38*38fd1498Szrj // (2) The Gnu Scientific Library, http://www.gnu.org/software/gsl 39*38fd1498Szrj // (3) Gamma, Exploring Euler's Constant, Julian Havil, 40*38fd1498Szrj // Princeton, 2003. 41*38fd1498Szrj 42*38fd1498Szrj #ifndef _GLIBCXX_TR1_RIEMANN_ZETA_TCC 43*38fd1498Szrj #define _GLIBCXX_TR1_RIEMANN_ZETA_TCC 1 44*38fd1498Szrj 45*38fd1498Szrj #include "special_function_util.h" 46*38fd1498Szrj 47*38fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default) 48*38fd1498Szrj { 49*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION 50*38fd1498Szrj 51*38fd1498Szrj #if _GLIBCXX_USE_STD_SPEC_FUNCS 52*38fd1498Szrj # define _GLIBCXX_MATH_NS ::std 53*38fd1498Szrj #elif defined(_GLIBCXX_TR1_CMATH) 54*38fd1498Szrj namespace tr1 55*38fd1498Szrj { 56*38fd1498Szrj # define _GLIBCXX_MATH_NS ::std::tr1 57*38fd1498Szrj #else 58*38fd1498Szrj # error do not include this header directly, use <cmath> or <tr1/cmath> 59*38fd1498Szrj #endif 60*38fd1498Szrj // [5.2] Special functions 61*38fd1498Szrj 62*38fd1498Szrj // Implementation-space details. 63*38fd1498Szrj namespace __detail 64*38fd1498Szrj { 65*38fd1498Szrj /** 66*38fd1498Szrj * @brief Compute the Riemann zeta function @f$ \zeta(s) @f$ 67*38fd1498Szrj * by summation for s > 1. 68*38fd1498Szrj * 69*38fd1498Szrj * The Riemann zeta function is defined by: 70*38fd1498Szrj * \f[ 71*38fd1498Szrj * \zeta(s) = \sum_{k=1}^{\infty} \frac{1}{k^{s}} for s > 1 72*38fd1498Szrj * \f] 73*38fd1498Szrj * For s < 1 use the reflection formula: 74*38fd1498Szrj * \f[ 75*38fd1498Szrj * \zeta(s) = 2^s \pi^{s-1} \Gamma(1-s) \zeta(1-s) 76*38fd1498Szrj * \f] 77*38fd1498Szrj */ 78*38fd1498Szrj template<typename _Tp> 79*38fd1498Szrj _Tp __riemann_zeta_sum(_Tp __s)80*38fd1498Szrj __riemann_zeta_sum(_Tp __s) 81*38fd1498Szrj { 82*38fd1498Szrj // A user shouldn't get to this. 83*38fd1498Szrj if (__s < _Tp(1)) 84*38fd1498Szrj std::__throw_domain_error(__N("Bad argument in zeta sum.")); 85*38fd1498Szrj 86*38fd1498Szrj const unsigned int max_iter = 10000; 87*38fd1498Szrj _Tp __zeta = _Tp(0); 88*38fd1498Szrj for (unsigned int __k = 1; __k < max_iter; ++__k) 89*38fd1498Szrj { 90*38fd1498Szrj _Tp __term = std::pow(static_cast<_Tp>(__k), -__s); 91*38fd1498Szrj if (__term < std::numeric_limits<_Tp>::epsilon()) 92*38fd1498Szrj { 93*38fd1498Szrj break; 94*38fd1498Szrj } 95*38fd1498Szrj __zeta += __term; 96*38fd1498Szrj } 97*38fd1498Szrj 98*38fd1498Szrj return __zeta; 99*38fd1498Szrj } 100*38fd1498Szrj 101*38fd1498Szrj 102*38fd1498Szrj /** 103*38fd1498Szrj * @brief Evaluate the Riemann zeta function @f$ \zeta(s) @f$ 104*38fd1498Szrj * by an alternate series for s > 0. 105*38fd1498Szrj * 106*38fd1498Szrj * The Riemann zeta function is defined by: 107*38fd1498Szrj * \f[ 108*38fd1498Szrj * \zeta(s) = \sum_{k=1}^{\infty} \frac{1}{k^{s}} for s > 1 109*38fd1498Szrj * \f] 110*38fd1498Szrj * For s < 1 use the reflection formula: 111*38fd1498Szrj * \f[ 112*38fd1498Szrj * \zeta(s) = 2^s \pi^{s-1} \Gamma(1-s) \zeta(1-s) 113*38fd1498Szrj * \f] 114*38fd1498Szrj */ 115*38fd1498Szrj template<typename _Tp> 116*38fd1498Szrj _Tp __riemann_zeta_alt(_Tp __s)117*38fd1498Szrj __riemann_zeta_alt(_Tp __s) 118*38fd1498Szrj { 119*38fd1498Szrj _Tp __sgn = _Tp(1); 120*38fd1498Szrj _Tp __zeta = _Tp(0); 121*38fd1498Szrj for (unsigned int __i = 1; __i < 10000000; ++__i) 122*38fd1498Szrj { 123*38fd1498Szrj _Tp __term = __sgn / std::pow(__i, __s); 124*38fd1498Szrj if (std::abs(__term) < std::numeric_limits<_Tp>::epsilon()) 125*38fd1498Szrj break; 126*38fd1498Szrj __zeta += __term; 127*38fd1498Szrj __sgn *= _Tp(-1); 128*38fd1498Szrj } 129*38fd1498Szrj __zeta /= _Tp(1) - std::pow(_Tp(2), _Tp(1) - __s); 130*38fd1498Szrj 131*38fd1498Szrj return __zeta; 132*38fd1498Szrj } 133*38fd1498Szrj 134*38fd1498Szrj 135*38fd1498Szrj /** 136*38fd1498Szrj * @brief Evaluate the Riemann zeta function by series for all s != 1. 137*38fd1498Szrj * Convergence is great until largish negative numbers. 138*38fd1498Szrj * Then the convergence of the > 0 sum gets better. 139*38fd1498Szrj * 140*38fd1498Szrj * The series is: 141*38fd1498Szrj * \f[ 142*38fd1498Szrj * \zeta(s) = \frac{1}{1-2^{1-s}} 143*38fd1498Szrj * \sum_{n=0}^{\infty} \frac{1}{2^{n+1}} 144*38fd1498Szrj * \sum_{k=0}^{n} (-1)^k \frac{n!}{(n-k)!k!} (k+1)^{-s} 145*38fd1498Szrj * \f] 146*38fd1498Szrj * Havil 2003, p. 206. 147*38fd1498Szrj * 148*38fd1498Szrj * The Riemann zeta function is defined by: 149*38fd1498Szrj * \f[ 150*38fd1498Szrj * \zeta(s) = \sum_{k=1}^{\infty} \frac{1}{k^{s}} for s > 1 151*38fd1498Szrj * \f] 152*38fd1498Szrj * For s < 1 use the reflection formula: 153*38fd1498Szrj * \f[ 154*38fd1498Szrj * \zeta(s) = 2^s \pi^{s-1} \Gamma(1-s) \zeta(1-s) 155*38fd1498Szrj * \f] 156*38fd1498Szrj */ 157*38fd1498Szrj template<typename _Tp> 158*38fd1498Szrj _Tp __riemann_zeta_glob(_Tp __s)159*38fd1498Szrj __riemann_zeta_glob(_Tp __s) 160*38fd1498Szrj { 161*38fd1498Szrj _Tp __zeta = _Tp(0); 162*38fd1498Szrj 163*38fd1498Szrj const _Tp __eps = std::numeric_limits<_Tp>::epsilon(); 164*38fd1498Szrj // Max e exponent before overflow. 165*38fd1498Szrj const _Tp __max_bincoeff = std::numeric_limits<_Tp>::max_exponent10 166*38fd1498Szrj * std::log(_Tp(10)) - _Tp(1); 167*38fd1498Szrj 168*38fd1498Szrj // This series works until the binomial coefficient blows up 169*38fd1498Szrj // so use reflection. 170*38fd1498Szrj if (__s < _Tp(0)) 171*38fd1498Szrj { 172*38fd1498Szrj #if _GLIBCXX_USE_C99_MATH_TR1 173*38fd1498Szrj if (_GLIBCXX_MATH_NS::fmod(__s,_Tp(2)) == _Tp(0)) 174*38fd1498Szrj return _Tp(0); 175*38fd1498Szrj else 176*38fd1498Szrj #endif 177*38fd1498Szrj { 178*38fd1498Szrj _Tp __zeta = __riemann_zeta_glob(_Tp(1) - __s); 179*38fd1498Szrj __zeta *= std::pow(_Tp(2) 180*38fd1498Szrj * __numeric_constants<_Tp>::__pi(), __s) 181*38fd1498Szrj * std::sin(__numeric_constants<_Tp>::__pi_2() * __s) 182*38fd1498Szrj #if _GLIBCXX_USE_C99_MATH_TR1 183*38fd1498Szrj * std::exp(_GLIBCXX_MATH_NS::lgamma(_Tp(1) - __s)) 184*38fd1498Szrj #else 185*38fd1498Szrj * std::exp(__log_gamma(_Tp(1) - __s)) 186*38fd1498Szrj #endif 187*38fd1498Szrj / __numeric_constants<_Tp>::__pi(); 188*38fd1498Szrj return __zeta; 189*38fd1498Szrj } 190*38fd1498Szrj } 191*38fd1498Szrj 192*38fd1498Szrj _Tp __num = _Tp(0.5L); 193*38fd1498Szrj const unsigned int __maxit = 10000; 194*38fd1498Szrj for (unsigned int __i = 0; __i < __maxit; ++__i) 195*38fd1498Szrj { 196*38fd1498Szrj bool __punt = false; 197*38fd1498Szrj _Tp __sgn = _Tp(1); 198*38fd1498Szrj _Tp __term = _Tp(0); 199*38fd1498Szrj for (unsigned int __j = 0; __j <= __i; ++__j) 200*38fd1498Szrj { 201*38fd1498Szrj #if _GLIBCXX_USE_C99_MATH_TR1 202*38fd1498Szrj _Tp __bincoeff = _GLIBCXX_MATH_NS::lgamma(_Tp(1 + __i)) 203*38fd1498Szrj - _GLIBCXX_MATH_NS::lgamma(_Tp(1 + __j)) 204*38fd1498Szrj - _GLIBCXX_MATH_NS::lgamma(_Tp(1 + __i - __j)); 205*38fd1498Szrj #else 206*38fd1498Szrj _Tp __bincoeff = __log_gamma(_Tp(1 + __i)) 207*38fd1498Szrj - __log_gamma(_Tp(1 + __j)) 208*38fd1498Szrj - __log_gamma(_Tp(1 + __i - __j)); 209*38fd1498Szrj #endif 210*38fd1498Szrj if (__bincoeff > __max_bincoeff) 211*38fd1498Szrj { 212*38fd1498Szrj // This only gets hit for x << 0. 213*38fd1498Szrj __punt = true; 214*38fd1498Szrj break; 215*38fd1498Szrj } 216*38fd1498Szrj __bincoeff = std::exp(__bincoeff); 217*38fd1498Szrj __term += __sgn * __bincoeff * std::pow(_Tp(1 + __j), -__s); 218*38fd1498Szrj __sgn *= _Tp(-1); 219*38fd1498Szrj } 220*38fd1498Szrj if (__punt) 221*38fd1498Szrj break; 222*38fd1498Szrj __term *= __num; 223*38fd1498Szrj __zeta += __term; 224*38fd1498Szrj if (std::abs(__term/__zeta) < __eps) 225*38fd1498Szrj break; 226*38fd1498Szrj __num *= _Tp(0.5L); 227*38fd1498Szrj } 228*38fd1498Szrj 229*38fd1498Szrj __zeta /= _Tp(1) - std::pow(_Tp(2), _Tp(1) - __s); 230*38fd1498Szrj 231*38fd1498Szrj return __zeta; 232*38fd1498Szrj } 233*38fd1498Szrj 234*38fd1498Szrj 235*38fd1498Szrj /** 236*38fd1498Szrj * @brief Compute the Riemann zeta function @f$ \zeta(s) @f$ 237*38fd1498Szrj * using the product over prime factors. 238*38fd1498Szrj * \f[ 239*38fd1498Szrj * \zeta(s) = \Pi_{i=1}^\infty \frac{1}{1 - p_i^{-s}} 240*38fd1498Szrj * \f] 241*38fd1498Szrj * where @f$ {p_i} @f$ are the prime numbers. 242*38fd1498Szrj * 243*38fd1498Szrj * The Riemann zeta function is defined by: 244*38fd1498Szrj * \f[ 245*38fd1498Szrj * \zeta(s) = \sum_{k=1}^{\infty} \frac{1}{k^{s}} for s > 1 246*38fd1498Szrj * \f] 247*38fd1498Szrj * For s < 1 use the reflection formula: 248*38fd1498Szrj * \f[ 249*38fd1498Szrj * \zeta(s) = 2^s \pi^{s-1} \Gamma(1-s) \zeta(1-s) 250*38fd1498Szrj * \f] 251*38fd1498Szrj */ 252*38fd1498Szrj template<typename _Tp> 253*38fd1498Szrj _Tp __riemann_zeta_product(_Tp __s)254*38fd1498Szrj __riemann_zeta_product(_Tp __s) 255*38fd1498Szrj { 256*38fd1498Szrj static const _Tp __prime[] = { 257*38fd1498Szrj _Tp(2), _Tp(3), _Tp(5), _Tp(7), _Tp(11), _Tp(13), _Tp(17), _Tp(19), 258*38fd1498Szrj _Tp(23), _Tp(29), _Tp(31), _Tp(37), _Tp(41), _Tp(43), _Tp(47), 259*38fd1498Szrj _Tp(53), _Tp(59), _Tp(61), _Tp(67), _Tp(71), _Tp(73), _Tp(79), 260*38fd1498Szrj _Tp(83), _Tp(89), _Tp(97), _Tp(101), _Tp(103), _Tp(107), _Tp(109) 261*38fd1498Szrj }; 262*38fd1498Szrj static const unsigned int __num_primes = sizeof(__prime) / sizeof(_Tp); 263*38fd1498Szrj 264*38fd1498Szrj _Tp __zeta = _Tp(1); 265*38fd1498Szrj for (unsigned int __i = 0; __i < __num_primes; ++__i) 266*38fd1498Szrj { 267*38fd1498Szrj const _Tp __fact = _Tp(1) - std::pow(__prime[__i], -__s); 268*38fd1498Szrj __zeta *= __fact; 269*38fd1498Szrj if (_Tp(1) - __fact < std::numeric_limits<_Tp>::epsilon()) 270*38fd1498Szrj break; 271*38fd1498Szrj } 272*38fd1498Szrj 273*38fd1498Szrj __zeta = _Tp(1) / __zeta; 274*38fd1498Szrj 275*38fd1498Szrj return __zeta; 276*38fd1498Szrj } 277*38fd1498Szrj 278*38fd1498Szrj 279*38fd1498Szrj /** 280*38fd1498Szrj * @brief Return the Riemann zeta function @f$ \zeta(s) @f$. 281*38fd1498Szrj * 282*38fd1498Szrj * The Riemann zeta function is defined by: 283*38fd1498Szrj * \f[ 284*38fd1498Szrj * \zeta(s) = \sum_{k=1}^{\infty} k^{-s} for s > 1 285*38fd1498Szrj * \frac{(2\pi)^s}{pi} sin(\frac{\pi s}{2}) 286*38fd1498Szrj * \Gamma (1 - s) \zeta (1 - s) for s < 1 287*38fd1498Szrj * \f] 288*38fd1498Szrj * For s < 1 use the reflection formula: 289*38fd1498Szrj * \f[ 290*38fd1498Szrj * \zeta(s) = 2^s \pi^{s-1} \Gamma(1-s) \zeta(1-s) 291*38fd1498Szrj * \f] 292*38fd1498Szrj */ 293*38fd1498Szrj template<typename _Tp> 294*38fd1498Szrj _Tp __riemann_zeta(_Tp __s)295*38fd1498Szrj __riemann_zeta(_Tp __s) 296*38fd1498Szrj { 297*38fd1498Szrj if (__isnan(__s)) 298*38fd1498Szrj return std::numeric_limits<_Tp>::quiet_NaN(); 299*38fd1498Szrj else if (__s == _Tp(1)) 300*38fd1498Szrj return std::numeric_limits<_Tp>::infinity(); 301*38fd1498Szrj else if (__s < -_Tp(19)) 302*38fd1498Szrj { 303*38fd1498Szrj _Tp __zeta = __riemann_zeta_product(_Tp(1) - __s); 304*38fd1498Szrj __zeta *= std::pow(_Tp(2) * __numeric_constants<_Tp>::__pi(), __s) 305*38fd1498Szrj * std::sin(__numeric_constants<_Tp>::__pi_2() * __s) 306*38fd1498Szrj #if _GLIBCXX_USE_C99_MATH_TR1 307*38fd1498Szrj * std::exp(_GLIBCXX_MATH_NS::lgamma(_Tp(1) - __s)) 308*38fd1498Szrj #else 309*38fd1498Szrj * std::exp(__log_gamma(_Tp(1) - __s)) 310*38fd1498Szrj #endif 311*38fd1498Szrj / __numeric_constants<_Tp>::__pi(); 312*38fd1498Szrj return __zeta; 313*38fd1498Szrj } 314*38fd1498Szrj else if (__s < _Tp(20)) 315*38fd1498Szrj { 316*38fd1498Szrj // Global double sum or McLaurin? 317*38fd1498Szrj bool __glob = true; 318*38fd1498Szrj if (__glob) 319*38fd1498Szrj return __riemann_zeta_glob(__s); 320*38fd1498Szrj else 321*38fd1498Szrj { 322*38fd1498Szrj if (__s > _Tp(1)) 323*38fd1498Szrj return __riemann_zeta_sum(__s); 324*38fd1498Szrj else 325*38fd1498Szrj { 326*38fd1498Szrj _Tp __zeta = std::pow(_Tp(2) 327*38fd1498Szrj * __numeric_constants<_Tp>::__pi(), __s) 328*38fd1498Szrj * std::sin(__numeric_constants<_Tp>::__pi_2() * __s) 329*38fd1498Szrj #if _GLIBCXX_USE_C99_MATH_TR1 330*38fd1498Szrj * _GLIBCXX_MATH_NS::tgamma(_Tp(1) - __s) 331*38fd1498Szrj #else 332*38fd1498Szrj * std::exp(__log_gamma(_Tp(1) - __s)) 333*38fd1498Szrj #endif 334*38fd1498Szrj * __riemann_zeta_sum(_Tp(1) - __s); 335*38fd1498Szrj return __zeta; 336*38fd1498Szrj } 337*38fd1498Szrj } 338*38fd1498Szrj } 339*38fd1498Szrj else 340*38fd1498Szrj return __riemann_zeta_product(__s); 341*38fd1498Szrj } 342*38fd1498Szrj 343*38fd1498Szrj 344*38fd1498Szrj /** 345*38fd1498Szrj * @brief Return the Hurwitz zeta function @f$ \zeta(x,s) @f$ 346*38fd1498Szrj * for all s != 1 and x > -1. 347*38fd1498Szrj * 348*38fd1498Szrj * The Hurwitz zeta function is defined by: 349*38fd1498Szrj * @f[ 350*38fd1498Szrj * \zeta(x,s) = \sum_{n=0}^{\infty} \frac{1}{(n + x)^s} 351*38fd1498Szrj * @f] 352*38fd1498Szrj * The Riemann zeta function is a special case: 353*38fd1498Szrj * @f[ 354*38fd1498Szrj * \zeta(s) = \zeta(1,s) 355*38fd1498Szrj * @f] 356*38fd1498Szrj * 357*38fd1498Szrj * This functions uses the double sum that converges for s != 1 358*38fd1498Szrj * and x > -1: 359*38fd1498Szrj * @f[ 360*38fd1498Szrj * \zeta(x,s) = \frac{1}{s-1} 361*38fd1498Szrj * \sum_{n=0}^{\infty} \frac{1}{n + 1} 362*38fd1498Szrj * \sum_{k=0}^{n} (-1)^k \frac{n!}{(n-k)!k!} (x+k)^{-s} 363*38fd1498Szrj * @f] 364*38fd1498Szrj */ 365*38fd1498Szrj template<typename _Tp> 366*38fd1498Szrj _Tp __hurwitz_zeta_glob(_Tp __a,_Tp __s)367*38fd1498Szrj __hurwitz_zeta_glob(_Tp __a, _Tp __s) 368*38fd1498Szrj { 369*38fd1498Szrj _Tp __zeta = _Tp(0); 370*38fd1498Szrj 371*38fd1498Szrj const _Tp __eps = std::numeric_limits<_Tp>::epsilon(); 372*38fd1498Szrj // Max e exponent before overflow. 373*38fd1498Szrj const _Tp __max_bincoeff = std::numeric_limits<_Tp>::max_exponent10 374*38fd1498Szrj * std::log(_Tp(10)) - _Tp(1); 375*38fd1498Szrj 376*38fd1498Szrj const unsigned int __maxit = 10000; 377*38fd1498Szrj for (unsigned int __i = 0; __i < __maxit; ++__i) 378*38fd1498Szrj { 379*38fd1498Szrj bool __punt = false; 380*38fd1498Szrj _Tp __sgn = _Tp(1); 381*38fd1498Szrj _Tp __term = _Tp(0); 382*38fd1498Szrj for (unsigned int __j = 0; __j <= __i; ++__j) 383*38fd1498Szrj { 384*38fd1498Szrj #if _GLIBCXX_USE_C99_MATH_TR1 385*38fd1498Szrj _Tp __bincoeff = _GLIBCXX_MATH_NS::lgamma(_Tp(1 + __i)) 386*38fd1498Szrj - _GLIBCXX_MATH_NS::lgamma(_Tp(1 + __j)) 387*38fd1498Szrj - _GLIBCXX_MATH_NS::lgamma(_Tp(1 + __i - __j)); 388*38fd1498Szrj #else 389*38fd1498Szrj _Tp __bincoeff = __log_gamma(_Tp(1 + __i)) 390*38fd1498Szrj - __log_gamma(_Tp(1 + __j)) 391*38fd1498Szrj - __log_gamma(_Tp(1 + __i - __j)); 392*38fd1498Szrj #endif 393*38fd1498Szrj if (__bincoeff > __max_bincoeff) 394*38fd1498Szrj { 395*38fd1498Szrj // This only gets hit for x << 0. 396*38fd1498Szrj __punt = true; 397*38fd1498Szrj break; 398*38fd1498Szrj } 399*38fd1498Szrj __bincoeff = std::exp(__bincoeff); 400*38fd1498Szrj __term += __sgn * __bincoeff * std::pow(_Tp(__a + __j), -__s); 401*38fd1498Szrj __sgn *= _Tp(-1); 402*38fd1498Szrj } 403*38fd1498Szrj if (__punt) 404*38fd1498Szrj break; 405*38fd1498Szrj __term /= _Tp(__i + 1); 406*38fd1498Szrj if (std::abs(__term / __zeta) < __eps) 407*38fd1498Szrj break; 408*38fd1498Szrj __zeta += __term; 409*38fd1498Szrj } 410*38fd1498Szrj 411*38fd1498Szrj __zeta /= __s - _Tp(1); 412*38fd1498Szrj 413*38fd1498Szrj return __zeta; 414*38fd1498Szrj } 415*38fd1498Szrj 416*38fd1498Szrj 417*38fd1498Szrj /** 418*38fd1498Szrj * @brief Return the Hurwitz zeta function @f$ \zeta(x,s) @f$ 419*38fd1498Szrj * for all s != 1 and x > -1. 420*38fd1498Szrj * 421*38fd1498Szrj * The Hurwitz zeta function is defined by: 422*38fd1498Szrj * @f[ 423*38fd1498Szrj * \zeta(x,s) = \sum_{n=0}^{\infty} \frac{1}{(n + x)^s} 424*38fd1498Szrj * @f] 425*38fd1498Szrj * The Riemann zeta function is a special case: 426*38fd1498Szrj * @f[ 427*38fd1498Szrj * \zeta(s) = \zeta(1,s) 428*38fd1498Szrj * @f] 429*38fd1498Szrj */ 430*38fd1498Szrj template<typename _Tp> 431*38fd1498Szrj inline _Tp __hurwitz_zeta(_Tp __a,_Tp __s)432*38fd1498Szrj __hurwitz_zeta(_Tp __a, _Tp __s) 433*38fd1498Szrj { return __hurwitz_zeta_glob(__a, __s); } 434*38fd1498Szrj } // namespace __detail 435*38fd1498Szrj #undef _GLIBCXX_MATH_NS 436*38fd1498Szrj #if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH) 437*38fd1498Szrj } // namespace tr1 438*38fd1498Szrj #endif 439*38fd1498Szrj 440*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION 441*38fd1498Szrj } 442*38fd1498Szrj 443*38fd1498Szrj #endif // _GLIBCXX_TR1_RIEMANN_ZETA_TCC 444