Funkcja Ackermanna - Ackermann function

W teorii obliczalności The Funkcja Ackermanna , nazwany na cześć Wilhelma Ackermanna , jest jednym z najprostszych i najwcześniej odkrytych przykładów całkowitej funkcja obliczalna , który nie jest prymitywny rekurencyjny . Wszystkie pierwotne funkcje rekurencyjne są całkowite i obliczalne, ale funkcja Ackermanna ilustruje, że nie wszystkie funkcje całkowite obliczalne są prymitywne rekurencyjne. Po opublikowaniu przez Ackermanna jego funkcji (która miała trzy nieujemne liczby całkowite), wielu autorów zmodyfikowało ją do różnych celów, tak że dzisiaj „funkcja Ackermanna” może odnosić się do dowolnego z wielu wariantów pierwotnej funkcji. Jedna wspólna wersja, dwuargumentowa funkcja Pétera-Ackermanna jest zdefiniowana w następujący sposób dla nieujemnych liczb całkowitych m i n :

Jego wartość szybko rośnie, nawet przy niewielkich nakładach. Na przykład A (4, 2) jest liczbą całkowitą 19,729 cyfr dziesiętnych (odpowiednik 2 65536 -3 lub 2 2 2 2 2 -3).

Historia

Pod koniec lat dwudziestych matematycy Gabriel Sudan i Wilhelm Ackermann , uczniowie Davida Hilberta , studiowali podstawy obliczeń. Zarówno Sudanowi, jak i Ackermannowi przypisuje się odkrycie całkowicie obliczalnych funkcji (w niektórych odniesieniach określanych po prostu jako „rekurencyjne”), które nie są prymitywnymi funkcjami rekurencyjnymi . Sudan opublikował mniej znaną funkcję Sudanu , a wkrótce potem i niezależnie, w 1928 roku, Ackermann opublikował swoją funkcję (grecka litera phi ). Funkcja trójargumentowa Ackermanna , jest zdefiniowana w taki sposób, że dla , odtwarza podstawowe operacje dodawania , mnożenia i potęgowania jako

a dla p > 2 rozszerza te podstawowe operacje w sposób, który można porównać do hiperoperacji :

(Oprócz swojej historycznej roli jako całkowicie obliczalnej-ale-nie-prymitywnej-rekurencyjnej funkcji, oryginalna funkcja Ackermanna jest postrzegana jako rozszerzenie podstawowych operacji arytmetycznych poza potęgowanie, chociaż nie tak płynnie jak warianty funkcji Ackermanna, które są specjalnie zaprojektowane do w tym celu — na przykład sekwencja hiperoperacyjna Goodsteina .)

W dniu Nieskończonego , David Hilbert hipotezę, że funkcja Ackermann nie był prymitywny rekurencyjny, ale było Ackermann, Hilberta osobisty sekretarz i były student, który rzeczywiście okazał się hipotezę, w swoim referacie Na Hilberta konstrukcja zbioru liczb rzeczywistych .

Rózsa Péter i Raphael Robinson opracowali później wersję funkcji Ackermanna z dwiema zmiennymi, która stała się preferowana przez wielu autorów.

Uogólniona sekwencja hiperoperacji , np. , jest również wersją funkcji Ackermanna.

W 1963 roku RC Buck oparł intuicyjny wariant z dwiema zmiennymi ( ) na sekwencji hiperoperacji :

W porównaniu do większości innych wersji funkcja Bucka nie ma nieistotnych przesunięć:

Zbadano wiele innych wersji funkcji Ackermanna.

Definicja

Jako funkcja m-ary

Oryginalna trójargumentowa funkcja Ackermanna jest zdefiniowana rekurencyjnie w następujący sposób dla nieujemnych liczb całkowitych i :

Spośród różnych dwuargumentowych wersji, ta opracowana przez Pétera i Robinsona (zwana przez niektórych autorów „funkcją Ackermanna”) jest zdefiniowana dla nieujemnych liczb całkowitych i jest następująca:

Funkcję Pétera-Ackermanna można również wyrazić w odniesieniu do różnych innych wersji funkcji Ackermanna:

Stąd
( i odpowiadałoby i , które logicznie można by dodać.)

Jako iterowana funkcja 1-arowa

Określić f n , gdy n -tej iteracji o f

gdzie id jest funkcją tożsamości, a fg oznacza złożenie funkcji .

