Ackermann-Funktion
Ackermann-Funktion
Ackermann-Funktion
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Theoretische Informatik<br />
<strong>Ackermann</strong>-<strong>Funktion</strong><br />
Ali Eyerta
Inhalt<br />
� Entstehungsgeschichte<br />
� Bedeutung in der Theoretischen Informatik<br />
� <strong>Ackermann</strong>s Idee<br />
� <strong>Ackermann</strong>-<strong>Funktion</strong><br />
� Anwendungen<br />
� Benchmark für rekursive Aufrufe<br />
� Implementation<br />
� Wertetabelle<br />
� Sonstiges<br />
� <strong>Funktion</strong>swert ack(4,2)<br />
� Die Busy Beaver <strong>Funktion</strong><br />
� Ende<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Entstehungsgeschichte<br />
� 1926 vermutet David Hilbert dass jede berechenbare<br />
<strong>Funktion</strong> primitiv rekursiv sei<br />
� Einfach ausgedrückt: Jede durch einen Computer berechenbare<br />
<strong>Funktion</strong> aus wenigen einfachen Regeln zusammensetzen<br />
lassen und die Dauer der Berechnung sich im Voraus<br />
abschätzen lässt.<br />
� Dies trifft auf nahezu alle in der Praxis vorkommenden<br />
<strong>Funktion</strong>en zu<br />
� 1928 veröffentlich Wilhelm <strong>Ackermann</strong> eine <strong>Funktion</strong> die<br />
diese Vermutung widerlegt<br />
� Diese <strong>Funktion</strong> kann von einem Computer berechnet werden ist<br />
aber nicht primitiv rekursiv.<br />
� 1955 konstruierte Rózsa Péter eine vereinfachte<br />
Version, die die gleichen Eigenschaften besitzt<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Bedeutung in der theo. Informatik<br />
� Suche nach Grenzen von Computern:<br />
berechenbare <strong>Funktion</strong>en<br />
� dies sind <strong>Funktion</strong>en mit gegebenen Algorithmen, die<br />
eine Turingmaschine berechnen kann<br />
� Problem: entscheiden ob eine <strong>Funktion</strong><br />
berechenbar ist oder nicht.<br />
� Algorithmus gefunden -> berechenbar<br />
� Algorithmus nicht gefunden -> ungewiss<br />
� Entweder nicht berechenbar oder es gibt einen Algorithmus<br />
aber nicht gefunden<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Bedeutung in der theo. Informatik<br />
� Alternative Definitionen werden gesucht<br />
� Erster Ansatz: primitiv rekursive <strong>Funktion</strong>en<br />
� Sind <strong>Funktion</strong>en die aus wenigen Regeln und<br />
einfachen <strong>Funktion</strong>en zusammensetzen lassen<br />
� Vermutung das alle berechenbare <strong>Funktion</strong>en<br />
primitiv Rekursiv sind<br />
� <strong>Ackermann</strong>s <strong>Funktion</strong> ist berechenbar aber nicht<br />
primitiv rekursiv -> Vermutung falsch<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
<strong>Ackermann</strong>s Idee<br />
� a+b, a*b, a^b,… .<br />
� a*b ist gerade a+a+…+a , wobei die Variable a, b-mal vorkommt<br />
� Die Idee: diese Folge als <strong>Funktion</strong> aufzufassen.<br />
Beispiel: a = 2 und b = 4,<br />
Folge: 6, 8, 16, 65536, (mit 65536 Zweien),<br />
Die letzte aufgeführte Zahl ist bereits wesentlich größer als die geschätzte Anzahl der Atome im gesamten Weltall.<br />
� Die <strong>Ackermann</strong>funktion, ist also eine <strong>Funktion</strong>, die die folgenden<br />
Gleichungen erfüllt:<br />
ack(a,b,0) = a+b<br />
ack(a,b,1) = a*b<br />
ack(a,b,2) = a^b<br />
…<br />
Ab der vierten Zeile können die <strong>Funktion</strong>swerte nicht mehr mit herkömmlichen Operatoren formuliert werden; man braucht erweiterte<br />
Notationen, wie beispielsweise den Hyper-Operator.<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Definition <strong>Ackermann</strong><br />
� Definition nach <strong>Ackermann</strong> (1926)<br />
ack(a,b,0) = a+b<br />
ack(a,0,n+1) = psi(a,n)<br />
ack(a,b+1,n+1) = ack(a,ack(a,b,n+1),n)<br />
psi(a,n) eine weitere <strong>Funktion</strong>, die <strong>Ackermann</strong> nicht weiter beschrieb. (Sie liefert die Startwerte a + 0, a*0 , a^0,…)<br />
� Rózsa Péter definierte 1955 eine einfachere Version der<br />
<strong>Ackermann</strong>funktion<br />
a(0,m) = m+1<br />
a(n+1,0) = a(n,1)<br />
a(n+1,m+1) = a(n,a(n+1,m))<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Definition <strong>Ackermann</strong><br />
Beispiele:<br />
� a(0,1)<br />
a(0,1) = 1 + 1 = 2. | die erste Zeile der Definition anwenden<br />
� a(1,0)<br />
a(1,0) = a(0,1) | die zweite Zeile der Definition anwenden<br />
= 1 + 1 = 2 | die erste Zeile der Definition anwenden<br />
� a(1,1) = a(0,a(1,0)) | die dritte Zeile der Definition anwenden<br />
= a(0,2)<br />
= 2 + 1 = 3<br />
| a(1,0) wurde vorhin berechnet, jetzt einsetzen<br />
Wenn man vom Wachstum der <strong>Ackermann</strong>funktion spricht, meint man oftmals die <strong>Funktion</strong> f(n): = ack(n,n,n).<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Anwendungen<br />
� Benchmarktests für rekursive Aufrufe in<br />
Programmiersprachen<br />
� Laufzeitabschätzung bei der Union-Find-<br />
Struktur<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Anwendungen : Benchmarktests<br />
� Bei Einführung von neuen Compilern,<br />
Programmiersprachen und Computern, wird<br />
Leistungsfähigkeit überprüft<br />
� <strong>Ackermann</strong>funktion als Benchmark für rekursive<br />
<strong>Funktion</strong>en<br />
� <strong>Ackermann</strong>funktion besteht im wesentlichen aus<br />
rekursiven Aufrufen<br />
� Die Schwierigkeit dabei ist nicht der<br />
<strong>Funktion</strong>swert, sondern Verschachtelungstiefe<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Anwendungen : Benchmarktests<br />
� Problem: Stack Overflow<br />
� Yngve Sundblad benutzte 1971 die <strong>Funktion</strong> f(n): = a(3,n)<br />
um Programmiersprachen zu vergleichen<br />
� Um a(3,n) zu berechnen, werden a(3,n) + 12n −2<br />
Aufrufe<br />
getätigt.<br />
� 1971 Größe von n=1<br />
� Heute mit Java 1.4.2 mit Standardspeichereinstellungen<br />
n=13<br />
� Im Laufe der Berechnung viele identische Aufrufe<br />
� Intelligenter Compiler speichert diese zwischen<br />
� 1971 war damit ein mit von 20 möglich<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Implementation<br />
� Pseudo Code<br />
function ack(n, m)<br />
if n = 0 return m + 1<br />
else if m = 0 return ack(n - 1, 1)<br />
else return ack(n - 1, ack(n, m - 1))<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Implementation<br />
� Prolog<br />
ackermann(0,X,Y) :- X >= 0, !, Y is X + 1.<br />
ackermann(X,0,Z) :- X > 0, !, X1 is X - 1, ackermann(X1,1,Z).<br />
ackermann(X,Y,Z) :- X > 0, Y > 0, X1 is X-1, Y1 is Y - 1,<br />
ackermann(X,Y1,W), ackermann(X1,W,Z).<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Wertetabelle<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
Sonstiges<br />
� <strong>Funktion</strong>swert a(4,2)<br />
� Die <strong>Funktion</strong> Fleißiger Biber<br />
�1962 gab Tibor Radó mit der <strong>Funktion</strong><br />
Fleißiger Biber (busy beaver) eine noch stärker<br />
als die <strong>Ackermann</strong>funktion (oder jede andere<br />
berechenbare <strong>Funktion</strong>) wachsende <strong>Funktion</strong><br />
an, die allerdings nicht mehr berechenbar ist.<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta
ENDE<br />
<strong>Ackermann</strong>funktion – Theoretische Informatik Verfasser: Ali Eyerta