Universität Paderborn Fakultät für Elektrotechnik, Informatik und Mathematik WS 2004/05 Seminararbeit Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe Sebastian Aland [email protected] 6. April 2005 Teil des Seminars Zahlen: Berechnung von Pi“ ” Prof. Dr. Joachim von zur Gathen Betreuer: Dr. Michael Nüsken Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe Inhaltsverzeichnis 1. Einführung 3 2. Die BBP-Formel für π 4 3. Der BBP-Algorithmus 8 4. Abschließende Bemerkungen 11 A. Der PSLQ-Algorithmus 12 B. Berechnungen einiger Konstanten 13 C. Eine effiziente Implementierung in C 14 Literatur 17 2 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe Bailey, Borwein und Plouffe präsentierten 1997 einen Algorithmus, mit dem sich einzelne Hexadezimal-Stellen von π bestimmen lassen, ohne dass die voherigen Stellen berechnet werden müssen. Hierfür verwendeten sie eine Darstellung von π als Summe, die man schnell berechnen kann. 1. Einführung Die Aufgabe π auf möglichst viele Nachkommastellen zu berechnen ist nicht neu, in der Tat ist sie eine der ältesten mathematischen Aufgaben, die es gibt. Dabei haben sich die Verfahren zur Bestimmung von π zwar stets verbessert und es wurden immer mehr Stellen von π bekannt, jedoch beruhte die Berechnung einer Nachkommastelle immer auf der Kenntnis ihrer Vorgänger. Dank Bailey, Borwein und Plouffe ist es seit kurzem möglich, eine bestimmte Stelle von π direkt zu berechnen, ohne alle Stellen davor kennen zu müssen. Ihre Ergebnisse ([01]), auf denen diese Arbeit aufbaut, veröffentlichten sie 1997 in Mathematics of ” Computation“. Natürlich ist es möglich, eine bestimmte Stelle von π mit Hilfe der bekannten Algorithmen zu bestimmen, indem man π einfach bis zu der gewünschten Stelle berechnet - und dies ist von der Laufzeit her auch nicht unbedingt schlechter. Jedoch erweist sich das Verfahren von Bailey, Borwein und Plouffe aus anderen Gründen als besonders empfehlenswert. Es benötigt keine multiple-precision“-Arithmetik, lässt ” sich sehr einfach implementieren und kann dadurch auch erfolgreich auf Heim-PCs angewandt werden. Ausgangspunkt für das Bailey-Borwein-Plouffe-Verfahren“ (im Folgenden mit BBP” ” Verfahren“ bezeichnet) ist die Darstellung von π als einfache Summe mit besonderer Eigenschaft - sie lässt sich besonders schnell berechnen: ∞ X 1 2 1 1 4 π= · − − − i 16 8i + 1 8i + 4 8i + 5 8i + 6 i=0 3 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe 2. Die BBP-Formel für π Durch eine Kombination aus inspiriertem Raten und extensiven Forschungen mit Hilfe des PSLQ integer relation algorithm“ (siehe Anhang A für eine kurze Be” schreibung) haben Bailey, Borwein und Plouffe folgende Gleichheit für π gefunden: ∞ X 1 2 1 1 4 − − − ) π= ·( i 16 8i + 1 8i + 4 8i + 5 8i + 6 i=0 (1) Um diese Gleichheit zu beweisen wird zunächst gezeigt, dass das folgende Integral eine Darstellung von π liefert: √ 1/ Z 2 π= √ √ 4 2 − 8x3 − 4 2x4 − 8x5 dx 1 − x8 0 Beweis von (2). Durch Partialbruchzerlegung erhält man: √ 1/ Z 2 0 √ √ 4 2 − 8x3 − 4 2x4 − 8x5 dx 1 − x8 √ 1/ Z 2 = √ 4 2 2 2 −4x √ √ + + + dx 2 2 x − 2x + 1 x − 2x + 1 x − 1 x + 1 0 √ 1/ Z 2 = 0 −4x √ dx + 2 x − 2x + 1 √ 1/ Z 2 √ 1/ Z 2 √ 1/ Z 2 √ 4 2 √ dx x2 − 2x + 1 0 2 2 dx + dx x−1 x+1 0 0 √ √ √ 1/ 2 = [−4 arctan ( 2x − 1) − 2 ln (x2 − 2x + 1)]0 √ √ √ √ 1/ 2 1/ 2 1/ 2 + [8 arctan ( 2x − 1)]0 + [2 ln x − 1]0 + [2 ln x + 1]0 √ 3 3 √ = 2 ln 2 − π + 2π + ln ( − 2) + ln ( 2 + ) 2} | 2 {z + =−2 ln 2 =π . 4 (2) Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe Des Weiteren benötigt man folgende Gleichungen als Hilfsmittel: n X 1 − xn+1 xi = , 1−x i=0 ∞ X xi = i=0 1 für |x| < 1 . 1−x (3) (4) Beweis. Zu (3): Der Beweis lässt sich per vollständiger Induktion über n führen. P 0+1 Induktionsanfang (n = 0): 0i=0 xi = x0 = 1 = x x−1−1 X . Induktionsvoraussetzung (I.V.): Es gelte (3) für beliebiges, festes n ∈ N. Induktionsschluss (n → n + 1): n+1 X xi = i=0 n X I.V. xi + xn+1 = i=0 n+1 = xn+1 − 1 + xn+1 x−1 − 1 + xn+2 − xn+1 1 − x(n+1)+1 = . x−1 1−x x Zu (4): ∞ X i x = lim n X n→∞ i=0 xi i=0 =0, da |x|<1 (3) xn+1 − 1 = n→∞ x − 1 = lim z }| { lim (xn+1 ) −1 n→∞ = x−1 1 . 1−x Mit Hilfe von (4) lässt sich nun diese wichtige Gleichung zeigen (k ∈ N): √ 1/ Z 2 xk−1 (I) dx = 8 1−x √ 1/ Z 2 0 ∞ X x k−1+8i dx = i=0 0 ∞ 1 X (II) 2k/2 i=0 16i 1 · (8i + k) (5) Beweis von (5). Zu (I): √ Es gilt |x| < 1, da 0 ≤ x ≤ 1/ 2, somit lässt sich (4) anwenden. ∞ X x k−1+8i =x i=0 k−1 ∞ X i=0 (4) = xk−1 · 8i x =x k−1 ∞ X (x8 )i i=0 k−1 1 x = . 8 1−x 1 − x8 5 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe Zu (II): Aus den Ableitungsregeln folgt: !0 ∞ ∞ X X 1 · xk+8i = xk−1+8i . k + 8i i=0 i=0 Und damit: √ 1/ Z 2 ∞ X 0 " xk−1+8i dx = i=0 ∞ X i=0 = ∞ X i=0 = = 1 2k/2 1 2k/2 1 · xk+8i k + 8i #1/√2 0 1 1 · ( √ )k+8i − 0 k + 8i 2 · · ∞ X i=0 ∞ X i=0 1 √ (k + 8i) · ( 2)8i 1 . 16i · (8i + k) Nun ist es möglich (1), also die BBP-Formel für π zu beweisen: 6 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe Beweis. Dies zeigt man nun durch (2) und (5), denn (2) √ 1/ Z 2 π= √ √ 4 2 − 8x3 − 4 2x4 − 8x5 dx 1 − x8 0 √ =4 2· √ 1/ Z 2 0 √ −4 2· 0 x dx − 8 · 1 − x8 √ 1/ Z 2 √ 1/ Z 2 0 4 x dx − 8 · 1 − x8 0 x3 dx 1 − x8 √ 1/ Z 2 x5 dx 1 − x8 0 ∞ ∞ 1 X 1 X 1 1 (5) √ = 4 2·( √ )−8·( √ ) i i 1 4 ( 2) i=0 16 (8i + 1) ( 2) i=0 16 (8i + 4) ∞ ∞ √ 1 X 1 X 1 1 √ ) − 8 · ( ) −4 2·( √ ( 2)5 i=0 16i (8i + 5) ( 2)6 i=0 16i (8i + 6) ∞ ∞ X X 4 2 = − i i 16 (8i + 1) i=0 16 (8i + 4) i=0 − ∞ X i=0 ∞ X 1 1 − i i 16 (8i + 5) i=0 16 (8i + 6) ∞ X 1 4 2 1 1 = ·( − − − ). i 16 8i + 1 8i + 4 8i + 5 8i + 6 i=0 7 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe 3. Der BBP-Algorithmus Um nun eine einzelne Stelle von π effizient berechnen zu können unterteilt man (1) zunächst wie folgt in Teilsummen: π= ∞ X 2 1 1 1 4 − − − ) · ( i 16 8i + 1 8i + 4 8i + 5 8i + 6 i=0 =:S1 =4· z ∞ X }| =:S2 { 1 −2 · i 16 · (8i + 1) i=0 ∞ X −1· |i=0 16i z ∞ X }| { 1 16i · (8i + 4) i=0 ∞ X 1 1 −1 · i · (8i + 5) 16 · (8i + 6) {z } |i=0 {z } =:S3 =:S4 = 4 · S1 − 2 · S2 − S3 − S 4 Die Hexadezimal-Ziffern der Teilsumme Si , beginnend ab Stelle d + 1 erhält man durch den Nachkomma-Anteil von 16d Si (im Folgenden bezeichnet mit frac (16d Si )“). ” Diesen Anteil kann man durch die Modulo-Funktion mod erhalten, die wie folgt definiert sei: x mod y := x − bx/yc · y Damit erhält man beispielsweise für den Nachkomma-Anteil von S1 : ∞ X 16d−k frac (16 S1 ) = 8k + 1 k=0 d d X 16d−k = 8k + 1 k=0 (∗) = d X 16d−k k=0 mod 1 ∞ X 16d−k mod 1 + 8k + 1 k=d+1 mod 8k + 1 8k + 1 mod 1 + mod 1 ∞ X 16d−k 8k + 1 k=d+1 mod 1 Für wen (∗) nicht sofort einsehbar ist, wird im Folgenden für x, a ∈ N die Gleichung x mod a = xa mod 1 bewiesen: a 8 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe Beweis von (∗). Sei x = ma + r, mit m, r ∈ N0 , r < a. Dann gilt: x x − bx/ac · a mod a = a a =m, da r<a z }| { ma + r − b(ma + r)/ac ·a r = = . a a Außerdem ergibt sich: x a ma r + ) mod 1 a a k r j r r = m + − (m + )/1 · 1 = .pslq a a a mod 1 = ( Bemerkung: Es genügt hier tatsächlich diese Gleichung nur“ für a, n ∈ N zu zeigen, ” da mit k ≤ d (k ∈ N0 , d ∈ N) sowohl 16d−k , als auch 8k + 1 (bzw. 8k + 4, 8k + 5, 8k + 6 für die Teilsummen S2 , S3 und S4 ) in N liegen. Damit man aus dieser Gleichung für die Hexadezimal-Ziffer ab der (d + 1)-ten Stelle einen effizienten Algorithmus ableiten kann, benötigt man noch eine Methode um effizient das Ergebnis einer Potenzierung modulo einer positiven ganzen Zahl zu berechnen. Dies lässt sich mittels wiederholten Quadrierens realisieren: Um r = bn mod c zu berechnen (b, c ∈ N, n ∈ N0 ) geht man also wie folgt vor: Algorithmus PotenziereModuloC Eingabe: b, c ∈ N, n ∈ N0 Ausgabe: r = bn mod c 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: if n = 0 then Gebe aus: 1 mod c exit end if t := maxi∈N0 2i ≤ n r := 1 repeat if n ≥ t then r := br mod c n := n − t end if t := t/2 if t ≥ 1 then r := r2 mod c end if until t < 1 Gebe aus: r 9 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe Zur Verdeutlichung der Arbeitsweise des Algorithmus, hier ein kleines Anwendungsbeispiel. Zu berechnen sei: 316 mod 100 = 43046721 mod 100 = 21. Da 16 = 24 quadriert man 4 mal hintereinander modulo 100: 32 92 812 612 =9 = 81 = 6561 = 3721 −→ −→ −→ −→ 9 81 6561 3721 mod mod mod mod 100 = 9 100 = 81 100 = 61 100 = 21 Das korrekte Ergebnis (nämlich 21) wurde durch PotenziereModuloC mittels lediglich 4 Multiplikationen und 4 Modulo-Operationen berechnet, ohne dabei Zahlen größer als 1002 = 10000 zu verwenden. Allgemein benötigt PotenziereModuloC weniger als 2 log2 n Multiplikationen um bn mod c zu berechnen. Mittels der von PotenziereModuloC durchführbaren schnellen Potenzierung modulo einer ganzen Zahl lässt sich nun die erste Summe von frac(16d S1 ) effizient und ohne die Notwendigkeit einer besonderen multiple-precision“-Arithmetik berechnen. ” P 16d−k mod 1 reicht es aus nur Für die zweite Summe von frac(16d S1 ), also ∞ k=d+1 8k+1 wenige Terme zu berechnen, nämlich soviele, bis sicher ist, dass der verbleibende Restterm sich auf einen Wert kleiner als das epsilon“ (die Maschinengenauigkeit) ” der verwendeten floating-point“-Arithmetik addiert. Das Ergebnis von frac(16d Si ) ” (i = 1, . . . , 4) liegt zwischen 0 und 1 und muss nur noch in Hexadezimal-Form, also die Darstellung zur Basis 16, konvertiert werden. In abkürzender Schreibweise lässt sich der Algorithmus, der die (d + 1)-te Nachkommastelle von π ausgibt, nun folgendermaßen zusammenfassen: Algorithmus BBP 1: Berechne si := 16d Si mod 1 für i = 1, . . . , 4 unter Verwendung von PotenziereMo- duloC 2: pid := (4 · s1 − 2 · s2 − s3 − s4 ) mod 1 3: Gebe aus: HEX[16·pid ] Hier sei mit HEX[i] die Funktion gemeint, die für i = 0, . . . , 15 den entsprechenden Hexadezimalwert (0, . . . , 9, A, . . . , F ) zurückgibt. Der schnellste bekannte Algorithmus um π (vollständig) bis zur d-ten Stelle zu berechnen ist zwar asymptotisch um den Faktor log(log(log(d))) schneller als BBP, dafür benötigt er allerdings die Schönhage-Strassen-Multiplikation, die zwar im Komplexitätskalkül schnell, allerdings in der Praxis, auf Grund einer hohen Konstante, erst bei hoher Stellenzahl praktikabel wird. Sich allerdings nur auf die Laufzeit der Algorithmen zu konzentrieren, führt hier in die falsche Richtung, denn die Tatsache, dass BBP sehr einfach zu implementieren ist, und das 10 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe ohne dabei FFT-basierte Verfahren benutzen zu müssen, und dass man schon auf Systemen der Leistungsstärke, Rechengenauigkeit und der Speichergröße eines üblichen Heim-PCs sehr hohe Stellen von π berechnen kann, stellt BBP als einen besonders eleganten und effizienten Algorithmus heraus. 4. Abschließende Bemerkungen Mit dieser Vorgehensweise lassen sich natürlich auch andere bekannte transzendente Zahlen berechnen, wie z.B. log(2), π 2 oder log(9/10). Allgemeiner kann man alle Zahlen der Form S= ∞ X p(i) bci q(i) i=0 mit leichten Abwandlungen durch BBP berechnen, wobei p, q ganzzahlige Polynome sind und c ∈ N>0 . Entsprechende Gleichungen wie (1) können für diese Konstanten in [01, S.4f, S.8] nachgelesen werden. Anhand dieser Gleichungen wurden einige exemplarische Berechnungen durchgeführt, die in Anhang B zu finden sind. In Anhang C ist der Quellcode einer effizienten Implementierung des BBP abgedruckt, wie er in [02] zu finden ist. 11 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe A. Der PSLQ-Algorithmus Der PSLQ-Algorithmus wurde 1992 von Ferguson und Bailey entwickelt (siehe [03]). Er ermöglicht es sogenannte Ganzzahl-Beziehungen (integer relations) von reellwertigen Zahlen zu finden. Eine Menge M = {x1 , . . . , xn } ⊂ R besitzt genau dann eine Ganzahl-Beziehung, wenn es ai ∈ Z (i = 1, . . . , n) gibt, die nicht alle Null sind, mit: a1 x1 + · · · + an xn = 0. Ein interessantes Beispiel ist der Vektor (1, x, x2 , . . . , x16 ) mit x = 31/4 − 21/4 , der die Ganzzahl-Beziehung (1, 0, 0, 0, −3860, 0, 0, 0, −666, 0, 0, 0, −20, 0, 0, 0, 1) hat, d.h. es gilt: 1 − 3860x4 − 666x8 − 20x12 + x16 = 0. Der PSLQ-Algorithmus terminiert nach einer (von einem Polynom über n = |M | beschränkten) Anzahl Iterationen. Er benutzt eine numerisch stabile Methode zur MatrizenReduktion (die ebenfalls von Ferguson und Bailey 1992 entwickelt wurde) und ist auf Grund cleverer Techniken schneller als der ebenfalls sehr bekannte LLL-Algorithmus von Lenstra, Lenstra, and Lovasz (1982) [04]. Die BBP-Gleichung für π wurde folgendermaßen gefunden: Man suchte nach ganzzahligen ai (i = 0, . . . , 7) mit: ∞ X a0 a1 a2 a3 a4 a5 a6 a7 1 π= + + + + + + + 16i 8i 8i + 1 8i + 2 8i + 3 8i + 4 8i + 5 8i + 6 8i + 7 i=0 = a0 ∞ X i=0 ∞ ∞ i=0 i=0 X X 1 1 1 + a1 + · · · + a7 i i i 16 (8i) 16 (8i + 1) 16 (8i + 7) P 1 Die Summen ∞ i=0 16i (8i+j) wurden bis auf sehr hohe Genauigkeit berechnet (im Folgenden mit Sej bezeichnet) (j = 0, . . . , 7) und dann eine Ganzzahl-Beziehung für den Vektor (π, Se0 , Se1 , Se2 , Se3 , Se4 , Se5 , Se6 , Se7 ) gesucht. Der PSLQ-Algorithmus gab als Ergebnis den Vektor (−1, 0, 4, 0, 0, −2, −1, −1, 0) aus, dies entspricht genau der BBP-Formel für π. Näheres dazu findet man in [05, S.11-14]. 12 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe B. Berechnungen einiger Konstanten Die folgenden Berechnungen stammen aus [01, S.10]: Konstante: Basis: Position: Ziffern ab Position: π 16 106 107 108 109 1010 26C65E52CB4593 17AF5863EFED8D ECB840E21926EC 85895585A0428B 921C73C6838FB2 log(2) 16 106 107 108 109 418489A9406EC9 815F479E2B9102 E648F40940E13E B1EEF1252297EC π2 16 106 107 108 109 685554E1228505 9862837AD8AABF 4861AAF8F861BE 437A2BA4A13591 log2 (2) 16 106 107 108 109 2EC7EDB82B2DF7 33374B47882B32 3F55150F1AB3DC 8BA7C885CEFCE8 log(9/10) 10 106 107 108 109 1010 80174212190900 21093001236414 01309302330968 44066397959215 82528693381274 13 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe C. Eine effiziente Implementierung in C /* This program employs the recently discovered digit extraction scheme to produce hex digits of pi. This code is valid up to ic = 2^24 on systems with IEEE arithmetic. */ /* David H. Bailey 2000-03-28 */ #include <stdio.h> #include <math.h> main() { double pid, s1, s2, s3, s4; double series (int m, int n); void ihex (double x, int m, char c[]); int ic = 1000000; #define NHX 16 char chx[NHX]; /* ic is the hex digit start position. */ s1 = series (1, ic - 1); s2 = series (4, ic - 1); s3 = series (5, ic - 1); s4 = series (6, ic - 1); pid = 4. * s1 - 2. * s2 - s3 - s4; pid = pid - (int) pid + 1.; ihex (pid, NHX, chx); printf (" start position = %i\n hex digits = %10.10s\n", ic, chx); } void ihex (double x, int nhx, char chx[]) /* This returns, in chx, the first nhx hex digits of the fraction of x. */ { int i; double y; char hx[] = "0123456789ABCDEF"; y = fabs (x); for (i = 0; i < nhx; i++){ y = 16. * (y - floor (y)); chx[i] = hx[(int) y]; } } double series (int m, int ic) /* This routine evaluates the series sum_k 16^(ic-k)/(8*k+m) using the modular exponentiation technique. */ { int k; double ak, eps, p, s, t; double expm (double x, double y); #define eps 1e-17 s = 0.; 14 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe /* Sum the series up to ic. */ for (k = 0; k < ic; k++){ ak = 8 * k + m; p = ic - k; t = expm (p, ak); s = s + t / ak; s = s - (int) s; } /* Compute a few terms where k >= ic. */ for (k = ic; k <= ic + 100; k++){ ak = 8 * k + m; t = pow (16., (double) (ic - k)) / ak; if (t < eps) break; s = s + t; s = s - (int) s; } return s; } double expm (double p, double ak) /* expm = 16^p mod ak. This routine uses the left-to-right binary exponentiation scheme. It is valid for ak <= 2^24. */ { int i, j; double p1, pt, r; #define ntp 25 static double tp[ntp]; static int tp1 = 0; /* If this is the first call to expm, fill the power of two table tp. */ if (tp1 == 0) { tp1 = 1; tp[0] = 1.; for (i = 1; i < ntp; i++) tp[i] = 2. * tp[i-1]; } if (ak == 1.) return 0.; /* Find the greatest power of two less than or equal to p. */ for (i = 0; i < ntp; i++) if (tp[i] > p) break; pt = tp[i-1]; p1 = p; r = 1.; /* Perform binary exponentiation algorithm modulo ak. */ for (j = 1; if (p1 >= r = 16. r = r p1 = p1 } j <= i; j++){ pt){ * r; (int) (r / ak) * ak; - pt; 15 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe pt = 0.5 * pt; if (pt >= 1.){ r = r * r; r = r - (int) (r / ak) * ak; } } return r; } 16 Seminararbeit: Einzelne Ziffern von Pi nach Bailey, Borwein & Plouffe Literatur [01] David Bailey, Peter B. Borwein and Simon Plouffe. On The Rapid Computation Of Various Polylogarithmic Constants. Mathematics of Computation, vol. 66, no. 218 (April 1997), S. 903-913 (Online verfügbar unter http://crd.lbl.gov/~dhbailey/dhbpapers/digits.pdf, Aufruf: 06.12.2004) 3, 11, 13 [02] Homepage von David Bailey (http://www.dhbailey.com/). (Quellcode verfügbar unter http://crd.lbl.gov/~dhbailey/piqp.c, Aufruf: 06.12.2004) 11 [03] H. R. P. Ferguson and D. H. Bailey A Polynomial Time, Numerically Stable Integer Relation Algorithm. RNR Techn. Rept. RNR-91-032, Jul. 14, 1992 12 [04] PSLQ Algorithm http://mathworld.wolfram.com/PSLQAlgorithm.html, Aufruf: 14.12.2004 12 [05] D. Bailey and S. Plouffe. On The Rapid Computation Of Various Polylogarithmic Constants. http://www.cecm.sfu.ca/organics/papers/bailey/, Aufruf: 20.12.2004 12 17