Python 59 octets
print reduce(lambda x,p:p/2*x/p+2*10**999,range(6637,1,-2))
Cela imprime 1000 chiffres; légèrement plus que le nombre requis 5. Au lieu d'utiliser l'itération prescrite, il utilise ceci:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + 5/11*(2 + ...)))))
Le 6637
(dénominateur le plus intérieur) peut être formulé comme:
chiffres * 2 * log 2 (10)
Cela implique une convergence linéaire. Chaque itération plus profonde produira un bit binaire supplémentaire de pi .
Si , cependant, vous insistez pour utiliser l'identité tan -1 , une convergence similaire peut être obtenue, si cela ne vous dérange pas de traiter le problème légèrement différemment. Jetons un œil aux sommes partielles:
4.0, 2.66667, 3.46667, 2.89524, 3.33968, 2.97605, 3.28374, ...
il est évident que chaque terme saute d'avant en arrière de chaque côté du point de convergence; la série a une convergence alternée. De plus, chaque terme est plus proche du point de convergence que le terme précédent. il est absolument monotone par rapport à son point de convergence. La combinaison de ces deux propriétés implique que la moyenne arithmétique de deux termes voisins est plus proche du point de convergence que l'un ou l'autre des termes eux-mêmes. Pour vous donner une meilleure idée de ce que je veux dire, considérez l'image suivante:
La série externe est l'original, et la série interne est trouvée en prenant la moyenne de chacun des termes voisins. Une différence remarquable. Mais ce qui est vraiment remarquable, c'est que cette nouvelle série a également une convergence alternée, et est absolument monotone par rapport à son point de convergence. Cela signifie que ce processus peut être appliqué à maintes reprises, ad nauseum.
D'accord. Mais comment?
Quelques définitions formelles. Soit P 1 (n) le n ème terme de la première séquence, P 2 (n) le n ème terme de la deuxième séquence, et de même P k (n) le n ème terme de la k ème séquence tel que défini ci-dessus .
P 1 = [P 1 (1), P 1 (2), P 1 (3), P 1 (4), P 1 (5), ...]
P 2 = [(P 1 (1) + P 1 (2)) / 2, (P 1 (2) + P 1 (3)) / 2, (P 1 (3) + P 1 (4)) / 2, (P 1 (4) + P 1 (5)) / 2, ...]
P 3 = [(P 1 (1) + 2P 1 (2) + P 1 (3)) / 4, (P 1 (2) + 2P 1 (3) + P 1 (4)) / 4, (P 1 (3) + 2P 1 (4) + P 1 (5)) / 4, ...]
P 4 = [(P 1 (1) + 3P 1 (2) + 3P 1 (3) + P 1 (4)) / 8, (P 1 (2) + 3P 1 (3) + 3P 1 (4) + P 1 (5)) / 8, ...]
Sans surprise, ces coefficients suivent exactement les coefficients binomiaux et peuvent être exprimés comme une seule ligne du triangle de Pascal. Puisqu'une ligne arbitraire du triangle de Pascal est triviale à calculer, une série arbitrairement «profonde» peut être trouvée, simplement en prenant les n premières sommes partielles, multipliez chacune par le terme correspondant dans la k ème ligne du triangle de Pascal et en divisant par 2 k-1 .
De cette façon, une précision complète en virgule flottante 32 bits (~ 14 décimales) peut être obtenue avec seulement 36 itérations, point auquel les sommes partielles n'ont même pas convergé sur la deuxième décimale. Ce n'est évidemment pas joué au golf:
# used for pascal's triangle
t = 36; v = 1.0/(1<<t-1); e = 1
# used for the partial sums of pi
p = 4; d = 3; s = -4.0
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print "%.14f"%x
Si vous vouliez une précision arbitraire, cela peut être obtenu avec une petite modification. Ici encore, calcul de 1000 chiffres:
# used for pascal's triangle
f = t = 3318; v = 1; e = 1
# used for the partial sums of pi
p = 4096*10**999; d = 3; s = -p
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print x>>f+9
La valeur initiale de p commence 2 10 plus grande, pour contrer les effets de division entière de s / d lorsque d devient plus grand, ce qui fait que les derniers chiffres ne convergent pas. Remarquez ici encore que 3318
c'est aussi:
chiffres * log 2 (10)
Le même nombre d'itérations que le premier algorithme (réduit de moitié car t diminue de 1 au lieu de 2 à chaque itération). Encore une fois, cela indique une convergence linéaire: un bit binaire de pi par itération. Dans les deux cas, 3318 itérations sont nécessaires pour calculer 1000 chiffres de pi , soit un quota légèrement meilleur que 1 million d'itérations pour en calculer 5.
p=lambda:3.14159