Approximations de Pi: Formule et série de Gosper

Description

Bonjour,

Bill Gosper (Ralph William Gosper), mathématicien et informaticien américain est né en 1943.
En ce qui concerne Pi, on lui doit principalement la formule:
   Pi = sqrt(6.75)*Somme(i>=0) [i! * i! / (2*i+1)!]
et la série:
   Pi = 3 + 1/4/5/3*(8 + 2*3/7/8/3*(13 + 3*5/10/11/3*(18 + 4*7/13/14/3*(23 + ...))))

Vous trouverez de la documentation dans:
Wiki: Bill Gosper, Bill Gosper (en)
pi314: William Gosper

Cet article fait partie de la série CodeS-SourceS: Approximations de Pi     <--- cliquez !.

Pour "vérifier" la formule, donnons d'abord un code qui emploie des factorielles précalculées:
// Formule de Gosper: Pi = sqrt(6.75)*Somme(i>=0) [i! * i! / (2*i+1)!]
double Gosper_A(int n) { // calcul avec les factorielles
  double s = 0;
  for (int i=0; i<n; ++i) s += fact[i]*fact[i]/fact[2*i+1];
  return sqrt(6.75)*s;
}

La programmation reste très simple lorsqu'on n'utilise pas explicitement les factorielles:
// Formule de Gosper transformée en série:
// Pi = sqrt(6.75)*[1 + 1/6 + 2/10 + 3/14 + 4/18 + ...)]
double Gosper_B(int n) { // calcul sans les factorielles
  double s = 1, t = 1;
  for (int i=1; i<n; ++i) {
    t *= (double)i/(4*i + 2);
    s += t;
  }
  return sqrt(6.75)*s;
}
Il faut 23 itérations pour atteindre la précision double.

Avec la série de Gosper, 12 itérations suffisent:
// Série de Gosper: Pi =
// 3 + 1/4/5/3*(8 + 2*3/7/8/3*(13 + 3*5/10/11/3*(18 + 4*7/13/14/3*(23 + ...))))
double Gosper_C(int n) {
  double s = 5*(n+1) - 2;
  for (int i=n; i>0; --i) s = 5*i - 2 + s*i*(2*i - 1)/(3*i + 1)/(3*i + 2)/3;
  return s;
}


Le Zip contient le fichier Gosper.cpp qui donne l'Output suivant:
Gosper_A: Pi = sqrt(6.75)*Somme(i>=0) [i! * i! / (2*i+1)!]
  n=  1: pi=2.59807621135332
  n=  2: pi=3.03108891324554
  n=  3: pi=3.11769145362398
  n=  4: pi=3.13624914084793
  n=  5: pi=3.14037307134214
  n=  6: pi=3.14131032827265
  n=  7: pi=3.14152661833353
  n=  8: pi=3.14157708601440
  n=  9: pi=3.14158896076284
  n= 10: pi=3.14159177320327
  n= 11: pi=3.14159244283194
  n= 12: pi=3.14159260296053
  n= 13: pi=3.14159264139140
  n= 14: pi=3.14159265064327
  n= 15: pi=3.14159265287648
  n= 16: pi=3.14159265341677
  n= 17: pi=3.14159265354775
  n= 18: pi=3.14159265357956
  n= 19: pi=3.14159265358730
  n= 20: pi=3.14159265358919
  n= 21: pi=3.14159265358964
  n= 22: pi=3.14159265358976
  n= 23: pi=3.14159265358979
 precis: pi=3.14159265358979

Gosper_B: Pi = sqrt(6.75)*[1 + 1/6 + 2/10 + 3/14 + 4/18 + ...)]
  n=  1: pi=2.59807621135332
  n=  2: pi=3.03108891324554
  n=  3: pi=3.11769145362398
  n=  4: pi=3.13624914084793
  n=  5: pi=3.14037307134214
  n=  6: pi=3.14131032827265
  n=  7: pi=3.14152661833353
  n=  8: pi=3.14157708601440
  n=  9: pi=3.14158896076284
  n= 10: pi=3.14159177320327
  n= 11: pi=3.14159244283194
  n= 12: pi=3.14159260296053
  n= 13: pi=3.14159264139140
  n= 14: pi=3.14159265064327
  n= 15: pi=3.14159265287648
  n= 16: pi=3.14159265341677
  n= 17: pi=3.14159265354775
  n= 18: pi=3.14159265357956
  n= 19: pi=3.14159265358730
  n= 20: pi=3.14159265358919
  n= 21: pi=3.14159265358964
  n= 22: pi=3.14159265358976
  n= 23: pi=3.14159265358979
 precis: pi=3.14159265358979

Gosper_C:
pi = 3 + 1/60*(8 + 2*3/7/8/3*(13 + 3*5/10/11/3*(18 + 4*7/13/14/3*(23 + ...))))
  n=  1: pi=3.13333333333333
  n=  2: pi=3.14107142857143
  n=  3: pi=3.14155844155844
  n=  4: pi=3.14159035409035
  n=  5: pi=3.14159249655573
  n=  6: pi=3.14159264274275
  n=  7: pi=3.14159265283407
  n=  8: pi=3.14159265353679
  n=  9: pi=3.14159265358606
  n= 10: pi=3.14159265358953
  n= 11: pi=3.14159265358977
  n= 12: pi=3.14159265358979
 precis: pi=3.14159265358979

 
 
Bonne lecture ...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.