This module provides helper functions for exact or approximate calculation of the Bernoulli numbers, which are defined by the exponential generating function
Efficient algorithms are implemented for both multi-evaluation and calculation of isolated Bernoulli numbers. A global (or thread-local) cache is also provided, to support fast repeated evaluation of various special functions that depend on the Bernoulli numbers (including the gamma function and the Riemann zeta function).
An iterator object for generating a range of even-indexed Bernoulli numbers exactly in reverse order, i.e. computing the exact fractions \(B_n, B_{n-2}, B_{n-4}, \ldots, B_0\). The Bernoulli numbers are generated from scratch, i.e. no caching is performed.
The Bernoulli numbers are computed by direct summation of the zeta series. This is made fast by storing a table of powers (as done by Bloemen et al. http://remcobloemen.nl/2009/11/even-faster-zeta-calculation.html). As an optimization, we only include the odd powers, and use fixed-point arithmetic.
The reverse iteration order is preferred for performance reasons, as the powers can be updated using multiplications instead of divisions, and we avoid having to periodically recompute terms to higher precision. To generate Bernoulli numbers in the forward direction without having to store all of them, one can split the desired range into smaller blocks and compute each block with a single reverse pass.
Initializes the iterator iter. The first Bernoulli number to be generated by calling bernoulli_rev_next() is \(B_n\). It is assumed that \(n\) is even.
Sets numer and denom to the exact, reduced numerator and denominator of the Bernoulli number \(B_k\) and advances the state of iter so that the next invocation generates \(B_{k-2}\).
Frees all memory allocated internally by iter.
Cache of Bernoulli numbers. Uses thread-local storage if enabled in FLINT.
Makes sure that the Bernoulli numbers up to at least \(B_{n-1}\) are cached. Calling flint_cleanup() frees the cache.
Returns an integer \(b\) such that \(|B_n| \le 2^b\). Uses a lookup table for small \(n\), and for larger \(n\) uses the inequality \(|B_n| < 4 n! / (2 \pi)^n < 4 (n+1)^{n+1} e^{-n} / (2 \pi)^n\). Uses integer arithmetic throughout, with the bound for the logarithm being looked up from a table. If \(|B_n| = 0\), returns LONG_MIN. Otherwise, the returned exponent \(b\) is never more than one percent larger than the true magnitude.
This function is intended for use when \(n\) small enough that one might comfortably compute \(B_n\) exactly. It aborts if \(n\) is so large that internal overflow occurs.
Sets num and den to the reduced numerator and denominator of the Bernoulli number \(B_n\).
This function computes the denominator \(d\) using von Staudt-Clausen theorem, numerically approximates \(B_n\) using arb_bernoulli_ui_zeta(), and then rounds \(d B_n\) to the correct numerator. If the working precision is insufficient to determine the numerator, the function prints a warning message and retries with increased precision (this should not be expected to happen).
Computes the Bernoulli number \(B_n\) as an exact fraction, for an isolated integer \(n\). This function reads \(B_n\) from the global cache if the number is already cached, but does not automatically extend the cache by itself.