Python 59 Bytes
print reduce(lambda x,p:p/2*x/p+2*10**999,range(6637,1,-2))
Dies druckt 1000 Stellen aus; etwas mehr als die erforderlichen 5. Anstatt die vorgeschriebene Iteration zu verwenden, verwendet es diese:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + 5/11*(2 + ...)))))
Der 6637
(innerste Nenner) kann wie folgt formuliert werden:
Ziffern * 2 * log 2 (10)
Dies impliziert eine lineare Konvergenz. Jede tiefere Iteration erzeugt ein weiteres binäres Bit von pi .
Wenn Sie jedoch darauf bestehen, die tan- 1- Identität zu verwenden, kann eine ähnliche Konvergenz erzielt werden, wenn es Ihnen nichts ausmacht, das Problem etwas anders anzugehen. Betrachten Sie die Teilsummen:
4,0, 2,66667, 3,46667, 2,89524, 3,33968, 2,97605, 3,28374, ...
es ist offensichtlich, dass jeder Term zu beiden Seiten des Konvergenzpunkts hin und her springt; die serie hat wechselnde konvergenz. Außerdem ist jeder Term näher am Konvergenzpunkt als der vorherige Term. es ist absolut monoton in Bezug auf seinen Konvergenzpunkt. Die Kombination dieser beiden Eigenschaften impliziert, dass das arithmetische Mittel zweier benachbarter Terme näher am Konvergenzpunkt liegt als die beiden Terme selbst. Betrachten Sie das folgende Bild, um eine bessere Vorstellung davon zu bekommen, was ich meine:
Die äußere Reihe ist das Original, und die innere Reihe ergibt sich aus dem Durchschnitt aller benachbarten Begriffe. Ein bemerkenswerter Unterschied. Aber was wirklich bemerkenswert ist, ist, dass diese neue Serie auch eine abwechselnde Konvergenz aufweist und in Bezug auf ihren Konvergenzpunkt absolut monoton ist. Dies bedeutet, dass dieser Prozess ad nauseum immer wieder angewendet werden kann.
In Ordnung. Aber wie?
Einige formale Definitionen. Sei P 1 (n) der n- te Term der ersten Sequenz, P 2 (n) der n- te Term der zweiten Sequenz und P k (n) der n- te Term der k- ten Sequenz wie oben definiert .
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, ...]
Es überrascht nicht, dass diese Koeffizienten genau den Binomialkoeffizienten folgen und als einzelne Zeile des Pascalschen Dreiecks ausgedrückt werden können. Da eine beliebige Reihe des Pascalschen Dreiecks trivial zu berechnen ist, kann eine beliebige "tiefe" Reihe gefunden werden, indem einfach die ersten n Teilsummen genommen, mit dem entsprechenden Term in der k- ten Reihe des Pascalschen Dreiecks multipliziert und durch 2 dividiert werden k-1 .
Auf diese Weise kann mit nur 36 Iterationen eine vollständige 32-Bit-Gleitkomma-Genauigkeit (~ 14 Dezimalstellen) erreicht werden, bei der die Teilsummen noch nicht einmal auf der zweiten Dezimalstelle konvergieren. Dies ist offensichtlich nicht 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
Wenn Sie eine beliebige Genauigkeit wünschen, kann dies mit einer kleinen Modifikation erreicht werden. Hier nochmal 1000 Stellen rechnen:
# 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
Der Anfangswert von p beginnt 2 10 größer zu sein, um den ganzzahligen Divisionseffekten von s / d entgegenzuwirken, wenn d größer wird, wodurch die letzten Stellen nicht konvergieren. Beachten Sie auch hier Folgendes 3318
:
Ziffern * log 2 (10)
Die gleiche Anzahl von Iterationen wie beim ersten Algorithmus (halbiert, weil t bei jeder Iteration um 1 anstatt um 2 abnimmt ). Dies deutet erneut auf eine lineare Konvergenz hin: ein binäres Bit pi pro Iteration. In beiden Fällen sind 3318 Iterationen erforderlich, um 1000 Stellen pi zu berechnen. Dies ist eine geringfügig bessere Quote als 1 Million Iterationen zur Berechnung von 5.
p=lambda:3.14159