Ackermann-funktionen er et simpelt eksempel på en overalt defineret beregnelig funktion , der ikke er primitiv rekursiv . Det tager to ikke-negative heltal som parametre og returnerer et naturligt tal , angivet med . Denne funktion vokser meget hurtigt, for eksempel er tallet så stort, at antallet af cifre i rækkefølgen af dette tal er mange gange større end antallet af atomer i den observerbare del af universet .
I slutningen af 1920'erne studerede David Hilberts matematikere , Gabriel Sudan og Wilhelm Ackermann , det grundlæggende i databehandling. Sudan og Ackerman er berømte [1] for at opdage en overalt defineret beregnelig funktion (nogle gange blot kaldet "rekursiv"), som ikke er primitiv rekursiv . Sudan opdagede den mindre kendte funktion Sudan , hvorefter Ackerman uafhængigt af ham offentliggjorde sin funktion i 1928 . Ackermann-funktionen af tre argumenter blev defineret på en sådan måde, at den for den udførte operationen addition, multiplikation eller eksponentiering:
og for det er udvidet ved hjælp af Knuths pilnotation , udgivet i 1976:
.(Ud over sin historiske rolle som den første overalt definerede ikke-primitive rekursive beregnelige funktion, udvidede Ackermanns oprindelige funktion grundlæggende aritmetiske operationer ud over eksponentiering, dog ikke så godt som dedikerede funktioner som Goodsteins hyperoperatorsekvens .)
I On the Infinite formodede Hilbert, at Ackermanns funktion ikke er primitivt rekursiv, og Ackerman (Hilberts personlige sekretær og tidligere studerende) beviste denne formodning i On Hilberts Construction of the Real Numbers. Rosa Peter og Raphael Robinson præsenterede senere en to-argument version af Ackermann-funktionen, som mange forfattere nu foretrækker frem for originalen [2] .
Ackermann-funktionen er defineret rekursivt for ikke-negative heltal og som følger:
Det virker måske ikke indlysende, at rekursion altid slutter. Dette følger af, at i et rekursivt kald enten reduceres værdien af , eller værdien bevares, men værdien reduceres . Dette betyder, at hver gang parret reduceres med hensyn til leksikografisk rækkefølge , hvilket betyder, at værdien til sidst vil nå nul: for én værdi er der et begrænset antal mulige værdier (siden det første opkald med dataene var lavet med en bestemt værdi , og yderligere, hvis værdien bevares, kan værdien kun falde), og antallet af mulige værdier er til gengæld også begrænset. Men når den falder , er den værdi, der stiger med, ubegrænset og normalt meget stor.
(total blokke ) |
Da funktionen vokser meget hurtigt, vokser den omvendte funktion , betegnet med , meget langsomt. Denne funktion støder man på i studiet af kompleksiteten af nogle algoritmer , for eksempel et system af usammenhængende sæt eller Chazell-algoritmen til at konstruere et minimumspændende træ [3] . Når vi analyserer asymptotikken , kan vi antage, at for alle praktisk talt forekommende tal er værdien af denne funktion mindre end fem, da den ikke er mindre end .
Ackerman-funktionen har i kraft af sin definition et meget dybt niveau af rekursion, som kan bruges til at teste compilerens evne til at optimere rekursion. Yngwie Sundblad [4] var den første til at bruge Ackerman-funktionen til dette .
Brian Wichman (medforfatter af Whetstone benchmark ) tog denne artikel i betragtning, da han skrev en række artikler om opkaldsoptimeringstest [5] [6] [7] .
For eksempel kan en compiler, der ved analyse af en beregning er i stand til at gemme mellemværdier, for eksempel og , fremskynde beregningen med hundreder og tusinder af gange. Også at evaluere direkte i stedet for rekursivt at udvide ind vil fremskynde beregningen en del. Beregningen tager lineær tid . Beregningen kræver kvadratisk tid, da den udvides til O ( ) indlejrede kald for forskellige . Beregningstiden er proportional med .
Værdien kan ikke beregnes med en simpel rekursiv applikation inden for rimelig tid. I stedet bruges stenografiformler til at optimere rekursive opkald, som f.eks .
En af de praktiske måder at beregne værdierne af Ackermann-funktionen på er memoisering af mellemresultater. Compileren kan anvende denne teknik til en funktion automatisk ved hjælp af memofunktioner [8] [9] af Donald Michie .
Store tal | |
---|---|
Tal | |
Funktioner | |
Notationer |