Ackermann függvény

Az Ackermann függvény  egy egyszerű példa egy mindenhol definiált kiszámítható függvényre , amely nem primitív rekurzív . Két nem negatív egész számot vesz paraméterként, és egy természetes számot ad vissza , amelyet jelöl . Ez a függvény nagyon gyorsan növekszik, például a szám olyan nagy, hogy a számsorrendben lévő számjegyek száma sokszorosa az Univerzum megfigyelhető részében lévő atomok számának .

Történelem

Az 1920-as évek végén David Hilbert matematikusai ,  Gabriel Sudan és Wilhelm Ackermann a számítástechnika alapjait tanulmányozták. Sudan és Ackerman híresek [1] arról, hogy felfedeztek egy mindenhol definiált kiszámítható függvényt (amit néha egyszerűen "rekurzívnak" neveznek), amely nem primitív rekurzív . Szudán felfedezte a kevésbé ismert Szudán funkciót , ami után tőle függetlenül Ackerman 1928-ban publikálta funkcióját . A három argumentumból álló Ackermann-függvényt úgy határoztuk meg, hogy az összeadás, szorzás vagy hatványozás műveletét hajtotta végre:

és kibővítésre került Knuth 1976-ban közzétett nyíl jelölésével :

.

(Amellett, hogy történelmi szerepe volt az első, mindenhol definiált, nem primitív rekurzív kiszámítható függvény, Ackermann eredeti függvénye kiterjesztette az alapvető aritmetikai műveleteket a hatványozáson túlra, bár nem olyan jól az olyan dedikált függvényeket, mint a Goodstein -féle hiperoperátor sorozat .)

A végtelenről című művében Hilbert azt sejtette, hogy Ackermann függvénye nem primitíven rekurzív, és Ackerman (Hilbert személyi titkára és egykori tanítványa) bebizonyította ezt a sejtést Hilbert A valós számok felépítése című művében. Rosa Peter és Raphael Robinson később bemutatta az Ackermann-függvény kétargumentumos változatát, amelyet sok szerző most az eredetivel szemben preferál [2] .

Definíció

Az Ackermann-függvény rekurzív módon van definiálva nemnegatív egész számokhoz , és a következőképpen:

Talán nem tűnik nyilvánvalónak, hogy a rekurzió mindig véget ér. Ez abból következik, hogy egy rekurzív hívásnál vagy az értéke csökken , vagy az értéke megmarad, de az értéke csökken . Ez azt jelenti, hogy minden alkalommal, amikor a pár lexikográfiai sorrendben csökken , ami azt jelenti, hogy az érték végül eléri a nullát: egy értékhez véges számú lehetséges érték van (mivel az első hívás az adatokkal valamilyen meghatározott értékkel készült , és ha az érték megmarad, az érték csak csökkenhet), és a lehetséges értékek száma is véges. Csökkentésekor azonban a -kal növekvő érték korlátlan és általában nagyon nagy.

Értéktáblázat

Lásd a hyper operátort a hyper részleteiért .
(összes blokk )

Inverz függvény

Mivel a függvény nagyon gyorsan növekszik, az inverz függvény , amelyet jelöl , nagyon lassan növekszik. Ezzel a függvénnyel találkozhatunk néhány algoritmus komplexitásának tanulmányozása során , például egy diszjunkt halmazrendszer vagy a Chazell-algoritmus egy minimális feszítőfa létrehozására [3] . Az aszimptotika elemzésekor feltételezhetjük, hogy minden gyakorlatilag előforduló számra ennek a függvénynek az értéke kisebb, mint öt, mivel nem kisebb, mint .

Használat teljesítménytesztekben

Az Ackerman függvény definíciójából adódóan nagyon mély rekurziós szinttel rendelkezik, amellyel tesztelhető a fordító rekurzióoptimalizáló képessége. Yngwie Sundblad [4] volt az első, aki erre az Ackerman függvényt használta .

Brian Wichman ( a Whetstone benchmark társszerzője ) figyelembe vette ezt a cikket, amikor cikksorozatot írt a hívásoptimalizálás teszteléséről [5] [6] [7] .

Például egy olyan fordító, amely egy számítás elemzésekor képes közbenső értékeket tárolni, például és , száz- és ezerszeresére gyorsíthatja a számítást . A rekurzív kibővítés helyett közvetlen kiértékelés is jelentősen felgyorsítja a számítást. A számítás lineáris időt vesz igénybe . A számítás másodfokú időt igényel, mivel O ( ) beágyazott hívásokká bővül a különböző . A számítási idő arányos .

Az érték egyszerű rekurzív alkalmazással ésszerű időn belül nem számítható ki. Ehelyett gyorsírási képleteket használnak a rekurzív hívások optimalizálására, például .

Az Ackermann-függvény értékeinek kiszámításának egyik gyakorlati módja a köztes eredmények memorizálása . A fordító ezt a technikát automatikusan alkalmazhatja egy függvényre Donald Michie memo függvényeinek [8] [9] segítségével .

Jegyzetek

  1. Cristian Calude, Solomon Marcus és Ionel Tevy . Az első példa egy rekurzív függvényre, amely nem primitív rekurzív  // Historia Math  . : folyóirat. - 1979. - november ( 6. köt. , 4. sz.). - P. 380-384 . - doi : 10.1016/0315-0860(79)90024-7 .
  2. Raphael M. Robinson . Rekurzió és kettős rekurzió  (neopr.)  // Bulletin of the American Mathematical Society . - 1948. - T. 54 , 10. sz . - S. 987-993 . - doi : 10.1090/S0002-9904-1948-09121-2 . Archiválva az eredetiből 2011. június 7-én.
  3. Diszkrét matematika: Algoritmusok. Minimálisan átívelő fák (a link nem érhető el) . Letöltve: 2011. augusztus 13. Az eredetiből archiválva : 2010. június 2. 
  4. Y. Sundblad . Az Ackermann függvény. Elméleti, számítási és képletmanipulációs tanulmány  (angol)  // BIT : folyóirat. - 1971. - 1. évf. 11 . - 107-119 . o . - doi : 10.1007/BF01935330 .  (nem elérhető link)
  5. Ackermann-függvény: Tanulmány a hívási eljárások hatékonyságáról (1975). Letöltve: 2011. augusztus 13. Az eredetiből archiválva : 2012. február 23..
  6. Hogyan nevezzük az eljárásokat, avagy második gondolatok Ackermann függvényéről (1977). Letöltve: 2011. augusztus 13. Az eredetiből archiválva : 2012. február 23..
  7. Az eljáráshívási teszt legfrissebb eredményei. Ackermann függvénye (1982). Letöltve: 2011. augusztus 13. Az eredetiből archiválva : 2012. február 23..
  8. Michie, Donald Memo funkciók és gépi tanulás, Nature , no. 218, pp. 1968. 19-22.
  9. Példa: Ackermann függvény explicit memo függvény verziója Archiválva 2011. július 17-én a Wayback Machine -nél PL/SQL-ben implementálva.

Linkek