Bernoulli_B
Calculates array of Bernoulli numbers using an infinite series
You're viewing an older version of this page (#82). View the current version.
Interface
#include <codecogs/maths/discrete/number_theory/bernoulli_b.h>
using namespace Maths::Discrete::Number_Theory;
Overview
Bernoulli numbers are particular values of Bernoulli polynomials
. Polynomials
are expandable in the Fourier series:
Substitution gives series expansion for Bernoulli numbers:
However, series like this is not quite suitable for numerical evaluation, especially at small n, in view of slow convergence and uneasy accuracy estimation. One needs to use another relation [2,23.10.21]:
Then Fourier series expansion results in the following:
Alternating series converges faster and gives possibility for simple accuracy estimation: error arising due to series truncation is less than first term neglected. Then N, the amount of series terms to obtain accuracy may be estimated as follows:
In the worst case n=2 reasonable accuracy results in
series terms to sum. To significantly reduce a mount of summands and speed up convergence it is suitable to use Aitken transformation of partial series sums. Let
then sequence of new sums
may converge faster compared with . To avoid subtractions of near values and losses of significant digits expression should be rewritten as follows:
or, using
Array dimension should be iMax+1 or greater.
References
- Higher Transcendental Functions, vol.1, (1.13) by H.Bateman and A.Erdelyi (Bateman Manuscript Project), 1953
- M.Abramowitz and I.A.Stegun, Handbook of Mathematical Functions, 1964 chapt.23
- Yu.Luke, Mathematical functions and their approximations, 1975 chapt.14.2
Example 1
#include <stdio.h>
#include <codecogs/maths/discrete/number_theory/bernoulli_b.h>
#define MAX_INDEX 16
int main()
{
double dBernoulli[MAX_INDEX+1];
printf( "%8s%2c%20s\n", " ", 'n', "Bn" );
printf( "%8s", " " );
for(int i = 0; i < 22; i++ )
printf( "%c", '-' );
printf( "\n" );
Maths::NumberTheory::bernoulli_B( MAX_INDEX, dBernoulli );
printf( "%10d%20.12f\n", 0, dBernoulli[0] );
printf( "%10d%20.12f\n", 1, dBernoulli[1] );
for(int i = 2; i <= MAX_INDEX; i += 2 )
printf( "%10d%20.12f\n", i, dBernoulli[i] );
return 0;
}Output:
n Bn
----------------------
0 1.000000000000
1 -0.500000000000
2 0.166666666667
4 -0.033333333333
6 0.023809523810
8 -0.033333333333
10 0.075757575758
12 -0.253113553114
14 1.166666666667
16 -7.092156862745Parameters
FUNCTION
for
odd index elements
DECLARATION
eps
computer dependent value ultimate calculation accuracy
DECLARATION
TwoPi
minimal eps such that 1.0 + eps != 1.0
FUNCTION
for
Bernoulli numbers with even index