Το 1995 οι David Bailey, Peter Borwein και Simon Plouffe ανακάλυψαν έναν εξαιρετικά ασυνήθιστο τύπο για τον αριθμό \(\pi\). Ο τύπος, γνωστός σήμερα ως τύπος Bailey–Borwein–Plouffe ή απλώς BBP, επιτρέπει τον υπολογισμό ενός μακρινού δεκαεξαδικού ψηφίου του \(\pi\), χωρίς να χρειάζεται να έχουν υπολογιστεί όλα τα προηγούμενα.
\[\pi=\sum_{k=0}^{\infty}\frac{1}{16^k}\left(\frac{4}{8k+1}-\frac{2}{8k+4}-\frac{1}{8k+5}-\frac{1}{8k+6}\right).\]
Η σχετική εργασία δημοσιεύθηκε στο περιοδικό Mathematics of Computation το 1997. Το εντυπωσιακό χαρακτηριστικό δεν είναι μόνο η γρήγορη σύγκλιση της σειράς, αλλά κυρίως η ιδιαίτερη σύνδεσή της με τη βάση \(16\).
Γιατί εμφανίζεται η βάση 16;
Ο παράγοντας \(16^{-k}\) ταιριάζει ακριβώς με τη δεκαεξαδική γραφή. Στη βάση \(16\), ο αριθμός \(\pi\) αρχίζει ως
3.243F6A8885A308D313198A2E…
Κάθε δεκαεξαδικό ψηφίο αντιστοιχεί ακριβώς σε τέσσερα δυαδικά ψηφία. Επομένως, η ίδια μέθοδος παρέχει πρόσβαση και σε δυαδικά ψηφία του \(\pi\), σε ομάδες των τεσσάρων.
Πώς γίνεται η «παράκαμψη» των προηγούμενων ψηφίων;
Για να φτάσουμε κοντά στη θέση \(n\), εξετάζουμε το κλασματικό μέρος του \(16^n\pi\). Στο τμήμα της σειράς όπου \(k\le n\), οι μεγάλες δυνάμεις του 16 μπορούν να υπολογιστούν κατά μέτρο των παρονομαστών \(8k+j\). Δεν χρειάζεται λοιπόν να αποθηκευτεί ολόκληρη η τεράστια δεκαδική ανάπτυξη του \(\pi\).
Το υπόλοιπο τμήμα, όπου \(k>n\), περιέχει αρνητικές δυνάμεις του 16 και μειώνεται πολύ γρήγορα. Ο συνδυασμός αρθρωτής αριθμητικής και μιας μικρής ουράς της σειράς απομονώνει τα ζητούμενα δεκαεξαδικά ψηφία.
Πόσο γρήγορα συγκλίνει;
| Όροι | Προσέγγιση του \(\pi\) | Απόλυτο σφάλμα |
|---|---|---|
| 1 | 3,133333333333333 | \(8{,}26\times10^{-3}\) |
| 2 | 3,141422466422466 | \(1{,}70\times10^{-4}\) |
| 3 | 3,141587390346582 | \(5{,}26\times10^{-6}\) |
| 4 | 3,141592457567436 | \(1{,}96\times10^{-7}\) |
| 6 | 3,141592653228088 | \(3{,}62\times10^{-10}\) |
Απλό πρόγραμμα Python για τη σειρά BBP
from decimal import Decimal, getcontext
def pi_bbp(terms=20, precision=50):
getcontext().prec = precision
total = Decimal(0)
for k in range(terms):
k = Decimal(k)
total += (Decimal(1) / (Decimal(16) ** k)) * (
Decimal(4) / (8*k + 1)
- Decimal(2) / (8*k + 4)
- Decimal(1) / (8*k + 5)
- Decimal(1) / (8*k + 6)
)
return total
print(pi_bbp())
Το πρόγραμμα υπολογίζει το \(\pi\) από τη σειρά. Η άμεση εξαγωγή ενός πολύ μακρινού δεκαεξαδικού ψηφίου απαιτεί επιπλέον αρθρωτή ύψωση σε δύναμη· αυτή είναι η ουσιαστική αλγοριθμική καινοτομία της μεθόδου BBP.
Το πραγματικά παράξενο:
ο τύπος δεν υπολογίζει απλώς γρήγορα το \(\pi\)· μας επιτρέπει να «πηδήξουμε» σε μια μακρινή θέση της δεκαεξαδικής του ανάπτυξης.
Για κοινοποίηση: Μπορούμε να βρούμε ένα μακρινό ψηφίο του \(\pi\) χωρίς να γνωρίζουμε όλα όσα προηγούνται; Ο τύπος BBP κάνει ακριβώς αυτό στη βάση 16.

Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου