20.02.2013 Aufrufe

Ackermann-Funktion

Ackermann-Funktion

Ackermann-Funktion

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!