Rozpatrując funkcję Ackermanna jako ciąg funkcji jednoargumentowych, można ustawić .

Funkcja staje się wtedy ciągiem funkcji jednoargumentowych, zdefiniowanych z iteracji :

Ponieważ złożenie funkcji ( fg )( x ) = f ( g ( x )) jest asocjacyjne , ostatnia linia może być również

Obliczenie

Rekurencyjną definicję funkcji Ackermanna można oczywiście przełożyć na system przepisywania terminów (TRS) .

TRS, oparty na funkcji 2-arowej

Definicja 2- arnej funkcji (Péter-)Ackermanna odpowiada regułom redukcji

Przykład

Obliczać

Do obliczeń można użyć stosu , który początkowo zawiera elementy .

Następnie kilkakrotnie wymieniane są dwa górne elementy zgodnie z zasadami

Schematycznie, zaczynając od :

WHILE stackLength <> 1
{
   POP 2 elements;
   PUSH 1 to 3 elements in conformance with the rules r1, r2, r3
}

Pseudokod został opublikowany w Grossman & Zeitman (1988) .

Na przykład na wejściu kolejne konfiguracje stosu to

Odzwierciedla to sekwencję redukcji

Uwagi

  • Strategia najbardziej od lewej do wewnętrznej jest zaimplementowana w 225 językach komputerowych w Rosetta Code .
  • Grossman i Zeitman (1988) wskazali, że w obliczeniach maksymalna długość stosu wynosi , tak długo jak .

TRS, oparty na iterowanej funkcji 1-arnej

Definicja iterowanych 1-arnych funkcji Ackermanna prowadzi do różnych reguł redukcji

Ponieważ złożenie funkcji jest asocjacyjne, zamiast reguły r6 można zdefiniować

Podobnie jak w poprzedniej sekcji, obliczenie może być zaimplementowane za pomocą stosu, który utrzymuje bieżący termin.

Początkowo stos zawiera trzy elementy .

Następnie kilkakrotnie wymieniane są trzy górne elementy zgodnie z zasadami

Schematycznie, zaczynając od :

WHILE stackLength <> 1
{
   POP 3 elements;
   PUSH 1 or 3 or 5 elements in conformance with the rules r4, r5, r6;
}

Przykład

Na wejściu kolejne konfiguracje stosu są

Odpowiednie równości są


Gdy zamiast r6 stosuje się regułę redukcji r7, następują zamiany w stosie

Kolejne konfiguracje stosu będą wtedy:

Odpowiednie równości są

Uwagi

  • Na dowolnym wejściu wszystkie przedstawione powyżej TRS zbiegają się w tej samej liczbie kroków. Używają również tych samych reguł redukcji (w tym porównaniu reguły r1, r2, r3 są uważane za „takie same” jak reguły r4, r5, r6/7). Na przykład redukcja zbieżności w 14 krokach: 6 X r1, 3 X r2, 5 X r3. Redukcja również zbiega się w 14 krokach: 6 X r4, 3 X r5, 5 X r6/7. TRS różnią się kolejnością stosowania zasad redukcji.
  • Gdy jest obliczana zgodnie z regułami r4, r5, r6, maksymalna długość stosu pozostaje poniżej 2 * . Kiedy stosuje się regułę redukcji r7 zamiast reguły r6, maksymalna długość stosu spada poniżej 2(i+2). Długość stosu odzwierciedla głębokość rekurencji. Ponieważ obliczenie zgodnie z regułami r4, r5, r7 obejmuje najmniejszą zaobserwowaną do tej pory maksymalną głębokość rekurencji, jest pod tym względem efektywne.

Ogromne liczby

Aby zademonstrować, jak obliczanie wyników w wielu krokach i w dużej liczbie:

Tabela wartości

Obliczenie funkcji Ackermanna można przełożyć na nieskończoną tablicę. Najpierw umieść liczby naturalne w górnym rzędzie. Aby określić liczbę w tabeli, przenieś liczbę bezpośrednio po lewej stronie. Następnie użyj tej liczby, aby wyszukać wymaganą liczbę w kolumnie podanej przez tę liczbę i jeden wiersz w górę. Jeśli po lewej stronie nie ma żadnej liczby, po prostu spójrz na kolumnę z nagłówkiem „1” w poprzednim wierszu. Oto mała lewa górna część tabeli:

