[
https://issues.apache.org/jira/browse/NUMBERS-216?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Alex Herbert updated NUMBERS-216:
---------------------------------
difficulty-level: Medium (was: Easy)
> Add a zeta function
> -------------------
>
> Key: NUMBERS-216
> URL: https://issues.apache.org/jira/browse/NUMBERS-216
> Project: Commons Numbers
> Issue Type: New Feature
> Components: gamma
> Reporter: Alex Herbert
> Priority: Minor
>
> Add a zeta function to evaluate the Hurwitz zeta function:
> {noformat}
> oo 1
> zeta(s, a) = sum ------
> k=0 s
> (k+a)
> {noformat}
> The series is formally defined for complex s with real(s) > 1 and real a !=
> 0, -1, -2, ... It can be extended to any s != 1 using analytic continuation.
> When a=1 this is the Riemann zeta function.
> The Hurwitz zeta can be evaluated for real s != 1 and a > 0 efficiently using
> the Euler-Maclaurin formula (see [Huwitz zeta function in DLMF 25.17 Eq
> 7|https://dlmf.nist.gov/25.11#E7]). The final integral can be dropped as a
> residual error term. The formula uses a summation of n terms and is valid
> when s > -2n and a > 0.
> An implementation was added to Commons Statistics to support the Zipf and
> zeta distributions. The implementation supports s > 1 and a > 0.
> h2. Increasing support
> Supporting large negative s requires long computation times as the required
> number of terms n increases. Each term requires a Bernoulli number which can
> be precomputed for small n but are expensive to compute dynamically.
> Supporting negative a requires computing the summation of the formal series
> of (k+a)^-s until k+a is above 0. There is no general reflection formula.
> This will have long run times for negative a.
> I suggest an initial implementation supporting only s > 1 where the series is
> absolutely convergent. Negative a can be supported with the caveat of reduced
> accuracy and long run times.
> When a = 1 the function is the Riemann zeta function. There exists a
> reflection formula for negative s allowing computation for any s != 1.
> I have tested a double-precision implementation from [Boost C++
> zeta|https://www.boost.org/doc/libs/latest/libs/math/doc/html/math_toolkit/zetas/zeta.html]
> converted to Java using the same range supported by the current hurwitz zeta
> implementation. Relative error on 5000 values with s in [1, 32):
> ||Function||Max error||RMS error||
> |zeta(s, 1)|1.664744282142072|0.48639150510073753|
> |zeta(s)|1.448659608140353|0.3295234039818026|
> The Boost function has a small accuracy improvement and will be an order of
> magnitude faster as it uses a polynomial approximation and avoids calls to
> Math.pow. The Boost license is permissive and other Boost function
> implementations already exist in Commons Numbers.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)