Informatik Vorkurs Sommersemester 2014

Informatik Vorkurs – Sommersemester 2015
Vom Algorithmus zum Programm
Werner Struckmann / Marvin Priedigkeit, Stephan Mielke
31. März – 10. April 2015
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
1. Was ist ein Algorithmus?
2. Was ist ein Programm?
3. Wie wird ein Algorithmus aufgeschrieben?
4. Mit welchem Aufwand löst der Algorithmus das Problem?
5. Löst der Algorithmus das Problem?
6. Gibt es einen Algorithmus für das Problem?
7. Vom kleinen zum großen Programm
8. Weitere Aspekte
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Kann ein Computer rechnen? Ein Java-Beispiel
public static void main(String[] args) {
System.out.println(1*1);
System.out.println(12*12);
System.out.println(123*123);
System.out.println(1234*1234);
System.out.println(12345*12345);
System.out.println(123456*123456);
}
Ausgabe:
1
144
15129
1522756
152399025
31. März – 10. April 2015 | Werner Struckmann | Seite 3 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Kann ein Computer rechnen? Ein Java-Beispiel
public static void main(String[] args) {
System.out.println(1*1);
System.out.println(12*12);
System.out.println(123*123);
System.out.println(1234*1234);
System.out.println(12345*12345);
System.out.println(123456*123456);
}
Ausgabe:
1
144
15129
1522756
152399025
-1938485248
Diese Ausgabe ist offensichtlich falsch!
31. März – 10. April 2015 | Werner Struckmann | Seite 3 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Kann ein Computer rechnen? Ein zweites Java-Beispiel
public static void main(String[] args) {
int z = 256*256*256*128+2147483647;
System.out.println(z*z);
}
31. März – 10. April 2015 | Werner Struckmann | Seite 4 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Kann ein Computer rechnen? Ein zweites Java-Beispiel
public static void main(String[] args) {
int z = 256*256*256*128+2147483647;
System.out.println(z*z);
}
Ausgabe:
1
Hat er sich schon wieder verrechnet?
31. März – 10. April 2015 | Werner Struckmann | Seite 4 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Kann ein Computer rechnen? Ein drittes Java-Beispiel
double a = 1.0/3.0;
double b = 10.0 + a - 10.0, c;
if (a == b)
c = 0;
else
c = 1/(a-b);
System.out.printf("%20.5f%n",c);
31. März – 10. April 2015 | Werner Struckmann | Seite 5 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Kann ein Computer rechnen? Ein drittes Java-Beispiel
double a = 1.0/3.0;
double b = 10.0 + a - 10.0, c;
if (a == b)
c = 0;
else
c = 1/(a-b);
System.out.printf("%20.5f%n",c);
Ausgabe: -1637672591771089.50000
- 1 Billiarde 637 Billionen 672 Milliarden 591 Millionen 771 Tausend und 89,5
korrekter Wert:
0
31. März – 10. April 2015 | Werner Struckmann | Seite 5 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Warum sich der Computer hier dreimal verrechnet hat,
werden wir in Programmieren 1 lernen.
31. März – 10. April 2015 | Werner Struckmann | Seite 6 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
1. Was ist ein Algorithmus?
2. Was ist ein Programm?
3. Wie wird ein Algorithmus aufgeschrieben?
4. Mit welchem Aufwand löst der Algorithmus das Problem?
5. Löst der Algorithmus das Problem?
6. Gibt es einen Algorithmus für das Problem?
7. Vom kleinen zum großen Programm
8. Weitere Aspekte
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Ist das Programm korrekt?
In Jahre 1999 wurde durch die Fehlfunktion eines Seitenairbags ein Baby
getötet.
Die Untersuchungen ergaben einen Softwarefehler:
Die Ausführungsreihenfolge zweier Anweisungen war vertauscht worden.
Der Fehler trat nur in der Software eines speziellen Fahrzeugmodells auf.
Es wurde vergessen, diese spezielle Software zu testen.
31. März – 10. April 2015 | Werner Struckmann | Seite 8 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Ist das Programm korrekt?
Richtige Reihenfolge:
airbag = ein;
if (kindersitz == belegt) {
airbag = aus;
}
Falsche Reihenfolge:
if (kindersitz == belegt) {
airbag = aus;
}
airbag = ein;
31. März – 10. April 2015 | Werner Struckmann | Seite 9 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
1. Was ist ein Algorithmus?
2. Was ist ein Programm?
3. Wie wird ein Algorithmus aufgeschrieben?
4. Mit welchem Aufwand löst der Algorithmus das Problem?
5. Löst der Algorithmus das Problem?
6. Gibt es einen Algorithmus für das Problem?
7. Vom kleinen zum großen Programm
8. Weitere Aspekte
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Der intuitive Algorithmusbegriff
Gegeben sei ein „Problem“. Eine Handlungsvorschrift, deren mechanisches
Befolgen ohne Verständnis des Problems zur Lösung des Problems führt, wird
„Algorithmus“ genannt.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Der intuitive Algorithmusbegriff
Gegeben sei ein „Problem“. Eine Handlungsvorschrift, deren mechanisches
Befolgen ohne Verständnis des Problems zur Lösung des Problems führt, wird
„Algorithmus“ genannt.
Etwas präziser: Ein Algorithmus ist eine wohldefinierte „Rechenvorschrift“, die eine
(evtl. leere) Menge von Größen als Eingabe verwendet und eine Menge von
Größen als Ausgabe erzeugt. Ein Algorithmus ist also eine Abfolge von Schritten,
die die (evtl. leere) Eingabe in eine Ausgabe umwandelt.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Der intuitive Algorithmusbegriff
Gegeben sei ein „Problem“. Eine Handlungsvorschrift, deren mechanisches
Befolgen ohne Verständnis des Problems zur Lösung des Problems führt, wird
„Algorithmus“ genannt.
Etwas präziser: Ein Algorithmus ist eine wohldefinierte „Rechenvorschrift“, die eine
(evtl. leere) Menge von Größen als Eingabe verwendet und eine Menge von
Größen als Ausgabe erzeugt. Ein Algorithmus ist also eine Abfolge von Schritten,
die die (evtl. leere) Eingabe in eine Ausgabe umwandelt.
Der Algorithmus muss durch einen endlichen Text in einer wohldefinierten
Sprache beschrieben sein.
Die Objekte der Aktionen müssen klar sein.
Die Operationen müssen mechanisch ausführbar sein.
Die Reihenfolge der Operationen muss evtl. feststehen.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Der intuitive Algorithmusbegriff
Gegeben sei ein „Problem“. Eine Handlungsvorschrift, deren mechanisches
Befolgen ohne Verständnis des Problems zur Lösung des Problems führt, wird
„Algorithmus“ genannt.
Etwas präziser: Ein Algorithmus ist eine wohldefinierte „Rechenvorschrift“, die eine
(evtl. leere) Menge von Größen als Eingabe verwendet und eine Menge von
Größen als Ausgabe erzeugt. Ein Algorithmus ist also eine Abfolge von Schritten,
die die (evtl. leere) Eingabe in eine Ausgabe umwandelt.
Der Algorithmus muss durch einen endlichen Text in einer wohldefinierten
Sprache beschrieben sein.
Die Objekte der Aktionen müssen klar sein.
Die Operationen müssen mechanisch ausführbar sein.
Die Reihenfolge der Operationen muss evtl. feststehen.
Ein Problem, für dessen Lösung ein Algorithmus existiert, heißt berechenbar. In
der Definition wird nicht gefordert, dass die Abfolge der Rechenschritte stets
terminiert (Halteproblem).
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiele
Zerlegung handwerklicher Arbeiten in einzelne Schritte,
Kochrezepte,
Verfahren zur schriftlichen Multiplikation,
Algorithmus zur Bestimmung des größten gemeinsamen Teilers zweier
natürlicher Zahlen.
Zwei dieser Beispiele sehen wir uns jetzt an.
31. März – 10. April 2015 | Werner Struckmann | Seite 12 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Beispiel: Multiplikation zweier Zahlen
12 · 23 = ?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Beispiel: Multiplikation zweier Zahlen
12 · 23 = ?
2
7
6
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Multiplikation zweier Zahlen
12 · 23 = ?
2
12
6
3
1
7
6
23
46
92
184
276
*
*
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Multiplikation zweier Zahlen
12 · 23 = ?
2
12
6
3
1
7
1
6
23
46
92
184
276
2
·
2
2
*
*
2
4
3
7
3
6
6
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Multiplikation zweier Zahlen
12 · 23 = ?
2
12
6
3
1
7
1
6
23
46
92
184
276
2
·
2
2
*
*
2
4
3
7
3
6
6
12·23 = (1·10+2)·(2·10+3) = 1·2·100+(1·3+2·2)·10+2·3 = 2·100+7·10+6 = 276
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Beispiel: Größter gemeinsamer Teiler
Es sollen zwei Brüche addiert werden:
1 23
13 23
36
4·9
9
+
=
+
=
=
=
4 52
52 52
52
4 · 13
13
Bestimme den Hauptnenner.
Erweitere die Brüche.
Addiere die Zähler.
Bestimme den ggT von Zähler und Nenner.
Kürze den Bruch.
Wie berechnet man den ggT?
31. März – 10. April 2015 | Werner Struckmann | Seite 14 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
1. Algorithmus: Teilermengen
a = 52, b = 36:
Ta = T52 = {1, 2, 4, 13, 26, 52}
Tb = T36 = {1, 2, 3, 4, 6, 12, 18, 36}
Ta ∩ Tb = T52 ∩ T36 = {1, 2, 4}
ggT(52, 36) = max(Ta ∩ Tb ) = max{1, 2, 4} = 4
Bestimme die Teilermengen Ta und Tb .
Bestimme die Durchschnittsmenge Ta ∩ Tb .
Bestimme das Maximum von Ta ∩ Tb .
31. März – 10. April 2015 | Werner Struckmann | Seite 15 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
2. Algorithmus: Primfaktorzerlegung
a = 52, b = 36:
2
0
0
0
0
1
2
0
0
0
0
0
52
36
=
=
2 · 3 · 5 · 7 · 11 · 13
2
2
0
0
0
0
2 · 3 · 5 · 7 · 11 · 13
ggT(52, 36)
=
2 · 3 · 5 · 7 · 11 · 13
= 4
Bestimme die Primfaktorzerlegungen von a und b .
Bestimme die Primfaktorzerlegung des ggTs:
Bilde dazu das jeweilige Minimum der Exponenten von a und b.
31. März – 10. April 2015 | Werner Struckmann | Seite 16 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
3. Algorithmus: Verfahren von Euklid (ca. 300 v. Chr.)
a = 52, b = 36:
Berechne r = a mod b.
Setze a = b und b = r.
Wiederhole diese Schritte bis b = 0 ist.
a ist das Ergebnis.
r
16
4
0
a
52
36
16
4
b
36
16
4
0
31. März – 10. April 2015 | Werner Struckmann | Seite 17 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Fragestellungen für Algorithmen: Korrektheit und Komplexität
Partielle Korrektheit:
Falls der Algorithmus terminiert wird die Spezifikation erfüllt.
Totale Korrektheit:
Der Algorithmus terminiert und erfüllt die Spezifikation.
Komplexität:
Speicherplatz des Algorithmus
Laufzeit des Algorithmus
31. März – 10. April 2015 | Werner Struckmann | Seite 18 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Programm und Programmiersprache
Ein Programm ist die Formulierung eines Algorithmus und seiner Datenbereiche in
einer Programmiersprache.
Eine Programmiersprache erlaubt es, Algorithmen präzise zu beschreiben.
Insbesondere legt eine Programmiersprache
die elementaren Operationen,
die Möglichkeiten zu ihrer Kombination und
die zulässigen Datenbereiche
eindeutig fest.
Unter „programmieren“ versteht man den Vorgang des Erstellens eines
Programms. Die Programmierausbildung der ersten Semester erfolgt in der
Sprache Java. Später werden weitere Sprachen gelehrt.
31. März – 10. April 2015 | Werner Struckmann | Seite 19 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Der euklidische Algorithmus in fünf Programmiersprachen
Java (objektorientierte Sprache)
s t a t i c i n t ggT ( i n t a , i n t b ) {
int r ;
while ( b != 0 ) {
r = a % b;
a = b;
b = r;
}
return a ;
}
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Der euklidische Algorithmus in fünf Programmiersprachen
Java (objektorientierte Sprache)
s t a t i c i n t ggT ( i n t a , i n t b ) {
int r ;
while ( b != 0 ) {
r = a % b;
a = b;
b = r;
}
return a ;
}
Prolog (logische Sprache)
g g t ( A, 0 , A ) .
g g t ( A , B , Z ) : − U i s A mod B , g g t ( B , U, Z ) .
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Der euklidische Algorithmus in fünf Programmiersprachen
Java (objektorientierte Sprache)
s t a t i c i n t ggT ( i n t a , i n t b ) {
int r ;
while ( b != 0 ) {
r = a % b;
a = b;
b = r;
}
return a ;
}
Prolog (logische Sprache)
g g t ( A, 0 , A ) .
g g t ( A , B , Z ) : − U i s A mod B , g g t ( B , U, Z ) .
Haskell (funktionale Sprache)
g g t : : I n t e g e r −> I n t e g e r −> I n t e g e r
g g t a b | b == 0
= a
| otherwise = g g t b ( a ‘mod‘ b )
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Der euklidische Algorithmus in fünf Programmiersprachen
Java (objektorientierte Sprache)
C-Shell (Skriptsprache)
s t a t i c i n t ggT ( i n t a , i n t b ) {
int r ;
while ( b != 0 ) {
r = a % b;
a = b;
b = r;
}
return a ;
}
set a = . . . ; set b = . . .
while ( $b != 0 )
@ r = $a % $b
s e t a = $b
set b = $r
end
echo $a
Prolog (logische Sprache)
g g t ( A, 0 , A ) .
g g t ( A , B , Z ) : − U i s A mod B , g g t ( B , U, Z ) .
Haskell (funktionale Sprache)
g g t : : I n t e g e r −> I n t e g e r −> I n t e g e r
g g t a b | b == 0
= a
| otherwise = g g t b ( a ‘mod‘ b )
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Der euklidische Algorithmus in fünf Programmiersprachen
Java (objektorientierte Sprache)
C-Shell (Skriptsprache)
s t a t i c i n t ggT ( i n t a , i n t b ) {
int r ;
while ( b != 0 ) {
r = a % b;
a = b;
b = r;
}
return a ;
}
set a = . . . ; set b = . . .
while ( $b != 0 )
@ r = $a % $b
s e t a = $b
set b = $r
end
echo $a
Prolog (logische Sprache)
g g t ( A, 0 , A ) .
g g t ( A , B , Z ) : − U i s A mod B , g g t ( B , U, Z ) .
Haskell (funktionale Sprache)
g g t : : I n t e g e r −> I n t e g e r −> I n t e g e r
g g t a b | b == 0
= a
| otherwise = g g t b ( a ‘mod‘ b )
C (imperative Sprache)
i n t ggt ( i n t a , i n t b ) {
int r ;
while ( b != 0 ) {
r = a % b;
a = b;
b = r;
}
return a ;
}
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Lineare diophantische Gleichungen
Definition
Eine lineare diophantische Gleichung mit zwei Unbekannten x und y ist eine
Gleichung der Form
ax + by = c
(*)
für gegebene ganze Zahlen a, b, c. Gesucht werden ganze Zahlen x und y, die die
Gleichung erfüllen.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Lineare diophantische Gleichungen
Definition
Eine lineare diophantische Gleichung mit zwei Unbekannten x und y ist eine
Gleichung der Form
ax + by = c
(*)
für gegebene ganze Zahlen a, b, c. Gesucht werden ganze Zahlen x und y, die die
Gleichung erfüllen.
Satz
Die Gleichung (*) besitzt genau dann eine Lösung, wenn ggT(a, b) | c gilt.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Lineare diophantische Gleichungen
Definition
Eine lineare diophantische Gleichung mit zwei Unbekannten x und y ist eine
Gleichung der Form
ax + by = c
(*)
für gegebene ganze Zahlen a, b, c. Gesucht werden ganze Zahlen x und y, die die
Gleichung erfüllen.
Satz
Die Gleichung (*) besitzt genau dann eine Lösung, wenn ggT(a, b) | c gilt.
Beispiel
Zum Beispiel besitzt die Gleichung 36x + 52y = 24 eine ganzzahlige Lösung, weil
ggT(36, 52) = 4 ein Teiler von 24 ist: 36 · 18 − 52 · 12 = 24. Mithilfe eines
erweiterten euklidischen Algorithmus können Lösungen von linearen
diophantischen Gleichungen bestimmt werden, falls sie existieren.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Allgemeine diophantische Gleichungen
Definition
Eine allgemeine diophantische Gleichung mit den Unbekannten x1 , x2 , . . . , xn ist
eine Gleichung der Form
p(x1 , x2 , . . . , xn ) = 0,
wobei p ein ganzzahliges Polynom mit n Variablen ist.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Allgemeine diophantische Gleichungen
Definition
Eine allgemeine diophantische Gleichung mit den Unbekannten x1 , x2 , . . . , xn ist
eine Gleichung der Form
p(x1 , x2 , . . . , xn ) = 0,
wobei p ein ganzzahliges Polynom mit n Variablen ist.
Problem
Gibt es einen Algorithmus, der entscheiden kann, ob eine allgemeine
diophantische Gleichung ganzzahlige Lösungen besitzt? Dies ist das berühmte
zehnte Hilbertsche Problem aus dem Jahr 1900.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Allgemeine diophantische Gleichungen
Definition
Eine allgemeine diophantische Gleichung mit den Unbekannten x1 , x2 , . . . , xn ist
eine Gleichung der Form
p(x1 , x2 , . . . , xn ) = 0,
wobei p ein ganzzahliges Polynom mit n Variablen ist.
Problem
Gibt es einen Algorithmus, der entscheiden kann, ob eine allgemeine
diophantische Gleichung ganzzahlige Lösungen besitzt? Dies ist das berühmte
zehnte Hilbertsche Problem aus dem Jahr 1900.
Fakt
Solch einen Algorithmus gibt es nicht. Dies wurde von Yuri Matijasevič im Jahre
1970 bewiesen.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Beispiel: Allgemeine diophantische Gleichungen
Definition
Eine allgemeine diophantische Gleichung mit den Unbekannten x1 , x2 , . . . , xn ist
eine Gleichung der Form
p(x1 , x2 , . . . , xn ) = 0,
wobei p ein ganzzahliges Polynom mit n Variablen ist.
Problem
Gibt es einen Algorithmus, der entscheiden kann, ob eine allgemeine
diophantische Gleichung ganzzahlige Lösungen besitzt? Dies ist das berühmte
zehnte Hilbertsche Problem aus dem Jahr 1900.
Fakt
Solch einen Algorithmus gibt es nicht. Dies wurde von Yuri Matijasevič im Jahre
1970 bewiesen.
Folgerung
Es gibt Probleme, die mit keinem Computer gelöst werden können!
Zum Beispiel das Halteproblem oder das zehnte Hilbertsche Problem.
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Der intuitive Algorithmusbegriff (Wiederholung)
Ein Algorithmus ist eine „Berechnungsvorschrift“. Die Aufgabe, die der Algorithmus
lösen soll, wird durch eine Spezifikation festgelegt.
Die Berechnungsvorschrift wird durch einen endlichen Text kodiert.
Sie beschreibt die auszuführenden Berechnungen „hinreichend präzise“.
Die Berechnungen sind aus „elementaren“ Operationen aufgebaut und
besitzen Aus- und evtl. Eingabewerte.
Hierbei handelt es ich um eine sog. intuitive Definition. In der Informatik wird auch
eine formale Definition benötigt, zum Beispiel zum Nachweis, dass für ein
bestimmtes Problem kein Algorithmus existiert.
»Intuitiv heißt nicht erlernt.« (Bruce M. Hood)
31. März – 10. April 2015 | Werner Struckmann | Seite 23 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
1. Was ist ein Algorithmus?
2. Was ist ein Programm?
3. Wie wird ein Algorithmus aufgeschrieben?
4. Mit welchem Aufwand löst der Algorithmus das Problem?
5. Löst der Algorithmus das Problem?
6. Gibt es einen Algorithmus für das Problem?
7. Vom kleinen zum großen Programm
8. Weitere Aspekte
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Was ist ein Algorithmus? Wichtige Aspekte
s. oben: intuitiver Algorithmusbegriff
„intuitiv“ heißt „nicht erlernt“ (Bruce M. Hood)
Spezifikation
Terminierung
primitive und komplexe Datentypen, abstrakte Datentypen
Varianten des Algorithmusbegriffs:
deterministisch, determiniert, nichtdeterministisch,
randomisiert, parallel, verteilt, ...
31. März – 10. April 2015 | Werner Struckmann | Seite 25 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Was ist ein Programm?
Umsetzung eines Algorithmus in eine Sprache, die ein Computer versteht.
Sprachen:
Maschinensprachen
maschinenorientierte Sprachen (Assemblersprachen)
problemorientierte Sprachen
Verarbeitung von Programmen:
Compiler
Interpreter
Mischverfahren
Bestandteile einer Programmiersprache:
Lexik
Syntax
Semantik
Pragmatik einer Programmiersprache
31. März – 10. April 2015 | Werner Struckmann | Seite 26 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Java-Mischverfahren
Java-Quellprogramm
javac
Java-Bytecode
java
JVM: Windows
java
JVM: Linux
31. März – 10. April 2015 | Werner Struckmann | Seite 27 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Wie wird ein Algorithmus aufgeschrieben?
Paradigmen:
Imperatives Paradigma: Algol, Pascal, C
Objektorientiertes Paradigma: Smalltalk, Eiffel
Funktionales Paradigma: ML, Lisp, Haskell
Logisches Paradigma: Prolog
Hybride Paradigmen:
Imperativ und objektorientiert: Java, C++
Java 8 geht in die Richtung weiteres Paradigma: funktional
Imperativ und funktional: Scheme
Imperativ, objektorientiert und funktional: Scala
Deklaratives vs. prozedurales Paradigma
31. März – 10. April 2015 | Werner Struckmann | Seite 28 / 35
Vom Algorithmus zum Programm
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Mit welchem Aufwand löst der Algorithmus das Problem?
Komplexität
Laufzeitkomplexität, Speicherkomplexität
best case, average case, worst case Komplexität
Es gibt weitere Komplexitätsfragen!
O-Notation, Landau-Symbole
Θ(g) = {f : N −→ R | ∃c1 > 0, c2 > 0, n0 > 0 ∀n ≥ n0 . 0 ≤ c1 g(n) ≤ f (n) ≤ c2 g(n)}
O(g) = {f : N −→ R | ∃c > 0, n0 > 0 ∀n ≥ n0 . 0 ≤ f (n) ≤ cg(n)}
Ω(g) = {f : N −→ R | ∃c > 0, n0 > 0 ∀n ≥ n0 . 0 ≤ cg(n) ≤ f (n)}
o(g) = {f : N −→ R | ∀c > 0 ∃n0 > 0 ∀n ≥ n0 . 0 ≤ f (n) < cg(n)}
ω(g) = {f : N −→ R | ∀c > 0 ∃n0 > 0 ∀n ≥ n0 . 0 ≤ cg(n) < f (n)}
31. März – 10. April 2015 | Werner Struckmann | Seite 29 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Löst der Algorithmus das Problem?
Spezifikation
Korrektheit: partielle Korrektheit, totale Korrektheit
Verifikation: Nachweis der Korrektheit
Validation: Als Validierung bezeichnet man den Test eines Softwaresystems
unter Bedingungen, wie sie im späteren Einsatz herrschen werden. Auch
wenn das zu erstellende Programm verifiziert wurde, kann auf eine
Validierung nicht verzichtet werden, da ein mathematischer Nachweis der
Korrektheit beispielsweise nichts über das Laufzeitverhalten des Programms
oder die Auslastung von Ressourcen aussagt.
Gibt es einen Algorithmus, der alle Algorithmen verifizieren kann?
Der Satz von R ICE gibt viele konkrete Probleme an, die algorithmisch nicht
behandelt werden können.
31. März – 10. April 2015 | Werner Struckmann | Seite 30 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Gibt es einen Algorithmus für das Problem?
Berechenbarkeit, Entscheidbarkeit
Formale Algorithmendefinition
Turing-Maschine
Markov-Algorithmus
λ-Kalkül
Primitiv rekursive Funktionen
...
Diese Modelle sind alle äquivalent.
Beispiele: Halteproblem, diophantische Gleichungen, . . .
Abzählbar viele Probleme sind berechenbar.
Überabzählbar viele Probleme sind nicht berechenbar.
D. h., so gut wie kein Problem kann ein Computer lösen.
31. März – 10. April 2015 | Werner Struckmann | Seite 31 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Church’sche These
A LONZO C HURCH stellte 1936 die folgende These auf, die bis heute nicht widerlegt
wurde:
Church’sche These: Der intuitive Algorithmenbegriff
wird durch das Modell der Turing-Maschine adäquat definiert.
Die Church’sche These kann natürlich nicht bewiesen werden, da sie den intuitiven
Algorithmenbegriff verwendet. Über intuitive Dinge können keine formalen
Beweise geführt werden. Es wurde gezeigt, dass alle oben erwähnten formalen
Algorithmusdefinitionen äquivalent sind. Daher kann in der Church’schen These
die Turing-Maschine durch andere Definitionen des Algorithmus ersetzt werden.
31. März – 10. April 2015 | Werner Struckmann | Seite 32 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Vom kleinen zum großen Programm
Software Engineering Manifest (2006):
Das Software Engineering zielt auf die ingenieurmäßige Entwicklung, Wartung,
Anpassung und Weiterentwicklung großer Softwaresysteme unter Verwendung
bewährter systematischer Vorgehensweisen, Prinzipien, Methoden und
Werkzeuge.
Analysephase
Entwurfsphase
Implementierungsphase
Testphase
Betriebs- und Wartungsphase
31. März – 10. April 2015 | Werner Struckmann | Seite 33 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Weitere Aspekte (Beispiele)
Standardalgorithmen
Datenstrukturen, Typsysteme, abstrakte Datentypen
Prinzipien zum Entwurf von Algorithmen
Divide-and-Conquer-Algorithmen
Backtracking-Algorithmen
Greedy-Algorithmen
Dynamische Algorithmen, . . .
Variationen des Algorithmusbegriffs
Randomisierte Algorithmen
Nichtdeterministische Algorithmen
Parallele, verteilte Algorithmen, . . .
Sprachen der Informatik
GPL (General purpose languages): Programmiersprachen
DSL (Domain specific languages): Datenbanksprachen, HTML, XML, . . .
31. März – 10. April 2015 | Werner Struckmann | Seite 34 / 35
Kann ein Computer rechnen?
Ist das Programm korrekt?
Wiederholung: Algorithmusbegriff
Vom Algorithmus zum Programm
Herzlichen Dank für Ihre Aufmerksamkeit!
Viel Erfolg im Studium.
31. März – 10. April 2015 | Werner Struckmann | Seite 35 / 35