Wartości A ( mn )
n
m
0 1 2 3 4 n
0 1 2 3 4 5
1 2 3 4 5 6
2 3 5 7 9 11
3 5 13 29 61 125
4 13


65533


2 65536  − 3










5 65533

6
m

Liczby tutaj, które są wyrażone tylko za pomocą potęgowania rekurencyjnego lub strzałek Knutha, są bardzo duże i zajęłyby zbyt dużo miejsca, aby zapisać je w postaci zwykłych cyfr dziesiętnych.

Pomimo dużych wartości występujących w tej wczesnej części tabeli, niektóre jeszcze większe liczby zostały zdefiniowane, takie jak liczba Grahama , której nie można zapisać za pomocą małej liczby strzałek Knutha. Liczba ta jest konstruowana za pomocą techniki podobnej do rekurencyjnego stosowania do siebie funkcji Ackermanna.

Jest to powtórzenie powyższej tabeli, ale z wartościami zastąpionymi odpowiednim wyrażeniem z definicji funkcji, aby wyraźnie pokazać wzorzec:

Wartości A ( mn )
n
m
0 1 2 3 4 n
0 0+1 1+1 2+1 3+1 4+1 n + 1
1 A (0, 1) A (0, A (1, 0))
= A (0, 2)
A (0, A (1, 1))
= A (0, 3)
A (0, A (1, 2))
= A (0, 4)
A (0, A (1, 3))
= A (0, 5)
A (0, A (1, n −1))
2 A (1, 1) A (1, A (2, 0))
= A (1, 3)
A (1, A (2, 1))
= A (1, 5)
A (1, A (2, 2))
= A (1, 7)
A (1, A (2, 3))
= A (1, 9)
A (1, A (2, n −1))
3 (2, 1) A (2, A (3, 0))
= A (2, 5)
A (2, A (3, 1))
= A (2, 13)
A (2, A (3, 2))
= A (2, 29)
A (2, A (3, 3))
= A (2, 61)
A (2, A (3, n −1))
4 A (3, 1) A (3, A (4, 0))
= A (3, 13)
A (3, A (4, 1))
= A (3, 65533)
A (3, A (4, 2)) A (3, A (4, 3)) A (3, A (4, n −1))
5 A (4, 1) A (4, A (5, 0)) A (4, A (5, 1)) A (4, A (5, 2)) A (4, A (5, 3)) A (4, A (5, n −1))
6 A (5, 1) (5, (6, 0)) (5, (6, 1)) (5, (6, 2)) (5, (6, 3)) (5, (6, n -1)),

Nieruchomości

Uwagi ogólne

  • Może nie być od razu oczywiste, że ocena zawsze się kończy. Jednak rekursja jest ograniczona, ponieważ w każdej aplikacji rekurencyjnej albo maleje, albo pozostaje taka sama i maleje. Za każdym razem, gdy osiągnie zero, maleje, więc w końcu również osiąga zero. (Mówiąc bardziej technicznie, w każdym przypadku para zmniejsza się w porządku leksykograficznym na parach, co jest dobrym uporządkowaniem , podobnie jak uporządkowanie pojedynczych nieujemnych liczb całkowitych; oznacza to, że nie można zejść w kolejności nieskończenie wiele razy z rzędu .) Jednakże, gdy maleje, nie ma górnej granicy tego, jak bardzo może wzrosnąć — i często znacznie wzrośnie.
  • Dla małych wartości m, takich jak 1, 2 lub 3, funkcja Ackermanna rośnie stosunkowo wolno względem n (co najwyżej wykładniczo ). Bo rośnie jednak znacznie szybciej; parzysty wynosi około 2 × 10 19 728 , a rozszerzenie dziesiętne A (4, 3) jest bardzo duże według każdej typowej miary.
  • Ciekawym aspektem jest to, że jedyną operacją arytmetyczną, jaką kiedykolwiek używa, jest dodanie 1. Jego szybko rosnąca moc opiera się wyłącznie na rekurencji zagnieżdżonej. Oznacza to również, że jego czas działania jest co najmniej proporcjonalny do jego wydajności, a więc jest również niezwykle duży. W rzeczywistości w większości przypadków czas działania jest znacznie większy niż wydajność; patrz poniżej.
  • Wersja jednoargumentowa, która zwiększa oba i jednocześnie przyćmiewa każdą prymitywną funkcję rekurencyjną, w tym bardzo szybko rosnące funkcje, takie jak funkcja wykładnicza , funkcja silnia, funkcje wielo- i superczynnikowe , a nawet funkcje zdefiniowane za pomocą strzałki w górę Knutha notacja (z wyjątkiem przypadku użycia indeksowanej strzałki w górę). Widać, że jest to z grubsza porównywalne z szybko rozwijającą się hierarchią . Ten ekstremalny wzrost można wykorzystać do pokazania tego, co jest oczywiście obliczalne na maszynie z nieskończoną pamięcią, takiej jak maszyna Turinga, a więc jest funkcją obliczalną , rośnie szybciej niż jakakolwiek prymitywna funkcja rekurencyjna i dlatego nie jest pierwotną funkcją rekurencyjną.

