Ackermann-funktionen är ett enkelt exempel på en överallt definierad beräkningsbar funktion som inte är primitiv rekursiv . Den tar två icke-negativa heltal som parametrar och returnerar ett naturligt tal , betecknat med . Denna funktion växer mycket snabbt, till exempel är antalet så stort att antalet siffror i ordningen för detta nummer är många gånger större än antalet atomer i den observerbara delen av universum .
I slutet av 1920-talet studerade David Hilberts matematiker , Gabriel Sudan och Wilhelm Ackermann , grunderna för datoranvändning. Sudan och Ackerman är kända [1] för att ha upptäckt en överallt definierad beräkningsbar funktion (ibland kallad helt enkelt "rekursiv") som inte är primitiv rekursiv . Sudan upptäckte den mindre kända funktionen Sudan , varefter Ackerman, oberoende av honom, publicerade sin funktion 1928 . Ackermann-funktionen för tre argument definierades på ett sådant sätt att den utförde operationen addition, multiplikation eller exponentiering:
och för det utökas med Knuths pilnotation , publicerad 1976:
.(Förutom sin historiska roll som den första överallt definierade icke-primitiva rekursiva beräkningsbara funktionen, utökade Ackermanns ursprungliga funktion grundläggande aritmetiska operationer bortom exponentiering, dock inte lika bra som dedikerade funktioner som Goodsteins hyperoperatorsekvens .)
I On the Infinite antog Hilbert att Ackermanns funktion inte är primitivt rekursiv, och Ackerman (Hilberts personliga sekreterare och tidigare student) bevisade denna gissning i On Hilberts Construction of the Real Numbers. Rosa Peter och Raphael Robinson presenterade senare en tvåargumentversion av Ackermann-funktionen, som många författare nu föredrar framför originalet [2] .
Ackermann-funktionen definieras rekursivt för icke-negativa heltal och enligt följande:
Det kanske inte verkar självklart att rekursion alltid tar slut. Detta följer av det faktum att i ett rekursivt anrop minskas antingen värdet på , eller så bevaras värdet, men värdet reduceras . Detta innebär att varje gång paret reduceras i termer av lexikografisk ordning , vilket betyder att värdet så småningom kommer att nå noll: för ett värde finns det ett ändligt antal möjliga värden (eftersom det första samtalet med data var gjord med ett visst värde , och vidare, om värdet bevaras, kan värdet bara minska), och antalet möjliga värden är i sin tur också ändligt. Men vid minskning är värdet som ökar med obegränsat och vanligtvis mycket stort.
(totalt antal block ) |
Eftersom funktionen växer mycket snabbt, växer den omvända funktionen , betecknad med , mycket långsamt. Denna funktion påträffas i studiet av komplexiteten hos vissa algoritmer , till exempel ett system av disjunkta uppsättningar eller Chazell-algoritmen för att konstruera ett minsta spännträd [3] . När vi analyserar asymptotikerna kan vi anta att för alla praktiskt förekommande tal är värdet på denna funktion mindre än fem, eftersom det inte är mindre än .
Ackerman-funktionen har i kraft av sin definition en mycket djup nivå av rekursion, som kan användas för att testa kompilatorns förmåga att optimera rekursion. Yngwie Sundblad [4] var den första som använde Ackerman-funktionen för detta .
Brian Wichman (medförfattare till Whetstone benchmark ) tog hänsyn till denna artikel när han skrev en serie artiklar om samtalsoptimeringstestning [5] [6] [7] .
Till exempel kan en kompilator som vid analys av en beräkning kan lagra mellanvärden, till exempel och , påskynda beräkningen hundratals och tusentals gånger. Att även utvärdera direkt istället för att expandera rekursivt kommer att påskynda beräkningen en hel del. Beräkningen tar linjär tid . Beräkningen kräver kvadratisk tid, eftersom den expanderar till O ( ) kapslade anrop för olika . Beräkningstiden är proportionell mot .
Värdet kan inte beräknas med en enkel rekursiv applikation inom rimlig tid. Istället används stenografiformler för att optimera rekursiva anrop, som .
Ett av de praktiska sätten att beräkna värdena för Ackermann-funktionen är memoisering av mellanresultat. Kompilatorn kan tillämpa denna teknik på en funktion automatiskt med memofunktioner [8] [9] av Donald Michie .
Stora siffror | |
---|---|
Tal | |
Funktioner | |
Noteringar |