Advertising
AKWA-MARKET

Porównanie wydajności obliczania Pi. Język C i MPFR.

Porównanie wydajności algorytmów obliczania Pi (MPFR)

Zaimplementowałem 5 popularnych algorytmów obliczania liczby Pi przy użyciu biblioteki MPFR (dla dowolnej precyzji) w języku C. Przeprowadziłem testy wydajnościowe dla precyzji od 100 do 100 000 cyfr dziesiętnych.

Zaimplementowane algorytmy

  1. Newton (arcsin 1/2) – Szereg Taylora dla $\arcsin(1/2) = \pi/6$. Zbieżność liniowa, daje około 1 bit precyzji na iterację.
  2. Machin (1706) – Wzór oparty na $\arctan$: $\pi/4 = 4\arctan(1/5) – \arctan(1/239)$. Zbieżność liniowa, szybsza od Newtona (~1.4 cyfry dziesiętnej na iterację).
  3. Borwein (AGM, 1984) – Algorytm iteracyjny oparty na średniej arytmetyczno-geometrycznej. Zbieżność kwadratowa (liczba poprawnych cyfr podwaja się w każdej iteracji).
  4. Chudnovsky (1989) – Zbieżność liniowa, ale niezwykle szybka: każda iteracja dostarcza ponad 14 cyfr dziesiętnych. Używany w większości współczesnych rekordów bicia Pi.
  5. BBP (Bailey-Borwein-Plouffe, 1995) – Słynny wzór szesnastkowy. Zbieżność liniowa (~1.2 cyfry hex na iterację).

Wyniki dla 10 000 cyfr dziesiętnych

Poniższa tabela przedstawia czas obliczeń oraz liczbę iteracji potrzebną do uzyskania 10 000 poprawnych cyfr Pi.

AlgorytmCzas obliczeń [s]Liczba iteracjiSzybkość [cyfry/s]Zbieżność
Borwein (AGM)0.00377~2 699 922Kwadratowa
Chudnovsky0.0748707~133 738Liniowa (14.18 cyfr/it)
BBP0.12638 300~79 191Liniowa (1.2 cyfr/it)
Machin (arctan)0.46749 255~21 392Liniowa (1.4 cyfr/it)
Newton (arcsin)1.580416 602~6 326Liniowa (1 bit/it)

(Testy wykonano w jednowątkowej implementacji C, na procesorze w środowisku sandboxowym)

Wizualizacja wyników

Czas obliczeń w funkcji precyzji

Poniższy wykres pokazuje skalowanie algorytmów (w skali logarytmicznej). Widzimy wyraźnie, że algorytm Borweina deklasuje pozostałe przy wysokich precyzjach dzięki kwadratowej zbieżności.

Zestawienie czasów (wykres słupkowy)

Wykresy dla różnych rzędów wielkości (od 100 do 10 000 cyfr). Zauważ, jak drastycznie rośnie czas metody Newtona względem nowocześniejszych algorytmów.

Szybkość generowania cyfr

Wykres pokazujący, ile poprawnych cyfr na sekundę potrafi wygenerować dany algorytm. Spadek dla większych precyzji wynika ze złożoności mnożenia dużych liczb w MPFR (złożoność $O(N \log N)$).

Więcej wyników – dla 100 000 cyfr: (testy na procesorze AMD Ryzen 5 3600, 64 GB RAM. OS Ubuntu 64 bit)

============================================================
  Pi Benchmark — MPFR  |  prec = 332200 bits (~100002 dec. digits)
============================================================

Reference (mpfr_const_pi, first 60 digits):
  3.141592653589793238462643383279502884197169399375105820974945

Algorytm                           Czas [s]   Iteracje Poprawne cyfry   Zbieżność
-------------------------------- ---------- ---------- -------------- --------------
Newton (arcsin 1/2)              337.892078     166089       100000.3        liniowa
Machin (arctan 1/5, 1/239)        78.083924      92557        99999.8        liniowa
Borwein kwadr. (AGM)               0.096225          9        99997.2     kwadratowa
Chudnovsky                        14.131964       7054       100000.0        liniowa
BBP (Bailey-Borwein-Plouffe)       7.968434      83044        99999.8        liniowa

Algorytm                         Cyfry/iter  Cyfry/sek
-------------------------------- ----------  ---------
Newton (arcsin 1/2)              ~1 bit/iter        296
Machin (arctan 1/5, 1/239)       ~1.4 cyfry/iter       1281
Borwein kwadr. (AGM)             podwaja cyfry    1039199
Chudnovsky                       ~14.18 cyfr/iter       7076
BBP (Bailey-Borwein-Plouffe)     ~1.2 cyfry hex/iter      12549

Note: 'Poprawne cyfry' = liczba cyfr dziesiętnych zgodnych z mpfr_const_pi.

Wnioski

  1. Metoda Newtona jest historycznie ważna i elegancka, ale numerycznie najwolniejsza ze wszystkich testowanych. Potrzebuje aż 16 602 iteracji, by osiągnąć 10 000 cyfr, co zajęło ponad 1.5 sekundy.
  2. Algorytm Chudnovsky’ego to król metod opartych na szeregach. Dzięki dodawaniu ponad 14 cyfr w każdym kroku, potrzebował zaledwie 707 iteracji do osiągnięcia 10 000 cyfr.
  3. Algorytm Borweina (AGM) całkowicie deklasuje konkurencję w prostej implementacji bez optymalizacji binary splitting. Kwadratowa zbieżność sprawia, że w zaledwie 7 iteracjach obliczył 10 000 cyfr Pi w czasie 0.0037 sekundy (ponad 400 razy szybciej niż metoda Newtona).
  4. W profesjonalnych programach (np. y-cruncher) do bicia rekordów świata (tryliona cyfr) używa się wzoru Chudnovsky’ego, ponieważ można go bardzo wydajnie zrównoleglić i zoptymalizować techniką binary splitting, która omija potrzebę wyliczania wielu pierwiastków (co jest wąskim gardłem AGM w astronomicznych precyzjach). W prostej, jednowątkowej pętli AGM wygrywa.

Przypisy:

Pi Formulas – MATH WORLD WOLFRAM: https://mathworld.wolfram.com/PiFormulas.html

Kod źródłowy aplikacji BENCHMARK PI MPFR w języku c: https://github.com/SylwesterBogusiak/ComputePi/blob/main/pi_bench.c

Opracowanie przy pomocy MANUS AI.

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Scroll to Top

Webmaster: MARTE.BEST - Sylwester Bogusiak See more of my projects: BOGUSIAK.pl home website