Programując, rzadko mamy do czynienia z bardzo dużymi wartościami. Dowodem na to jest choćby fakt, że 32-bitowe systemy dopiero teraz zaczynają być w zauważalny sposób zastępowane 64-bitowymi. Jedynie w przypadku rozmiarów bardzo dużych plików operowanie zmiennymi mogącymi zmieścić wartości większe niż 4 miliardy jest konieczne.
Inne dziedziny życia i nauki przynoszą nam nieco większe wartości. Ekonomia czasami mówi o dziesiątkach bilionów (PKB dużych krajów), a fizyka często posługuje się wielkościami zapisywanymi przy pomocy notacji potęgowej – aż do ok. 1080, czyli szacowanej liczby wszystkich atomów we Wszechświecie.
Wydawać by się mogło, że wielkość ta jest bliska górnej granicy wartości, jakich kiedykolwiek moglibyśmy używać w sensownych zastosowaniach. Okazuje się jednak, że tak nie jest; co więcej, jakakolwiek liczba zapisana za pomocą co najwyżej potęgowania jest tak naprawdę bardzo, bardzo mała.
Do zapisywania naprawdę dużych liczb potrzebne są bowiem inne notacje. Jednym z takich sposobów zapisu jest notacja strzałkowa Knutha, która jest “naturalnym” rozszerzeniem operacji algebraicznych. Tak jak dodawanie jest iterowaną inkrementacją, mnożenie jest iterowanym dodawaniem, a potęgowanie – iterowanym mnożeniem:
,
tak każdy następny operator strzałkowy jest iterowaną wersją poprzedniego. I tak pierwszy z nich, to zwykłe potęgowanie
, ale już drugi:
jest odpowiednikiem wielokrotnego podnoszenia danej liczby do jej potęgi. W ogólności, skracając ciąg n strzałek do , otrzymujemy definicję:
Na pierwszy rzut oka może wydawać się to nieoczywiste, jednak już dla n = 3 i jednocyfrowych argumentów, wielkość liczb otrzymywanych przy użyciu notacji strzałkowej znacznie przekracza te, które można w wygodny sposób zapisać przy pomocy samego potęgowania. Chcąc je mimo wszystko przedstawić w tej postaci, trzeba się uciekać do sztuczek z klamerkami:
Oczywiście wraz ze wzrostem liczby strzałek nawet takie triki przestają wystarczać.
W tej chwili pewnie nasuwa się proste pytanie: czy z takiego systemu zapisu jest w ogóle jakiś pożytek, jeśli nikt nie posługuje się na poważnie tak wielkimi liczbami?… Odpowiedź jest jak najbardziej twierdząca, mimo że założenie w pytaniu jest nieprawdziwe. Otóż niektóre dziedziny matematyki używają nie tylko takich, ale i znacznie większych wartości – i nie chodzi tu nawet o teorię liczb, którą to jako pierwszą podejrzewalibyśmy o rzucanie liczbami “z kosmosu”.
Według Księgi Rekordów Guinnessa największą skończoną liczbą kiedykolwiek użytą w poważnym dowodzie matematycznym jest bowiem tzw. liczba Grahama, będącą górnym ograniczeniem pewnej wielkości występującej w problemie luźno związanym z grafami. Żeby ją zdefiniować, można użyć notacji strzałkowej – trzeba to jednak zrobić… iteracyjnie, wprowadzając pomocniczy ciąg gn:
Już pierwszy jego wyraz nie daje się zapisać w postaci potęgowej, ale gwoździem programu jest zauważenie, że kolejne jego elementy posługują się poprzednimi w celu określenia liczby strzałek w operatorze . Innymi słowy, mamy tu wejście na kolejny poziom abstrakcji i stoimy już chyba tak wysoko, że aż strach spoglądać w dół ;)
Co jednak ze wspomnianą wcześniej liczbą Grahama? Teraz na szczęście jej określenie jest już bardzo proste. Jest ona równa ni mniej, ni więcej, jak tylko… g64 :-)
Karolu, “naprawdę duże liczby” powinno oznaczać duże liczby, a nie takie karły jak liczba Grahama…
Czy taki tekst jak ten w komentarzu powyżej ma jakikolwiek sens, oprócz popisania się jaki to autor jest fajny, obcykany w matematyce i w ogóle wszedł na Nty poziom abstrakcji?
Każdy moze sobie rzucić taki komentarz, bo to w sumie nic nie znaczy.
A notka ciekawa, jak zwykle na tym blogu :)
Daj spokój Alton…
Dla Aithne dzień bez
http://dzizas.blogspot.com/2009/09/pierd.html
to dzień stracony…
Jakby taki nasz gamedevowy … Palikot :P
No i niech lepiej sama założy bloga i niech pisze na nim ciekawsze rzeczy
Jeśli takie liczby są jeszcze za małe.. zawsze można użyć czegoś, co, jeśli dobrze pamiętam, nazywa się “nadsilnią”:
Taka ciekawostka zapamiętana z czasów studienckich.. ciekawe czy z tamtych czasów jeszcze składnię TeXa dobrze pamiętam :D
Podglądu posta niestety nie ma więc nie ręczę za poprawność.. jakby co to: n$ = n!^n!^n!.. i tak n! razy. Koszmarne wartość już przy 3$.
Niestety niespecjalnie pamiętasz, musiałem poprawić :) (Nawias dolny robi się przez \underbrace{wyr. na górze}_{wyr. na dole})
A co do tej “nadsilni”, to rzeczywiście na pierwszy rzut oka robi wrażenie. Ale tylko na pierwszy :) Notacja strzałkowa daje bowiem większe liczby, co pokusiłem się nawet udowodnić :> Jak?
Przede wszystkim wiemy, że:
wobec czego:
Jeśli teraz pozbędziemy się tych nawiasów, to otrzymamy nawet większą liczbę:
(bo już dla
).
Takie piętrowe potęgowanie tych samych liczb wygląda znajomo – i istotnie, to nic innego jak:
a jeśli nie chcemy w ogóle potęgowania, to po prostu:
Tak więc n$ można ograniczyć z łatwością przez proste wyrażenie używające notacji strzałkowej – c.b.d.o. :) Dodam jeszcze, że wszystkie nierówności występujące tutaj są bardzo zgrubnymi ograniczeniami :] W sumie więc relacja n$ do strzałek wygląda mniej więcej tak:
Czyli n$ jest między dwiema a trzema strzałkami :)
Kiedyś po prostu na pewnym forum (bodajże forum FASMa to było) zrobili sobie zabawę polegającą na podaniu jak największej liczby w dziewięciu znakach, a że padały tam znacznie większe liczby, to G wydaje mi się małe… Tu jest sporo o dużych liczbach. Naprawdę dużych.
Aithne: G rzeczywiście nie jest duże w porównaniu chociażby do wartości funkcji busy-beaver dla odpowiednio dużych argumentów. Jednak o ile po np. BB(100) tej wielkości w ogóle nie widać, tak zagnieżdżona rekurencyjna definicja G – w której kolejne elementy ciągu służą jako rząd i tak już dającego gigantyczne rezultaty operatora – jest pod tym względem o wiele bardziej sugestywna.
To grahma
.