Forgotten Password?

Or login with:

  • Facebook
  • Google
  • Yahoo
get GPL
this unit 1.00
sub units 0.00

Bernoulli B

Calculates array of Bernoulli numbers using an infinite series
Controller: CodeCogs



Bernoulli B

double*dB )
Bernoulli numbers \inline B_n are particular values of Bernoulli polynomials \inline B_n(x): B_n=B_n(0) . Polynomials \inline B_n(x) are expandable in the Fourier series:

Substitution \inline x=0 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 \inline (\epsilon ) may be estimated as follows:

In the worst case n=2 reasonable accuracy \inline (\epsilon ={10}^{-12} ) results in \inline ({10}^6) 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 \inline (S_n). 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.


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;
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


iMaxinput maximal index requested
dBoutput pointer on the array of numbers declared in the calling module.


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.

Last Modified: 28 Dec 11 @ 00:37     Page Rendered: 2022-03-14 13:56:32