Schritt 12: Codierung Gauss Formel
In unserem vorherigen Schritt fanden wir die Formel:
Π/4=12*arctan(1/18) + 8*arctan(1/57) - 5*arctan(1/239)
Wir können leicht daraus eine Funktion in Python geht man davon aus, dass wir eine Arctan-Funktion definiert haben:
Wir müssen nun eine Arctan-Funktion erstellen. Die schnellste Methode zur Umsetzung wäre die Formel verwenden, sahen wir in Schritt 9:
arctan(x) = X - (x³/3) + (X⁵/5) - (X⁷/7) + (X⁹/9) - (x¹¹/11)...
aber zu sehen, wie wir berechnen nur Arctans Zahlen in Form von 1 / x es macht mehr Sinn, die Formel als neu zu definieren:
arctan(1/x) = (1 / x)-(1/3 x ³) + (1/5x⁵) - (1/7x⁷) + (1/9x⁹) - (1/11 x ¹¹)...
Dies gibt uns die folgende Funktion in Python:
Diese Funktion ist ein bisschen fortgeschrittener als unsere bisherigen Funktionen, erfordert nicht die den Benutzer die Eingabe wie viele Iterationen ausgeführt. Stattdessen schaut auf den Wert der Getcontext () .prec und ermittelt den kleinsten Wert, die Python-Programm von Null unterscheiden können (zum Beispiel wenn Getcontext () .prec = 2, dann ist der kleinste Wert Python zwischen 0 unterscheiden kann 0,1).
Es vergleicht dann den Wert des letzten Wortes in der Reihenfolge: Wenn es ist kleiner als der kleinste Wert Python von 0 unterscheiden können, dann gibt es keinen Sinn, weiter, so dass das Programm beendet.
Wenn wir die beiden Funktionen zusammengestellt, erhalten wir das folgende Programm (gauss_pi_method.py):
Wenn Sie dies erhalten Sie 10.000 Stellen von π ausführen sollte es weniger als eine Minute dauern. Auf meinem Computer dauerte es 17 Sekunden. Das ist viel besser als die vorherigen beste Programm, das wir hatten, das basiert auf den Polygon-Methode, die dauerte 43 Sekunden auf meinem Computer zu 100 Stellen von π zu berechnen.
Jedoch können wir viel besser mit der gleichen Funktion, um π zu berechnen, wenn wir arctan(1/x) schneller berechnen könnte.
Glücklicherweise kam Euler mit einem Weg, genau das zu tun:
arctan(1/x) = (X / (1 + X²)) + ((2 * X) / (3*(1+x²)²)) + ((2 * 4 * X) / (3*5*(1+x²)³)) + ((2 * 4 * 6 * X) / (3*5*7*(1+x²)⁴)) +...
Die n-te Begriff in dieser Serie wird durch die Funktion Tabelle gegeben:
Zweierpotenz = f(n-1) * (2 * n) / ((2*n+1)*(1+x²))
Wo befindet sich der erste Term (X / (1 + X²))
Um den Code machen schneller laufen können wir berechnen 1 + X² vor der Schleife so haben wir nur einmal berechnet. Der aktualisierte Code (gauss_pi_method_accelerated_arctan.py) ist:
Dieser Code hat etwas mehr als eine halbe Sekunde π auf 10.000 stellen, berechnen, das etwa 30 Mal schneller als zuvor!
Es ist ein netter Trick, um den Code noch schneller machen. Bis jetzt habe wir die dezimale Bibliothek in Python verwendet. Wenn wir die Berechnungen mit ganzen Zahlen tun wird es viel schneller sein. Dazu multiplizieren wir zuerst den Anfangswert durch eine große Potenz von 10 und später, wenn wir das Ergebnis verwenden möchten, teilen wir es durch die gleiche Potenz von 10. Hier wird der Code (gauss_pi_method_fixed_point.py) aussehen:
Diese Version des Codes berechnet 10.000 Dezimalstellen von π in 0,26 Sekunden, das ist fast doppelt so schnell wie die vorherige Methode!