Interface
#include <codecogs/maths/discrete/number_theory/bernoulli_b.h>
using namespace Maths::NumberTheory;
| void | bernoulli_B (int iMax, double* dB)
Calculates array of Bernoulli numbers using an infinite series |
Use the following HTML code to embed the calculators within other websites:
Bernoulli B
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.092156862745
Parameters
| iMax | input maximal index requested |
| dB | output pointer on the array of numbers declared in the calling module. |
Authors
- Anatoly Prognimack (Mar 16, 2005)
Developed tested with Borland C++ 3.1 for DOS and Microsoft Visual C++ 5.0, 6.0
Updated by Will Bateman (March 2005)
Source Code
Source code is available when you agree to a GP Licence or buy a Commercial Licence.
Not a member, then Register with CodeCogs. Already a Member, then Login.