Nie prymitywny rekurencyjny

Funkcja Ackermanna rośnie szybciej niż jakakolwiek prymitywna funkcja rekurencyjna i dlatego sama nie jest pierwotną funkcją rekurencyjną.

W szczególności pokazujemy, że dla każdej pierwotnej funkcji rekurencyjnej istnieje nieujemna liczba całkowita taka, że ​​dla wszystkich nieujemnych liczb całkowitych ,

Po ustaleniu tego wynika, że samo w sobie nie jest prymitywne, rekurencyjne, ponieważ w przeciwnym razie wprowadzenie doprowadziłoby do sprzeczności

Dowód przebiega następująco: zdefiniuj klasę wszystkich funkcji, które rosną wolniej niż funkcja Ackermanna

i pokaż, że zawiera wszystkie prymitywne funkcje rekurencyjne. To ostatnie osiąga się przez pokazanie, że zawiera funkcje stałe, funkcję następnika, funkcje rzutowania oraz że jest ona zamknięta pod operacjami składania funkcji i rekurencji pierwotnej.

Odwrotność

Ponieważ funkcja f ( n ) = ( N , N ) za powyżej rośnie bardzo szybko, jego funkcję odwrotną , C -1 , rośnie bardzo wolno. Ta odwrotna funkcja Ackermanna f- 1 jest zwykle oznaczana przez α . W rzeczywistości α ( n ) jest mniejsze niż 5 dla każdego praktycznego rozmiaru wejściowego n , ponieważ A (4, 4) jest rzędu .  

Ta odwrotność pojawia się w złożoności czasowej niektórych algorytmów , takich jak rozłączna struktura danych i algorytm Chazelle'a dla drzew o minimalnej rozpiętości . Czasami w tych ustawieniach stosuje się oryginalną funkcję Ackermanna lub inne odmiany, ale wszystkie one rosną w podobnym tempie. W szczególności niektóre zmodyfikowane funkcje upraszczają wyrażenie, eliminując -3 i podobne terminy.

Dwuparametrową odmianę odwrotnej funkcji Ackermanna można zdefiniować w następujący sposób, gdzie jest funkcją podłogi :

Funkcja ta pojawia się w dokładniejszych analizach wyżej wymienionych algorytmów i daje bardziej precyzyjne ograniczenie czasowe. W rozłącznej strukturze danych m reprezentuje liczbę operacji, podczas gdy n reprezentuje liczbę elementów; w algorytmie minimalnego drzewa opinającego m reprezentuje liczbę krawędzi, podczas gdy n reprezentuje liczbę wierzchołków. Istnieje kilka nieco odmiennych definicji α ( m , n ) ; na przykład log 2 n jest czasami zastępowany przez n , a funkcja podłogi jest czasami zastępowana przez sufit .

Inne badania mogą zdefiniować funkcję odwrotną jedności, w której m jest ustawione na stałą, tak że odwrotność dotyczy określonego wiersza.

Odwrotność funkcji Ackermanna jest pierwotną rekurencyjną.

Użyj jako punktu odniesienia

Funkcja Ackermanna, ze względu na swoją definicję w kategoriach ekstremalnie głębokiej rekurencji, może być wykorzystana jako wzorzec zdolności kompilatora do optymalizacji rekurencji. Pierwsze opublikowane użycie funkcji Ackermanna w ten sposób miało miejsce w 1970 r. przez Dragoș Vaidę i prawie jednocześnie w 1971 r. przez Yngve Sundblada.

Przełomowa praca Sundblada została podjęta przez Briana Wichmanna (współautora benchmarku Whetstone ) w trylogii artykułów napisanych w latach 1975-1982.

Zobacz też

Uwagi

Bibliografia

Bibliografia

Zewnętrzne linki