Pi er defineret som forholdet mellem en cirkels omkreds og dens diameter. På illustrationen ses en cirkel, som er delt op i otte halve kvartcirkler. Nedenunder ses to liniestykker, hvor det øverste er de otte cirkelstykker strakt ud og det nederste er fire diametre. Man kan umiddelbart se at pi er lidt større end tre og faktisk kan man også se at 5 halve kvartcirkler er en anelse mindre end to diametre, dvs 5/8 * pi * diameter er lidt mindre end 2 * diameter, eller hvis vi flytter lidt rundt at pi er lidt mindre end 16/5 også kaldet 3.2.
Denne side vil vise hvordan man kan beregne pi på en simpel vis og alligevel få vilkårligt mange decimaler ud.
Pi kan forholdsvis let udregnes ved at kombinere John Machin's formel
ArcTan(1) = 4 * ArcTan(1/5) - ArcTan(1/239)
med James Gregory's rækkeudvikling af ArcTan
ArcTan(x) = x - 1/3 * x^3 + 1/5 * x/5 ...
Find pi med 10 decimaler pr håndkraft
Da vi er interesseret i en bestemt præcision, kan vi forenkle udregningerne ved at regne med heltal i stedet for kommatal.
Med 10 cifre giver det følgende udregninger
160000000000 / 5
32000000000 / 1 = 32000000000
32000000000 /25
1280000000 / 3 = 426666666
1280000000/25
51200000 /5 = 10240000
51200000/25
2048000 /7 = 292571
2048000/25
81920 /9 = 9102
81920/25
3276 / 11 = 297
3276/25
131 /13 = 10
131/25
5 /15 = 0
32000000000-426666666+10240000-292571+9102-297+10 = 31583289578
og
40000000000 / 239
167364016 / 1 = 167364016
167364016/57121
2929 /3 = 976
2929 /57121 = 0
167364016 - 976 = 167363040
og til slut er 31583289578 - 167363040 = 31415926538
Bemærk at vi til alt dette blot har brugt simpel addition, subtraktion og division af store tal. Dette er ret let (dvs ikke specielt interessant) at programmere, så præsentationen af et sådant program lader vi vente lidt.
Bemærk også at der ikke er mere hokus-pokus i ovenstående udregning, hvis vi fx vil have 100 cifre. Det er blot at bruge et bredere stykke papir.
Faktisk brugte John Machin i 1706 den her anvendte formel til at udregne pi med 100 decimaler.
Machin's formel
Machin's formel ser ret kryptisk ud, men kan trivielt omskrives til
Pi/4 = ArcTan(1/5) + ArcTan(1/5) + ArcTan(1/5) + ArcTan(1/5) + ArcTan(-1/239)
som er nem at checke, fordi addition af vinkler svarer til multiplikation af komplekse tal, dvs vi skal se på
(5+i)(5+i)(5+i)(5+i)(239-i) =
(24+10i)(24+10i)(239-i) =
(476+480i)(239-i) =
(114244+114244i)
Og da 114244+114244i har samme vinkel som 1+i, dvs pi/4, passer formlen. Samme metode kan bruges til at checke en vilkårlig formel af samme slags og der er et utal af sådanne.
Fx pi = 48 ArcTan(1/18) + 32 ArcTan(1/57) - 20 ArcTan(1/239) der ifølge Jesper Lützens bog s 124 blev brugt af Shanks og Wells i 1961 til at udregne pi med 100.000 decimaler.
Siden har Jean Guillod og M. Bouver i 1973 beregnet pi med en million decimaler vha en ArcTan formel og en forbedret multiplikationsalgoritme (Schonhage-Strassen).
Machin's formel udmærker sig ved at være den bedste af dem, der kun splitter beregningen op i to. Men man kan fx bruge formlen ArcTan(a/b) = ArcTan(p/q) + ArcTan((aq-bp)/(bq+ap)) til at generere så mange man lyster. Conway's Book of Numbers giver mange mange af disse ArcTan formler.
Senere rekorder er beregnet med andre algoritmer, fx Ramanujan-Borwein-Borwein.
Gregory og David Chudnovsky beregnede i 1989 pi med 1001196691 decimaler.
Euler
Leonard Euler (1707-1783) fandt en række for ArcTan, der konvergerer endnu hurtigere end Machin's formel. Han benyttede omskrivningen.
ArcTan(x) = y/x * SUM(i>=0; (2^i*i!)^2/((2i+1)!) * y^i)
hvor y = x^2/(1+x^2)
Denne omskrivning plus formlen pi = 20 ArcTan(1/7) + 8 ArcTan(3/79) brugte han til at beregne pi med 20 decimaler på en times tid.
Umiddelbart ser hverken 1/7 eller 3/79 specielt tillokkende ud, men de tilhørende y-værdier er 1/50 og 9/6250, som også kan skrives som 2/100 og 144/100000 og det er jo næsten så pænt, man kan forlange det, når man regner i titalssystemet.
De to rækkeudviklinger bliver så til
2.80000 * (1 + 2/3*(2/100) + 2/3*4/5*(2/100)^2 + ...) +
0.30336 * (1 + 2/3*(144/100000) + 2/3*4/5*(144/100000)^2 + ...)
som findes i David Wells bog You are a Mathematician, page 314.
Eulers kladdepapir har altså set ud i stil med det følgende.
280000000000000000000 * 1 = 280000000000000000000
* (2/3)*(2/100) = 3733333333333333333
* (4/5)*(2/100) = 59733333333333333
* (6/7)*(2/100) = 1023999999999999
* (8/9)*(2/100) = 18204444444444
* (10/11)*(2/100) = 330989898989
* (12/13)*(2/100) = 6110582750
* (14/15)*(2/100) = 114064211
* (16/17)*(2/100) = 2147091
* (18/19)*(2/100) = 40681
* (20/21)*(2/100) = 774
* (22/23)*(2/100) = 14
30336000000000000000 * 1 = 30336000000000000000
* (2/3)*(144/100000) = 29122560000000000
* (4/5)*(144/100000) = 33549189120000
* (6/7)*(144/100000) = 41409284856
* (8/9)*(144/100000) = 53003884
* (10/11)*(144/100000) = 69386
* (12/13)*(144/100000) = 92
og summen af tallene i højre kolonne er 314159265358979323837, svarende til at pi med 20 decimaler er 3.14159.26535.89793.23837. Det er en anelse lavt, fordi der konsekvent er brugt afkortning i stedet for afrunding og det er gået ud over 15 mellemresultater, så vi kan passende lægge 15/2 til og derved få et næsten helt præcist resultat.
Med det følgende program har jeg uden problemer lokket 800 korrekte decimaler frem.
sub t {
my($t,$mult,$div) = @_;
my($pow,$sum,$m,$d) = ($t,$t,2,3);
while ($pow ne "0") {
$pow = ldiv(lmul(ldiv(lmul($pow,$mult),$div),$m),$d);
$m=$m+2; $d=$d+2;
$sum = ladd($sum,$pow);
}
return $sum;
}
$n = $ARGV[0];
$pi = ladd(t("280000"."0"x$n,2,100),
t( "30336"."0"x$n,144,100000));
$pi =~ s/^3/3\./;
$pi =~ s/(\d\d\d\d\d)/$1\./g;
print "$pi\n";
Pi i python
Sproget python har lange heltal og andet godt indbygget, så samme algoritme kan udtrykkes meget kort i dette sprog.
po,n = 1,40000
for i in range(0,n-5): po *= 10;
def t (t,mult,div):
m,d,pow,sum = 2,3,t,t
while pow > 0:
pow = (pow*mult/div)*m/d
m,d,sum = m+2,d+2,sum+pow
return sum
pi = t(280000*po,2,100) + t(30336*po,144,100000)
print "Pi er med",n,"decimaler ca",pi,"\n"
40000 decimaler tager et par minutter på en ikke alt for hurtig linuxbox.
mvh
Ishoey