| [section:zeta Riemann Zeta Function] |
| |
| [h4 Synopsis] |
| |
| `` |
| #include <boost/math/special_functions/zeta.hpp> |
| `` |
| |
| namespace boost{ namespace math{ |
| |
| template <class T> |
| ``__sf_result`` zeta(T z); |
| |
| template <class T, class ``__Policy``> |
| ``__sf_result`` zeta(T z, const ``__Policy``&); |
| |
| }} // namespaces |
| |
| The return type of these functions is computed using the __arg_pomotion_rules: |
| the return type is `double` if T is an integer type, and T otherwise. |
| |
| [optional_policy] |
| |
| [h4 Description] |
| |
| template <class T> |
| ``__sf_result`` zeta(T z); |
| |
| template <class T, class ``__Policy``> |
| ``__sf_result`` zeta(T z, const ``__Policy``&); |
| |
| Returns the [@http://mathworld.wolfram.com/RiemannZetaFunction.html zeta function] |
| of z: |
| |
| [equation zeta1] |
| |
| [graph zeta1] |
| |
| [graph zeta2] |
| |
| [h4 Accuracy] |
| |
| The following table shows the peak errors (in units of epsilon) |
| found on various platforms with various floating point types, |
| along with comparisons to the __gsl and __cephes libraries. |
| Unless otherwise specified any floating point type that is narrower |
| than the one shown will have __zero_error. |
| |
| [table Errors In the Function zeta(z) |
| [[Significand Size] [Platform and Compiler] [z > 0][z < 0]] |
| [[53] [Win32, Visual C++ 8] [Peak=0.99 Mean=0.1 |
| |
| GSL Peak=8.7 Mean=1.0 |
| |
| __cephes Peak=2.1 Mean=1.1 |
| ] [Peak=7.1 Mean=3.0 |
| |
| GSL Peak=137 Mean=14 |
| |
| __cephes Peak=5084 Mean=470 |
| ]] |
| [[64] [RedHat Linux IA_EM64, gcc-4.1] [Peak=0.99 Mean=0.5] [Peak=570 Mean=60]] |
| [[64] [Redhat Linux IA64, gcc-4.1] [Peak=0.99 Mean=0.5] [Peak=559 Mean=56]] |
| [[113] [HPUX IA64, aCC A.06.06] [Peak=1.0 Mean=0.4] [Peak=1018 Mean=79]] |
| ] |
| |
| [h4 Testing] |
| |
| The tests for these functions come in two parts: |
| basic sanity checks use spot values calculated using |
| [@http://functions.wolfram.com/webMathematica/FunctionEvaluation.jsp?name=Zeta Mathworld's online evaluator], |
| while accuracy checks use high-precision test values calculated at 1000-bit precision with |
| [@http://shoup.net/ntl/doc/RR.txt NTL::RR] and this implementation. |
| Note that the generic and type-specific |
| versions of these functions use differing implementations internally, so this |
| gives us reasonably independent test data. Using our test data to test other |
| "known good" implementations also provides an additional sanity check. |
| |
| [h4 Implementation] |
| |
| All versions of these functions first use the usual reflection formulas |
| to make their arguments positive: |
| |
| [equation zeta3] |
| |
| The generic versions of these functions are implemented using the series: |
| |
| [equation zeta1] |
| |
| for large z, and using the globally convergent series: |
| |
| [equation zeta2] |
| |
| In all other cases. The crossover point for these is chosen so that the first |
| series is used only if it will converge reasonably quickly, the problem with this |
| series is that convergence become slower the more terms you take, so we really do |
| have to be certain of convergence before using this series, even though the |
| alternative is often quite slow. |
| |
| When the significand (mantissa) size is recognised |
| (currently for 53, 64 and 113-bit reals, plus single-precision 24-bit handled via promotion to double) |
| then a series of rational approximations [jm_rationals] are used. |
| |
| For 0 < z < 1 the approximating form is: |
| |
| [equation zeta4] |
| |
| For a rational approximation R(1-z) and a constant C. |
| |
| For 1 < z < 4 the approximating form is: |
| |
| [equation zeta5] |
| |
| For a rational approximation R(n-z) and a constant C and integer n. |
| |
| For z > 4 the approximating form is: |
| |
| [zeta](z) = 1 + e[super R(z - n)] |
| |
| For a rational approximation R(z-n) and integer n, note that the accuracy |
| required for R(z-n) is not full machine precision, but an absolute error |
| of: [epsilon]/R(0). This saves us quite a few digits when dealing with large |
| z, especially when [epsilon] is small. |
| |
| [endsect] |
| [/ :error_function The Error Functions] |
| |
| [/ |
| Copyright 2006 John Maddock and Paul A. Bristow. |
| Distributed under the Boost Software License, Version 1.0. |
| (See accompanying file LICENSE_1_0.txt or copy at |
| http://www.boost.org/LICENSE_1_0.txt). |
| ] |