Jörg R. Mühlbacher

Günter Pilz

Marcel Widi †

Mathematik explorativ

2. Auflage

Ausgewählte Kapitel der Algebra, Zahlentheorie und Graphentheorie für Anwendungen in der Informatik

Impressum

Jörg R. Mühlbacher - Günter Pilz - Marcel Widi †

Mathematik explorativ

Ausgewählte Kapitel der Algebra, Zahlentheorie und Graphentheorie für Anwendungen in der Informatik

2. erweiterte und überarbeitete Auflage 2007

© 2007

Das Werk und seine Teile sind urheberrechtlich geschützt. Jede Verwertung in anderen als den gesetzlich zugelassenen Fällen bedarf der vorherigen Einwilligung von J. R. Mühlbacher.

Herstellung:

Kern: Johannes-Kepler-Universität Linz, A 4045 Linz-Auhof

Mit tiefer Betroffenheit informieren wir die Leser und Leserinnen dieses Buches, dass unser Mitarbeiter, Herr Dipl.-Ing. Marcel Widi am 27. März 2012 im 44. lebensjahr nach langer schwerer Krankheit von uns gegangen ist.

Vorwort zur 2. Auflage

Die erste Auflage dieses Buches war innerhalb kürzester Zeit vollständig vergriffen. In der zweiten Auflage ist eine Reihe von Fehlern behoben. Zusätzlich aber wurde der Text erweitert: das Thema kryptographische Hashfunktionen wurde vertieft und um den Code für den SHA1 Algorithmus ergänzt. Als neues Kapitel kam im theoretischen Teil ein Abschnitt über Verbände hinzu. Zwei Anwendungen davon werden ausführlich besprochen: Boole’scher Verband bzw. Schaltalgebra sowie die Modellierung von Zugriffskontrollen mittels eines Verbandes, ein Thema, das im Bereich Sicherheit von Computersystemen eine besondere Rolle spielt.

Auch wurde die dem Buch beigelegte CD-ROM um mehrere interaktive Programme erweitert und Kompatibilität mit der neuen JAVA 6 Version hergestellt.

Weitere Ergänzungen und notwendig werdende Korrekturen sind unter http://www.fim.at/mathe-explorativ abrufbar.

Linz, im September 2007

Jörg R. Mühlbacher

Günter Pilz

Marcel Widi †

Vorwort

Die Informatik als Ingenieurwissenschaft basiert letztlich immer auf mathematischen Grundlagen. Neben der Analysis sind für viele Anwendungen insbesondere Algebra, Zahlentheorie und Graphentheorie wichtig. Einer Auswahl von Themen aus diesen drei letztgenannten Fächern ist dieses Buch gewidmet. Zur Motivation, sich zu Beginn eines Studiums der Informatik mit der abstrakten mathematischen Welt auseinanderzusetzen, ist ein umfangreiches Kapitel mit ausgewählten Beispielen enthalten, denen Studierende im Laufe ihres Studiums in Fächern wie z. B. Algorithmen- und Datenstrukturen, Computergraphik, Kryptographie, Modellierung, Codierungstheorie und Computernetzwerke in nahezu jedem informatiknahen Curriculum begegnen. Naturgemäß kann eine solche Auswahl aber nur unvollständig bleiben. Der Text ist aus didaktischer Sicht gleichsam untrennbar mit einer Sammlung von JAVA-Applets auf der beigefügten CD-ROM verbunden. Mit dieser soll selbstgesteuertes exploratives Lernen gefördert werden, wobei – soweit es in Zahlentheorie und abstrakter Algebra möglich ist – auf die Kraft der Visualisierung und der Interaktion gesetzt wird.

Das Buch ist nicht nur als Begleitmaterial zu herkömmlichen Lehrveranstaltungen, sondern insbesondere für ein Studium im Rahmen von E-Learning gedacht, wobei in diesem Fall für die Gestaltung des Unterrichtes „Blended Learning“ als pädagogisches Modell empfohlen wird.

Aus technischer Sicht ist das Lernmaterial entsprechend der IMS Content Packaging Specification als CPS-Paket ausgelegt, sodass es auch online angeboten werden kann: Moderne E-Learning Plattformen wie WeLearn unterstützen dieses Format.

Angesprochen sind Studierende der Informatik (Bakkalaureat, Universitäten und Fachhochschulen), die im Rahmen der zugehörigen Mathematikausbildung je nach fachlichem Schwerpunkt ihres Studiums jedenfalls mit einem Großteil des vorgestellten Stoffes vertraut werden sollten. Da die Eingangsvoraussetzungen der Studierenden im Allgemeinen unterschiedlich sind und nicht immer eine Mathematikvorbildung im Umfang einer Matura (Abitur) vorausgesetzt werden kann, sind zur Erleichterung des Einstieges ein Kapitel über Mengen, Zahlen, Relationen und Funktionen sowie ein Kapitel über Analytische Geometrie vorgesehen.

Das Manuskript stammt aus einer Zusammenarbeit zwischen dem Institut für Algebra (Prof. Dr. Günter Pilz, Dipl. Ing. Marcel Widi) und dem Institut FIM unter Leitung von Prof. Dr. Jörg R. Mühlbacher. Herr M.Sc. Alexandros Paramythis (FIM) entwickelte das Framework, in das die Applets eingebettet sind, sodass eine gemeinsame Bedienungsoberfläche geschaffen wird. Zur Spezifikation und Implementierung der Applets haben neben Jörg R. Mühlbacher noch Bernhard Niedermayer, Markus Pfleger, Christian Praher und Peter Zehetner im Rahmen von Bakkalaureatsarbeiten mitgearbeitet.

Ein besonderer Dank gilt Frau Dr. Gisela Razen, die Teile des Manuskriptes kritisch gelesen und viele Anregungen eingebracht hat, Herrn Dipl.- Ing. Dr. Andreas Putzinger (FIM) für die Unterstützung beim Erstellen der CD-ROM sowie Frau Ingeborg Naderer für die Niederschrift des Manuskriptes. Ferner sei der Johannes Kepler Universität Linz (JKU) gedankt, von deren E-Learning Initiative das Projekt seinen Ausgang nahm und unterstützt wurde.

Diese E-Book Ausgabe für die diversen Formate ist nur durch das Engagement und die Mitarbeit von Frau Sabine Link möglich geworden. Wir haben alle den Aufwand für die Konvertierung der Ausgangsdokumente unterschätzt. Daher gebührt Frau Link besondere Anerkennung.

Laufende Updates zum Buch und zu den Applets sowie Errata können unter folgender URL eingesehen werden: http://www.fim.at/mathe-explorativ

Linz, im August 2006

Jörg R. Mühlbacher

Günter Pilz

Marcel Widi †

1. Mengen, Zahlen, Relationen und Funktionen

1.1. Mengen

Obwohl intuitiv klar ist, was man sich unter einer Menge vorstellt, ist die mathematisch exakte Definition alles andere als trivial und kann sogar zu Widersprüchen führen. Für den interessierten Leser mehr dazu am Ende dieses Kapitels. Zu Beginn die übliche Definition einer Menge:

Definition 1.1: (nach Georg Cantor, 1845-1918)

Eine Menge ist eine Zusammenfassung verschiedener „Objekte unserer Anschauung oder unseres Denkens“ (welche die Elemente der Menge genannt werden) zu einem „Ganzen“. Falls x ein Element der Menge A ist, so bezeichnen wir dies mittels x ∈ A, andernfalls schreiben wir x ∉ A.

Wie kann man Mengen nun angeben?

Dies geschieht mit „Mengenklammern“ { }:

1) Durch Aufzählen der Elemente; z.B. A = {a,b,3}.

2) Durch Angabe einer so genannten charakteristischen Eigenschaft E (mit der man für jedes x eindeutig entscheiden können muss, ob x ∈ A oder x ∉ A gilt); z.B.

A = {x | x ist ganzzahlige Lösung von x^2 – 5x + 6 = 0}.

3) (Spezialfall von 1) Durch Verwendung von Punkten, wenn klar ist, was gemeint sein soll; z.B. A = {2,4,6,…,100}.

Diese Schreibweise ist jedoch nicht eindeutig und sollte nach Möglichkeit vermieden werden, besser wäre in diesem Fall etwa: A = {x | ist eine gerade Zahl zwischen 1 und 100}

Die Reihenfolge der Elemente ist bei Mengen unwichtig, die Menge {1,2} und die Menge {2,1} sind gleich, da sie dieselben Objekte enthalten, formal:

Definition 1.2:

Zwei Mengen A, B heißen gleich (A = B), falls jedes Element von A auch Element von B ist, und umgekehrt. Andernfalls schreibt man A ≠ B.

Zusammenfassend halten wir fest: Bei Mengen

- kommt es also nicht auf die Reihenfolge der Elemente an

- werden mehrfach vorkommende Elemente nur einmal angeschrieben.

Es gilt also z.B. {a,b,3} = {b,3,a} = {a,a,a,b,3,b}.

Später wird näher auf wichtige Mengen eingegangen, wie etwa:

Ebenfalls wichtig sind:

= {x | x ist Primzahl} = {2,3,5,7,11,13,17,19,…}

= {x | x ist gerade Zahl} = {0,2,–2,4,–4,6,–6,…}

= {2n | n ∈ }

sowie die Intervalle für a,b ∈ mit a ≤ b:

[a,b] = {x ∈  | a ≤ x ≤ b} … abgeschlossenes Intervall

[a,b[ = {x ∈  | a ≤ x < b} … halboffenes Intervall

]a,b] = {x ∈  | a < x ≤ b} … halboffenes Intervall

]a,b[ = {x ∈  | a < x < b} … offenes Intervall

Intervalle der Gestalt:

[a,∞ [ = {x ∈ | x ≥ a} o.ä. (mit unendlich als linke untere und/oder obere rechte Grenze bzw. Grenzen ) heißen „uneigentliche Intervalle“, Ø = { } bezeichnet die leere Menge („Menge ohne Elemente“) (das Symbol für die leere Menge ist angelehnt an den griechischen Großbuchstaben Phi, Φ ). Man beachte, dass A = { Ø } nicht leer ist, denn A enthält in diesem Beispiel die leere Menge als Element!

Definition 1.3: Eine Menge A heißt Teilmenge einer Menge B, in Zeichen: A ⊆ B, falls jedes Element von A auch Element von B ist. Für A ⊆ B und A ≠ B schreibt man auch A ⊂ B (A heißt dann echte Teilmenge von B), statt A ⊆ B schreibt man auch B ⊇ A und sagt dann, B wäre eine Obermenge von A.

Offenbar gilt:

- A = B ist gleichbedeutend mit A ⊆ B und B ⊆ A

- Ø ⊆ A für jede Menge A

- ]a,b[⊂ ]a,b] ⊂ [a,b]

- ]a,a[ = Ø

Man kann neue Mengen aus bestehenden konstruieren:

Definition 1.4:

A, B, U seien Mengen mit A ⊆ U.

a) A ∩ B = {x | x ∈ A und x ∈ B} heißt Durchschnitt von A und B. Gilt A ∩ B = Ø, so heißen A und B disjunkt.

b) A ∪ B = {x | x ∈ A oder x ∈ B (oder beides)} heißt Vereinigung von A und B

c) A \ B (manchmal auch: A – B) = {x | x ∈ A und x ∉ B} heißt Differenz A minus B oder kurz „A ohne B“.

d) A Δ B = (A \ B) ∪ (B \ A) = {x | x ∈ A oder x ∈ B (aber nicht beides)} heißt die symmetrische Differenz von A und B, gesprochen „A delta B“

e) CU(A) = U \ A heißt Komplement von A in U (meist ist hier U eine übergeordnete Gesamtmenge, U heißt dann ein Universum).

Folgende Aussagen sind trivial:

Satz 1.1:

- A ∩ B  ⊆  A  ⊆  A ∪ B

- A \ B  ⊆  A

- A Δ B = (A ∪ B)  \  (A ∩ B)

- A ⊆ B ist gleichbedeutend mit A ∩ B = A, dies wieder mit A ∪ B = B

Obige Beziehungen können etwa durch so genannte Euler-Venn-Diagramme veranschaulicht und bewiesen werden:

Abb. 1.1

Ebenfalls mittels Euler-Venn Diagrammen lässt sich der nächste Satz beweisen, obwohl die Tatsache, dass diese Diagramme „beweiskräftig“ sind, einiges mehr an Theorie erfordert.

Satz 1.2:

Für Mengen A, B, C gelten die Kommutativgesetze: A ∩ B = B ∩ A;  A ∪ B = B ∪A;  A Δ B = B Δ A

und auch die Assoziativgesetze (A∩B) ∩C = A∩ (B∩C);  A∪ (B∪C) = (A∪B) ∪C;  A Δ (BΔC) = (AΔB) Δ C

sowie die Distributivgesetze A ∪ (B∩C) = (A∪B) ∩ (A∪C);  A ∩ (B∪C) = (A∩B) ∪ (A∩C); A ∩ (BΔC) = (A∩B) Δ (A∩C)

die Idempotenzgesetze A ∪ A = A;  A ∩ A = A

und die Verschmelzungsgesetze A ∩ (A∪B) = A = A ∪ (A∩B)

Für die Komplementbildung gilt

Satz 1.3: Seien A, B Teilmengen von U. Dann gilt

a) A ∩ CU(A) = Ø; A ∪ CU(A) = U

b) CU(A∩B) = CU(A) ∪ CU(B);    (Gesetze von

CU(A∪B) = CU(A) ∩ CU(B)      De Morgan)

c) CU(CU(A)) = A .

Für Vereinigung / Durchschnitt mehrerer Mengen ist folgende Notation hilfreich, ähnlich wie das Σ - Symbol für mehrere „+“ Zeichen verwendet wird:

Definition 1.5: I sei eine Menge und für jedes i ∈ I sei Ai eine Menge.

Beispiele:

Unter anderem für die Vektorrechnung wichtig sind geordnete Paare, etwa (3, 7). Anders als bei Mengen ist die Reihenfolge hier aber wichtig, wenn (3,7) ≠ (7,3) sein soll.

Die formale Definition eines geordneten Paares ist überraschend kompliziert:

Definition 1.6:

Seien A und B Mengen und a ∈ A, b ∈ B. Die Menge {a, {a,b}}, abgekürzt durch (a,b), heißt das geordnete Paar a,b. Weiters sei A×B = {(a,b) | a ∈ A, b ∈ B}.

A×B heißt das (kartesische) Produkt der Mengen A und B.

Für A×A schreibt man kurz A^2.

Manchmal, zB in der Graphentheorie, wo mit geordneten Paaren (a,b) eine „Kante“ vom Knoten a zu einem Knoten b gemeint ist, schreibt man auch <a,b> anstatt (a,b).

Man schreibt für (A×B)×C oft auch kurz A×B×C . Die Notation A^3,A^4, … ist nun für Mengen definiert und jetzt kann man 2 mit der „Ebene“ und 3 mit dem „Raum“ unserer Anschauung identifizieren.

Ein Element (a,b,c) ∈ A×B×C heißt auch Tripel, ein (a_1,a_2,…,an) ∈ A1/×A_2×…×An heißt kurz ein n-Tupel. Die Kurzschreibweise dafür ist folgende:

A^1 wird mit A identifiziert.

Beispiele:

{a,b,c} × {1,2} = {(a,1),(a,2),(b,1),(b,2),(c,1),(c,2)}

{0,1}3 = {(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1)}.

Die Menge aller Teilmengen einer Menge nennt man Potenzmenge:

Definition 1.7:

A sei eine Menge. Die Menge aller Teilmengen von A heißt die Potenzmenge von A und wird mit P(A) oder 2A abgekürzt.

Beispiel:

P({1,2,3}) = {Ø, {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}}.

Die Potenzmenge dieser dreielementigen Menge hat also 2^3 Elemente, daher auch die Bezeichnung 2A für die Potenzmenge.

Für den interessierten Leser sei jetzt noch kurz auf die zu Beginn dieses Kapitels erwähnten Widersprüche in der Mengenlehre eingegangen:

Beispiel (Russel’sches Paradoxon, nach Bertrand Russel, 1872-1970):

A sei die zweielementige Menge, bestehend aus der Zahl 1 und der (wieder) zweielementigen Menge, die aus 1 und der zweielementigen …besteht, kurz A = {1, {1, {1,…}}}.

Ist A eine Menge? Wenn ja, wurde sie nach keiner der drei erwähnten Methoden angegeben, und sie erfüllt die „Mengengleichung“ A = {1,A}. Somit gilt A ∈ A. Solche Mengen seien als „böse“ bezeichnet, da sie sich selber als Element enthalten.

M sei nun die Menge der „braven“ Mengen, also die Mengen, die sich selbst nicht als Elemente enthalten, formal:

M = {X | X ist Menge mit X ∉ X}.

Jetzt stellt man die Frage: Ist M „brav“?

Fall 1.   M ist brav. Dann gilt M ∉ M; M erfüllt daher die „Qualifikation“, in M zu liegen. Also gilt M ∈ M und M ist bös.

Fall 2.   M ist bös, also M ∈ M. Dann muss M die charakteristische Eigenschaft von M erfüllen, also muss M ∉ M gelten. M ist also brav.

Man erhält also einen Widerspruch, egal ob M „brav“ oder „böse“ ist. Die Entscheidungsfrage „Ist M brav?“ bzw. „Enthält sich M selbst als Element?“ ist nicht entscheidbar!

Dieses Paradoxon ist äquivalent zum berühmten Barbier, der (genau) alle diejenigen rasiert, die sich nicht selbst rasieren. Dieses Dilemma heißt das Russel'sche Paradoxon. Der Name „Paradoxon“ ist aber eigentlich zu harmlos gewählt. Es ist einer der fundamentalen Widersprüche in der Mathematik (und in der Logik, damit in jeder Wissenschaft!). Lösungsansätze für diesen Widerspruch gibt es nur mit viel mehr Mathematik, etwa der Theorie der „Klassen“ in der Algebra.

1.2 Natürliche Zahlen

Wir beginnen mit der Wiederholung und Einführung von Schreibweisen von in der Zahlentheorie üblichen Sprechweisen.

Die Zahlen 1,2,3,... heißen natürliche Zahlen und wir bezeichnen die Menge der natürlichen Zahlen mit = {1,2,...}.

Will man die ganze Zahl 0 dazunehmen, so schreiben wir 0 = {0,1,2,...}.

Es soll darauf hingewiesen werden, dass in manchen Lehrbüchern bzw. unter dem Einfluss der Informatik von dieser seit alters her verwendeten Bezeichnung abgegangen wird und „per definitionem“ die Null den natürlichen Zahlen hinzugerechnet wird, also = {0,1,2,...}. Dann wird das Symbol + (oder x) gesondert für {1,2,...} verwendet und es ist dann = {0} ∪+ . Wir wollen aber bei der eingeführten Bezeichnung bleiben.

Man kann die natürlichen Zahlen  einfach als a priori vorgegeben annehmen, da Zählen und Abzählen einen praktischen Ursprung haben.

In der modernen Mathematik ist es jedoch zweckmäßig, die natürlichen Zahlen  über ein System von Axiomen einzuführen.

Axiome sind zueinander widerspruchsfreie Aussagen und Sätze, die als gültig angenommen werden und aus denen sich alle anderen Sätze der Theorie durch logisches Schließen ableiten lassen.

Für die Menge der natürlichen Zahlen  hat der italienische Mathematiker Giuseppe Peano (1858 – 1932) ein solches Axiomensystem angegeben:

Peano’sche Axiome

P1: 1 ist eine natürliche Zahl.

P2: Jede natürliche Zahl n besitzt einen Nachfolger n+

P3: Es gibt keine natürliche Zahl n mit n+=1, d.h. 1 ist nicht Nachfolger einer natürlichen Zahl.

P4: Gilt für zwei natürliche Zahlen n, m die Beziehung n+= m+, so ist n = m. D.h.: verschiedene natürliche Zahlen haben verschiedene Nachfolger.

P5: Man erhält von 1 ausgehend durch Bildung der Nachfolger alle natürlichen Zahlen.

Erklärt man einen Nachfolger als „größer“ als seinen Vorgänger, so kann man aus diesen Axiomen ableiten, dass 1 die kleinste natürliche Zahl ist. Ebenso lässt sich zeigen, dass es keine größte natürliche Zahl gibt.

Es ist eine Frage des verwendeten Alphabetes und Zahlensystems, wie der Nachfolger n+einer natürlichen Zahl n angeschrieben wird. Wir verwenden 1+ = 2, 2+ = 3, ..., 9+ = 10, usw.

Genauso gut, aber nicht so handlich, kann man schreiben I+ = II, II+ = III, ..., IX+ = X, usw.

Das Axiom P5 bildet die Grundlage des Prinzips der vollständigen Induktion, das in der Prädikatenlogik eingeführt worden ist.

Dort heißt es:

Vollständige Induktion

Um zu beweisen, dass ∀ n ∈ das Prädikat P(n) gilt, geht man wie folgt vor.

1. Induktionsanfang: Zeige, dass P(1) gilt.

2. Induktionsannahme: Nimm an, dass P(n) für ein beliebiges n = k ∈ gilt.

3. Induktionsschluss: Zeige unter Verwendung der Induktionsannahme, dass P(k+1) gilt.

Als erste Übungsaufgabe beweisen wir folgende Formel für natürliche Zahlen (Summenformel)

1. Induktionsanfang:

Zu zeigen ist, dass für n = 1 die Formel richtig ist, also P(1) wahr ist. Dies ergibt sich durch Ausrechnen:

2. Induktionsannahme:

Wir nehmen an, dass P(n) für n = k richtig ist.

3. Induktionsschluss (auch: Induktionsschritt):

Unter Verwendung der Induktionsannahme ist zu zeigen, dass die Formel auch für

n = k + 1 gilt, d.h. dass P(k + 1) =

Dies zeigen wir durch Umformung unter Verwendung der Induktionsannahme:

1 + 2 + ... + k + (k + 1) = (laut Annahme)

=

Als nächste Übungsaufgabe beweisen wir mittels vollständiger Induktion folgende Aussage bzw. Formel:

Für alle n ∈ gilt: Die Summe der ersten n ungeraden natürlichen Zahlen ist gleich n^2, also

1. Induktionsanfang:

Die Formel ist trivialerweise richtig für n = 1

2. Induktionsannahme:

Wir nehmen an, dass die Formel für n = k gilt, dass also

1 + 3 + ... + (2 · k –1) = k^2.

3. Induktionsschluss:

Es ist zu zeigen, dass die Formel auch für n = k + 1 gilt, d.h. dass

1 + 3 + ... + (2 · k – 1) + (2 · k + 1) = (k + 1)2 gilt.

Dies zeigen wir wiederum unter Verwendung der Induktionsannahme:

1 + 3 + ... + (2 · k –1) + (2 · k + 1) = k2 + (2 · k + 1) = (k + 1)2

1.3. Ganze Zahlen

Die Addition und Multiplikation von natürlichen Zahlen ist uns vertraut. Die Division wirft ein besonderes Problem auf und wir kommen später darauf zurück. Wie steht es aber mit der Subtraktion? 7 – 3 = 4 ist wieder eine natürliche Zahl, nicht aber 3 – 7 = –4.

Daher bietet sich eine Erweiterung von auf die Menge der ganzen Zahlen an:

= {... –5, –4, –3, –2, –1, 0, 1, 2, 3, 4, 5 ...}

Nun können wir die uns vertrauten Rechenregeln für Zahlen a ∈ in formalen Regeln zusammenfassen.

Additionsregeln

In gibt es eine Addition, „+“ : c = a + b

Für alle a,b,c ∈  gilt:

A1 (a + b) + c = a + (b + c) Assoziativgesetz

A2 a + b = b + a Kommutativgesetz

A3 zu jedem Paar a, b ∈  gibt es genau ein x ∈ mit x + b = a

Hinweis: Genau die letzte Regel A3 gilt in  nicht.

Statt x + b = a schreibt man auch x = a – b („Subtraktion“).

Im Kapitel über algebraische Strukturen wird erläutert, dass  bezüglich der Addition eine abelsche (d.h.: kommutative) Gruppe bildet.

Aus der Regel A3 leitet man auch die Sonderstellung der Zahl 0 ab: a + 0 = 0 + a = a.

Allgemein heißt in einer Gruppe ein Element mit dieser Eigenschaft neutrales Element. Das neutrale Element bezüglich der Addition wird oft auch als Nullelement bezeichnet.

Weiters folgt aus der Regel A3, dass es zu jedem a ∈  ein „–a“ ∈  gibt, sodass a + (–a) = (–a) + a = 0. Ein solches –a heißt zu a inverses Element.

Multiplikationsregeln

In  gibt es eine Multiplikation, „·“ : c = a · b

Für alle a,b,c ∈ gilt

M1 (a · b) · c = a · (b · c) Assoziativgesetz

M2 a · b = b · a Kommutativgesetz

M3 (a + b) · c = (a · c) + (b · c) Distributivgesetz

M4 1 · a = a · 1 = a Existenz eines neutralen Elements bzgl. der Multiplikation („Einselement“)

Es ist üblich, statt a · b kurz ab zu schreiben. In Programmiersprachen wiederum nimmt man „* “ als Multiplikationszeichen.

Im Kapitel über algebraische Strukturen wird erläutert, dass Z betreffend Addition und Multiplikation einen kommutativen nullteilerfreien Ring mit Einselement (kurz: Integritätsbereich) bildet.

Definition 1.8: Ein Nullteiler ist ein vom Nullelement verschiedenes Element a, für das es ein Element b ≠ 0 gibt, sodass ab = 0. Ein Ring ohne Nullteiler heißt nullteilerfrei.

Z ist nullteilerfrei, denn sind a, b ∈ Z und gilt a · b = 0, so gilt entweder a = 0, oder b = 0, oder a = b = 0

Beim ersten Hinsehen scheint die Forderung nach Nullteilerfreiheit eine selbstverständliche Sache zu sein und beim Rechnen mit Zahlen sind wir nichts anderes gewöhnt. Wir werden aber später z.B. beim Rechnen mit Restklassen oder Matrizen solchen Nullteilern begegnen und genauer definieren. Für Neugierige sei ein kleines Beispiel in JAVA-Notation vorweggenommen:

Beispiel:

int a = 2; int b = 3; int c;

c = (a * b) % 6; // es ist c = 0

Beispiel:

Wer an dieser Stelle bereits mit den Regeln für Matrizenmultiplikation vertraut ist, kann nachrechnen, dass das Produkt C = A · B der beiden von der Nullmatrix verschiedenen Matrizen A und B

die Nullmatrix liefert, A und B also Nullteiler sind.

Da wir wissen, dass  nullteilerfrei ist, kann man die Kürzungsregel aus den eingeführten Rechenregeln und den Peano-Axiomen ableiten.

Kürzungsregel

Seien a, b ∈  und a · b = a · c mit a ≠ 0. Dann kann man „kürzen“ und es ist b = c.

Man leitet diese Regel einfach wie folgt ab:

a · b = a · c ⇒ a · b – a · c = 0 ⇒ a · (b – c) = 0.

Und wegen a ≠ 0 und der Nullteilerfreiheit folgt b – c = 0 und damit b = c.

Schließlich brauchen wir z.B. für das Sortieren von Teilmengen von  oder den Vergleich von Zahlen die

Regeln für die Ordnung

O1: für zwei Zahlen a, b ∈ gilt genau eine der drei Beziehungen: a < b, a = b oder b < a . ( ist eine durch „<“ geordnete Menge)

O2: ist a < b und b < c, so gilt a < c (Transitivitätsgesetz)

Als nächstes führen wir den Absolutbetrag | n | einer ganzen Zahl n ein und definieren:

Definition 1.9:

Es gelten dazu folgende Rechenregeln:

Rechenregeln für den Absolutbetrag

AB1:  | n · m | = | n | · | m |

AB2:  | n + m | ≤ | n | + | m |       (1. Dreiecksungleichung)

AB3:  | n – m | ≤ | n | + | m |

AB4:  || n | – | m || ≤ | n – m |     (2. Dreiecksungleichung)

Wir wenden uns nun der Division zu, ohne den Zahlenbereich  zu verlassen, betrachten also die ganzzahlige Division. Dividiert man 14 durch 5, so erhalten wir 2 und den Rest 4, also 14 = 2 · 5 + 4. Bei –14 erhält man –14 = –3 · 5 + 1. Diese Darstellung ist allgemein und es gilt folgender

Satz 1.4: Zu jedem a ∈  und b ∈  gibt es eindeutig bestimmte ganze Zahlen q, r, sodass a = b · q + r mit 0 ≤ r < b.

Man nennt q den Quotienten und r den Rest der Division von a durch b.

Beweis: Für a = 0 ist die Aussage trivial, ebenso für a = b.

Ist 0 < a < b, so gilt mit q = 0 und r = a die Beziehung a = b · 0 + a. Ist 0 < b < a, so wählen wir die größte Zahl q ≥ 0, für die bq ≤ a gilt.Dann ist b(q + 1) = bq + b > a. Zusammen gilt 0 ≤ a – bq < b und q ist die gesuchte Zahl. Als Rest r wählt man r = a – bq. Ist a < 0, dann ist –a ∈ . Nach dem Vorigen gilt –a = bq’ + r’ mit 0 ≤ r’ < b. Das ergibt a = b(–q’) + (–r’). Für r’ = 0 sind wir fertig. Für r’ > 0 bilden wir a = b(–q’) – b + b – r’ = b(–q’ – 1) + b – r’ und setzen q = –q’ – 1 und r = b – r’. Also ist a = bq + r und wegen 1 ≤ r’ < b gilt 0 < r = b – r’ < b. Somit bleibt noch zu zeigen, dass q und r eindeutig bestimmt sind. Angenommen, es gibt zwei solcher Darstellungen a = q_1b + r_1 = q_2b + r_2.

Wir erhalten r_2 – r_1 = q_1b – q_2b = b(q_1 – q_2) und somit (q_1 – q_2) =

Aus den Ungleichungen 0 ≤ r_1 < b und 0 ≤ r_2 < b folgt – b < r_2 – r_1 < b und somit

Da aber  , muss notwendigerweise gelten und damit folgt r_2 = r_1 und hieraus q_1 = q_2.

Der Spezialfall von a = b · q + r mit r = 0 führt zu den Begriffen Teiler und Teilbarkeit von ganzen Zahlen.

Definition 1.10: Die ganze Zahl b ≠ 0 teilt die ganze Zahl a, kurz: b / a, wenn es eine ganze Zahl q gibt, sodass a = b · q. Die Zahl b heißt dann Teiler von a und q heißt komplementärer Teiler. Wenn b die Zahl a nicht teilt, schreibt man b∤ a.

Da mit jedem Teiler b von a auch – b ein Teiler von a ist, kann man sich bei Untersuchungen von Teilereigenschaften i.A. auf  beschränken.

Es gelten folgende Rechenregeln:

Rechenregeln für Teiler

T1 b / a ⇒ b / a · c

denn b / a ⇒ a = bq ⇒ ac = bqc = bq_1 ⇒ b / ac

T2 c / b und b / a ⇒ c / a

denn c / b ⇒ cq_1 = b, b / a ⇒ bq_2 = a, also a = bq_2 = cq_1q_2 = cq_3 ⇒ c / a

T3 b / a und b / c ⇒ b / (ka + sc) für k, s ∈

wegen a = bq_1 und c = bq_2 ist (ka + sc) = (kbq_1 + sbq_2) = b (kq_1 + sq_2) = bq_3 ⇒ b / (ka + sc)

T4 b / a und a / b ⇒ | a | = | b |

aus a = bq_1 und b = aq_2 erhält man durch Einsetzen a = aq_2q_1 und damit entweder q_1 = q_2 = 1 oder q_1 = q_2 = –1. Somit gilt a = b oder a = –b, und daher | a | = | b |

T5 Ist k ∈  mit k ≠ 0, so gilt b / a ⇒ kb / ka und kb / ka ⇒ b / a.

Dies erhält man wieder durch direktes Ausrechnen.

Die Anzahl der Teiler einer Zahl ist endlich und daher gibt es in der Menge der Teiler einen größten. Später werden wir uns mit der Frage auseinandersetzen, ob zwei Zahlen a,b ∈ neben 1 weitere gemeinsame Teiler haben und dann den größten gemeinsamen davon bestimmen: ggT(a,b). Um alle Teiler einer Zahl a zu erhalten, genügt es nur bis √a zu probieren, wie folgende einfache Abschätzung zeigt:

Es gelte b / a, also a = bq. Mit dem Teiler b ist der komplementäre Teiler q eindeutig bestimmt. Sei b ≤ q. Dann ist a = bq ≥ bb = b^2 ⇒ b ≤ √a . Für den komplementären Teiler q gilt a = bq ≤ q^2 ⇒ q √a . D.h. mit dem Bestimmen aller Teiler b ≤ √a erhält man wegen a = b · q und q ≥ √a auch alle komplementären.

Bemerkung

Wir geben an dieser Stelle folgenden Hinweis zur Schreibweise: mit Blick auf Programmiersprachen findet man einen Bruch häufig als a/b notiert. Z.B schreibt man a+ b/c, und 4+ b/3 etc., um Platz zu sparen. Wir werden manchmal davon Gebrauch machen, wenn aus dem Zusammenhang klar ist, was gemeint ist. Der Divisionsoperator „/“ hat in einer Programmiersprache also eine andere Funktion als im Zusammenhang mit der Teilbarkeit.

1.4. Rationale Zahlen

Aus dem Satz über die Darstellung von Zahlen a ∈   mit a = bq + r und 0 ≤ r < b erkennen wir, dass, wenn der Rest r > 0 ist, die Division von zwei ganzen Zahlen keine ganze Zahl ergibt. Dies bedeutet, dass  bezüglich der Division nicht „abgeschlossen“ ist.

Will man eine Gleichung der Gestalt b · x = a aber auch dann lösen, wenn b∤ a, so führt dies zu den so genannten rationalen Zahlen .

Aus b · x = a folgt in bekannter Schreibweise  Wir definieren daher die Menge der „rationalen Zahlen“  als die Menge aller „Brüche“ , mit a, b ∈ und b ≠ 0.

Man erkennt, dass  eine unmittelbare Erweiterung von  ist, wenn man als Spezialfall b = 1 setzt: . Man bezeichnet daher  auch als Menge der „ganzen rationalen Zahlen“. Auch sieht man leicht, dass es zu jeder Zahl q ∈ \ {0} eine „inverse“ Zahl q-1 gibt, für die q · q-1 = 1 gilt.

Weiters können die bekannten Grundrechnungsarten übernommen werden und ebenso kann man die Potenzrechnung mit folgender Vereinbarung einführen:

Definition 1.11 / Satz:

an = a · a · ... · a, (a tritt n mal als Faktor auf, n ∈0, mit a^0 := 1)

und es gilt an · am = an+m

Als Verallgemeinerung zu   vereinbart man als Schreibweise für  kurz a-n.

Demnach gilt für a ≠ 0 die Rechenregel

Rechenregeln für Brüche

Sind zwei rationale Zahlen  und  in Bruchdarstellung gegeben, so erhalten wir als Rechenregeln

Bei der Bruchdarstellung r =  nimmt man häufig an, dass a und b zueinander teilerfremd (man sagt auch relativ prim) sind, d.h. keinen gemeinsamen Teiler außer ±1 haben: man kürzt  durch gemeinsame Teiler, bis nur mehr ±1 gemeinsamer Teiler ist.

Es stellt sich eine weitere Frage: wie dicht liegen zwei rationale Zahlen r =  und  beieinander? (Also: „Wie klein ist der kleinste Abstand zweier Brüche?“)

Man denke sich r und q auf der Zahlengeraden aufgetragen und überlege, wie klein | q – r | werden kann. Es sei o.B.d.A q > r.

Abb. 1.2

Wir konstruieren eine Zahl s, mit r < s < q wie folgt: s liegt „in der Mitte von r und q“:

Also ist s wieder eine rationale Zahl.

Wegen q – r > 0 folgt s > r. Wegen q > r gilt weiters  also s < q.

Da r und q beliebig gewählt wurden, erkennen wir:

So klein der Abstand zwischen r und q auch sein mag, es gibt immer eine weitere rationale Zahl s, die dazwischen liegt. Man sagt, die rationalen Zahlen  liegen dicht auf der Zahlengeraden .

Zu unserer Überraschung werden wir aber feststellen, dass es noch weitere Zahlen gibt, die „irrationalen“ Zahlen, die auf der Zahlengeraden Platz haben – ja nicht nur Platz haben, sondern, wie sich zeigen lässt, fast die gesamte Zahlengerade für sich in Anspruch nehmen! Dies führt uns zu den reellen Zahlen , die die Menge  als echte Teilmenge enthalten.

1.5. Reelle Zahlen

Betrachten wir ein rechtwinkeliges Dreieck, dessen Katheten die Seitenlänge 1 haben.

Abb. 1.3.

Aus dem Satz von Pythagoras können wir die Hypotenuse c berechnen:

c^2 = a^2 + b^2 ⇒ c = √2 .

Die Größe √2 existiert also real und man fragt sich, ob √2 eine rationale (lat.: ratio = Vernunft) Zahl ist, also ob √2 darstellbar ist in der Gestalt  .

Dies ist nicht der Fall, wie wir gleich zeigen werden.

√2 ist eine irrationale Zahl und liefert einen Grund, die Menge um die Menge  der irrationalen Zahlen zu erweitern: man erhält damit die Menge der reellen Zahlen . Dass  auf der Zahlengeraden liegt, erkennt man aus der nachfolgenden Zeichnung, in der ein Quadrat der Seitenlänge 1 längs ihrer Diagonale auf die Zahlengerade gelegt wird.

Abb. 1.4.

Der Beweis ist überraschend einfach und es lohnt sich, ihn durchzudenken:

Satz 1.5: Die Zahl √2 ist keine rationale Zahl, √2 ist irrational.

Beweis: Angenommen, √2 ∈ . Dann gäbe es eine Darstellung

wobei a und b relativ prim zu einander sind, also keinen gemeinsamen Teiler außer 1 haben. Wir erhalten durch Quadrieren auf beiden Seiten die Beziehung a^2 = 2b^2, woraus folgt, dass a^2 eine gerade Zahl und somit auch a gerade ist.

Also: a = 2r ⇒ a^2 = 4r^2 ⇒ 4r^2 = 2b^2 ⇒ 2r^2 = b^2.

Demnach muss auch b² und damit auch b eine gerade Zahl, also b = 2s sein.

Wenn aber a und b beide gerade sind, kann man sie durch 2 kürzen, sie sind also nicht teilerfremd (relativ prim), was ein Widerspruch zur Voraussetzung ist. Also ist √2 irrational.

Die Entdeckung, dass √2 irrational ist, geht auf Pythagoras von Samos (6. Jhdt. v. Chr.) bzw. einen seiner Schüler zurück und löste allergrößte Irritation aus. Der Legende nach soll der Entdecker dieser Erkenntnis deshalb ins Meer geworfen worden sein. Man beachte dazu, dass irrational als Gegenstück zu rational eigentlich „unvernünftig“ bedeutet.

Neben der Eulerschen Zahl e und der Kreiszahl π gehören auch alle Zahlen der Gestalt

zu den irrationalen Zahlen, wenn n ≥ 2 und p_1, p_2, ... , pr mit r > 0 verschiedene Primzahlen sowie m_1, m_2, ..., mr beliebige positive ganze Zahlen sind und für mindestens ein mi gilt n∤mi

Insbesondere sind demnach √3 , √5 , √7 , √11 ... irrational.

Es geht noch „irrationaler“: Der Vollständigkeit halber erwähnen wir noch, dass, anders als etwa √2 , e und π nicht nur irrational sind, sondern darüber hinaus nie die Lösung einer algebraischen Gleichung der Gestalt xn + cn-1 xn-1 + cn-2 xn-2 + ... + c_0 = 0 sein können. Solche Zahlen nennt man transzendent.

Man beachte, dass n√p , p prim, zwar irrational aber nicht transzendent ist!

Es gilt z.B. mit x = 2√2 die Beziehung x^2 – 2 = 0.

1.6. Komplexe Zahlen

Wir gehen vom Wunsch aus, die einfache Gleichung x^2 + 1 = 0 lösen zu wollen. Durch Umformen erhalten wir x = √-1 und damit haben wir ein Problem: √-1  hat zunächst keinen Sinn: √a  ist nur für positive Zahlen definiert und demnach ist √-a  für positives a keine reelle Zahl.

Man hilft sich hier durch einen Kunstgriff, eine Zusatzdefinition, die es erlaubt, solche komplexen Zahlen wie √-1  zwar nicht auf der Zahlengeraden, wohl aber in der Zahlenebene darzustellen.

Man schreibt für eine komplexe Zahl z = x + i y und definiert i durch i^2 = –1.

Damit besteht z aus einem Realteil x und einem Imaginärteil y und lässt sich in der Ebene als Punkt wie folgt einzeichnen.

Abb. 1.5.

Demnach interpretiert man eine komplexe Zahl z = x + i y als Paar von reellen Zahlen x,y und bildet zu z = x + i y auch noch die konjugiert komplexe Zahl  = x – i y (die „Spiegelung an der (reellen) x-Achse“).

So wie man den Absolutbetrag | x | einer reellen Zahl eingeführt hat, versteht man nun unter dem Absolutbetrag | z | einer komplexen Zahl die Entfernung des Punktes z zum Ursprung 0, also

womit auch schon ein Übergang zur Vektorrechnung angedeutet ist, denn | z | entspricht der Länge der gerichteten Strecke vom Ursprung 0 zum in der Ebene eingezeichneten „Punkt P mit den Koordinaten (x, y)”.

Die komplexe Zahl z, ihre konjugiert komplexe  und der Absolutbetrag | z | stehen – was aus der Zeichnung auch anschaulich ablesbar ist – in einem einfachen Zusammenhang: z  = | z |2 ,

denn z  = (x + i y) (x – i y) = x^2 + i xy – i xy – i²y^2 = x^2 + y^2.

Die Additionsregel und Multiplikationsregel sind einfach und ebenso anschaulich ableitbar:

z_1 = x + i y; z_2 = u + i v

z_1 + z_2 = (x + i y) + (u + i v) = (x + u ) + i (y + v)

z_1 z_2 = (x + i y) (u + i v) = xu + i xv + i yu + i^2yv = (xu – yv) + i (xv + yu)

Die Division ist etwas aufwändiger, denn das Resultat  muss wieder als Tupel zweier reellen Zahlen darstellbar sein, d.h. der Nenner muss als reelle Zahl darstellbar sein. Dazu verwenden wir die Beziehung z  = | z |2 und erweitern den Nenner entsprechend:

+ = („reell Machen“ des Nenners)=

Versteht man z = x + i y als Punkt in der Zahlenebene mit den „Koordinaten“ x,y, so kann man z auch anders beschreiben: man misst den Winkel φ der Strecke r = | z | vom Ursprung O, wie nachstehende Abbildung zeigt:

Abb. 1.6.

Damit erhält man die Polar(koordinaten)darstellung von z ≠ 0.

z = r cos φ + i r sin φ = r (cos φ + i sin φ).

Man hat dabei zu beachten, dass diese Darstellung von z nicht eindeutig ist, da sich durch Addition von Vielfachen von π am Wert des Winkels nichts ändert. Daher schränkt man ein auf –π < φ ≤ π , manchmal auch 0 ≤ φ < 2π und nennt den dadurch bestimmten Winkel φ das Hauptargument in der Polarkoordinatendarstellung.

Das Interessante an den komplexen Zahlen  ist u.a., dass wir damit einen Bezug zu Rechenaufgaben in der Geometrie herstellen können, wenn dort Strecken und deren Winkel untereinander gegeben sind.

Weitere Anwendungen in der Praxis finden komplexe Zahlen etwa in der Elektrotechnik oder der Astronomie.

1.7. Zahlendarstellung in digitalen Rechenanlagen

1.7.1. Darstellung von ganzen Zahlen

Ausgangspunkt aller Überlegungen ist der Satz über die eindeutige Darstellung von natürlichen Zahlen a ∈ mittels einer Basis b ≥ 2.

Satz 1.6 (b-adische Darstellung):

Sei b ∈ mit b ≥ 2. Dann lässt sich jede natürliche Zahl a > 0 eindeutig darstellen in der Gestalt

Für die obige Darstellung schreibt man kurz (an-1 an-2 …a_1a_0)b. Wegen der in der Informatik üblichen Nummerierung der Bits von dn-1 (most significant) bis d_0 (least significant) wurde der Laufindex i entsprechend angepasst. Die ai heißen Ziffern. Ganze Zahlen nennt man in der Informatik „vom Typ integer“.

Beispiel:

405_10 = 4 · 10^2 + 0 · 10^1 + 5 · 10^0 = 6 · 8^2 + 2 · 8^1 + 5 · 8^0 = 625_8 =

= 1 · 2^8 + 1 · 2^7 + 0 · 2^6 + 0 · 2^5 + 1 · 2^4 + 0 · 2^3 + 1 · 2^2 + 0 · 2^1 + 1 · 2^0 =

= 110010101_2 = 1 · 16^2 + 9 · 16^1 + 5 · 16^0 = 195_16.

Beim binären System kommt man mit den Ziffern {0,1} aus, bei der Basis 8 mit {0,1,…,7} und bei der Basis 16 (Hexadezimalsystem) ist es üblich, die Ziffern {0,1,2,…9,A,B,C,D,E,F} zu verwenden: 179_10 = B3_16.

Um eine Zahl x > 0 zur Basis b in obigem Stellenwertsystem darzustellen, benötigt man 1 + logb x Ziffern, wobei mit u die nächst kleinere ganze Zahl zu u ∈ bezeichnet wird.

Die Überlegung ist wie folgt:

Es gilt für die darzustellende Zahl x = bn-1 bn-2 … b_0 die Ungleichung bn-1 ≤ x bn.

Daher: n - 1 ≤ logb x und n > logb x

logb x n ≤ logb x + 1 und da n ganzzahlig ist, erhält man

logb x + 1 ≤ n ≤ logb x + 1

Beispiel:

4753_10 → n   = 1 + log_10 4753   = 1 + 3,67.. = 4

28CF_16 → n  = 1 + log_16 28CF  = 1 + 3,3 = 4

1011_2 → n     = 1 + log_16 1011   = 1 + 3,4.. = 4

Für negative Zahlen kommt noch ein Vorzeichen hinzu.

Bei digitalen Rechenanlagen ist die Zahlendarstellung zur Basis 2 auf Grund der elektronischen Gegebenheiten ein zentraler Punkt: Ganze Zahlen müssen mit einer endlichen Anzahl von Bits (z.B. 32), also in einem Wort der Länge (z.B.) 32 dargestellt werden. Damit wird allerdings der Zahlenvorrat beschränkt, er hängt von der Wortlänge ab.

Um auch negative Zahlen darstellen zu können, reserviert man das vorderste Bit d_31 für das Vorzeichen +/- bzw. 0/1.

Eine direkte Übertragung der b-adischen Darstellung ist aber nicht zweckmäßig, denn dann hätte man zwei verschiedene Nullen, eine „positive“ (d_31 = 0, d_30 = … d_0 = 0) und eine „negative“ (d_31 = 1, d_30 = … d_0 = 0).

Die Lösung zu diesem Problem ist das sogenannte Zweierkomplement.

Definition 1.12 (Zweierkomplement):

Ist a ∈ , so ist der Wert von a in einem Wort der Länge n mit

dn-1 dn-2 … d_1, d_0, di ∈ {0,1} definiert als

Man beachte, dass sich für positive ganze Zahlen gegenüber der b-adische Darstellung dadurch nichts ändert, denn mit dn-1 = 0 als Repräsentant für das Vorzeichen verbleibt dn-1 2n-2 + dn-3 2n-3 + …. + d_121 + d_020 und es gibt nur mehr eine Null.

Beispiel: wir wählen n = 8 (1 Byte)

1 0 1 0 1 1 0 0 = - 2^7 + 2^5 + 2^3 + 2^2 = -8410

1 0 0 0 0 0 0 0 = - 2^7 = -12810

0 1 1 1 1 1 1 1 = 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 12710

1 1 1 1 1 1 1 1 = - 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = -1_10

Eine einfache Methode erlaubt es, negative Zahlen a in das Zweierkomplement umzurechnen:

(i) Bei n verfügbaren Bits stelle |a| im Dualsystem dar, wobei das vorderste Bit dn-1 für das Vorzeichen reserviert bleibt und wegen |a| > 0 zunächst 0 ist.

(ii) Invertiere alle Bits.

(iii) Addiere (+1) zum Ergebnis aus (ii).

Beispiel:

n = 8, a = -7610

76_10 = 0 1 0 0 1 1 0 0

invertieren 1 0 1 1 0 0 1 1

1 dazuzählen 1 0 1 1 0 1 0 0 = -2^7 + 2^5 + 2^4 + 2^2 = -76_10

Beispiel:

- 128 ist im Zweierkomplement bei n = 8 Bits die kleinste ganze Zahl.

Allgemein ist bei n Bits dn-1 dn-2 … d_0 die kleinste darstellbare Zahl -2n-1 und die dadurch größte darstellbare ganze Zahl ist 2n-1 -1. Bei einer Implementierung dieses Konzeptes muss auf die Möglichkeit eines Überlaufs (Overflow) geachtet werden, was wir uns am Beispiel n = 8 vor Augen führen:

+ 127 + 1 = 0 1 1 1 1 1 1 1_2 + 0 0 0 0 0 0 0 1_2

= 1 0 0 0 0 0 0 0 = (wäre) -2^7 = -128_10!

- 128 – 1 = 1 0 0 0 0 0 0 0 + 1 1 1 1 1 1 1 =

= 1 0 1 1 1 1 1 1 1 = 127_10 mit einem sogenannten carry als 9-tes Bit.

Bei n = 16 hat man als Zahlenbereich -32768 ≤ a ≤ 32767.

Bei n = 32 ergibt sich -2147483648 ≤ a ≤ 2147483647.

1.7.2. Darstellung von rationalen und reellen Zahlen

Bei rationalen Zahlen bricht die Dezimaldarstellung entweder ab

oder wird periodisch

Es gilt folgender

Satz 1.7: Die Dezimalbruchentwicklung des gekürzten Bruches (rationale Zahl)

besitzt genau dann eine endliche Dezimalbruchentwicklung, wenn im Nenner v nur die Primfaktoren 2 oder 5 vorkommen. Dieser Satz lässt sich auf beliebige Basen b > 1 übertragen:

Satz 1.8: Ein gekürzter Bruchhat genau dann eine nicht periodische b-adische Darstellung, wenn alle Primfaktoren von v auch Primfaktoren von b sind.

Die b-adische Darstellung von rationalen Zahlen entspricht links vom Komma der Darstellung wie bei den ganzen Zahlen, während rechts vom Komma die i-te Ziffer mit b-i zu multiplizieren ist.

Beispiel:

Es folgt aus Satz 1.8, dass eine Zahl a bei der einen Basis eine endliche b-adische Darstellung haben kann, bei einer anderen Basis aber nicht.

Irrationale Zahlen haben keine endliche und auch keine periodische b-adische Darstellung. Es geht nun darum, wie man rationale bzw. irrationale Zahlen mit endlich vielen Bits so darstellt, dass die wesentlichen (signifikanten) Ziffern repräsentiert werden. In der Informatik spricht man in diesem Zusammenhang von der Darstellung von Zahlen vom Typ real. Man stellt eine Zahl a ≠ 0 durch ein Zahlenpaar (m,e) mit einer gewählten Basis b wie folgt dar:

a = m · be

Die Zahl m heißt Mantisse und hat bei p Stellen (p für Genauigkeit, Präzision) die Gestalt ± d, dd …, d

Für die Ziffern d gilt 0 ≤ d ≤ b-1. Die Zahl e heißt Exponent.

Die Mantisse m wird nun normalisiert, indem man durch Anpassung des Exponenten erreicht, dass die erste signifikante Stelle von m von Null verschieden ist. Diese Normierung wird nach jedem Rechenschritt bei Bedarf vollzogen, das Komma gleitet also. Daher spricht man auch von Gleitkommadarstellung.

3,14159 · 10^0 → 0,314159 · 10^1

Da für m nur p Stellen vorgesehen sind, braucht man die führende Null gar nicht darstellen.

Wählt man als Basis b = 2, ist das führende Bit wegen a ≠ 0 - die Null wird gesondert dargestellt - immer 1, braucht daher auch nicht repräsentiert werden und man gewinnt implizit eine zusätzliche Stelle. Für das Vorzeichen s(sign) ist ein gesondertes Bit vorzusehen. Daher hat man hier zwei Nullen, eine positive und eine negative.

Im Gegensatz zum Zweierkomplement wird das Vorzeichen beim ganzzahligen Exponenten e anders geregelt: zu e wird ein sogenannter Bias hinzugezählt.

Im Beispiel sei Bias = 50 und wir erhalten:

0,314159 · 10^1 → 0,314159 · 1051

0,314159 · 10-1 → 0,314159 · 10^49

Normierte Gleitkommazahlen (real-Zahlen) können den wahren Wert einer reellen Zahl im Allgemeinen nur approximativ darstellen, können daher von vornherein mit einem Anfangsfehler behaftet sein, der sich beim Fortgang von Berechnungen hochschaukeln kann, weil Auf- bzw. Abrundungen erforderlich sein können. Dieses Thema ist in der Numerischen Mathematik ein ernstes Problem und wird dort gesondert abgehandelt.

Bei digitalen Rechenanlagen wählt man b = 2 und alleine schon, weil Dezimalzahlen bei der Umrechnung auf die Basis 2 periodisch werden können, ergibt sich oft eine Ungenauigkeit:

0,1_10 = 0 · 10011 …2 mit der Periode 10011

Das Normungsgremium der IEEE hat in ihrem Standard IEEE 754 die Darstellung von Gleitkommazahlen festgelegt und die meisten Prozessoren folgen diesem Standard. Eine bemerkenswerte Ausnahme dazu ist die Implementierung in JAVA bzw. in der JAVA-Virtual Machine.

Eine Zahl a wird mit Bias β und dem Vorzeichen s dargestellt als

a = s · m · 2e-β

Wir geben ein Beispiel an Hand einer Gleitkommadarstellung mit 32 Bits (real, einfache Genauigkeit):

Vorzeichen: s ∈ {0,1}, Bit 31

Exponent: 8 Bits mit Bias β = 127 = 2^7-1.

Somit sind Exponenten e im Intervall [-126, 127] möglich. Die Werte e = 0 und e = 255 sind reserviert für „Null“ und „Unendlich“. Der Exponent steht in den Bits 23 – 30.

Mantisse: verbleibende 23 Bits von 0 – 22.

Es wird angenommen, dass das führende Bit der Mantisse m ≠ 0 ist und daher nicht dargestellt werden muss. Es ist implizit angenommen, sodass  = 1, m.

Damit erreicht man einen Zahlenbereich im Intervall ± 2-126 ≤ a ≤ (2 - 2-23) · 2^127, ungefähr 10-38 ≤ a ≤ 10^38.

Dazu überlegen wir allgemein: bei einem q-stelligen Exponenten mit Bias β = 2q-1 – 1 wird der Exponent von [0, 2q -1] nach [-(2q-1 -1), 2q-1] transformiert:

Die kleinste Zahl a = m · 2-e erfüllt

-e – β = 0 → e = -(2q-1 -1)

Für die größte Zahl a = m · 2e gilt bei q Stellen

e = 2q – 1 – β = 2q – 1 – (2q-1 – 1) = 2q-1

Ein gültiger Exponent e´ liegt, weil e´ = 0 und e´ = 255 nicht zugelassen sind, im Intervall

emin = 0 < e´ < emax = 2q – 1 = 2 β + 1

Sind alle p Bits in der Mantisse m gleich Null, so hat m in Wahrheit den Wert 1,0, da wegen der Normalisierung das führende Bit nicht explizit dargestellt wird:

Für den größten Wert ergibt sich 1,1 … 1 = 2^0 + 2-1 + 2-2 + … + 2-p.

Wegen

ist

Beides zusammengefasst liefert den Zahlenbereich [ ± 21-β, (2 – 2-p)2β].

Für p = 23 und β = 127 ergeben sich daher die vorhin genannten Werte ±2-126 bis (2 – 2-23)2^127.

Nimmt man anstatt eines 32 Bit Wortes nach IEEE 754 ein 64 Bit Wort bei 11 Bits für den Exponenten und einen Bias β = 1023, so verbleiben neben dem Vorzeichen s noch 52 Bits für die Mantisse und kann Dezimalzahlen im Intervall ~ ± [10-308, 10^308] approximieren.

1.8. Kombinatorik

Wichtig für die Mathematik, etwa in den Gebieten Wahrscheinlichkeitsrechnung und Statistik, ist die Kombinatorik, ein Gebiet, das sich mit der Bestimmung der Zahl möglicher Anordnungen oder Auswahlmöglichkeiten von (nicht) unterscheidbaren Objekten mit (ohne) Beachtung der Reihenfolge befasst. Es seien hier vier typische Beispiele angeführt:

Beispiel:

Wieviele Möglichkeiten gibt es für einen Tipp im Lotto 6 aus 45? Die Anzahl der Möglichkeiten, zu tippen, ist offensichtlich gleich der Anzahl der Möglichkeiten, sechs Dinge aus 45 Dingen auszuwählen, da es auf die Reihenfolge der Zahlen ja nicht ankommt, dies vorausgesetzt man spielt ein Spiel mit einem Tipp zu sechs Kreuzen.

In der Kombinatorik spricht man in diesem Zusammenhang von Kombination ohne Zurücklegen. Der Ausdruck „Zurücklegen“ ist auf die für die Kombinatorik typischen Beispiele des Ziehens von Kugeln aus Urnen zurückzuführen.

Grundsätzlich gibt es 45! = 45 ⋅ 44 ⋅… ⋅1 Möglichkeiten, 45 Dinge der Reihe nach anzuordnen, 45 Möglichkeiten für den ersten Platz, 44 für den zweiten Platz, … und schließlich nur mehr eine Möglichkeit für den letzten Platz.

Definition 1.13: n ! = n ⋅ (n-1) ⋅… ⋅1 für n ∈ , man sagt dazu n Fakultät.

Von diesen 45! Möglichkeiten sind aber nur diejenigen für obiges Beispiel von Interesse, bei denen 6 Zahlen gewählt und (45-6) = 39 Zahlen nicht gewählt werden.Dafür gibt es mit demselben Argument wie zuvor 6! ⋅ 39! Möglichkeiten.

Wählt man nun diesen Anteil aus den 45! Möglichkeiten aus, d.h. dividiert man 45! durch6! ⋅ 39!, so erhält man  Möglichkeiten, 6 aus 45 Dingen auszuwählen.

Allgemein gibt es also  Möglichkeiten, n aus k Dingen auszuwählen, wobei die Reihenfolge, wie beim Lotto, nicht von Bedeutung ist. Beim Lotto 6 aus 45 gibt es also 8 145 060 Möglichkeiten für einen Tipp.

Obiger Quotient kommt in der Kombinatorik sehr häufig vor und wird daher definiert als:

Definition 1.14:

ist der Binomialkoeffizient „n über k“.

Mit einem Binomialkoeffizienten lässt sich auch bequem eine Formel für (x+y)n angeben:

Für n=3 ergibt sich etwa:

Wichtig für die Kombinatorik ist die sogenannte Binomialverteilung:

Beispiel:

Wie groß ist die Wahrscheinlichkeit bei 10 Würfen mit einem Würfel genau drei Sechser zu werfen?

Die Wahrscheinlichkeit für einen Sechser in einem Wurf ist im Idealfall gleich p=1/6 (also ;rund 16.7%) Die Wahrscheinlichkeit, keine Sechs zu werfen ist damit gleich 1-p = 5/6. Bei 10 ;Würfel erreicht man genau drei Sechser genau dann, wenn man 3 mal eine Sechs und 7 mal p;keine Sechs wirft. Die Wahrscheinlichkeit für drei Sechser und dann sieben„Nicht-Sechser“ ;ist gleich p^3(1-p)7. Jetzt ist aber die Reihenfolge der Würfe nicht von Bedeutung, es ist egal, ;wann die drei Sechser geworfen werden. Insgesamt gibt es nun 10 über 3 Möglichkeiten, drei Positionen für die Sechser auszuwählen, somit erhält man als Wahrscheinlichkeit in diesem Fall:

also ca. 15%.

Man nennt ein solches Experiment, bei dem es auf die Reihenfolge nicht ankommt und „nicht zurückgelegt“ werden kann, auch ein Bernoulli-Experiment. Die allgemeine Formel für die Wahrscheinlichkeit, bei einem Bernoulli-Experiment unter 10 Versuchen k-mal erfolgreich zu sein ist damit gleich:

wobei p die Wahrscheinlichkeit angibt, bei einem Versuch erfolgreich zu sein.

Kurz erwähnt sei noch das Modell der von Kombination mit Zurücklegen. Ein typisches Beispiel hiefür ist:

Beispiel:

Wieviele Möglichkeiten gibt es, in einer Gruppe von 10 Studenten 3 Beispiele von je einem Studenten vorrechnen zu lassen, wobei ein Student auch mehrere Beispiele rechnen kann.

Ohne Beweis, die Herleitung ist etwas komplizierter, sei hierfür die Formel angeben:

Für die Auswahl von k aus n Dingen ohne Beachtung der Reihenfolge, wobei ein Ding mehrmals gewählt werden kann, gibt es  > Möglichkeiten.

Ist nun die Reihenfolge der Objekte von Bedeutung, spricht man von Variation.

Beispiel:

Wieviele Möglichkeiten gibt es, eine k=7-stellige Zahl zu bilden?

Offensichtlich gibt es für jede Stelle (im Dezimalsystem) n=10 Möglichkeiten, insgesamt also 10^7 Möglichkeiten. Hier dürfen Ziffern mehrfach gewählt werden, man spricht also von Variation mit Zurücklegen.

Allgemein gilt:

Satz 1.9: Für die Variation mit Zurücklegen von k aus n Dingen gibt es nk Möglichkeiten. Auch für die Variation sei noch die zweite Möglichkeit erwähnt, nämlich die Variation ohne Zurücklegen:

Beispiel:

Wieviele Möglichkeiten gibt es, aus einer Speisekarte mit n=10 Gerichten, eine k=3-gängiges Menü auszuwählen? Es werde freilich kein Gang mehrfach gewählt.

Die Formel ergibt sich analog zum Lottobeispiel, da die Reihenfolge der k ausgewählten Gerichte hier aber wichtig ist, fällt der Faktor k! im Nenner weg, man erhält also:

= Möglichkeiten, in obigem Beispiel 120.

Zum Schluss seien noch ein paar Eigenschaften des Binomialkoeffizienten erwähnt, der Beweis folgt durch direktes Nachrechnen über die Definition:

Satz 1.10:

Beweis von (a):

1.9. Relationen und Funktionen

In der Menge aller ganzen Zahlen  gilt, dass zwei ganze Zahlen denselben Absolutbetrag haben, wenn sie sich nur um ihr Vorzeichen unterscheiden. Zahlen gleichen Betrages, etwa +2 und -2 stehen auf diese Weise zueinander in Beziehung.

Ein anderes Beispiel in  sei die Beziehung „ist größer als“: zwei Zahlen stehen dann zueinander in Beziehung, wenn die erstere kleiner oder gleich der zweiten Zahl ist, etwa -2 und -1.

Man spricht bei diesen und ähnlichen Arten von Beziehungen von Relationen, im obigen Fall haben wir ein Beispiel für eine „Ähnlichkeits-“ und eine „Hierarchiebeziehung“.

Allgemeiner gilt nun: Sind zwei Mengen A, B gegeben, so ist es oft von Interesse, Beziehungen zwischen Elementen von A zu Elementen von B zu studieren. So eine Relation kann man auf zwei Arten angeben:

− Intentional durch Angabe eines Kriteriums, wann ein a ∈ A mit einem b ∈ B in Beziehung steht: Beispiel: A=B= , a steht in Relation zu b, genau dann wenn |a| = |b|

− Extensional durch Auflisten aller Paare (a,b) ∈ A×B, die miteinander in Beziehung stehen.

Beispiel: R={(0,0),(1,-1),(-1,1),(2,-2),(-2,2),(3,-3),……}

Obige Relation wurde also auf zwei verschiedene Arten angegeben. Die intentionale Notation ;sei in Zukunft verwendet.

Nun aber zur formalen Definition einer Relation:

Definition 1.15: Eine Relation R von einer Menge A in eine Menge B ist eine Teilmeng von A×B. Für (a,b) ∈ R schreiben wir auch aRb, für (a,b) ∉ R auch ab. Ist A = B, so sprechen wir von einer Relation auf A. R–1 := {(b,a) | (a,b) ∈ R} heißt die zu R inverse Relation (von B nach A).

Überraschend mag sein, dass sich Funktionen über Relationen definieren:

Definition 1.16: Eine Relation R von A nach B heißt funktional oder auch eine Funktion, falls gilt: Für jedes a ∈ A gibt es ein b ∈ B, sodass (a,b) ∈ R. Dies ist genau die bekannte Definition einer Funktion, also zu jedem Element aus der Definitionsmenge A gibt es genau ein Element aus der Bildmenge B. Eine Relation auf einer Menge A kann keine, eine oder mehrere der folgenden Eigenschaften besitzen.

Definition 1.17: R sei eine Relation auf einer Menge A.

a) R heißt reflexiv, falls für alle a ∈ A gilt: aRa

b) R heißt symmetrisch, falls für alle a,b ∈ A gilt: aRb ⇒ bRa

c) R heißt antisymmetrisch, falls für alle a,b ∈ A gilt: (aRb ∧ bRa) ⇒ a=b

d) R heißt transitiv, falls für alle a,b,c ∈ A gilt: (aRb ∧ bRc) ⇒ aRc

Beispiele:

a) A = B =  , aRb ⇔ |a| = |b|: reflexiv, symmetrisch und transitiv, aber nicht funktional.

(i) |a| = |a|, daher ist R reflexiv.

(ii) wenn |a| = |b| gilt, dann freilich auch |b| = |a| und R ist symmetrisch.

(iii) R ist nicht antisymmetrisch, denn |-1| = |1| und |1| = |-1|, aber 1 ≠ -1.

(iv) wenn |a| = |b| und |b| = |c|, dann freilich auch |a| = |c| und R ist transitiv

(v) etwa wegen |-1| = |1| und |-1| = |-1| ist R nicht funktional.

analog überprüft man schnell:

b) A = B = , aRb ⇔ a ≤ b. Diese Relation ist nicht funktional, aber reflexiv, antisymmetrisch und transitiv.

c) A = B =  , aRb ⇔ a < b: antisymmetrisch und transitiv.

d) A = B = , aRb ⇔ a ≤ b: reflexiv, antisymmetrisch und transitiv.

e) A = B = {a | a ist Name in einem bestimmten Telefonbuch}. aRb ⇔ a und b haben denselben Anfangsbuchstaben: reflexiv, symmetrisch und transitiv.

Man beachte, dass die Relationen aus (c), (d) und (e) nicht funktional sind.

Wie schon in der Einleitung erwähnt, kann man Relationen im allgemeinen grob so klassifizieren:

− Reflexive, symmetrische und transitive Relationen: sie beschreiben immer „Ähnlichkeitsbeziehungen“. (vgl. Beispiel a)

− Reflexive, antisymmetrische und transitive Relationen: sie beschreiben immer „Hierarchiebeziehungen“. (vgl. Beispiel b)

Angelehnt an diesen Gedanken definiert man:

Definition 1.18: Eine reflexive, symmetrische und transitive Relation auf einer Menge A heißt eine Äquivalenzrelation. Eine reflexive, antisymm. und transitive Relation auf A heißt eine Ordnungsrelation oder auch Halbordnung. Die wichtigste Klasse von Relationen sind die Funktionen, auf die nun näher eingegangen werde:

Definition 1.19: Sei R eine funktionale Relation, also eine Funktion von A nach B. Dann heißt A der Definitionsbereich und B der Bildbereich von R. Das für jedes a ∈ A eindeutig bestimmte b ∈ B mit (a,b) ∈ R heißt der Funktionswert von a unter R, man schreibt dann b = R(a). Die vollständige Notation dieser Funktion mit diesen Begriffen ist nun:

R: A → B, a → R(a)

R(A) := {R(a) | a ∈ A} heißt das Bild von A unter R. Statt „Funktion“ sagt man auch oft „Abbildung“.

Für Funktionen schreibt man statt R zumeist Symbole wie f oder g.

Definition 1.20 und Beispiele:

a) Für jede Menge A ist idA: A → A, a → a eine Funktion, genannt die identische Funktion auf A.

b) f: →  , x → x^2 und sin: →  , x → sin(x) sind sogenannte „reelle“ Funktionen, also Funktionen, wobei Definitions- und Bildmenge Teilmengen der reellen Zahlen sind.

sin(x), die Sinusfunktion, ist ein Beispiel für die so genannten trigonometrischen Funktionen.

c) w: →  , x → ± √x ist keine Funktion, denn jede natürliche Zahl hat zwei Bilder. w heißt Wurzelfunktion.

d) | |: →  , x → |x| ordnet jeder reellen Zahl ihren Absolutbetrag zu, | | heißt die Betragsfunktion.

Wann sind nun zwei Funktionen gleich? Der folgende Satz definiert, was man unter Gleichheit über Relationen versteht:

Satz 1.11: f: A → B und g: C → D seien Funktionen.

f = g ⇔ A = C und für alle a ∈ A: f(a) = g(a)

Funktionen werden also identifiziert, wenn sie den gleichen Definitionsbereich und die gleiche Abbildungsvorschrift haben.

Funktionen f: D →  mit D ⊆  kann man oft als Kurven in der Ebene zeichnen;

f = {(x,f(x)) | x ∈ D} heißt dann auch der Graph von f.

Abb. 1.7

Funktionen auf endlichen Mengen kann man auch durch „Pfeildiagramme“ veranschaulichen. So lässt sich z.B. f = {(1,a), (2,a), (3,b), (4,c), (5,a)} viel anschaulicher zeichnen:

Abb. 1.8

Auch Wertetabellen können für endliche Mengen zur Angabe der Funktionswerte verwendet werden:

Abb. 1.9

Wichtig für die Mathematik ist der Begriff der Umkehrfunktion, hierfür sind jedoch noch einige weitere Definitionen erforderlich:

Definition 1.21: f: A → B sei eine Funktion.

a) f heißt injektiv, falls gilt: Für alle a_1,a_2 ∈ A: (f(a_1) = f(a_2) ⇒ a_1 = a_2), in Worten:

Jeder Funktionswert der Bildmenge wird maximal einmal durch ein Element der Definitionsmenge erreicht.

b) f heißt surjektiv, falls f(A) = B ist, in Worten:

Jeder Funktionswert der Bildmenge wird höchstens einmal durch ein Element der Definitionsmenge erreicht.

c) f ist bijektiv, falls f injektiv und surjektiv ist, in Worten:

Jeder Funktionswert der Bildmenge wird genau einmal durch ein Element der Definitionsmenge erreicht.

Ist f eine Funktion von D ⊆  nach B ⊆  , so kann man sich diese Begriffe wie folgt veranschaulichen (vgl. dazu auch Abb. 1.10)

- f ist injektiv ⇔ jede horizontale Gerade im Bildbereich schneidet f in höchstens einem Punkt.

- f ist surjektiv ⇔ jede horizontale Gerade im Bildbereich schneidet f in mindestens einem Punkt.

- f ist bijektiv ⇔ jede horizontale Gerade im Bildbereich schneidet f in genau einem Punkt.

Unter „im Bildbereich“ sei eine horizontale Gerade y=c verstanden, falls c ∈ B ist.

Abb. 1.10

In obiger Abbildung ist f als Funktion von  nach  weder injektiv noch surjektiv: Da obige Gerade bei +1 den Graphen zweimal schneidet, ist f nicht injektiv. Da die untere Gerade bei -2 die Funktion gar nicht schneidet, ist f nicht surjektiv.

Ist f nun durch ein Pfeildiagramm charakterisiert, so gilt:

- f ist injektiv ⇔ zu jedem b ∈ B führt höchstens ein Pfeil

- f ist surjektiv ⇔ zu jedem b ∈ B führt mindestens ein Pfeil

- f ist bijektiv ⇔ zu jedem b ∈ B führt genau ein Pfeil.

Funktionen können auch aufeinander angewendet werden, so ist etwa sin(x^2) als Hintereinanderausführung der Funktionen x^2 und sin(x) zu verstehen. Allgemein gilt hier:

Wenn f: A → B und g: B → C Funktionen sind, so kann man jedes a ∈ A auf f(a) = b ∈ B abbilden. b ∈ B wiederum kann auf g(b) = g(f(a)) ∈ C abgebildet werden. Insgesamt erhält man damit eine Funktion von A nach C. Das geht natürlich nur, wenn f dort „endet“, wo g „beginnt“, formal also wenn die Definitionsmenge von g, identisch mit der Bildmenge von f ist.

Abb. 1.11.

Definition 1.22: Seien f: A → B und g: B → C Funktionen. Dann heißt g°f: A → C, a → g(f(a)) die Hintereinanderausführung von g nach f, man beachte hier die Reihenfolge!

Beispiele:

a) f: → {x ∈ | x ≥ 0}, x → x^2, g: → , x → x+1.

g°f ist im strengen Sinn nicht definiert, da die Bildmenge von f nicht der Definitionsmenge von g entspricht. Setzt man für die Bildmenge von f die reellen Zahlen , so ergibt sich:

g°f: → , xf→ x^2 g→ x^2+1, also x → x^2+1. Dagegen ist

f°g: → , x g→ x+1 f→ (x+1)2, also x → x^2+2x+1.

b) Sei f: A → B. Dann erhält man sofort: f ° idA = f und idB ° f = f.

Dieses Beispiel zeigt:

− g°f ist nicht immer definiert.

− Selbst wenn g°f und f°g definiert sind, müssen sie nicht gleich sein.

− Die identische Funktion verändert keine Funktion beim Hintereinanderausführen. In der Mathematik spricht man hier vom „neutralen Element bezüglich der Hintereinanderausführung von Funktionen“.

Satz 1.12: Seien f: A → B, g: B → C und h: C → D drei Funktionen. Dann gilt h ° (g°f) = (h°g) ° f

Beweis: h ° (g°f) = h ° (g(f)) = h(g(f)) = h(g(f(x)) = (h°g)(f(x) = (h°g)(f) = (h°g) ° f

Man sagt in diesem Fall „Die Hintereinanderausführung von Funktionen ist assoziativ“, vgl. dazu das Kapitel über Gruppen.

Ähnlich wie oben zeigt man leicht:

Satz 1.13: Sei f: A → B bijektiv. Dann ist auch f–1: B → A eine Funktion und ebenfalls bijektiv; es gelten folgende Regeln:

f–1 ° f = idA ; f ° f–1 = idB; (f–1)–1 = f

Satz 1.14: Seien f: A → B und g: B → C bijektiv. Dann ist auch g°f: A → C bijektiv und es gilt (g°f)–1 = f–1 ° g–1

Allgemein gilt, dass eine Funktion genau dann bijektiv ist, wenn sie eine Umkehrfunktion besitzt:

Satz 1.15: Sei f eine Funktion von A nach B. Falls es eine Funktion g: B → A gibt mit g°f = idA und f°g = idB, so ist f bijektiv und es gilt g = f–1.

1.10. Übungsaufgaben

1.1: Man zeige für alle n ∈  :

Wir beschränken uns in den folgenden Beispielen jeweils auf den Induktionsschluss:

1.2: Man zeige für alle n ∈  :

1.3: Man zeige für alle n ∈ und x ∈  , x > – 1, x ≠ 0 :

(1+ x)n > 1+ nx (Bernoulli’sche Ungleichung)

1.4: Man zeige für alle n ∈ und q ∈  , q ≠ 1:

(geometrische Reihe)

1.5: Man zeige für alle n ∈ : |a +...+an| ≤ |a_1| +..+ an|

1.6: Man zeige mit Induktion, dass jede natürliche Zahl eine Binärdarstellung hat.

1.7: Wo ist der Fehler in folgendem Induktionsbeweis?

Wir „beweisen“ die (vlg. Kapitel 1) falsche Aussage:

Induktionsschluss:

Es ist zu zeigen, dass die Formel auch für n = k + 1 gilt, d.h. dass

(Einsetzen der Induktionsannahme) =

= k 2 + k +1 + k + = k 2 + k + + k + = k + 2 + k + +

1.8: Man finde alle reellen Zahlen x, die folgende Betrags-Ungleichung erfüllen:

| x – 2 | < 3

1.9: Man vereinfache über :

1.10: Man bestimme die Polardarstellung und berechne aus der Polardarstellung als Probe wieder die Angabe.

(a) – 1 + i

(b) 2i

1.11: Man beweise durch vollständige Induktion folgende Formel:

∀a ∈ [0,1] und ∀ n ∈ : (1+ a)n ≤ 1+ (2n −1)a

1.12: Man zeige mit Induktion, dass jede n-elementige Menge genau 2n Teilmengen hat.

1.13: Gelten für eine Relation R auf einer Menge A folgende Behauptungen ?

(a) R ist transitiv und symmetrisch ⇒ R ist reflexiv

(b) R ist reflexiv, symmetrisch und antisymmetrisch ⇒ R ist funktional

1.14: Gilt folgende Behauptung ?

Sei R eine reflexive, symmetrische Relation auf A. Sei weiters :

S = { (a,c) ∈ A × A | ∃ b ∈ A : (a,b) ∈ R ∧ (b,c) ∈ R }

Dann ist R ∪ S eine Äquivalenzrelation.

1.15: Welche der folgenden Relationen sind Funktionen? Man überprüfen in diesem Fall, ob die Funktionen injektiv, surjektiv bzw. bijektiv sind.

(a) f:  → , y² = x² (b) f: ²→ , (x,y) → x y

(c) f: ²→  , (x,y) → –y – x (d) f: ²→  , (x,y) → x² + y

(e) f: ²→  , (x,y) → x – y

1.16: Man zeige für Funktionen f: A → B und g : B → C:

Sind f und g surjektiv / injektiv / bijektiv, so ist auch g o f surjektiv / injektiv / bijektiv

1.11. Applets

- Powerset

Liefert die Potenzmenge von n Zahlen 1, 2, …, n.

- Permutationen

Berechnet die Menge aller Permutationen von n Zahlen 1, 2, …, n.

- Binaerrepraesentation

Wandelt ganze Zahlen in Binärdarstellung um, 32-Bit Zweierkomplementdarstellung.

- Fakultaet

Berechnet schrittweise n!

Abb. 1.12: Screenshots Applet: „Potenzmenge“

2.  Elementare Zahlentheorie

2.1. Der größte gemeinsame Teiler

Im Abschnitt über Rechnen mit Zahlen wurde der Begriff Teiler einer ganzen Zahl a definiert: b ∈  ist Teiler von a, wenn es ein q ∈  gibt, sodass a = b · q. Man schreibt dann b ⁄ a.

Definition 2.1: Eine ganze Zahl c ∈ heißt gemeinsamer Teiler von a, b ∈ , wenn c ⁄ a und c ⁄ b.

Wir werden uns im Folgenden auf  beschränken.

Dann gilt: wenn c ⁄ a und c ⁄ b ⇒ c ≤ a und c ≤ b.

Definition 2.2: Es heißt d = ggT(a,b) der größte gemeinsame Teiler von a und b, wenn

(i) d ⁄ a und d ⁄ b

(ii) für jeden gemeinsamen Teiler c von a und b gilt c ≤ d.

Aus der Definition folgt: Ist d der ggT(a,b) und e ein beliebiger gemeinsamer Teiler von a und b, so gilt e ⁄ d.

Zur Bestimmung des ggT(a,b) verwendet man etwa den Euklid´schen Algorithmus (Euklid, 325 – 265 v. Chr.).

Betrachten wir vorab ein Beispiel: d = ggT(56,21).

Es gilt: 56 = 2 · 21 + 14. Also ist jeder Teiler von 56 und 21 auch ein Teiler von 21 und 14. Erst recht ist d ein Teiler von 21 und 14: ggT(56,21) = ggT(21,14). Wir wiederholen dieses Verfahren für 21 und 14 und erhalten:

21 = 1 · 14 + 7 und daher ggT(56,21) = ggT(14,7)

14 = 2 · 7 + 0 und daraus folgt ggT(56,21) = ggT(7,0) = 7 = d

Obige Vorgangsweise beruht auf folgendem Satz, wobei man o.B.d.A. a ≥ b, a,b ∈ voraussetzen kann.

Satz 2.1: Ist a = bq + r mit 0 ≤ r < b, dann ist ggT(a,b) = ggT(b,r).

Beweis: Ist c ein gemeinsamer Teiler von a und b, dann ist c auch ein gemeinsamer Teiler von b und r, denn aus c ⁄ a und c ⁄ b sowie r = a – bq folgt c ⁄ r. Umgekehrt ist jeder gemeinsame Teiler von b und r auch Teiler von a, also stimmt die Behauptung auch für den ggT.

Um den ggT(a,b) zu bestimmen geht man wie im vorigen Beispiel vor, wobei a = r_0 und b = r_1 gesetzt wird, ri in der (i–2)-ten Zeile also jeweils den Rest angibt:

r0 = r_1q_1 + r_2 0 ≤ r_2 < r1

r_1 = r_2q_2 + r_3 0 ≤ r_3 < r2

...............

ri-2 = ri-1 qi-1 + ri 0 ≤ ri < ri-1

...............

Wegen ri ∈  und 0 ≤ rn+1 < ri bricht die Kette irgendwann ab, etwa mit rn+1 = 0: rn-1 = rnqn + 0.

Nach dem vorigen Satz gilt aber

ggT(a,b) = ggT(r0,r1) = ggT(r1,r2) = … = ggT(rn-1,rn) = rn,

womit der Euklid´sche Algorithmus vollständig bewiesen ist.

Bemerkung: Für den ggT(a,b) gelten noch folgende Beziehungen:

ggT(a,b) = ggT(b,a)

ggT(a,0) = |a| (bei Erweiterung  von  auf 0

ggT(a,b) = ggT(|a|, |b|) (bei Erweiterung von 0 auf wobei nicht a = b = 0)

Das Beispiel des Euklid´schen Algorithmus ist für die Informatik aus zwei besonderen Gründen interessant. Einerseits erhält man aus dem Beweis einen einfachen Algorithmus (wobei in JAVA die Berechnung von a = bq + r mit r = a % (a modulo b) notiert wird).

Anderseits liefert der Satz 2.3 wegen mit ggT(a,b) = ggT(b,r) auch einen Ansatz für ein rekursives Programm:

Komplementär zum (größten) gemeinsamen Teiler gibt es das (kleinste) gemeinsame Vielfache:

Definition 2.3: Eine Zahl u ∈ heißt gemeinsames Vielfaches von a, b ∈ , wenn a ⁄ u und b ⁄ u. Es heißt v = kgV(a,b) das kleinste gemeinsame Vielfache von a und b, wenn

(i) a ⁄ v und b ⁄ v

(ii) für jedes gemeinsame Vielfache u von a und b gilt u ≥ v.

Aus der Definition folgt: Ist v das kgV(a,b) und w ein beliebiges gemeinsames Vielfaches von a und b, so gilt v ⁄ w.

Nicht beweisen werden wir den nachstehenden Satz, mit dem man über den ggT(a,b) sehr einfach das kgV(a,b) berechnen kann:

Satz 2.2: kgV(a,b) · ggT(a,b) = a · b

Der Euklid´sche Algorithmus liefert noch ein weiteres Ergebnis, den Hauptsatz über den ggT:

Satz 2.3: Ist d = ggT(a,b), dann existieren Zahlen x,y ∈, sodass ax + by = d.

Die Beweisidee ist, dass man die einzelnen Schritte ri = ri+1 qi+1 + ri+2 im Verfahren zum Bestimmen des ggT(a,b) von unten nach oben aufrollt und die erhaltenen Werte substituiert. Diese Methode heißt „erweiterter Euklid´scher Algorithmus“.

Anstatt eines Beweises erläutern wir den Algorithmus anhand eines Beispiels:

ggT(a,b) = ggT(56,21) = 7 = d

(i) 56 = 2 · 21 + 14 = a

(ii) 21 = 1 · 14 + 7 = b

(iii) 14 = 2 · 7 + 0 → d = 7

Die Gleichung (iii) in (ii) eingesetzt liefert 14 = b – d und man erhält a = 2b + 14 = 2b + b – d und daraus d = –a + 3b, also x = –1, y = 3 und man erhält: ggt(56,21) = 7 = (–1) ·56 + (3) ·21

Ein wichtiger Satz ist auch das Fundamentallemma der Zahlentheorie:

Satz 2.4: Sind a,b,c ∈  mit c ⁄ ab und ggT(a,c) = 1, so folgt c / (abx + cby) und damit c ⁄ b.

Beweis: Da ggT(a,c) = 1, gibt es x,y ∈  mit ax + cy = 1. Multiplikation mit b liefert abx + cby = b. Da nach Voraussetzung c ⁄ ab und trivialerweise c ⁄ cb, folgt c ⁄ b.

2.2. Primzahlen

Definition 2.4: Eine natürliche Zahl p > 1 heißt Primzahl, wenn sie außer 1 und p selbst keine weiteren (positiven) Teiler hat.

Da wir uns auf  beschränken, kann der Zusatz „positiv“ entfallen. Der Grund, warum 1 nicht als Primzahl geführt wird, ist vor allem ein technischer. Zum einen würde eine Reihe von Aussagen trivial oder man müsste immer den Zusatz p > 1 extra formulieren, zum anderen geht im später genannten Hauptsatz eine wesentliche Eigenschaft verloren: die Eindeutigkeit der Primzahlzerlegung von natürlichen Zahlen.

Primzahlen spielen u.a. bei der Untersuchung von Teilereigenschaften eine Rolle, wie nachfolgender einfacher Satz zeigt.

Satz 2.5: Ist p prim und p ⁄ ab, so folgt (p ⁄ a oder p ⁄ b) oder (p ⁄ a und p ⁄ b): d.h. ist ein Produkt ab teilbar durch eine Primzahl p, so ist mindestens einer der Faktoren a,b durch p teilbar.

Beweis: Angenommen, die Behauptung ist falsch. Dann gilt insbesondere p∤ a, d.h. ggT(p,a) = 1. Aus p ⁄ ab und ggT(p,a) = 1 folgt aber nach dem Fundamentallemma p ⁄ b. Widerspruch zur Annahme, die Behauptung sei falsch.

Dieser Satz wird auch als Euklid´s erstes Theorem bezeichnet.

Man beachte, dass die Aussage falsch ist, wenn p = n keine Primzahl ist: 4 ⁄ 2 · 6, aber 4 ∤ 2 und 4 ∤ 6.

Es folgt der Hauptsatz der elementaren Zahlentheorie.

Satz 2.6: Jede natürliche Zahl n ∈, n > 1, lässt sich in Primfaktoren zerlegen, d.h. es gibt k ∈ , sodass n = p_1 p_2 p_3 ... pk. Diese Darstellung ist bis auf die Reihenfolge der Faktoren eindeutig.

Beweis der Zerlegung mittels vollständiger Induktion:

Induktionsanfang: Der Satz ist für n = 2 richtig.

Induktionsannahme: Der Satz sei gültig für alle m < n.

Induktionsschluss: Zu zeigen: unter dieser Annahme ist der Satz auch gültig für n.

Man betrachte die Menge T der Teiler von n, die größer sind als 1. Diese Menge ist nicht leer, denn n ⁄ n und n > 1. Man wähle das kleinste Element p1 ∈ T, d.h. p_1 ⁄ n und p_1 < pi, i = 2, 3, ... . Es muss p_1 eine Primzahl sein, denn andernfalls hätte p_1, und damit auch n, einen Teiler q > 1 mit q < p_1 und p_1 wäre nicht das kleinste Element von T. Demnach gilt n = p_1m und m < n. Also kann auf m die Induktionsannahme angewandt werden und es ist n = p_1 p_2 ... pk.

Beweis der Eindeutigkeit der Zerlegung:

Es seien n = p_1 p_2 ... pk = q_1 q_2 ... qr zwei verschiedene Primzahlzerlegungen, wobei o.B.d.A angenommen werden kann, dass k ≤ r ist

Wegen p_1 ⁄ n folgt p_1 ⁄ q_1 q_2 ... qr. Also gibt es ein qi mit qi = p_1. Da es auf die Reihenfolge nicht ankommt, ist o.B.d.A. q_1 = p_1. Man erhält p_2p_3 ... pk = q_2 q_3 ... qr. Diese Überlegung wird wiederholt, bis links alle pi gekürzt sind. Wäre nun k ≠ r, so bliebe zum Schluss die Beziehung 1 = qk+1 qk+2 ... qr, was nicht möglich ist.

Der Hauptsatz besagt die Eindeutigkeit der Zerlegung bis auf die Reihenfolge. Es ist aber üblich, von einer kanonischen Zerlegung auszugehen, in der die Primzahlen pi nach ihrer Größe gereiht werden und gleiche Faktoren zu Potenzen mit der entsprechenden „Vielfachheit“ zusammengefasst werden:

Beispiel:

n = 2^2 ⋅ 3^0 ⋅ 5^1 = 20

Aus der Primzahlzerlegung und den Teilereigenschaften kann man sich unmittelbar folgende Beobachtung überlegen:

Satz 2.7: Zwei Zahlen a, b sind genau dann relativ prim (d.h.: ggT(a,b) = 1), wenn jede Primzahl p, die in der Zerlegung von a vorkommt, nicht in der Zerlegung von b vorkommt und umgekehrt.

Wegen des Hauptsatzes betrachtet man die Menge der Primzahlen  sozusagen als die atomaren Bausteine von . Somit ist die Frage, ob  endlich ist oder nicht, eine wichtige. Darauf hat bereits Euklid die Antwort gewusst und auch der Beweis des nachfolgenden Satzes geht auf ihn zurück.

Satz 2.8: Es gibt unendlich viele Primzahlen.

Beweis: indirekt. Gäbe es nur k verschiedene Primzahlen, so bilde man die natürliche Zahl n = p_1 p_2 ... pk + 1.

Nach dem Hauptsatz ist in der Zerlegung von n ein pi>i ∈ {p_1, p_2, ..., pk} enthalten.

Wegen pi ⁄ n folgt pi ⁄ (p_1 p_2 ... pk) + 1 und wegen pi ⁄ (p_1 p_2 ... pk) folgt pi ⁄ 1. Widerspruch.

Aus dem Hauptsatz ergibt sich auch das Sieb des Eratosthenes von Kyrene (um 250 v. Chr.) zur Bestimmung der Primzahlen ≤ n:

Man schreibt die Zahlen in einer Liste auf: 2, 3, 4, 5, ..........n–1, n und streicht der Reihe nach die Vielfachen von 2, 3 bzw. der noch nicht gestrichenen Zahlen i. Es genügt dabei, wie wir früher bei den allgemeinen Teilereigenschaften wegen der komplementären Teiler schon überlegt haben, bis i = √n zu gehen. Die verbleibende Liste entspricht der Liste der Primzahlen < n.

Die Erforschung von Primzahlen hat besonderes akademisches Interesse hervorgerufen und auch eine Reihe von nach wie vor ungelösten Fragen aufgeworfen.

Man interessiert sich für die Anzahl π(x) der Primzahlen p < x, wofür bislang „nur“ eine grobe Abschätzung existiert:

Ebenso ist unbekannt ob es unendlich viele Primzahlzwillinge (d.h. p und p+2 sind Primzahlen), z.B. (5, 7), (11,13), (17, 19) gibt. Weiters ist unbekannt, ob es unendlich viele Fermat´sche Primzahlen (Pierre de Fermat, 1601 – 1665) gibt (das sind Primzahlen der Form 2^2 i + 1 mit i ∈ 0, z.B.: 2, 5,17), oder ob es unendlich viele Mersenne´schen Primzahlen (Marin Mersenne, 1588 – 1648) gibt (Primzahlen der Form 2p – 1 mit p prim, z.B. 3, 7, 31).

Das besondere Interesse an Primzahlen ist in erster Linie in ihren Anwendungen in der Kryptographie begründet. So fußt das RSA Verfahren (R.L. Rivest, A. Shamir, L. Adleman, 1978), auch als Public Key Cryptosystem bezeichnet, auf der Zerlegung von sehr großen natürlichen Zahlen n in ihre Primfaktoren. Das RSA-Verfahren wiederum ist die Grundlage der heute gängigen elektronischen Signaturen (elektronischen Unterschriften). Ferner finden Primzahlen in der Algebra eine besondere Anwendung und werden auch in der Informatik bei Verfahren im Bereich Algorithmen und Datenstrukturen eingesetzt. Ebenso benützen die meisten Verfahren zur Erzeugung von Zufallszahlen, wie man sie bei der Simulation von Experimenten im Computer benötigt, geeignete (große) Primzahlen. Daher benötigt man Kenntnis über große Primzahlen bzw. benötigt Verfahren, die für große n in „vernünftiger“ Zeit entscheiden, ob eine vorgegebene Zahl eine Primzahl ist oder nicht. Das Sieb des Eratosthenes ist von der Rechenzeit her gesehen für große n nicht mehr brauchbar

2.3. Lineare diophantische Gleichungen

Mit den nachstehenden Gleichungen hat sich bereits Diophantos von Alexandria (3. Jhdt. n. Chr.) befasst. Es geht dabei um ganzzahlige () Lösungen von Gleichungen der Gestalt

ax + by = c. (d.h. (x,y) aus 2)

Wir beschränken uns auf lineare diophantische Gleichungen. Ein Beispiel für eine quadratische wäre x^2 + y^2 = z^2 mit der Lösung x = 4, y = 3, z = 5 oder x = 5, y = 12, z = 13. (Für ein ;verwandtes Problem, den „großen Satz von Fermat“, xn + yn = zn mit n > 2 und x, y, z ∈  konnte erst 1997 der Nachweis der Unlösbarkeit endgültig erbracht werden.)

Betrachten wir folgendes Beispiel: 65 x + 20 y = 15

Durch Probieren erkennt man, dass etwa x = +3, y = –9, aber auch x = –1, y = 4 Lösungen sind. Weiter unten werden wir zeigen, dass es sogar unendlich viele Lösungen gibt.

Nun betrachten wir die Gleichung 3 x + 6 y = 3(x + 2 y) = 1.

Sie hat keine ganzzahlige Lösung, denn entweder ist (x + 2y) ≠ 0, dann wäre 3 Teiler von 1, oder es ist (x + 2y) = 0, dann wäre 0 = 1. Widerspruch!

Die Frage, wann solche linearen diophantischen Gleichungen lösbar sind, beantwortetfolgender

Satz 2.9: Die lineare diophantische Gleichung ax + by = c mit a, b, c, x, y ∈ ist genau dann lösbar, wenn für d = ggT(a,b) gilt: d ⁄ c.

Beweis: „⇒“ (die Bedingung ist notwendig):

Sei ax + by = c lösbar. Wegen d ⁄ a und d ⁄ b folgt d ⁄ c.

„⇐“ (die Bedingung ist hinreichend):

Ist d = ggT(a,b), so gibt es nach dem Hauptsatz über den ggT zwei Zahlen x0, y0 ∈ Z mit ax0 + by0 = d.

Wegen d ⁄ c ist   und durch Multiplikation der Gleichung mit    erhält man

Somit gilt: ax + by = c hat die Lösung

Vorhin haben wir gesehen, dass eine Lösung, sofern sie existiert, nicht eindeutig ist. Dazu gilt folgendes allgemein: Hat ax + by = c die Lösung x1, y1 ∈   so erhält man alle Lösungen durch

2.4. Kongruenzen und Restklassensysteme

2.4.1. Kongruenzen

Wir beginnen mit einem Beispiel, das uns bewusst macht, dass die Art des Rechnens, wie sie in diesem Kapitel besprochen wird, durchaus im Alltag gängig ist:

Wenn jemand um 23 Uhr zu Bett geht und 8 Stunden liegen bleibt, steht diese Person um 7 Uhr, und nicht um 31 Uhr auf. Der Rechengang ist offensichtlich 23 + 8 = 31 und 31 = 1 · 24 + 7. JAVA oder C-Programmierer würden gleich x = (23 + 8) % 24 schreiben. Der Mathematiker spricht hier vom von „31 modulo 24“ (Rest bei Divison von 31:24). Das nächste Beispiel ist nur insofern „komplizierter“, als Informatiker mit 0 zu zählen beginnen und es lieber sähen, wenn die Null zu den natürlichen Zahlen hinzugerechnet wäre: Eine Web-Kamera mache jede Minute ein Bild und dieses werde in einem Puffer der Größe 64 – Informatiker lieben ja 2er Potenzen – abgelegt. Die Pufferpositionen sind mit 0, 1, ..., 63 nummeriert, d.h. Puffer P = P [0], P [1], ..., P [63].

Die erste Aufnahme sei das Bild mit der Nummer 0 um 8.00 Uhr. Die letzte Pufferposition P [63] wird mit dem 64-sten Bild (mit der Nummer 63) um 9.03 Uhr belegt. Dann beginnt man den Puffer von vorne zu überschreiben. Das 65-ste Bild (mit der Nummer) von 9.04 Uhr 64 kommt nach P [0] usw.: der Puffer, so sagt man, wird zyklisch überschrieben. Wo liegt das Bild, welches um 10.05 Uhr aufgenommen worden ist? Es ist das 126-ste Bild mit der Nummer 125. (Wir erinnern uns: das i-te Bild bekam in der ersten Runde die Nummer j = i – 1 und wurde auf P [j] abgelegt.) Es ist j = 125 = 1 · 64 + 61. Das Bild liegt in P [61].

Die Beobachtungen an den vorigen Anwendungsbeispielen wollen wir nun formalisieren und definieren.

Definition 2.5: Seien a, b ∈  und m ∈.

Es heißt „a kongruent b modulo m“, wenn m ⁄ (a–b). Man schreibt a ≡ b mod m oder auch a ≡m b. Die Zahl m ist der Modul.

In obiger Definition kann man den Modul sofort in Zusammenhang mit dem Divisionsrest bringen, es gilt folgender

Satz 2.10: a ≡ b mod m genau dann, wenn die positiv kleinsten Reste von a und b bei der Division durch den Modul m übereinstimmen.

Der Beweis ist einfach und sei kurz zur Übung geführt.

„⇐“(hinreichend): Ist r_1 = r_2, so gilt

a = mq_1 + r_1 und b = mq_2 + r_1.

a – b = m(q_1 –q_2) daher m ⁄ (a – b) ⇒ a ≡ b mod m

„⇒“ (notwendig): Ist a ≡ b mod m, also m ⁄ (a – b) und

a = mq_1 + r_1 und b = mq_2 + r_2, wobei o.B.d.A. r1 ≥ r_2. Dann ist

a – b = mq_1 + r_1 – mq_2 – r_2 und daher

r_1 – r_2 = (a – b) – m (q_1 – q_2) und wegen m ⁄ (a – b)

folgt m ⁄ (r_1 – r_2).

Wegen 0 ≤ r_2 ≤ r_1 < m folgt hieraus r_1 – r_2 = 0, also r_1 = r_2.

Ferner beobachten wir durch einfaches Nachrechnen

(i) a ≡ a mod m (reflexiv)

(ii) a ≡ b mod m ⇒ b ≡ a mod m (symmetrisch)

(iii) a ≡ b mod m, b ≡ c mod m → a ≡ c mod m (transitiv)

Die Kongruenz „≡“ ist also eine Äquivalenzrelation und wir brauchen zwischen Zahlen, die bezüglich dem Modul m denselben Rest bei der Division ergeben, nicht zu unterscheiden, „wenn wir sie modulo m betrachten“.

Beispielsweise erklärt die Kongruenz modulo 2 zwei Äquivalenzklassen: die geraden und die ungeraden Zahlen.

Die nachfolgenden Rechenregeln lassen sich durch Zurückführen auf die Definition von a ≡ b mod m ableiten.

(i)  a ≡ b mod m      →               a + c ≡ b + d mod m

c ≡ d mod m                              a – c ≡ b – d mod m

(ii) a ≡ b mod m, k ∈  →     ka ≡ kb mod m.

Wir halten fest, dass die Umkehrung der Regel (ii) im Allgemeinen aber nicht gilt: 3 · 1 ≡ 3 · 2 mod 3, aber 1 ≢ 2 mod 3

(iii)  a ≡ b mod m    →               ac ≡ bd mod m

c ≡ d mod m und daraus folgt:

a_1 ≡ b_1 mod m, ..., an ≡ bn mod m      →      a_1 a_2 ... an ≡ b_1 b_2 ... bn mod m.

Das Rechnen mit Kongruenzen über den ganzen Zahlen kann man auch auf das Rechnen mit Polynomen übertragen.

Satz 2.11: Sei p(x) = cn xn + cn-1 xn-1 + ... c^1x + c^0 mit ci ∈

Ist a ≡ b mod m, so ist p(a) ≡ p(b) mod m.

Der Beweis ergibt sich aus der Anwendung der vorigen Rechenregeln:

Nach (iii) folgt aus a ≡ b mod m die Beziehung ai ≡ bi mod m,

nach (ii) folgt aus ai ≡ bi mod m die Beziehung ciai ≡ cibi mod m und

nach (i) kann man aufsummieren, da wegen a,b ∈  auch p(a) und p(b) ∈ .

2.4.2. Restklassensysteme

Wie vorhin erwähnt wird mit a ≡ b mod m eine Äquivalenzrelation erklärt, indem man bezüglich m zueinander kongruente Zahlen in Klassen (Restklassen mod m) zusammenfasst.

Aus diesen Klassen wählt man beispielsweise als Repräsentanten die m kleinsten nichtnegativen Zahlen 0, 1, ..., i, m-1 und diese stehen dann für eine ganz Klasse von Zahlen.

0 steht für die Menge der Zahlen mod m, die als Rest 0 haben

1 steht für diejenigen mit Rest 1

........

m–1 steht für diejenigen mit Rest m–1.

Um bei Bedarf von einer Zahl i die Restklasse i mod m zu unterscheiden, verwendet man für die Restklassen die Notation 0, 1, ..., i, m-1, oder auch [0], [1], …, [i], …, [m-1]. Man bezeichnet diese Menge mit m.

Die dem Rest r entsprechende Klasse r mod m besteht aus allen ganzen Zahlen a = mq + r, q ∈. Die Gesamtheit aller Klassen bildet ein so genanntes vollständiges Restsystem mod m:

Definition 2.6: Ein System r_1, r_2, ..., rm heißt vollständiges Restsystem mod m, wenn jede der Zahlen ri genau einer Restklasse mod m angehört, d.h. wenn sie paarweise inkongruent sind: ri ≢ rj mod m für i ≠ j.

In der Informatik ist nachstehender Satz im Zusammenhang mit folgender Aufgabe wichtig: man möchte alle Positionen P[i] eines Puffers durchlaufen, aber aus irgendwelchen Gründen von der Reihenfolge 0, 1, 2, ..., m–1 abweichen, z.B. durch j = ai + b mit i = 0, 1, ..., m–1.

Unter welchen Voraussetzungen ist sichergestellt, dass alle j tatsächlich alle Pufferpositionen erreichen?

Beispiel:

m = 4, a = 2, b = 0 ⇒ a · 0 ≡ 0, a · 1 ≡ 2, a ·2 ≡ 0, a · 3 ≡ 2 man erreicht nur 0 und 2, nicht aber 1 und 3

m = 4, a = 3, b = 0 ⇒ a · 0 ≡ 0, a · 1 ≡ 3, a · 2 ≡ 2, a · 3 ≡ 1 man erreicht alle Positionen 0, 1, 2, 3

Es gilt folgender

Satz 2.12: Ist r_1, r_2, ..., rm ein vollständiges Restsystem mod m und ist ggT(a, m) = 1 und b ∈ , dann ist auch ar_1 + b, ar_2 + b, ..., arm + b ein vollständiges Restsystem mod m.

Betrachtet man demnach die Pufferpositionen i = 0, 1, ..., m–1 als vollständiges Restsystem, so durchläuft man wieder alle Positionen mit j = ari + b wenn a und m relativ prim zueinander sind. Trivial, aber für Anwendungen wichtig ist, dass bei Wahl einer Primzahl p als Restklassenmodul bzw. Pufferlänge immer die Bedingung ggT(a, p) = 1 erfüllt ist.

Bei der Besprechung von Rechenregeln haben wir gesehen, dass die Addition, Subtraktion und Multiplikation bei Kongruenzen keine Probleme aufwerfen, wohl aber die zur Multiplikation inverse Operation, die Division. Aus a ≡ b mod m und k ∈  folgt zwar ka ≡ kb mod m nicht einfach durch k dividieren. Allerdings lässt sich folgendes zeigen:

Satz 2.13: Ist ka ≡ kb mod m und d = ggT(k,m), so gilt a ≡ b mod

Das heißt, dass man eine Kongruenz durch k dividieren kann, wenn k und der Restklassenmodul m relativ prim sind.

Wir überlegen uns, wie bzw. unter welchen Voraussetzungen man mit Restklassen x bzw. einem vollständigen Restsystem rechnen kann.

Haben wir eine Verknüpfung „“ (z.B. hier die Addition modulo m) gegeben, so vereinbart man, dass a  b  jene Restklasse erklärt, in der a ⊗b liegt.

Beispiel:

(1) Sei  die Addition, m = 7. Ein vollständiges Restsystem ist 0, 1, 2, ..., 6.

(2) Sei  die Multiplikation und m = 7 (Primzahl!)

(3) Sei  die Multiplikation und m = 6 (keine Primzahl!)

Ein vollständiges Restsystem ist 0, 1, 2, ..., 6.

.

Aber: . Das ist ungewohnt, denn vom Rechnen in  wissen wir, dass aus a ≠ 0 und b ≠ 0 folgt ab ≠ 0. Bei der Multiplikation von Restklassen können hingegen Nullteiler auftreten. Dass für m = p, prim, die Nullteilerfreiheit garantiert ist, werden wir später sehen.

Wir halten im Vorgriff auf das Kapitel über algebraische Strukturen folgendes vorab fest:

Nimmt man bei gegebenem Modul m anstatt des Restklassensystems 0, 1, ..., m-1 ein reduziertes, welches nur die primen Restklassen modulo m enthält, also jene, die zu m relativ prim sind, (z.B: m = 6: 1, 5), dann bildet dieses eine Gruppe mit der Multiplikation modulo m als Verknüpfung. Im Spezialfall m = p, prim, ist dies trivialerweise für 1, ..., p-1 erfüllt.

Solche Gruppen werden kurz mit p oder mit (p,.) bezeichnet.

Zur späteren Erklärung, warum für ( m,.) gefordert wird, dass die als Gruppenelemente enthaltenen Restklassen relativ prim zu m sein müssen, besprechen wir vorab kurz lineare Kongruenzen.

Die Frage ist jetzt, ob bzw. unter welchen Voraussetzungen die Kongruenz („Gleichung“)

ax ≡ b mod m, x ∈

Ist ax ≡ b mod m ganzzahlig lösbar, gilt m ⁄ (ax–b), d.h. ax – b = my und somit ax – my = b. Dies ist eine Diophantische Gleichung, und notwendig sowie hinreichend für die Existenz einer Lösung ist d = ggT(a,m) ⁄ b. Alles zusammengefasst resultiert in folgendem

Satz 2.14: Die Kongruenz ax ≡ b mod m mit x ∈ ist dann und nur dann lösbar, wenn d = ggT(a,m) ⁄ b. Ist die Kongruenz lösbar, so hat sie d verschiedene Lösungen. Daraus folgt speziell für ggT(a,m) = 1:

Satz 2.15: Die Kongruenz ax ≡ b mod m mit ggT(a,m) = 1 ist für jedes b ∈ durch eine und nur eine (d.h.:„genau eine“) Restklasse x mod m lösbar.

Genau das ist es, was man bei Gruppenverknüpfungen neben dem Assoziativgesetz verlangen muss: ax ≡ a mod m muss ein eindeutige Lösung haben (garantiert die Existenz des Einselements) und ax ≡ 1 mod m muss ein eindeutige Lösung haben, (garantiert die Existenz des zu a inversen Elements).

Ist m = p eine Primzahl, dann enthält (p,.) offensichtlich p–1 Elemente, die „Ordnung“ von ( p,.) ist p–1. Wie viele Elemente enthält (m,.), wenn m nicht prim ist? Zur Beantwortung dieser Frage benötigen wir zunächst die Definition der nach dem Mathematiker Leonhard Euler (1707 -1783) benannten zahlentheoretischen Funktion φ(n).

Definition 2.7: Die Eulersche φ-Funktion φ(n) ist die Anzahl der zu n teilerfremden Zahlen aus {1,2,…,n}.

Ohne Beweis geben wir folgende Eigenschaften von φ(n) an:

(i) φ(n) ist eine multiplikative zahlentheoretische Funktion, d.h. wenn ggT(a,b) = 1, dann ist φ(ab) = φ(a) . φ(b).

(ii)   für alle a ∈ : es wird über alle Primfaktoren von a multipliziert.

Folgerung: ist p prim, so ist φ(p) = p-1.

Beispiel:

φ(1) = 1; φ(2) = 1; φ(3) = 2 ; φ(10) = 4 ; φ(11) = 10 ; φ(12) = 4.

2.4.3. Simultane Kongruenzen

Das Problem bei simultanen Kongruenzen ist ähnlich wie bei Gleichungssystemen. Man gibt mehrere Beziehungen – hier Kongruenzen statt Gleichungen – vor und sucht eine Lösung x (d.h. eine Restklasse x), die allen Kongruenzen „gleichzeitig“ (daher: simultan) genügt.

Gegeben seien Moduln m_1, m_2, ..., mk und Klassen c_1, c_2, ..., ck sowie die Kongruenzen

x ≡ c_1 mod m_1

x ≡ c_2 mod m_2

......................

x ≡c_3 mod mk

Beispiel:

x ≡ 1 mod 2, x ≡ 2 mod 3, x ≡ 4 mod 5

Dann ist x = 59, aber auch x = –1, eine Lösung.

Auskunft über die Lösbarkeit gibt der Hauptsatz über simultane Kongruenzen, der auch als Chinesischer Restsatz bezeichnet wird, weil der chinesische Mathematiker Sun Tsu (ca. 300 n. Ch.) das Problem gelöst und einen Lösungsalgorithmus angegeben hat. Wir verzichten hier auf einen Beweis.

Satz 2.16: Sind die Moduln m_1, m_2, ..., mk paarweise relativ prim, dann ist das System x ≡ ci mod mi, i = 1, 2,..., k, stets lösbar und die Lösung ist modulo M = m_1 m_2 ... mk eindeutig.

Ein Lösungsverfahren wurde auch von Carl Friedrich Gauß (1777 – 1855) angegeben.

(1) Bilde die Zahlen

Man beachte dazu, dass ggT(Mi,mi) = 1 ist, da die (mi,mj) paarweise relativ prim sind.

(2) Mit Rückblick auf lineare Kongruenzen wissen wir, dass jede der folgenden

Kongruenzen eindeutig lösbar ist:

M_1y_1 ≡ 1 mod m1

M_2y_2 ≡ 1 mod m2

......................

M_3y_3 ≡ 1 mod mk

(3) Es kann nun gezeigt werden, dass die Lösung folgende Gestalt hat:

x = c_1 M_1 y_1 + c_2 M_2 y_2 … + ck Mk yk

Beispiel:

2.4.4. Quadratreste

Über die Lösbarkeit der linearen Kongruenz ax ≡ b mod m mit x ∈  gibt der Satz 2.15 Auskunft: sie ist dann und nur dann lösbar, wenn d = ggT(a,m) ⁄ b. In diesem Fall hat sie d verschiedene Lösungen. Im Spezialfall ggT(a,m) = 1 ist ax ≡ b mod m für jedes b∈  durch genau eine Restklasse x mod m lösbar.

Eine Verallgemeinerung der Fragestellung erhält man durch

Definition 2.8: Ist ggT(a,m) = 1, so heißt a n-ter Potenzrest modulo m, wenn es ein x gibt mit xn ≡ a mod m.

Wir beschränken uns hier auf Quadratreste, also auf den Spezialfall n = 2:

Definition 2.9: Ist ggT(a,m) = 1 so heißt a Quadratrest modulo m, wenn es ein x ∈ gibt, sodass x^2 ≡ a mod m. Gibt es so ein x nicht, heißt a Nichtrest modulo m.

Wir schreiben manchmal zur Vereinfachung QR(m) bzw. NR(m).

Für m = 2 sind offensichtlich die ungeraden Zahlen a ≡ 1 mod m, also die Restklasse 1 eine Lösung.

Für den Fall m = 2k, k ≥ 3 gilt folgender Satz:

Satz 2.17: Eine Zahl a ∈  ist genau dann quadratischer Rest mod 2k, k ≥ 3, wenn a ≡ 1 mod 8.

Im Falle k = 2, also m = 2k = 4 ist die Lösung durch a ≡ 1 mod 4 gegeben. Da ferner die Untersuchung der Quadratereste mod m sich auf die Quadratreste der Primfaktoren von m reduzieren lässt, genügt es, die Diskussion für p > 2, zu führen. Wir geben ohne Beweis die dazu gehörigen Sätze an:

Satz 2.18: Es sei m = p_1e_1 p_2e_2 ...pses, die Primzahlzerlegung von m ≥ 2. Dann ist a ∈ genau dann ein quadratischer Rest mod m, wenn a ein QR(piei) für i = 1,2,…,s ist.

Satz 2.19: Ist mit k ∈ , k ≥ 1 und p > 2, p prim, a ein QR (pk), so ist a auch QR(p), und umgekehrt.

Im folgenden sei demnach stets p > 2, prim, angenommen.

Um alle Quadratreste mod p zu bestimmen, kann man in einem ersten Ansatz die Folge 1^2, 2^2, 3^2, … i^2, (p-1)2 erzeugen und jeweils i^2 ≡ a mod p berechnen.

Die Frage ist, ob man damit tatsächlich alle QR(p) erhält und ob man wirklich bis i = (p-1) durchprobieren muss. Die Antwort darauf geben die beiden nachstehenden Sätze:

Satz 2.20: Die Zahlen 1^2, 2^2, … ((p-1)/2)2 sind alle inkongruent mod p. Das heißt, mit i^2 ≡ a mod p, i = 1,2,…(p-1)/2 erhält man (p-1)/2 Quadratreste.

Beweis: Sei r ≠ s und r, s ≤ (p-1)/2, also r + s < p-1 und wäre r^2 ≡ s^2 mod p. Dann ist entweder r ≡ s mod p oder r ≡ -s mod p. Ersteres kann wegen r ≠ s nicht sein. Letzteres hieße p⁄(r+s) mit r+s < p-1. Widerspruch.

Satz 2.21: Für p > 2 gibt es genau (p-1)/2 Quadratreste QR(p) und (p-1)/2 Nichtreste NR(p).

Beweis: Nach Satz 2.20 haben wir bereits (p-1)/2 verschiedene QR(p) gefunden. Es bleibt zu zeigen, dass diese alle sind. Wegen r2 ≡ p2 - 2pr + i2 mod p gilt r2 ≡ (p-r)2 mod p.

Demnach ist es gleichgültig, ob man von r = 1,2,…(p-1)/2 der Reihe nach vorgeht, oder von (p-1) bis (p-1)/2 die Quadratreste berechnet: nach (p-1)/2 erhält man wegen obiger Beziehung wieder nur Lösungen, die man schon berechnet hat.

Daher gibt es nur (p-1)/2 Quadratreste und demnach genau (p-1)/2 Nichtreste mod p.

Der Ansatz von Satz 2.20 liefert eine einfache Methode, um alle QR(p), p > 2, zu bestimmen. Algorithmisch braucht man gar nicht einmal zu quadrieren, denn die Folge der Quadrate 1, 2^2, 3^2, …r^2 erhält man als Summe der ungeraden Zahlen von 1 bis 2r -1:

Will man bei gegebenem p und a testen, ob QR(a) oder NR(a) gilt, so hat der vorige direkte Ansatz den Nachteil, dass man alle (p-1)/2 Möglichkeiten durchprobieren muss. Daher verwendet man zum Testen auf QR(p) bzw. NR(p) das Euler´sche Kriterium, das wir ohne Beweis angeben:

Satz 2.22: (Kriterium von Euler):

Ist a ∈  prim zu p > 2, so ist a

QR(p) genau dann, wenn a(p-1)/2 ≡ 1 mod p, NR(p) genau dann, wenn a(p-1)/2 ≡ -1 mod p.

Weitere interessante Ergebnisse aus der Theorie der Quadratreste sind u.a. folgende:

Satz 2.23: Für Quadratreste QR(p) und Nichtreste NR(p) gelten für p > 2:

QR(p) · QR(p) = QR(p)

QR(p) · NR(p) = NR(p)

NR(p) · NR(p) = QR(p)

Satz 2.24: 2 ist ein QR(p) für Primzahlen der Gestalt p = 8k 1 und ein NR(p) für Primzahlen der Gestalt p = 8k  3.

Beide Sätze liefern eine nette Anwendung beim Durchsuchen von Tabellen mit Hilfe sogenannter quadratischer Kollisionsstrategien. Darauf kommen wir im Kapitel über Anwendungen zurück.

2.5. Übungsaufgaben

2.1: Man berechne ggT(120, 32) mit dem Euklid’schen Algorithmus

2.2: Man finde Zahlen u, v sodass ggT(345, 123) = u*345 + v*123

2.3: Man bestimme kgV(26,14) mit Hilfe des größten gemeinsamen Teilers.

2.4: Man führe eine Primfaktorzerlegung von 60 bzw. 135 durch und berechne ggT und kgV der beiden Zahlen. Was fällt auf?

2.5: Man finde alle ganzzahligen Lösungen von

(a) 6x + 8y = 7

(b) 6x + 8y = 10

2.6: Sei p(x) = 3x^2 + x + 1 und seien a=8, b=3 und m = 5

Man überprüfe, ob p(a) ≡ p(b) mod m gilt und interpretiere das Ergebnis.

2.7: Bildet …

(a) {5, 2, 8, –1, 11}

(b) {2, 7, 1, 0, 14}

… ein vollständiges Restsystem modulo 5?

2.8: Man löse, falls möglich:

(a) 2x ≡ 5 mod 7

(b) 3x ≡ 4 mod 6

2.9: Wieviele Elemente haben:

(a) (17, ⋅)

(b) (12, ⋅)

2.10: Man löse folgendes System simultaner Kongruenzen:

x ≡ 2 mod 3

x ≡ 4 mod 5

x ≡ 5 mod 7

2.6. Applets

- GGT

Berechnet den größten gemeinsamen Teiler d=ggT(a,b) und visualisiert die Zwischenschritte des verwendeten Euklidisch´en Algorithmus. Liefert die Darstellung d = ax + by.

- Factorization

Zerlegt eine Zahl n ≤ 2147483647 in ihre Primfaktoren und berechnet alle Teiler.

- Primzahlen

Untersucht eine Zahl n auf verschiedene Eigenschaften bzw. berechnet solche wie: t(a) Zahl der positiven Teiler, Summe der Teiler, p(a) Produkt der Teiler, Euler´sche Funktion Φ(n), stellt fest, ob n Primzahl, Mersenne-Primzahl, Fermat-Zahl, Quadratzahl, vollkommene Zahl ist, liefert die Teiler von n und eine Faktorisierung und stellt diese Zerlegungen graphisch dar.

- Additive Restklassengruppe

Liefert die Gruppentafel für die additive Restklassengruppe.

- Multiplikative Restklassengruppe

Liefert die Gruppentafel für die multiplikative Restklassengruppe.

- Quadratreste

Bestimmt die Quadratreste zu einer Primzahl p ≤ 97.

- Sieve_of_Eratosthenes

Berechnet die Primzahlen p ≤ 97 und visualisiert den Siebvorgang

Abb. 2.1: Screenshots Applet: „Additive Restklassengruppe“

3. Analytische Geometrie

3.1. Koordinatensysteme und Vektoren

Das Ziel dieses Kapitels ist, einige Grundlagen der Vektorenrechnung auf anschaulicher Basis einzuführen bzw. zu wiederholen. Später, wenn Vektoren und Vektorräume allgemein besprochen werden, gehen wir umgekehrt vor: man definiert formal die Konzepte und veranschaulicht diese dann durch entsprechende Zeichnungen in der Ebene oder im Raum.

Beim bekannten Konzept der Zahlengeraden für  beginnen wir mit der Ebene:

(1) Lege einen beliebigen Punkt O als sogenannten „Ursprung“ fest.

(2) Ziehe durch O zwei beliebige zueinander nicht parallele Geraden x_1 und x_2.

(3) Markiere auf x_1 zum Zwecke der Normierung einen Punkt E_1 und weise ihm die Zahl 1 zu.

(4) Führe Analoges für die Gerade x_2 durch.

Dabei ist es gar nicht ;notwendig – aber wohl praktisch –, dass die Strecken OE_1 und OE_2 gleich lang sind.

Es ist anschaulich klar, wie man einen Punkt P der Ebene mit seinen reellen Koordinaten(p_1,p_2) aufgespannte Ebene eindeutig einzeichnen kann.

Abb. 3.1

Ferner können wir eine gerichtete Strecke von O nach P: „ “, kurz p, einzeichnen. Man nennt p den Ortsvektor von P und bezeichnet ihn mit p = (p1,p2), wobei p1 seine Koordinate auf der x1-Achse und p2 die Koordinate auf der x2 -Achse ist.

Im zweidimensionalen Fall, also in der Ebene, ist es auch üblich, die x_1-Achse als x-Achse und die x_2-Achse als y-Achse zu bezeichnen.

In vielen Fällen – aber nicht immer – ist es zweckmäßig, wenn die beiden Koordinatenachsen x_1, x_2 senkrecht zu einander stehen und | OE_1 | = | OE_2 | ist. Man nennt so ein Koordinatensystem ein kartesisches Koordinatensystem, welches die Ebene in 4 Quadranten (s. Abb. 3.2) teilt, wobei gegen den Uhrzeigersinn nummeriert wird.

Die x-Achse heißt Abszisse und die y -Achse nennt man Ordinate.

Abb. 3.2

Die letztere Vereinbarung stammt aus einer allgemeinen Konvention in der Geometrie: durchläuft man eine geschlossene Kurve, z.B. einen Kreis, dem Uhrzeigersinn entgegengesetzt, so bezeichnet man sie als positiv orientiert, andernfalls (also im Uhrzeigersinn) als negativ orientiert.

Abb. 3.3

3.2. Vektoren

Wir betrachten nun die Menge aller p = (p1, p2) mit p1, p2 ∈ sowie ein beliebiges λ ∈  und finden bei Betrachtung der Abb. 3.4, dass folgende Definition sinnvoll ist:

Es ist aus Gründen der Übersichtlichkeit üblich, Vektoren p = (p1,p2) als Spaltenvektoren zu schreiben, man hätte genau so gut wie folgt notieren können: λ p = (λ p1, λ p2) = p λ.

Die reelle Zahl λ streckt mit | λ | > 1 den Ortsvektor p und verkürzt ihn für | λ | < 1.

Abb. 3.4

Der Spezialfall λ = –1 bewirkt, dass p umorientiert wird und im Beispiel der Abb. 3.14 nun in den 4. Quadranten zeigt.

Wir beobachten auch, dass der Winkel α durch die Operation λ p unverändert bleibt.

Zweck des Ortsvektors war es, die Lage des Punktes P im Koordinatensystem zu beschreiben.

Sind wir aber nur an der Länge des Pfeiles und seiner Richtung interessiert, so ist es egal, wohin wir ihn zeichnen, solange dies nur durch Parallelverschiebung ohne Änderung der Richtung und ohne Streckung bzw. Kürzung erfolgt. Durch dieses Parallelverschieben entsteht eine Äquivalenzrelation und es genügt daher fortan, einfach von einem „Vektor“ zu sprechen. Die Option steht dann frei, bei Zeichnungen als Repräsentant einer Äquivalenzklasse genau den Ortsvektor auszuwählen und einzuzeichnen.

Das Wesen eines Vektors p sind seine Länge und seine Richtung und nicht, wo er in der Ebene eingezeichnet wird.

Abb. 3.5

Es ist für die Vektorrechnung wichtig, dass zwischen äquivalenten Vektoren nicht unterschieden wird.

Man kann auch folgendes Gedankenspiel üben: man lasse p fest und verschiebe stattdessen den Ursprung O (bzw. das Koordinatensystem) parallel zu den Achsen, bis O am Beginn des durch (p1, p2) beschriebenen Pfeils (Vektors p) liegt.

3.2.1. Addition und Subtraktion

Als nächstes wollen wir zwei Vektoren a und b miteinander verknüpfen und konzentrieren uns zunächst nur auf die Addition bzw. die durch sie erklärte Subtraktion.

Beim „Produkt“ von Vektoren wird die Sache etwas komplizierter und wir verschieben die Diskussion darüber vorerst.

Definition 3.1:

Man hat dafür sofort eine geometrische Deutung parat bzw. kommt bei Betrachtung der Abb. 3.6 zum Schluss, dass obige Definition zweckmäßig ist.

Da die Komponenten der Vektoren a, b reelle Zahlen sind, lassen sich sofort folgende Gesetze überprüfen:

(1) Assoziativgesetz

(a + b) + c = a + (b + c)

(2) Kommutativgesetz

a + b = b + a

Ferner beobachten wir, dass mit λ = –1 gilt

–1 · a = -a

und man kann gleich die Vektorsubtraktion als Spezialfall der Addition einführen:

b – a = b + (–a)

Erklärt man den Vektor (0,0) als Nullvektor O, so erhält man

a – a = o und a + o = a

Die geometrische Deutung der Addition zeigt Abb. 3.6. Die Subtraktion stellen wir in Abb. 3.7 dar.

Abb. 3.6

Abb. 3.7

Es gilt a + x = b ⇒ -a + a + x = b – a ⇒ x = b – a

In Abb. 3.8 betrachten wir einen Vektor p vom Ursprung O zu einem Punkt p = (p1,p2) in einem kartesischen Koordinatensystem.

Abb. 3.8

Die Länge von p entspricht der Entfernung von P vom Ursprung und wir erhalten sofort (Satz von Pythagoras)

(die formale Definition von ||p|| folgt in Definition 3.3)

3.2.2. Skalarprodukt

Wir befassen uns nun mit der Multiplikation von Vektoren und werden im Zusammenhang mit der nachstehenden Definition eine interessante Beobachtung machen.

Definition 3.2: Sind a = (a1, a2) und b = (b1, b2) zwei Vektoren, so definiert man ihr Skalarprodukt (oder: Inneres Produkt) a · b := a_1b_1 + a_2b_2.

Wie man sieht, ist das Ergebnis dieser Operation mit Vektoren kein Vektor, sondern eine reelle Zahl, ein so genannter „Skalar“ (daher die Bezeichnung Skalarprodukt).

Statt a · b schreibt man häufig auch kurz a b.

Für den Spezialfall p = a = b erhält man p · p = p_1^2 + p_2^2.

Damit hat man durch Einführen einer Operation mit Vektoren, nämlich durch das Skalarprodukt, einen Zusammenhang mit der Länge eines Vektors hergestellt, was eine eigene Bezeichnung verdient:

Definition 3.3: || v || := √ v . v heißt Norm oder Länge von v

Zur Notation sei erwähnt: es ist durchaus auch üblich, anstatt des Zeichens || für die Norm bloß einen Strich wie beim Absolutbetrag zu verwenden: |v|, weil man auch statt der Länge vom „Betrag eines Vektors” sprechen kann, insbesondere wenn man im 2- bzw. 3 dimensionalen Raum bleibt. Wir geben dem Begriff Norm mit dem Zeichen || den Vorzug.

Später werden wir sehen, dass diese Definition nicht nur in der Ebene (2) oder im Raum(3) sondern allgemein in n, also im n-dimensionalen Raum, nützlich ist.

Es sei noch folgende Vorabinformation hinzugefügt: Im 3 gibt es neben dem Skalarprodukt auch noch das vektorielle (oder: äußere) Produkt, auf das wir später eingehen. Aus den Bezeichnungen können wir schließen, dass das vektorielle Produkt „a × b“ zweier Vektoren einen Vektor in 3 als Ergebnis hat, während das Skalarprodukt einen Skalar λ ∈ liefert.

Wir untersuchen nun einige Eigenschaften des Skalarprodukts:

Sei λ ∈ Dann gilt: (λ a) b = a (λ b) = λ (a b)

Das Assoziativgesetz für das Skalarprodukt selbst gilt im Allgemeinen nicht!

a (b c) ≠ (a b) c

Daher ist auch die Schreibweise a b c ohne Klammern sinnlos. Es gibt keine skalare Multiplikation mehrerer Vektoren. Betrachten wir dazu folgendes Beispiel:

a = (1, 1), b = (1, 2), c = (1, 3)

a b = 1 + 2 = 3, ein Skalar. Daher (a b) c = 3 c = (3, 9) ein Vektor.

b c = 1 + 6 = 7, ein Skalar. Daher a (b c) = a · 7 = (7, 7) ein anderer Vektor.

Als nächstes wollen wir den Winkel zwischen zwei Vektoren a und b berechnen.

Vorerst machen wir einen kleinen Umweg zum „Cosinus-Satz“, den wir anhand von Abb. 3.9 für spitze Winkel α und β in Erinnerung rufen. (Für einen stumpfen Winkel geht man analog vor (Abb. 3.10)).

Abb. 3.9

Abb. 3.10

Es gilt

a^2 = h^2 + (c – q)2 = h^2 + c^2 – 2 c q + q2

h^2 = b^2 – q2

q = b cos α

Durch Ausrechnen erhält man a^2 = b^2 + c^2 – 2 b c cos α. Analog geht man für die Seiten b und c vor, sodass wir als Ergebnis den sogenannten Cosinus-Satz erhalten:

a^2 = b^2 + c^2 – 2 b c cos α

b^2 = a^2 + c^2 – 2 a c cos β

c^2 = a^2 + b^2 – 2 a b cos γ

Zur Bestimmung des Winkels zwischen Vektoren a und b verschieben wir die beiden Vektoren, sodass ihre Anfangspunkte zusammenfallen (Abb. 3.11).

Abb. 3.11

Die Länge von b ist || b || und die von a ist || a || und wir setzen cos α = cos (a, b).

Ferner kennen wir den Vektor c von B nach A, er ist b – a.

Wir setzen nun in den Cosinus-Satz ein und erhalten

|| c ||2 = || b ||2 + || a ||2 – 2 || b || || a || cos (a, b)

Aus der Definition der Norm eines Vektors v folgt || v ||2 = v v = v^2, demnach

c^2 = b^2 + a^2 – 2 || b || || a || cos (a, b)

und    c^2 = (b – a)2 = b^2 – 2 a b + a^2

Beide Gleichungen zusammengeführt liefert

Wir haben damit eine Beziehung zwischen dem Winkel zwischen zwei Vektoren und dem Skalarprodukt bzw. der Norm von Vektoren hergeleitet.

Man kann auch umgekehrt vorgehen und findet daher, wenn die geometrische Interpretation im Vordergrund steht, auch folgende (äquivalente) Definition:

Definition 3.4: Unter dem skalaren Produkt a · b (kurz : a b ) zweier Vektoren a und b der Längen || a || bzw. || b || versteht man a · b := || a || || b || cos (a, b)

Davon leitet man die ursprüngliche Beziehung a b = a_1 b_1 + a_2 b_2 ab.

Gleich im Anschluss an die neu abgeleitete Formel für den Winkel zwischen zwei Vektoren überlegen wir uns, unter welchen Voraussetzungen das Skalarprodukt u v = 0 ist.

Klar ist, dass dies der Fall ist, wenn einer der beiden Vektoren der Nullvektor o = (0, 0) ist.Wir wissen aber, dass cos (a, b) = 0, wenn der Winkel α zwischen a und b = 90o oder 270o ist und die Vektoren damit aufeinander senkrecht stehen.

Somit erhalten wir folgenden interessanten Satz:

Satz 3.1: Das Skalarprodukt zweier Vektoren ist Null genau dann wenn wenigstens einer der beiden Vektoren der Nullvektor ist oder wenn die beiden Vektoren senkrecht aufeinander stehen.

Zur Übung überlegen wir noch, was sich aus der alternativen Skalarprodukt-Definition ergibt, wenn man zwei gleiche Vektoren der Länge || v || nimmt, also wenn der Winkel α = 0 und damit cos (v, v) = 1, wobei v^2 die Kurzschreibweise für v v ist:

v v = || v || || v || cos 0o = v^2

|| v || = √v v =√v^2

Das ist genau die ursprüngliche Definition der Norm || v || eines Vektors v.

Man kann Vektoren a insofern normieren (nicht zu verwechseln mit der Norm eines Vektors!), indem man sie bei gleicher Richtung auf die Länge 1 kürzt. Beispielsweise sind die Einheitsvektoren e_1 = (1,0) und e_2 = (0,1) solche normierten Vektoren, oder etwa auch)

Wir haben λ a = (λa1, λa2) bereits früher eingeführt und wählen speziell

Dann hat der „normierte“ Vektor genau die Länge 1.

Ferner interessiert uns noch die Projektion eines Vektors r auf einen anderen Vektor q laut Abb. 3.12

Abb. 3.12

Es gilt dazu die Beziehung

Um obige Formel abzuleiten überlegt man wie folgt:

Die Strecke s =  OP sei die Länge | p | des zugehörigen Vektors p von O in Richtung Q. Dieser entsteht aus q durch Strecken um s des zu q gehörigen normierten Vektors q^1 der Länge 1, also p = s · q^1. Ferner ergibt sich aus der Zeichnung die Beziehung s = || r || cos α = || r || cos (r, q) und darin setzen wir die aus dem Skalarprodukt abgeleitete Formel r q = || r || || q || cos (r, q) ein und erhalten für den Skalar s

3.3. Die Gerade in der Ebene

3.3.1. Geradengleichungen

Wir beginnen sehr elementar und versuchen, wichtige Gleichungen für die Gerade im 2 an Hand von Abbildungen abzuleiten.

Eine Gerade g ist bestimmt durch einen auf der Geraden liegenden Punkt P_1 und ihre „Richtung“.

Unter „Richtung“ versteht man hier nicht einen Orientierungssinn (Pfeil) wie bei Vektoren, sondern den Anstiegswinkel α bzw. den daraus abgeleiteten Richtungsfaktor tan α, der auch kurz Anstieg (Steigung) der Geraden genannt wird.

Genauso gut kann man in Kenntnis von P_1 (x_1, y_1) und irgend eines anderen (beliebigen) Punktes P (x,y) der Geraden beide Punkte P_1 und P durch eine Strecke verbinden und selbige an beiden Enden beliebig weiterzeichnen.

Die Situation ist in den Abb. 3.13 im ersten Quadranten dargestellt.

Abb. 3.13

Mit erhält man somit y – y_1 = k (x-x_1)

die Punktrichtungsgleichung einer Geraden g in der Ebene.

Man beachte, dass P_1(x_1, y_1) ein vorgegebener Punkt und P(x,y) ein beliebiger – der laufende Punkt – auf der Geraden g ist.

Kennt man mit P_1(0,y_1) = P_1 (0,d) speziell genau den Punkt, in dem g die Ordinate y schneidet, so vereinfacht sich die Punktrichtungsgleichung zur Normalform der Geradengleichung, wobei der entsprechende Abschnitt auf der Ordinatenachse d ist.

y = kx + d

Ist d > 0, so schneidet g die Achse oberhalb von 0, für d < 0 unterhalb von O. Im Spezialfall d = 0 geht g genau durch den Ursprung O.

Ebenso erkennt man, dass für k = 1 bzw. k = -1 und d = 0 die Gleichung y = x bzw. y = -x eine Gerade beschreibt, die durch den Ursprung 0 mit dem Anstiegswinkel α = 45o bzw. 360o - 45o = 315o geht.

Ist nun neben P_1 = (x_1, y_1) ein zweiter Punkt P_2 = (x_2, y_2) fest vorgegeben, so ist g ebenfalls bereits eindeutig bestimmt, man braucht den Anstiegswinkel α nicht mehr extra, denn er ist bestimmt durch

wie aus Abb. 3.13 unschwer abzuleiten ist.

Durch Einsetzen in die Punktrichtungsgleichung erhalten wir die Zweipunktgleichung einer Geraden g in der Ebene. Sie wird verwendet, wenn man zwei Punkte P_1 und P_2 auf ihr kennt

bzw.

Wir beobachten – ohne dies formal abzuleiten – dass wir immer eine lineare Gleichung 1. Grades erhalten haben. Dies führt zur allgemeinen Geradengleichung ax + by + c = 0 auch geschrieben als a_2 x_2 + a_1 x_1 + a_0 = 0.

Dies sollte man sich in Erinnerung rufen, wenn es später um die Lösung eines linearen Gleichungssystems in zwei Unbekannten x,y geht:

a_1 x + b_1 y + c_1 = 0

a_2 x + b_2 y + c_2 = 0

Denn die Lösung (x,y) dieses Gleichungssystems ist – in der geometrischen Interpretation – die Schnittmenge der beiden Geraden.

Und damit kommt man gleich zur nächsten Überlegung. Offensichtlich existiert kein Schnittpunkt, wenn beide Geraden parallel zueinander sind, d.h. wenn sie dieselbe Steigung tan α haben. (Es sei denn, beide Geraden fallen zusammen, dann hätte man unendlich viele Schnittpunkte.)

Durch Umformen der beiden Gleichungen erhalten wir sie in Gestalt der Normalform der Geradengleichung

Und da die beiden Steigungen bei Parallelität gleich sind, gilt

Später, bei der Behandlung von Matrizen A und deren Determinanten D(A), werden wir beobachten, dass a1b2 –a2b1 die Determinante der Matrix

ist und lineare Gleichungssysteme keine eindeutige Lösung haben, wenn die Determinante der Matrix gleich Null ist! In diesem Fall kann das Gleichungssystem unendlich viele Lösungen haben.

Dies ist ein weiterer Grund, sich aus algebraischer Sicht mit Vektoren auseinander zu setzen, denn obige Matrix A kann interpretiert werden als zwei (Zeilen)-Vektoren (a_1, b_1) und (a_2, b_2) oder als zwei (Spalten)-Vektoren (a_1, a_2) und (b_1, b_2)!

Damit sind wir wieder bei Vektoren – hier: in der Ebene 2 – angelangt und überlegen, wie man eine Gerade durch Vektoren beschreiben kann.

3.3.2. Gerade und Vektoren

In Abschnitt 2 haben wir die Operation λ r eingeführt und gezeigt, dass mit Wahl von λ ∈ der Vektor je nach Vorzeichen von λ in beide Richtungen gestreckt und verkürzt werden kann. Damit beschrieben wir eine Gerade. Allerdings ist r = (r_1, r_2) nur ein Repräsentant aller Vektoren, die durch Parallelverschiebung ineinander übergeführt werden können und demnach beschreibt λ r, mit λ ∈beliebig, eine Menge zueinander paralleler Geraden.

Zur Fixierung einer bestimmten Geraden benötigen wir daher noch einen Ortsvektor p zur Festlegung eines Punktes P, durch den die Gerade geht, und kommen damit unter Anwendung der Vektoraddition zur Punktrichtungsform einer Geraden in Vektordarstellung (Abb. 3.14).

Für den Ortsvektor x des laufenden Punktes auf einer Geraden durch den Punkt P gilt x = p + λ r

Abb. 3.14

Kennt man zwei Punkte P, Q auf der Geraden g, so erhält man durch r = q – p einen Richtungsvektor der Geraden g. Eingesetzt in die Punktrichtungsform erhalten wir für λ ∈ alle Punkte X durch die Beziehung

x = p +

die Zweipunktform einer Geraden in Vektordarstellung genannt wird.

Schreibt man in der Punktrichtungsform x = p + λ r die einzelnen Komponenten für

x = (x_1, x_2) = (x, y), p = (p_1, p_2) und r = (r_1, r_2) explizit an, so erhält man

x = p_1 + λ r1

y = p_2 + λ r_2

Wir ermitteln λ aus der zweiten Gleichung (sei r_2 ≠ 0, sonst nehme man r_1)

, setzen dies in die erste ein und erhalten

Beide Seiten mit r2 ≠ 0 multipliziert liefert

r_2 x – r_1 y = p_1 r_2 – r_1 p_2

und wir haben damit wieder eine lineare Gleichung der Gestalt ax + by + c = 0 mit

a = r_2, b = – r_1 sowie c = r_1 p_2 – r_2 p_1.

Das Bemerkenswerte an der Vektordarstellung einer Geraden ist, dass wir in Vektorschreibweise zu denselben Ergebnissen kommen, wenn wir von der Ebene (2) auf den Raum 3) übergehen. Die Zeichnungen werden allerdings komplizierter und strapazieren unser räumliches Vorstellungsvermögen um einiges mehr bei der Suche nach rechtwinkeligen Dreiecken, um daraus die Formeln abzuleiten.

Abb. 3.15

Wir bleiben vorerst im 2 und fragen nach einem Normalvektor n einer Geraden g, die als lineare Gleichung der Gestalt ax + by = c gegeben ist.

Abb. 3.16

Klar ist, dass der Normalvektor (genauer: ein Repräsentant der Menge der Normalvektoren) sich nicht ändert, wenn man g so verschiebt, dass g´ nunmehr durch den Ursprung O läuft. Damit genügt es, die Gleichung ax + by = 0 zu betrachten, denn die zugehörige Normalform ist

und für c = 0 wird d = 0.

Wir interpretieren a = (a,b) und x (x,y) als Vektoren und haben damit das Skalarprodukt

a · x = ax + by

Es ist aber a · x genau dann 0, wenn a und x aufeinander senkrecht stehen. Daraus folgt

Satz 3.2: Der Vektor a = (a,b) ist ein Normalvektor zur Geraden g : ax + by – c = 0.

Als nächstes interessieren wir uns für den Schnittwinkel zweier Geraden in der Ebene.

Zunächst werde der Fall untersucht, dass g_1 und g_2 in Punktrichtungsform gegeben sind.

g_1: x = p + λ r und g_2: x = q + μ s

also

Die Frage nach einem Schnittpunkt stellt sich nur, wenn die Geraden g_1 und g_2 zueinander nicht parallel sind. Wir überlegen dazu folgenden

Satz 3.3: Zwei Geraden x = p + λ r und x = q + μ s sind genau dann parallel zueinander, wenn r_1s_2 – r_2s_1 = 0.

Hinreichend:

Sei r_1s_2 – r_2s_1 = 0. So ist r_1s_2 = r_2s_1 und

Eine kleine Umformung liefert

und ebenso r_2 = σ s_2, d.h. r = σ s, die Richtungsvektoren r und s sind parallel und damit auch die beiden Geraden.

Notwendig:

Sind die beiden Geraden parallel, so sind es auch ihre Richtungsvektoren und es gilt r = σ s und daher r_1 = σ s_1 und r_2 = σ s_2. r_1s_2 = σ s_1s_2 und s_1r_2 = σ s_1s_2 und somit r_1s_2 – s_1r_2 = 0. Man hätte den Satz auch aus der Beziehung

herleiten können, denn cos(r,s) = 1 genau dann, wenn die beiden Vektoren r und s parallel sind, also α = 0o ist.

Dann gilt

Durch Quadrieren und Ausmultiplizieren erhält man

r_2^2 s_1^2 – 2r_1r_2 s_1s_2 + r_12s_2^2 = 0, also (r_2s_1 – r_1s_2)2 = 0 und somit r_1s_2 – r_2s_1 = 0.

Sind g_1 und g_2 nicht parallel zueinander, so können wir den Winkel α direkt aus dem Skalarprodukt der beiden Richtungsvektoren r und s bestimmen.

Der Winkel α ist dann der arccos davon, die Umkehrfunktion zum Cosinus.

Sind die Geraden in analytischer Form gegeben, also

g_1: a x_2 + b x_1 + c = 0

g_2: u x_2 + v x_1 + w = 0

so wissen wir, dass n_1= (a,b) und n_2 = (u,v) zwei zu g_1 bzw. g_2 normal stehende Vektoren sind. Und der gesuchte Winkel α ist gleich dem Winkel zwischen diesen auf g_1 und g_2 senkrecht stehenden Vektoren n_1 und n_2.

An dieser Stelle führen wir den später bei Vektorräumen noch wichtigen Begriff der linearen Abhängigkeit bzw. linearen Unabhängigkeit von Vektoren (hier: in der Ebene) ein.

Definition 3.5: Die Vektoren r und s heißen linear abhängig, wenn es reelle Zahlen λ_1, λ_2 gibt, die nicht beide Null sind, sodass gilt

λ_1r + λ_2s = o

Die Vektoren r und s heißen linear unabhängig, wenn die Beziehung λ_1r + λ_2s = o nur für λ_1 = λ_2 = 0 gilt. Diese Definition hat eine einfache anschauliche Deutung, es gilt nämlich folgender

Satz 3.4: Zwei Vektoren r und s dann und nur dann linear abhängig, wenn sie parallel sind, also wenn gilt: r = λ s.

Hinreichend:

Es sei λ_1r + λ_2s = o und o.B.d.A sei λ_1 ≠ 0.

Notwendig:

Sind r und s parallel, so ist r = λ s. r – λ s = 0, λ_1 r – λ_2s = 0 mit λ_1 = 1 , λ_2 = λ.

Also sind r und s linear abhängig.

Wir erinnern uns an dieser Stelle daran, dass wir beim Satz über die Parallelität von zwei Geraden x = p + λ r und x = q + μ s aus dem Kriterium r_1s_2 – r_2s_1 = 0 die Beziehung r = σ s (und umgekehrt) abgeleitet haben.

Also sind bei Parallelität zweier Geraden deren Richtungsvektoren (und ebenso auch deren Normalvektoren) voneinander linear abhängig. Eine Konsequenz u.a. ist, dass man daher zum Aufspannen eines Koordinatensystems nur linear unabhängige Vektoren heranziehen kann, ;z.B. für 3 die Einheitsvektoren e_1 = (0,0,1), e_2 = (0,1,0), e_3 = (1,0,0).

3.3.3. Hesse’sche Normalform

Liegt eine Gerade in der allgemeinen Gleichung ax + by + c = 0 vor und ist ein Punkt S = (s_1, s_2) gegeben, so bestimmt man den Abstand d des Punktes S von der Geraden g unter Verwendung der Hesse’schen Normalform der Geradengleichung:

indem man für x und y die Koordinaten s_1 und s_2 des Punktes S einsetzt und erhält

Wir leiten hier diese Hesse’sche Abstandsformel nicht her, überlegen uns aber eine Formel für den Abstand d, wenn die Gerade in Vektordarstellung gegeben ist.

Abb. 3.17

Der kürzeste Abstand ergibt sich durch eine Normale durch S, die die Gerade im Punkt H schneidet.

Um die Distanz d, die Länge des Vektors d von H nach P, (symbolisch:) zu berechnen, benötigen wir die Koordinaten von H, d.h. den Ortsvektor h.

Es gilt:  = p – a . Die Projektion davon auf den Vektor b (bzw. die Gerade g) liefert den Vektor  = u.

Aus der Formel für die Projektion (vgl. Abb. 3.12) erhalten wir

und daher für h

und d = p – h. Daher gilt für die Länge d

eine andere Möglichkeit, den Abstand ohne Verwendung des Normalvektors anzugeben, erhält man auf folgende Weise:

Die Projektion X eines Punktes Q auf eine Gerade durch den Punkt P mit Richtungsvektor u erfüllt die Gleichung

Daraus ergibt sich der Abstand als

Abb. 3.18

3.4. Das Vektorprodukt und seine geometrische Deutung im Raum

3.4.1. Eigenschaften

Bislang hatten wir nur das Skalarprodukt a · b = a_1 b_1 + a_2 b_2 zweier Vektoren im 2 kennen gelernt, welches sich auf 3 bzw. auf den n verallgemeinern lässt:

Wichtig ist: das Ergebnis ist ein Skalar, daher auch der Name. Speziell für den 3 lässt sich ein „äußeres Produkt“, auch als „Vektorielles Produkt“ oder „Kreuzprodukt“ bezeichnet, einführen:

Definition 3.6: Das vektorielle Produkt von a = (a_1, a_2, a_3) und b = (b_1,b_2,b_3) ∈ 3 ist der Vektor a μ b = (a_2b_3 – a_3b_2, a_3b_1 – a_1b3, a_1b_2 – a_2b_1) ∈ 3

Aus der Definition unmittelbar ableitbar sind folgende Gesetze für das Rechnen mit Vektorprodukten

a x a = o

a x b = – b x a also nicht kommutativ

a x (b + c) = a x b + a x c und

(a + b) x c = a x c + b x c distributives Gesetz

(λ a) x b = λ( a x b) = a x (λ b)

Man beachte, dass im Allgemeinen

a x (b x c) ≠ (a x b) x c

Es gilt aber die Jacobi-Identität

a x (b x c) + b x (c x a) + c x (a x b) = o

Das Vektorprodukt hat einige sehr interessante geometrische Interpretationen und damit Anwendungen.

3.4.2. Anwendungen

Beginnen wir mit der Bestimmung des Flächeninhaltes F eines Parallelogramms, welches durch zwei linear unabhängige (also: nicht parallele) Vektoren erzeugt wird (Abb. 3.19). Zur Vereinfachung ist die Zeichnung im 2, es ist aber unmittelbar einsichtig, dass sich für den 3 nichts ändert: die Lage des Parallelogramms beeinflusst seinen Flächeninhalt ja nicht.

Abb. 3.19

F^2 = ||a||2 ||b||2 sin^2 α = ||a||2 ||b||2 (1- cos² α)

und wegen a b = ||a|| ||b|| cos α erhält man

F^2 = a^2 b^2 – (a b)2

Unterzieht man sich nun der Mühe, für a = (a_1, a_2, a_3) und b = (b_1, b_2, b_3) einzusetzen, so erhält man

und das ist die Länge des Vektors c = a x b. Eingesetzt in F = ||a|| ||b|| sin α erhalten wir

||a x b|| = ||a|| ||b|| sin α .

Gleichzeitig haben wir damit auch die Rechenregel a x a = o abgeleitet, wenn man für b einen zu a parallelen Vektor, sodass also sin α = 0, wählt.

Ähnlich kann man auch in die umgekehrte Richtung schließen und wir erhalten folgenden

Satz 3.5: Das Vektorprodukt a x b ist dann und nur dann gleich dem Nullvektor o, wenn die beiden Vektoren a und b linear abhängig sind.

Da wir uns im 3 bewegen, ist anschaulich klar, dass zwei Vektoren v und w, wenn sie linear unabhängig (also: nicht parallel zueinander) sind, eine Ebene aufspannen.

Abb. 3.20

Behauptet wird, dass v x w ein Normalvektor zu dieser von v und w aufgespannten Ebene ist.

In diesem Falle muss n = v x w sowohl auf v als auch auf w senkrecht stehen.

Also muss gelten:

n · v = (v x w) · v = 0

n · w = (v x w) · w = 0

denn das Skalarprodukt zweier Vektoren ungleich o ist genau dann Null, wenn sie aufeinander senkrecht stehen.

Es ist mit

Damit haben wir abgeleitet folgenden

Satz 3.6: Der Vektor v x w steht senkrecht auf v und w.

Seine Länge ist dem Betrag nach gleich der Fläche des durch v und w gebildeten Parallelogramms.

Was die Richtung von v μ w betrifft so gilt: von der „Spitze“ von v x w „sieht“ man v und w, so wie die x- und die y-Achse der Ebene.

Oder: Wenn der Daumen, der Zeigefinger und der Mittelfinger der rechten Hand so gehalten werden, dass sie zusammen drei rechte Winkel im Raum bilden, dann repräsentiert der Daumen die x-Achse, der Zeigefinger die y-Achse, und der Mittelfinger die z-Achse (siehe Abb. 3.20).

Abb. 3.21

Insbesondere gilt für die Einheitsvektoren e_1, e_2, e_3, die den 3 aufspannen:

e_1 x e_2 = e_3, e_2 x e_3 = e_1, e_3 x e_1 = e_2,

Folgerung: Der Flächeninhalt F des Dreieckes Δ (A, B, C) ist

Abb. 3.22

Auch der Rauminhalt V eines Parallelepipeds lässt sich unter Verwendung des Vektorproduktes in Kombination mit dem Skalarprodukt recht einfach ausdrücken.

Abb. 3.23

Über die Grundfläche F des Parallelepipeds wissen wir bereits Bescheid:

a =; b = ; c = ;

F = ||a|| ||b|| |sin α| = ||a x b|| und

h = ||c|| |cos γ| ; V = F · h = ||a x b|| ||c|| |cos γ| .

Nun ist nach vorigem Satz a x b senkrecht auf die Grundfläche und γ daher der Winkel zwischen c und a x b.

Also gilt wegen cos α = (a b) / (||a|| ||b||)

Der in Abb. 3.23 dargestellte Körper wird auch „Spat“ genannt.

Aus diesem Grunde wird die aus Vektorprodukt und Skalarprodukt zusammengesetzte Operation ((a x b) · c) auch als Spatprodukt bezeichnet.

Das Ergebnis unserer Ableitungen ist folgender

Satz 3.7: Das Volumen V eines durch die (Orts)-Vektoren a, b, c aufgespannten Parallelepipeds ist V = |(a x b) · c| .

Abb. 3.24

Ist die Ebene in Punktrichtungsform x = a + λb + μc gegeben, so halten wir fest:

- Der Abstand von P zur Ebene ist gegeben durch den Punkt F (bzw. Vektor f), wenn man P auf die Ebene projiziert: er ist dann die Länge des Vektors p – f. Dieser steht senkrecht auf dem in der Ebene liegenden Vektor f – a. Daher gilt die Beziehung (p – f) · (f – a) = 0.

- Das Vektorprodukt b μ c liefert einen Vektor, der normal auf die Ebene steht.;Daher gilt (b x c) · (f – a) = 0.

3.5. Gerade und Ebene im Raum

3.5.1. Geradengleichungen

Wie früher schon besprochen, können wir bei der Vektordarstellung einer Geraden im 3 alle Konzepte und Schreibweisen aus dem 2 direkt übernehmen:

Zweipunktform: x = p + λ (q – p)

Punktrichtungsform: x = p + λ r

Aus der Punktrichtungsform erhält man mit

x = (x,y,z), p = (p1, p2, p3), r = (r1, r2, r3) die

Parameterform:

x = p_1 + λr_1

y = p_2 + λr_2

z = p_3 + λr_3

Interessant ist die Idee, aus der Parameterform durch Elimination von λ ähnlich wie im 2 zu einer linearen Gleichung zu kommen. Tatsächlich aber erhält man zwei solcher Gleichungen.

Ist o.B.d.A r_1 ≠ 0, so erhält man

was man in die zweite und dritte Gleichung einsetzen kann. Dies ergibt zwei Gleichungen:

ax + by + cz = d

ax + b´y + c´z = d´

Wir nehmen folgende Aussage vorweg: jede dieser linearen Gleichungen beschreibt eine Ebene im 3 und damit kann man eine Gerade im 3 als Schnitt zweier (nicht zueinander parallelen) Ebenen verstehen.

3.5.2. Ebengleichungen

Die Dreipunktform bestimmt die Ebene durch Angabe dreier Punkte P, Q, R (durch ihre Ortsvektoren), die nicht auf einer Geraden liegen dürfen

x = p + λ (q – p) + μ (r – p)

Die Punktrichtungsform ist ebenso direkt erklärbar.

Man nimmt zwei nichtparallele (d.h.: linear unabhängige Vektoren) r_1 und r_2 . Durch Strecken bzw. Verkürzen mit λ und μ spannt λ r_1 + μ r_2 eine Schar zueinander paralleler Ebenen auf.

Eine davon ist durch Fixierung eines Punktes P darauf auszuwählen und man erhält

x = p + λ r_1 + μ r_2

Bei der Normalvektorform geht man von folgender Überlegung aus: Die Lage einer Ebene kann man angeben durch einen Punkt P in der Ebene und einen Normalvektor n, der zu allen in der Ebene liegenden Vektoren senkrecht steht, für den also das innere Produkt mit allen in der Ebene liegenden Vektoren 0 ist.

Die in der Ebene liegenden Vektoren erhält man durch x – p, somit lautet die Normalvektorform der Ebene (x – p) n = 0.

In die Normalvektorform der Ebene kann man x = (x,y,z), n = (a,b,c) und p = (p_1,p_2,p_3) einsetzen und erhält:

xa – p_1a = 0; yb –p_2b = 0; zc –p_3c =0;

xa + yb + zc – p_1a – p_2b – p_3c = 0, und demnach

ax + by + cz + e = 0 mit e = – (p_1a + p_2b + p_3c).

Zugleich erkennt man in dieser Ebenendarstellung als lineare Gleichung, dass die Koeffizienten a, b, c die Komponenten des Normalvektors n sind.

Ähnlich wie bei der Geraden kann man die Hesse´sche Normalform einer Ebene E: ax + by + cz + e = 0 zur Bestimmung des Abstands d eines Punktes S (s_1, s_2, s_3) von der Ebene angeben:

3.6. Übungsaufgaben

3.1: Man zeige: Die Schwerlinien eines Dreiecks schneiden sich einem Punkt und teilen einander im Verhältnis 2:1:

3.2: Man zeige: Die Mittelpunkte der Seiten eines (ebenen) Vierecks sind Eckpunkte eines Parallelogramms.

3.3: Man zeige (Satz von Pappus-Pascal):

Vom Punkt O gehen zwei Strecken aus, auf denen die Punkte A, B, C, D, E und F liegen (vgl. Skizze u.) Sind die Strecken  BD  und   CE  sowie  AE  und  BF  parallel, so sind auch die Strecken  AD und  CF parallel.

3.4: Man zeige (Satz von Thales): Die Winkel im Halbkreis sind rechte Winkel (vgl. Skizze.)

3.5: Durch ein Dreieck gegeben durch (3,0,0), (0,3,0) und (3,3,3) (Angaben in cm) strömt ein Gas mit Geschwindigkeit v = 40 cm/sec in Richtung (1,1,1)

Welches Gasvolumen strömt in 10 sec durch?

3.6: Ein vom Punkt P = (1,2,−3) ausgehender Lichtstrahl trifft im Punkt S = (4,−2,−1) auf die Ebene ε : x + 2y + 2z = −2

Man berechne die Richtung des reflektierenden Strahls.

3.7: Man zeige: (Satz von Gauß):

In einem Tetraeder (vierseitige Pyramide) ist der Summe der nach außen gerichteten Normalvektoren auf die Seitenflächen, deren Länge gleich dem Flächeninhalt der entsprechenden Seite ist, gleich 0.

3.8: Ein vom Punkt P = (1,2,−3) ausgehender Lichtstrahl trifft im Punkt S = (4,−2,−1) auf die Ebene ε : x + 2y + 2z = −2

Man berechne die Richtung des reflektierenden Strahls.

3.9: Der Schnittpunkt S der Geraden g : (−2,4,2) +λ (2,1,4) und h : (5,−3,4) +μ (−1,3,2) sei die Spitze eines Tetraeders, dessen Grundfläche durch das Dreieck ABC mit A = (−4,−9,1),B = (3,3,−1),C = (6,−1,−3) bestimmt ist.

Man berechne den Neigungswinkel der Kante AS gegen die Grundfläche ABC :

3.10: Seien S, A, B, C wie oben. Man berechne die Koordinaten des Punktes S’, den man durch Spiegelung des Punktes S an der Ebene ABC erhält.

3.11: Ein Ball (betrachtet als Massepunkt) mit m = 3 kg wird im Punkt P = (3, -2, -3) auf eine schiefe Ebene gelegt, auf der sich die Punkte A = (2,6,0), B = (6,0,1) und P befinden.

Mit welcher Kraft fn drückt der Ball (normal) auf die Ebene?

3.7. Applets

Verfügbar sind Applets zur Berechnung und Visualisierung der Ergebnisse in der Ebene von

- Vektor-Addition

- Vektor-Subtraktion

- Vektor-Produkt

- Projektion eines Punktes auf einen Vektor

- Projektion eines Vektors auf einen Vektor

- Darstellung einer Geraden durch zwei Punkte P1 und P2 in der Ebene

- Darstellung des Ortsvektors P eines Vektors und seiner Streckung λ P

Alle Applets sind interaktiv mit der Maus zu bedienen.

Abb. 3.25: Screenshot Applet: „Vektor-Produkt“

4. Algebraische Strukturen

4.1. Vorbemerkungen

Bei den bislang besprochenen mathematischen Objekten wie Rationalen oder Reellen Zahlen, Restklassen, Vektoren etc. haben wir immer auch die Gültigkeit von Rechenregeln – wir nennen sie „Gesetze“ – untersucht. Dabei hat es einige Überraschungen gegeben und einige davon seien in Erinnerung gerufen:

(1) Sind a, b ∈  und a ≠ 0, b ≠ 0, so folgt ab ≠ 0.

Sind a , b zwei Restklassen mod m und ist ggT(a,m) ≠ 1, ggT(b,m) ≠ 1, so kann es sein, dass a . b = 0  , auch wenn a ≠ b und b ≠ 0 (etwa a = 6, b = 4, m = 12)

(2) Sind a, b ∈  so ist die Gleichung a · x = b immer eindeutig lösbar. Ebenso gilt x · 1 = 1 · x = x für jedes x ∈.

Sind hingegen a , b  Restklassen mod m, so ist die Gleichung a . x = b (d.h: die Kongruenz a · x ≡ b mod m) nur lösbar, wenn d = ggT(a,m) ⁄ b; dabei ist die Lösung nicht eindeutig, es gibt d verschiedene Lösungen. (etwa 3 · x ≡ 12 mod 8)

Wenn allerdings d = ggT(a,m) = 1, wenn also a und m relativ prim zueinander sind, dann gibt es immer genau eine Lösung. Wählt man speziell b = 1  , so ist demnach  a . x = 1  eindeutig lösbar. Man schreibt dann a . a  -1.

(3) Betrachtet man Vektoren a, b ∈3 und nimmt man als Operation die Addition „+“, so gelten genauso wie bei den reellen Zahlen das Assoziativgesetz: (a + b) + c = a + (b + c) und das Kommutativgesetz: a + b = b + a.

Wählt man stattdessen als Operation das Vektorprodukt „μ”, so gelten beide Gesetze i.A. nicht mehr: ax (b x c) ≠ (a x b) x c und wegen a x b = –b x a ist a x b ≠ b x a.

In der Algebra abstrahiert man nun von den gegebenen Objekten bzw. Mengen (Zahlen, Restklassen, Vektoren, Matrizen, ...) und ebenso von der konkret angedachten Operation zwischen zwei beliebigen Elementen einer Menge. Um letzteres auszudrücken verwendet man ein spezielles Symbol, z.B. „“ oder „“.

Unser Ausgangspunkt wird demnach sein

(1) eine nicht-leere endliche oder unendliche Menge M

(2) eine Operation  zwischen je zwei Elementen x ∈ M, y ∈ M, sodass das Ergebnis dieser Operation (die Verknüpfung von x mit y) wieder ein Element von M ist: a  b = c mit a, b, c ∈ M.

Es ist ganz wichtig, dass a, b ∈ M sind. Das Produkt eines Skalars λ ∈  mit einem Vektor a ∈ n fällt da vorerst nicht darunter. Natürlich untersucht die Algebra auch Strukturen mit a ∈ M_1, b ∈ M_2 und z.B. a  b = c mit c ∈ M_2. Dazu kommen wir beim Thema Vektorraum erst später.

Gehen wir demnach vorerst vom Blickpunkt (1) und (2) aus. Durch die Forderung nach der Gültigkeit bestimmter Rechenregeln kommt man zunächst zu einer fundamentalen Struktur in der Algebra, nämlich der Gruppe.

4.2. Gruppen

4.2.1. Definitionen

Wir beginnen mit einigen Definitionen:

Definition 4.1: Eine zweistellige Verknüpfung auf einer Menge M ist eine Abbildung  : M μ M → M.

Um die Menge gemeinsam mit ihrer Verknüpfung darzustellen schreibt man sie üblicherweise als Paar (M, ).

An dieser Stelle sei erinnert, wie eine binäre Relation R zwischen zwei Mengen A und B eingeführt ist: R ist eine Teilmenge des kartesischen Produktes A x B, also R ⊆ A x B.

Man diskutiere den Unterschied zu obiger Definition.

Definition 4.2: Die Verknüpfung  in der Menge M heißt assoziativ, wenn das Assoziativgesetz gilt:

Für alle x, y, z ∈ M ist (x  y)  z = x  (y  z).

Und damit kommen wir zur ersten wichtigen algebraischen Struktur.

Definition 4.3: Eine nicht-leere Menge M zusammen mit einer assoziativen Verknüpfung  heißt Halbgruppe.

Beispiele:

M =  ,  = „+“: Die natürlichen Zahlen bilden bezüglich der Addition eine Halbgruppe.

Ebenso ist ( , ·) eine Halbgruppe.

Ist M = {0 , 1 , ... , m-1 | Restklassensystem mod m }, so bildet auch (M, +) eine Halbgruppe.

( , –) etwa ist keine Halbgruppe, 3 – 5 ist keine natürliche Zahl, dieses Paar verletzt also bereits „Blickpunkt (2)“ von oben.

Es ist jedoch auch ( , –) keine Halbgruppe, da wegen: 3 – (2 – (–3)) = –2 aber (3 – 2) – (–3) = 4 die Assoziativität verletzt ist.

Alle obigen Beispiele haben noch weitere interessante Eigenschaften aufzuweisen, sodass wir durch zusätzliche Definitionen die sehr allgemeine Struktur einer Halbgruppe weiterentwickeln wollen.

Definition 4.4: Ist (M, ) eine Halbgruppe, so heißt e ∈ M neutrales Element, wenn für jedes x ∈ M gilt: x  e = e  x = x.

Dies führt zum Begriff des Monoids wie folgt:

Definition 4.5: Eine Halbgruppe (M, ) heißt Monoid, wenn M ein neutrales Element enthält.

Nicht unwichtig ist die Tatsache, dass es in einer Halbgruppe nur ein einziges neutrales Element geben kann. Denn wären e_1 und e_2 neutrale Elemente, so folgt sofort e_1 e_2 = e_1 und e_1 e_2 = e_2, also e_1= e_2.

Es ist H = ( , ·) ein Monoid, wobei die Zahl 1 die Rolle des neutralen Elements innehat.

Ebenso ist H = ( 0, +) ein Monoid. Hier übernimmt die Null die Rolle des neutralen Elements. Aus diesem Grund wird das neutrale Element in multiplikativen Gruppen auch als „Einselement“ bezeichnet, das neutrale Element in additiven Gruppen hingegen als „Nullelement“, mehr dazu später unter „Ringe“ und „Körper“.

Ein anderes Beispiel: Sei A ein Alphabet und A* die Menge aller Wörter w über A. Als Operation u  v für u, v ∈ A* führen wir die Konkatenation ein.

Z.B.: A = {0, 1}, A* = {ε , 0, 1, 00, 11, 01, ... ..., 00110 ...} wobei ε das leere Wort sein soll.

Sind z.B. u = 011 und v = 10011, so ist u  v = 01110011 ∈ A. Offensichtlich ist die Konkatenation assoziativ und es gilt u  ε = ε  u = u mit u ∈ A*.

Man nennt A* das freie Monoid oder Wortmonoid über dem Alphabet A.

Ein Monoid ist eine wesentliche Spezialisierung einer Halbgruppe H, da eine Halbgruppe kein neutrales Element zu enthalten braucht.

So bildet zwar die Menge der geraden Zahlen bezüglich der Addition ein Monoid, denn die 0 übernimmt die Rolle des neutralen Elements, aber bezüglich der Multiplikation gibt es kein neutrales Element, ebenso wenig ist ( , +) ein Monoid.

Man kann nun von einem Monoid (M,) zum Begriff der Gruppe kommen, indem man zusätzlich verlangt, dass es zu je zwei Elementen a, b ∈ M Elemente x, y ∈ M gibt, sodass x  a = b und a  y = b.

Will man jedoch nicht auf die Begriffe Halbgruppe oder Monoid Bezug nehmen, so definiert man eine Gruppe wie folgt:

Definition 4.6: Eine Menge G mit der Verknüpfung  heißt Gruppe, wenn gilt

(i)                        das Assoziativgesetz: (a  b)  c = a  (b  c) für alle a,b,c ∈ G

(ii)                       es gibt ein neutrales Element e ∈ G mit a  e = e  a = a für alle a ∈ G

(iii)                      zu jedem a ∈ G gibt es ein inverses Element x, sodass a  x = x  a = e.

Wir verwenden wiederum die Schreibweise (G, ), wenn wir den Gruppenaspekt hervorheben wollen.

Es ist üblich, das inverse Element von a mit a-1 zu bezeichnen.

Vereinfacht schreibt man statt „a  b“ häufig auch „a · b“ oder auch nur „ab“.

Die Anzahl der Elemente einer Gruppe nennt man Ordnung der Gruppe, Gruppen mit endliche vielen Elementen heißen endliche Gruppen, ansonsten spricht man von unendlichen Gruppen.

Wenn G endlich ist und nicht „allzu viele“ Elemente enthält, kann man eine Gruppe (G, ⊗) bequem durch ihre so genannte Gruppentafel beschreiben: Das ist eine Tabelle, in der das Ergebnis der Verknüpfung je zweier Elemente dargestellt wird

4.2.2. Beispiele

Beispiel:

Sei G = {e, a, b, c}

Obige Gruppe trägt einen besonderen Namen: die Diedergruppe D2 oder auch Kleinsche Vierergruppe, benannt nach dem deutschen Mathematiker Felix Klein (1849 – 1925).

Der ersten Zeile und ersten Spalte entnehmen wir, dass e die Rolle des neutralen Elements übernimmt. Aus der Hauptdiagonale sieht man, dass jedes Element in diesem Beispiel zu sich selbst invers ist: aa = e, bb = e, cc = e.

Beispiel:

Sei G = {e, a, b, c} und im Gegensatz zu oben gebe es ein Element a ∈ G, sodass a^2 ≠ e. Wir setzen a^2 = b und erhalten folgende Gruppentafel:

Bei dieser Gruppe handelt es sich um die Restklassengruppe modulo 4, kurz ( 4, +) (mit {e,a,b,c} = {0, 1, 2, 3}

Beispiel:

Sei G = {e, a, b, c, d}. Nachstehende Verknüpfungstafel erklärt keine Gruppe! Man erkennt dies z.B. daran, dass die Positionen des neutralen Elements e nicht symmetrisch zur Hauptdiagonalen liegen (hier: a d = e, aber d a ≠ e). Wegen aa-1 = a-1a = e müsste dies bei einer Gruppe der Fall sein.

Beispiel:

Sei G ={0, 1, 2, 3, 4} und  = „+“, d.h. wir betrachten die Restklassen mod 5 bezüglich der Addition. Hier übernimmt 0 die Rolle des neutralen Elements. Vereinfachend schreiben wir, i statt i .

Man sieht leicht, dass in den ersten, zweiten und vierten Beispielen auch das Kommutativgesetz a  b = b  a gilt.

Solche Gruppen nennt man kommutative Gruppen oder abelsche Gruppen, benannt nach dem norwegischen Mathematiker Niels Henrik Abel (1802 – 1829).

Beispiel:

Die Menge  bildet unter der Addition eine abelsche Gruppe. Das neutrale Element ist 0, das zu a inverse Element ist –a.

Beispiel:

Die Menge der primen Restklassen modulo m bildet bezüglich der Multiplikation eine abelsche Gruppe. Wir haben nämlich früher gezeigt, dass die Kongruenz a x ≡ 1 mod m genau dann eindeutig lösbar ist, wenn ggT(a,m) = 1. Also ist das Inverse zu a eindeutig.

Sei m = 8, dann ist G = {1, 3, 5, 7} .

Beispiel:

Einen wichtigen Spezialfall aus vorigem Beispiel erhält man, wenn man für den Modul m eine Primzahl p wählt. Dann sind alle Restklassen 1, 2, ..., p-1 relativ prim zu p und erklären unter der Multiplikation die Gruppe ( p\ {0}, ·) oder kurz ( p*, ·)

Bei abelschen Gruppen ist die Gruppentafel offensichtlich symmetrisch zur Hauptdiagonale von links oben nach rechts unten.

Das nachfolgende Beispiel spielt in der Algebra eine besondere Rolle im Zusammenhang mit Isomorphien von Gruppen. Auf diese gehen wir hier jedoch nicht weiter ein.

Definition 4.7: Es sei S eine Menge mit genau n Elementen. Diese seien mit 1, 2, ..., n bezeichnet. Eine Permutation dieser Elemente ist eine Umordnung in der Reihenfolge bei der Aufzählung.

Beispiel:

beschreibt eine Permutation π, die aus 1, 2, 3, 4 die Reihenfolge 3, 2, 4, 1 erzeugt.

Es ist üblich, eine Permutation π wie folgt allgemein anzuschreiben

Man kann nun leicht eine Verknüpfung zwischen zwei Permutationen π_1, π_2 angeben, indem man auf jede Zahl i zunächst π_2 anwendet und auf das Ergebnis i /π_2 dann π_1 anwendet:

Man nennt diese Operation die Multiplikation von Permutationen, daher auch die Schreibweise ;π_3 = π_1 π_2 oder auch, da es sich bei einer Permutation um eine Funktion und bei π_1 π_2 daher um eine „Hintereinanderausführung von Funktionen handelt“, π_1 ° π_2 oder π_1 nach π_2

Dass das Assoziativgesetz erfüllt ist, kann man leicht verifizieren. Das neutrale Element ist jene Permutation, die jedes Element in sich selbst überführt:

Die Inverse π-1 zu π ist jene Permutation, die die durch π entstandene Umordnung „rückgängig“ macht, also die „natürliche“ Reihenfolge wieder herstellt.

Zusammenfassend erhalten wir den

Satz 4.1: Die Menge aller Permutationen einer Menge M bildet bezüglich der Multiplikation von Permutationen eine Gruppe. Man nennt sie vollständige symmetrische Gruppe S(M) auf M.

Hinzuzufügen ist noch

Satz 4.2: Die Anzahl der Permutationen einer Menge M mit m Elementen ist m! = m · (m-1) · … · 2 · 1 (genannt „m Fakultät“, auch „m Faktorielle“). Der Beweis lässt sich mit vollständiger Induktion führen. Ist M = {1,2, …, n} mit n ∈ , so schreibt man üblicherweise Sn oder S(n). ;Wir untersuchen S(3) im Detail und wählen folgende Permutationen aus:

Also ist S(3) nicht kommutativ. (Allgemein lässt sich zeigen, dass unter allen S(n) nur die S(2) eine abelsche Gruppe ist).

Zur Übung rechnen wir noch einige weitere Verknüpfungen aus

Da es insgesamt 3! = 6 Permutationen gibt, sind ε, g, δ, ξ, J, κ bereits alle.

Allgemein hat die S(n) daher Gruppenordnung n!

Man kommt zu folgender Gruppentafel:

4.3. Untergruppen

4.3.1. Definitionen

Wenn man von einer Gruppe (G, ) ausgeht, so interessiert die Frage, ob nicht bereits eine Teilmenge U ⊆ G für sich selbst eine Gruppe (U, ) bildet. Zumindest eine solche Teilmenge gibt es tatsächlich: Jede Gruppe enthält als „triviale“ (genannt uneigentliche) Untergruppen G selbst und die Gruppe, die nur aus dem neutralen Element e besteht. Wir werden aber später sehen, dass es auch „nichttriviale“ (eigentliche) Untergruppen gibt.

Definition 4.8: Eine Teilmenge U ⊆ G heißt Untergruppe von (G,), wenn U bezüglich der Verknüpfung  selbst eine Gruppe ist.

Satz 4.3: (U, ) mit U ≠ {} ist Untergruppe von (G, ), falls für alle x, y ∈ U gilt: x  y ∈ U und x-1 ∈ U.

Beweis: Da das Assoziativgesetz in G gilt, gilt es auch in U ⊆ G. Wegen x  y ∈ U und x-1 ∈ U folgt mit y = x-1 dass auch x  x-1 = e ∈ U.

Dieser Satz wird auch als Untergruppenkriterium bezeichnet.

Beispiel:

Sei G die Kleinsche Vierergruppe.

Dann sind neben den trivialen Untergruppen durch folgende Teilmengen von G = {e,a,b,c} weitere Untergruppen bestimmt:

U_1 = {e,a}; U_2 = {e,b}, U_3 = {e,c}.

Beispiel:

Die multiplikative Gruppe (  , ·) ist eine Untergruppe von (  , ·). Das ergibt sich, weil das Produkt zweier rationaler Zahlen, r, q ∈ wieder eine rationale Zahl ist und weil das inverse r-1 zu r mit  wieder rational ist.

Beispiel:

Jede Gruppe (G, ) enthält ein Zentrum Z(G) ⊆ G mit Z(G) = {x ∈ G | xa = ax für alle a ∈ G}, also alle Elemente, die mit allen anderen „kommutieren“. Wir vermerken, dass bei abelschen Gruppen Z(G) = G ist.

Das Zentrum Z(G) erklärt eine Untergruppe von G, denn:

(i)  sind x, y ∈ Z, so ist zu zeigen, dass auch xy ∈ Z(G):

(xy) a = xya = xay = a(xy) für alle a ∈ G, also ist xy ∈ Z.

(ii)  ist x ∈ Z, so ist auch x-1 ∈ Z, denn:

wegen x ∈ Z ⇒ ax = xa für alle a ∈ G

axx-1 = xax-1 und daher a = xax-1

⇒ x-1a = x-1xax-1 = ax-1, d.h. x-1a = ax-1, also auch x-1 ∈ Z.

Beispiel:

Die Teilmengen U1 = {1,2,4} und U2 = {1,6} von 7 bestimmen nichttriviale Untergruppen der Gruppe (7*,·).

Die Gruppentafel von ( 7*, ·) ist:

Nun fällt auf, dass in ( 7*, ·) keine Untergruppen mit 4 oder 5 Elementen zu finden sind. Dies leitet sich aus dem sehr mächtigen Satz von Lagrange (Joseph-Luis Lagrange, 1736 – 1813) ab, wir beweisen ihn später:

Satz 4.4: Ist G eine endliche Gruppe, so ist die Ordnung ord (U) einer Untergruppe U ein Teiler der Ordnung ord (G) der Gruppe G. Mit Hilfe dieses Satzes kann man bei der Suche nach Untergruppen die zu betrachtenden Teilmengen U ⊆ G beträchtlich einschränken. Eine Gruppe z.B. der Ordnung 10 kann daher nur nichttriviale Untergruppen mit 2 oder 5 Elementen haben, eine Gruppe mit Primzahlordnung, z.B. ( 5, +) hat gar keine eigentlichen Untergruppen.

4.3.2. Zyklische Gruppen

Bevor wir weitere Eigenschaften von endlichen Gruppen und Untergruppen untersuchen, experimentieren wir an Hand der (7*, ·) und der zugehörigen Gruppentafel.

Mit der Vereinbarung an = aaa ... a (n mal) kann man jedes Element potenzieren, z.B.

a = 1: 1^1 = 1

a = 2: 2^1 = 2; 2^2 = 4; 2^3 = 1

a = 3: 3^1 = 3; 3^2 = 2; 3^3 = 6; 3^4 = 4; 3^5 = 5; 3^6 = 1

a = 4: 4^1 = 4; 4^2 = 2; 4^3 = 1

a = 5: 5^1 = 5; 5^2 = 4; 5^3 = 6; 5^4 = 2; 5^5 = 3; 5^6 = 1

a = 6: 6^1 = 6; 6^2 = 1

Wir beobachten, dass es für jedes Element a einen Exponenten i gibt, für den ai = 1. Bei manchen Elementen, wie z.B. a = 3, ist dies erst dann der Fall, wenn i = ord (( 7, ·)).

Jedenfalls gibt es, ein kleinstes j, sodass aj = 1 (Begründung dafür siehe Satz 4.5) und j ist ein Teiler der Gruppenordnung.

Weiters vermerken wir eine besondere Eigenschaft von a = 3 ∈ 7*: die Potenzen a^1, a^2, ..., a^6 = aord(G) = 1 liefern alle Elemente dieser Gruppe. Vorab sei erwähnt, dass die letztere Eigenschaft nicht bei allen Gruppen zu beobachten ist, wohl aber bei ( p, ·) immer mindestens ein Element mit dieser Eigenschaft zu finden ist (siehe dazu Definition 4.10).

Schließlich beobachten wir auch noch folgendes: Die Mengen U_1 = {2i | i = 1, 2, 3} und U_2 = {6i | i = 1, 2} bilden alle nichttrivialen Untergruppen von ( 7*, ·) und es gilt ord(Uj) / ord (( 7*, ·)) für j = 1,2.

Im Folgenden wollen wir diese Beobachtungen in allgemeinen Aussagen formulieren.

Definition 4.9: Ist (G, ) eine Gruppe und x ∈ G, so heißt die kleinste natürliche Zahl r mit der Eigenschaft xr = e die Ordnung des Elementes x.

In unendlichen Gruppen kann es durchaus Elemente geben, die keine Ordnung haben. Ein triviales Beispiel liefert z.B. 5 ∈  , denn 5k = 1 ist in (  *, ·) für k ≠ 0 nicht lösbar. Anderseits hat –1 ∈ die Ordnung 2, denn (-1)2 = 1. In Gruppen endlicher Ordnung hat jedes Element eine Ordnung, denn es gilt der

Satz 4.5: Ist (G, ) eine endliche Gruppe mit dem neutralen Element e und der Ordnung g = ord(G) und ist x ∈ G beliebig, so gibt es eine positive ganze Zahl r, sodass xr = e.

Beweis: Wegen g = ord(G) können die g + 1 Potenzen x^1, x^2, ..., xg+1 nicht alle voneinander verschieden sein. Es gibt also zwei Exponenten m und s mit 1 ≤ m, s ≤ g + 1, für die xm = xs. Ist o.B.d.A. s < m, so folgt mit r = m – s > 0, dass xm-s = xr = e.

Das Potenzieren von Elementen x ∈ G und die Beobachtung am Beispiel ( 7*, ·), wo wir mit a = 3 und {ai | i = 1, 2, ..., 6} alle Elemente von ( 7*, ·) erzeugen konnten, gibt Anlass für eine weitere Begriffsbestimmung:

Definition 4.10: Eine Gruppe (G,  ) heißt zyklische Gruppe, wenn es ein Element a ∈ G gibt, sodass es für jedes x ∈ G ein k ∈ gibt, sodass x = ak.

Ein solches Element a heißt Generator von G oder erzeugendes Element oder Erzeugende der zyklischen Gruppe.

Beispiel:

( , +) ist zyklisch, denn 1 ist ein Generator, wobei das „Potenzieren“ hier bei der Operation „+“ natürlich dem wiederholten Addieren entspricht:

x ∈ : x = 1 + 1 + 1 ... + 1 (1 tritt x-mal als Summand auf und 1^0 = 0)

Beispiel:

({1, -1}, ·) ist zyklisch der Ordnung 2.

Beispiel:

(ohne Beweis): Die Gruppen ( p*,  ·) sind zyklisch.

Für den allgemeinen Fall hat Gauss bereits bewiesen: Es sei n≥ 2 und p≠ 2 prim. Die prime Restklassengruppe Z/n ist genau dann zyklisch, wenn n = 2 oder n = 4 oder n = pj oder n = 2 pj mit j ∈ N.

Satz 4.6: Alle zyklischen Gruppen sind abelsch.

Beweis: Sei (G, ) zyklisch, a ein Generator und x,y ∈ G, wobei x = ak und y = am. Dann folgt xy = ak ak = ak+m = am+k = amak = yx.

Nun hatten wir an einem Beispiel beobachtet, dass die durch ak, a ∈ 7*, erzeugten zyklischen Gruppen alle Untergruppen von ( 7*, ·), sind. In der Tat gilt diese Beobachtung weit allgemeiner durch folgenden

Satz 4.7: Ist G eine Gruppe und a ∈ G ein Element mit endlicher Ordnung k, dann erzeugt a eine zyklische Untergruppe U der Ordnung k, deren Elemente e, a, a^2, ..., ak-1 sind.

Beweis: Wir zeigen zunächst, dass das Untergruppenkriterium erfüllt ist:

Seien x,y ∈ U, wobei x = an und y = am mit 1≤ n, m ≤ k-1. Ist n+m < k, so ist xy = an am = an+m ∈ U. Ist n+m = s ≥ k, so folgt wegen s = kq + r mit 0 ≤ r < k, dass xy = an am = an+m = akq+r = (ak)q ar = eq ar = ar ∈ U.

Sei x = an ∈ U mit 1≤ n ≤ k-1. Dann ist ak-n die Inverse x-1 von x. Denn xx-1 = an ak-n = ak = e und es gilt 1≤ k-n ≤ k-1, somit x-1∈ U. Aufgrund der Definition der Ordnung eines Elements sind alle Potenzen e, a, a^2, ..., ak-1 voneinander verschieden und damit hat U die Ordnung k.

Über die Ordnung der Untergruppen wissen wir durch den Satz von Lagrange, dass k ⁄ ord(G). Und daraus wieder folgt wegen g = ord(G) und g = s · k, dass xg = xsk = (xk)s = es = e, was in einem Satz formuliert heißt:

Satz 4.8: Für alle Elemente x einer Gruppe G mit der Ordnung g = ord(G) gilt xg = e, wobei e das neutrale Element von G ist.

In der Sprechweise der Zahlentheorie ist folgende Bezeichnung üblich:

Definition 4.11: Ein Element a ∈ G einer zyklischen Gruppe G heißt Primitivwurzel, wenn ord(a) = ord(G).

Beispiel:

In ( 7*, ·) ist a = 3 eine Primitivwurzel, wie wir ein paar Zeilen nach Satz 4.4 durch Berechnung der Potenzen schon gezeigt haben. Das vorige Ergebnis zeigt sehr schön, wie man Ergebnisse aus der Algebra auf die Zahlentheorie übertragen kann.

So hat Fermat folgenden Satz bewiesen:

Satz 4.9: Ist p prim und x ∈ mit p∤ x, dann gilt xp-1 ≡ 1 mod p.

Dieser Satz wird als „kleiner Satz von Fermat“ (im Gegensatz zum „großen Satz von Fermat“: xn + yn = zn ganzzahlig nicht lösbar für n > 2) bezeichnet.

Beweis:

(1) die Gruppe der primen Restklassen unter der Multiplikation ( p*,·) ist zyklisch.

(2) ord(( p*,·)) = p-1.

(3) 1 ist das Einselement von ( p*,·)

ord(( p*,·)) ist nicht prim, weil p-1 gerade ist. Was ist aber über die Anzahl von nichttrivialen Untergruppen eine Gruppe G zu sagen, deren Ordnung eine Primzahl ist?

Z.B.:   ( p, +) mit p prim ist eine solche:

( 5,+) besteht aus den Restklassen 0, 1, 2, 3, 4 und die Verknüpfung ist die Addition modulo 5.

Da ord(U) ⁄ ord(G) gelten muss, andererseits aber ord(G) als prim angenommen wurde, folgt sofort

Satz 4.10: Ist G eine endliche Gruppe, deren Ordnung eine Primzahl ist, so hat G außer {e} und G selbst keine Untergruppen.

4.3.3. Nebenklassen und Normalteiler

Bei der Untersuchung von Gruppen G und deren Untergruppen U ist folgende Fragestellung interessant: kennt man ein U, inwieweit kann man damit andere besondere Teilmengen von G bestimmen?

Wir beginnen diese Frage am Beispiel G = ( p*,·) mit p = 13 experimentell zu untersuchen.

Über ( p*,·) wissen wir bereits

(i)       die Gruppe ist zyklisch

(ii)      die Gruppe ist abelsch, da jede zyklische Gruppe abelsch ist

(iii)     ist a ∈ ( p*,·) mit der Ordnung k, dann erzeugt a eine zyklische (und hier auch: abelsche) Untergruppe U der Ordnung k, deren Elemente e, a, a^2, a^3, ..., ak-1 sind.

Wir wählen bei p = 13 nun a = 5 und erhalten a^1 = 5, a^2 = 25 ≡ 12 mod 13, a^3 = 125 ≡ 8 mod 13, a^4 = 625 ≡ 1 mod 13.

Demnach bildet U = {5, 12, 8, 1} eine Untergruppe mit ord (U) = 4. Es muss gelten ord(U) ⁄ ord(G), was mit 4 ⁄ 12 der Fall ist. Klar ist, dass mit a ∈ U die Beziehung U = aU = Ua hält.

Die Schreibweise aU soll bedeuten, dass wir alle ai ∈ U der Reihe nach mit a multiplizieren. Da U selbst eine Gruppe ist, ist aai ∈ U, sodass die Kurzschreibweise aU = U gerechtfertigt ist. Da U und G = ( 13*,·) abelsch sind, gilt aU = Ua = U.

Die Frage ist, was erhält man, wenn man analog zu vorhin vorgeht, aber a_1 ∈ G und a_1 ∉ U wählt: a_1U = Ua_1 = ?

Wir wählen 4 ∉ U und erhalten

4 · 5 = 20 ≡ 7 mod 13; 4 · 12 = 48 ≡ 9 mod 13; 4 · 8 = 32 ≡ 6 mod 13;

4 · 1 = 4 ≡ 4 mod 13; zusammen U1 = 4 · U = {4, 7, 9, 6}.

Für die Anzahl |U_1| der Elemente von U_1 gilt zwar |U_1| ⁄ ord(G), aber U_1 ist keine Gruppe, da z.B. 1 ∉ U1. Weiters ist U ∩ U_1 = ∅.

Von den in G = ( 13*,·) verbleibenden Elementen nehmen wir etwa a_2 = 2 und konstruieren wie vorhin bei U_1 = 4 · U die Menge U_2 = 2 · U = {2, 10, 11, 3}. Die Mengen U, U1, U2 haben jeweils gleich viele Elemente.

Ferner gilt U ∩ Ui = ∅ bzw. Ui ∩ Uj = ∅ für i ≠ j und G = U ∪ U_1 ∪ U_2. Was haben wir erkannt bei G = ( 13*,·) und U Untergruppe von G?

(1) Ist a ∈ U ⇒ aU = U

(2) U und alle mit aU erzeugten Klassen (sie heißen : Nebenklassen) sind entweder gleich oder disjunkt

(3) Alle erzeugten Nebenklassen einschließlich U sind gleichmächtig (haben gleich viele Elemente) und bilden wegen (2) zusammen eine Partition von G = ( 13*,·), d.h. G ist die disjunkte Vereinigung der Nebenklassen.

Letzteres schreibt man als

(4) Weil im Beispiel U abelsch ist, gilt sogar aU = Ua = U.

In unserem Beispiel gibt es einige Einschränkungen gegenüber dem allgemeinen Fall: Zunächst ist die betrachtete Untergruppe U abelsch. Dabei bleiben wir, obgleich in der Algebra der allgemeine Fall untersucht wird und dann Begriffe wie „Linksnebenklassen“ und „Rechtsnebenklassen“ eingeführt werden (vgl. Definition 4.12).

Das Beispiel G = ( 13*,·) ist repräsentativ ist für G = ( p*,·). Dass aber G zyklisch angenommen worden ist, war nur eine Frage der Bequemlichkeit, um durch Potenzieren eines Elementes a ∈ G „schnell“ ein Beispiel für eine Untergruppe hinschreiben zu können.

Die beobachteten Eigenschaften und die Klassenzerlegung gelten allgemein und man kommt zu folgenden Definitionen:

Definition 4.12: Sei (G, ) eine Gruppe, U ⊆ G eine Untergruppe und g ∈ G. Dann heißt die Menge gU eine Linksnebenklasse (bzw. Ug: Rechtsnebenklasse) von G nach U.

Man beachte, dass wegen U = eU auch U selbst eine Nebenklasse ist.

Definition 4.13: Eine Untergruppe U einer Gruppe (G,  ) heißt Normalteiler N, wenn die Linksnebenklassen und die Rechtsnebenklassen von G nach U übereinstimmen, wenn also gU = Ug für alle g ∈ G.

In abelschen Gruppen ist, wie bereits hingewiesen, dies immer der Fall, da dort per definitionem das Kommutativgesetz gilt.

Die vorhin in (1) – (3) zusammengefassten Eigenschaften von ( 13*,·) gelten allgemein:

Satz 4.11: Sei U eine Untergruppe von (G, ). Dann gilt:

(1) Ist a ∈ U ⇒ aU = U.

(2) Je zwei Nebenklassen von G nach U sind disjunkt oder identisch.

(3) Alle Nebenklassen von G nach U sind gleichmächtig.

Beweis: (1) ist trivial.

(2) Angenommen x ∈ gU ∩ hU ≠ ∅. Dann gibt es ein y ∈ U, sodass x = gy und ein

z ∈ U, sodass x = hz. Aus x = gy = hz folgt dann

gU = (gy)U = (hz)U = hU, also gU = hU.

(3) Man betrachte die Abbildung f: U → Ua mit f(u) = ua. Es ist zu zeigen, dass f eineindeutig (bijektiv) ist, d.h. sowohl surjektiv als auch injektiv ist. Dass die Abbildung surjektiv ist, folgt unmittelbar aus ihrer Definition. Sie ist injektiv, weil für zwei verschiedene u_1, u_2 folgt, dass ihre Bilder u_1a und u_2a verschieden sind. Wäre dies nicht der Fall, so wäre u_1a = u_2a und u_1a a-1 = u_2 a a-1 und somit u_1 = u_2. Widerspruch!

Die Anzahl der Linksnebenklassen und der Rechtsnebenklassen ist also gleich, man bezeichnet sie mit |G : U| und nennt sie Index von U in G.

Ist G endlich, so ist es auch der Index |G : U|.

Auf Grund der Eigenschaft (2) bilden die Nebenklassen eine Partition der Gruppe G, jedes Element g ∈ G gehört genau einer Klasse an. Man beachte, dass die Nebenklassen mit Ausnahme von U selbst keine (Unter-)Gruppen sind, denn das neutrale Element ist nur in U enthalten.

Ist N ein Normalteiler von G und die daraus resultierende Nebenklassenzerlegung

so findet man, da die Nebenklassen disjunkt sind, oft auch folgende Schreibweise G = N + NP_1 + NP_2 + …

Diese Nebenklassen bilden für sich alleine betrachtet eine Gruppe, die Faktorgruppe G/N (sprich: G nach N), in der der Normalteiler N die Rolle des neutralen Elementes übernimmt. Die Verknüpfung ist gegeben, indem man für NPk = NPi ⊗ NPj je einen Repräsentanten pi bzw. pj aus NPi bzw. NPj nimmt und NPk jene Nebenklasse ist, in der pk = pi  pj liegt.

Weil alle Nebenklassen gleich viele Elemente |U| enthalten und eine Partition von G bilden, gilt für eine endliche Gruppe G die Beziehung |G| = |G : U| · |U|. Und dies ist der schon früher genannte Satz von Lagrange.

Satz von Lagrange 4.12:

Für jede Untergruppe U einer endlichen Gruppe G gilt ord(G) = |G : U| · ord(U). Dies bedeutet, dass sowohl Ordnung als auch Index jeder Untergruppe Teiler der Gruppenordnung ord(G) sind.

Da wir wissen, dass ord(( p*,·)) = p-1 und ( p*,·) zyklisch ist, folgt aus dem Satz von Lagrange speziell der („kleine“) Satz von Fermat: xp-1 ≡ 1 mod p.  Die Überlegung dazu ist folgendermaßen: Jedes Element u der Ordnung ord(u) in einer zyklischen Gruppe G erzeugt durch {u, u^2, ..., uord(u) = e} eine zyklische Untergruppe der Ordnung m = ord(u). Demnach muss m ein Teiler von n = ord(G) sein, d.h. n = mq. Man erhält un = umq = (um)q = e^9 = e.

Der Satz von Fermat folgt nun unmittelbar, da in p* gilt n = ord(( p*,·)) = p-1 und e = 1. Auch das nachfolgende Beispiel zeigt, wie eng Teile der Zahlentheorie mit der Algebra zusammenhängen.

Betrachten wir 5 = {5 i | i ∈ }. Die Menge 5  bildet eine Untergruppe von (  , +) bestehend aus allen Vielfachen von 5. Als Nebenklassen nach 5  erhält man {5i}, {5i + 1}, {5i + 2}, {5i + 3}, {5i + 4}, die alle gleichmächtig wie 5  = {5 i | i ∈ } sind. Diese entsprechen aber genau den Restklassen mod 5.

Als weiteres Beispiel betrachten wir die zyklische Gruppe ( p*, ·) und wählen p = 13 und r = 5, sodass r^4 ≡ 1 mod 13. Damit ist r keine Primitivwurzel, erzeugt aber die zyklische und damit abelsche Untergruppe N = {5, 12, 8, 1}, die als Normalteiler verwendet werden kann.

Mit p_1 = 6 ∈ N erhält man NP_1 = {4, 7, 9, 6},

mit p_2 = 3 ∈ N ergibt sich NP_2 = {2, 10, 11, 3}

und somit

G = ( 13*, ·) = {5, 12, 8, 1} + {4, 7, 9, 6} + {2, 10, 11, 3}

G/N = {1 , 2 , 4 }.

4.3.4. Isomorphie von Gruppen

Als Ausgangspunkt betrachten wir die additive Restklassengruppe ( 4, +) mit den Elementen { 0 , 1 , 2 , 3 } = {e, a, b , c} und die multiplikative Restklassengruppe ( 5*, ·) mit den Elementen {1 , 2 , 3, 4 }, die in folgenden Gruppentafeln beschreibbar sind:

Nun definieren wir eine bijektive Abbildung φ von { 0 , 1 , 2 , 3 } auf {1 , 2 , 3, 4 }: φ(0) = 1, φ(1) = 2, φ(2) = 4, φ(3) = 3

Als erstes beobachten wir, dass das neutrale Element von ( 4, +) auf das neutrale Element (Einselement) von ( 5*, ·) abgebildet wird. Als nächstes überprüfen wir, was mit den Bildern von Verknüpfungen geschieht und stellen fest

φ(a+b) = φ(a) · φ(b), denn

Damit haben wir eine bijektive Abbildung φ von ( 4, +) auf ( 5*, ·) gefunden, die zugleich die Verknüpfungsregeln insofern einhält, dass die beiden Verknüpfungstafeln bis auf die Bezeichnung der Elemente übereinstimmen.

Dazu gibt es folgende

Definition 4.14: Sind (G, ) und (H, ) zwei Gruppen und ist φ : G → H eine bijektive Abbildung der Elemente von G auf die Elemente von H, mit φ(a  b) = φ(a)  φ(b) dann heißen G und H isomorph.

Manchmal wird einfach φ(a · b) = φ(a) · φ(b) geschrieben, ohne besonders hervorzuheben, dass „·” links eine andere Operation als „·” rechts ist.

Gibt man die Forderung der Bijektivität von φ auf und verlangt nur φ(a · b) = φ(a) · φ(b), so spricht man von einem Gruppenhomomorphismus.

Man kann Isomorphismus bzw. Homomorphismus genauso gut zunächst für Halbgruppen, dann für Monoide und schließlich für Gruppen einführen.

Oder man beginnt z.B. mit der Definition eines Gruppenhomomorphismus und kommt durch die zusätzliche Forderung, dass φ bijektiv sein muss, so zum Isomorphismus. Sind zwei Gruppen G und H isomorph, so ist die Schreibweise G ≅ H üblich.

Für Ringe und Körper, die im nächsten Kapitel besprochen werden, ist der Isomorphiebegriff analog eingeführt: entscheidend ist neben der Bijektivität von φ, dass wie beim Gruppenisomorphismus für die dort existierenden Verknüpfungen  und  die Regeln φ(a) ο φ(b) = φ(a ο b) erfüllt sind.

4.4. Ringe und Körper

4.4.1. Ringe

Wir haben gesehen, dass  unter der Addition „+“ eine abelsche Gruppe bildet. Aber  bildet unter „·“ keine solche, da z.B. 0 x = 1 nicht ganzzahlig lösbar ist.

Lässt man die Null weg und wählt *, so ergibt sich immer noch keine Gruppe, da dann etwa 7 x = 1 nicht ganzzahlig lösbar ist.

Die Rationalen Zahlen  verhalten sich da schon „besser“. Sie bilden nicht nur für „+“ sondern auch (wenn man wieder * betrachtet) für „·“ eine (abelsche) Gruppe. Somit haben wir 2 Operationen auf (abgesehen von der Null) ein und derselben Menge definiert.

Die Sache wird aber spannend, wenn man beide Operationen mit einem weiteren Gesetz, dem Distributivgesetz, zusammenführt:

(a + b) · c = a · c + b · c

a · (b + c) = a · b + a · c

Unser Ziel ist, zu erklären, was ein Körper ist. Dazu erweitern wir schrittweise die Menge der definierenden Regeln.

Zunächst erklären wir, was man unter einem Ring versteht. Bei diesem wird verlangt, dass unter der Operation „+“ (sie wird üblicherweise als Addition bezeichnet, weil in den meisten Beispielen mit Zahlen man für „+“ die gewöhnliche Addition nimmt) eine abelsche Gruppe vorliegt, für „·“ aber nur eine Halbgruppe verlangt wird, d.h. a · x = b muss für x nicht lösbar sein. Schließlich gilt für „·“ bezüglich „+“ das Distributivgesetz.

Definition 4.15: Ein Ring ist eine nicht-leere Menge M in Verbindung mit zwei Operationen, Addition „+“ und Multiplikation „·“, sodass folgende Regeln gelten:

(1) wenn x, y ∈ M dann x + y ∈ M (Abgeschlossenheit bzgl. „+“ )

(2) x + y = y + x für alle x, y ∈ M ( (M,+) ist kommutativ )

(3) (x + y) + z = x + (y + z) für alle x, y, z ∈ M ( (M,+) ist assoziativ )

(4) es gibt ein Element 0 ∈ M, sodass x + 0 = 0 + x für alle x ∈ M („Nullelement“)

(5) für jedes x ∈ M gibt es ein Element –x ∈ M, sodass x + (–x) = 0 = (–x) + x (inverses Element existiert

(6) wenn x, y ∈ M, dann xy ∈ M (Abgeschlossenheit bzgl. „·“ )

(7) (xy) z = x (yz) für alle x, y, z ∈ M ( (M, ·) ist kommutativ )

(8) x (y + z) = xy + xz und (x + y) z = xz + yz für alle x, y, z ∈ M (Distributivität)

Interpretation der Regeln:

-      (1) – (5) besagen, dass (M, +) eine abelsche Gruppe ist,

-      (6) – (7) besagen, dass (M, ·) eine Halbgruppe ist

-      (8) ist das erwähnte Distributivgesetz, welches gestattet, die Operationen „+“ und „·“ in gemeinsamen Ausdrücken rechnerisch zu verwenden.

Als Schreibweise für die Menge M mit ihren Verknüpfungen verwenden wir analog (M,+, ·).

Beispiele für Ringe sind ( , +, ·), (  , +, ·) und ( n, +, ·), wobei n die Menge der Restklassen modulo n ist.

Was uns noch fehlt, ist die Möglichkeit, zu dividieren. Es muss also M auch bezüglich der Multiplikation auf eine Gruppe erweitert werden.

Es sei nochmals darauf hingewiesen, dass man die Zeichen „+“ und „·“ verwendet und sie als Addition bzw. Multiplikation bezeichnet, weil dies für die meisten Beispiele zutrifft. Es können aber beliebige andere Operationen „“ und „“ verwendet werden, solange sie den Gesetzen (1) – (8) genügen.

Um zu einem Körper zu gelangen, erweitert man die Regeln (1) – (8) um 3 weitere wie folgt:

4.4.2. Körper

Definition 4.16: Ein Körper ist ein Ring, für den folgende zusätzliche Regeln gelten:

(9) xy = yx für alle x, y ∈ M

(10) es gibt ein „Einselement“ e ∈ M (statt e schreibt man gelegentlich auch 1), sodass xe = x = ex für alle x ∈ M

(11) für jedes x ∈ M* = M \ {0} gibt es ein inverses Element x-1 ∈ M \ {0}, sodass xx-1 = x-1x = e.

In obiger Definition hat man bei Regel (11) zu beachten, dass x ∈ M \ {0} verlangt wird, womit das Nullelement bei der Berechnung der Inversen x-1 von x ausgeschlossen wird.

Damit wird implizit verlangt, dass für x, y ∈ M die Nullteilerfreiheit gilt: x ≠ 0, y ≠ 0 → xy ≠ 0.

Wir rufen in Erinnerung, dass ein Ring nicht nullteilerfrei zu sein braucht. Ein Beispiel dazu ist ( n, +, ·) für n nicht prim. ( , +, ·) wäre ein Beispiel für einen nullteilerfreien Ring, der kein Körper ist.

Man kann die Definition eines Körpers auch so formulieren:

Definition 4.17: Ist (M, +, ·) ein Ring, der bezüglich „·“ kommutativ ist, so heißt er kommutativer Ring. Ist zusätzlich (M \ {0}, ·) eine abelsche Gruppe, so heißt (M, +, ·) ein Körper.

Wir erwähnen noch, dass im Zusammenhang mit Nullteilern beim Übergang von Ringen zu Körpern oft noch definitorisch ein Zwischenschritt eingeführt wird:

Definition 4.18: Ein Integritätsbereich ist ein kommutativer Ring mit Einselement ohne Nullteiler.

Damit ist jeder Körper ein Integritätsbereich. Die Umkehrung gilt natürlich mangels der Regel (11) nicht. ( , +, ·) ist wieder ein Beispiel für einen Integritätsbereich, der kein Körper ist.

Zusammenfassend kann man auch sagen:

Ein Ring (M, +, ·) für den (M \ {0}, ·) eine abelsche Gruppe ist, heißt Körper.

Beispiele: ( , +, ·), ( , +, ·) und ( , +, ·) sind Körper.

Bezeichnen wir wieder mit n das Restklassensystem { 0, 1 , ..., n -1}, so wissen wir bereits, dass die Teilmenge jener Klassen (ohne 0 ), die zum Modul n relativ prim sind, eine abelsche Gruppe bezüglich der Multiplikation bilden.

Ist n = p eine Primzahl, dann sind die Klassen 1 , ..., p -1 zu p relativ prim. Daher gilt folgender

Satz 4.13: n ist dann und nur dann ein Körper, wenn n eine Primzahl p ist, d.h. ( p, +, ·) ist ein Körper.

Wir erinnern daran, dass ( , +, ·) und ( n, +, ·) wenn n nicht prim ist, zwar kommutative Ringe, aber keine Körper sind.

Ein endlicher Körper (K, +, ·) muss mindestens zwei Elemente enthalten: das Nullelement wegen (4) und das Einselement wegen (10) (diese beiden dürfen nicht identisch sein, da ja sonst K* eine leere Menge wäre und Gruppen nicht auf leeren Mengen definiert sind.)

Betrachten wir M = {0, 1} = {true, false} und geben wir folgende Regeln vor:

Die Regeln für + entsprechen der XOR Operation z = x XOR y: z ist genau dann „true“, wenn x und y verschieden sind. (Man beachte, dass dieses „exklusive Oder XOR“ anders definiert ist als die Disjunktion, das „inklusive Oder OR“. In Programmiersprachen werden daher für OR bzw. XOR unterschiedliche Operatoren verwendet!).

(M, +) ist eine abelsche Gruppe, was leicht zu überprüfen ist und (M \ {0}, ·) bildet trivialerweise eine abelsche Gruppe. Ferner kann man sich durch Nachrechnen überlegen, dass auch das Distributivgesetz gilt: (a + b) c = ac + bc und a (b + c) = ab + ac

Wir haben demnach einen bemerkenswert einfachen Körper vor uns. Er ist ein Spezialfall von bestimmten endlichen Körpern, die von Galois (Evariste Galois, 1811 – 1832) untersucht worden sind und trägt den Namen Galois-Feld der Charakteristik 2. Folgende Bezeichnungen sind dafür gängig: K2 bzw. ({0,1},+,.) bzw. ( 2 ,+,.). bzw. GF2 bzw. GF(2)

Er wird später im Zusammenhang mit Polynomen für eine überraschende Anwendung sorgen.

4.5. Polynome

4.5.1. Polynome über einem Körper

Aus der Analysis kennen wir Funktionen der Gestalt p(x) = an xn + an-1 xn-1 + ... + a_1 x + a_0 mit ai ∈ für i = 0, 1, … n-1, n als Polynomfunktionen p(x): → . Polynomfunktionen sind in der Analysis wichtig, weil man mit ihnen andere, „kompliziertere“, Funktionen approximieren (annähern) kann und weil sie leicht zu differenzieren und integrieren sind.

Beispiel:

In der Algebra löst man sich von der speziellen Interpretation als Funktion und untersucht formale Ausdrücke der Gestalt

p = an xn + an-1 xn-1 + ... + a_1 x + a_0

als Objekte für sich. Dabei ist x ein formales Symbol und die Koeffizienten ai stammen aus einem Ring oder einem Körper., d.h. an xn + an-1 xn-1 + ... + a_1 x + a_0ist keine Zahl, sondern einstweilen nur ein formaler Ausdruck! Wir werden uns im Folgenden auf Koeffizienten aus einem Körper, z.B. aus , , p, beschränken.

Wir definieren somit

Definition 4.19: Sei K ein Körper. Ein Ausdruck der Gestalt p = an xn + an-1 xn-1 + ... + a_1 x + a_0 mit n ∈0 und ai ∈ K für i = 0, 1, … n-1, n heißt Polynom über K.

Gilt ai = 0 für i = 0, 1, ..., n, so heißt p das Nullpolynom.

Der Grad von p ist die höchste in p tatsächlich auftretende Potenz von x. Polynome vom Grad 0 heißen konstant, Polynome vom Grad 1 heißen linear, Polynome vom Grad 2 heißen quadratisch. Dem Nullpolynom ordnet man per definitionem den Grad –∞ zu (der Grund hierfür wird später erläutert).

Beispiele:

Sei K =

führende Nullen werden nicht angeschrieben, daher:

p_2 = 0x^5 + 0x^4 + 0x^3 + 3x^2 + 2x + 1 = 3x^2 + 2x + 1

p_3 = 5

p_4 = 0

p_1 ist ein Polynom vom Grad 3, p_2 ist quadratisch, p_3 ist konstant, p_4 ist das Nullpolynom.

Wegen p = 0xn + 0xn-1 + ... + 0x + a kann man jedes Element a ∈ K als Polynom interpretieren.

Für die Informatik nicht uninteressant ist die Beobachtung, dass man ein Polynom auch als endliche Folge seiner Koeffizienten ai ∈ K schreiben kann:

p = (an, an-1, ..., a_1, a_0)

Als Beispiel nehmen wir den früher vorgestellten Körper K_2 , welcher nur aus den zwei Elementen 0 und 1 besteht.

Dann kann man jedes Bitmuster, z.B. ein Byte, als Polynom über K_2 (GF2) auffassen und damit rechnen.

Beispiel:

(0, 1, 1, 0, 0, 1, 0, 1) = x^6 + x^5 + x^2 + 1

4.5.2. Rechnen mit Polynomen

Die Menge K[x] der Polynome über einem Körper K bildet einen Ring, also eine algebraische Struktur, in der man addieren, subtrahieren und multiplizieren kann. Aber K[x] ist kein Körper, sodass man nicht dividieren kann (so gibt es etwa kein inverses Element bezüglich der Multiplikation zu p = x). Wir begegnen hier der vergleichbaren Situation von , wo man stattdessen die Division mit Rest eingeführt hat: a = bq + r.

Bevor wir darauf näher eingehen, müssen wir zunächst Rechenregeln für die Addition und Multiplikation von Polynomen einführen.

Es sei p = an xn + ... + a_0 und q = bmm xm + ... + b_0. Ist o.B.d.A. n > m, dann kann man q auch wie folgt darstellen: q = bn xn + ... + bm+1 xn+1 + bm xm + ... + b_0, wobei bn = ... = bm+1 = 0.

Definition 4.20: Sind p, q zwei Polynome über einem Körper K, so ist p + q = (an + bn) xn + (an-1 + bn-1) xn-1 + ... + (a_0 + b_0) man addiert also „komponentenweise“

Definition 4.21: Sind p, q zwei Polynome über einem Körper K, so ist p · q = an + bm xn+m + … + (a_0 br + a_1 br-1 + ... + ar-1 b_1 + ar b_0) xr + … + a_0 + b_0

Vielleicht sind wir gewohnt, Polynome „gliedweise zu multiplizieren und dann die Glieder mit gleicher Potenz zusammenzufassen“ und obige Definition mag beim ersten Hinschauen etwas irritieren. Wenn man die Potenzen von x aber heraushebt, erhält man genau die Darstellung von oben.

Beispiel:

p = p_3x^3 + p_2x^2 + p_1x + p0 = 4x^3 + 2x^2 + x +1

q = q_2x^2 + q_1x + q_0 = 3x^2 + x + 3

p · q = 12x^5 + 6x^4 + 3x^3 + 3x^2 + 4x^4 + 2x^3 + x^2 + x + 12x^3 + 6x^2 + 3x + 3 =

= 12x^5 + 10x^4 + 17x^3 + 10x^2 + 4x + 3

a_0b_5 + a_1b_4 + 2b_3 + 3b_2 + 4b_1 + 5b_0 = 12

a_0b_4 + a_1b_3 + 2b_2 + 3b_1 + 4b_0 = 10

a_0b_3 + a_1b_2 + 2b_1 + 3b_0 = 17

a_0b_2 + a_1b_1 + 2b_0 = 10

a_0b_1 + a_1b_0 = 4

a_0b_0 = 3

Im nächsten Beispiel wählen wir K_2 als Körper und betrachten einige Polynome über K_2.

Diese sind nicht zufällig ausgewählt – sie spielen in der Datenübertragung bei Fehlererkennung eine besondere Rolle („Cyclic Redundancy Code“).

Beispiel:

p = CRC-12 = x^12 + x^11 + x^3 + x^2 + x + 1

p = CRC-16 = x^16 + x^15 + x^2 + 1

p = CRC-CCITT = x^16 + x^12 + x^5 + 1

Die entsprechende Darstellung als Folge von 0 und 1, also als Bitmuster, in einem 17-Bit breiten Wort [b_16, b_15, ..., b_1, b0] ist:

CRC-12 = [00001100000001111]

CRC-16 = [11000000000000101]

CRC-CCITT = [10001000000100001]

Alle drei Polynome sind das Produkt von je zwei Polynomen, wobei eines davon x + 1 ist: sie haben also (x + 1) als „Faktor“.

CRC-12 = (x^11 + x^2 + 1) (x + 1)

CRC-16 = (x^15 + x + 1) (x + 1)

CRC-CCITT = (x^15 + x^14 + x^13 + x^12 + x^4 + x^3 + x^2 + x + 1) (x + 1)

Berechnet man z.B. für CRC-CCITT (Comité Consultatif International de Télégraphique et Téléphonique, eine Einrichtung für Standards in der Nachrichtenübertragung) das Produkt

(x^15 + x^14 + x^13 + x^12 + x^4 + x^3 + x^2 + x + 1) (x + 1), so hat man insbesondere zu beachten, dass in K_2 modulo 2 gerechnet wird und daher xj + xj = 0, sich also beim Aufsummieren Glieder mit gleicher Potenz aufheben.

Aus den Definitionen für die Addition und Multiplikation in K[x] ist sofort abzuleiten:

(i) (K[x], +) ist eine abelsche Gruppe

(ii) Die Multiplikation „·“ ist kommutativ, assoziativ und es gilt das Distributivgesetz

(p + q) · h = p · h + q · h

Daher bildet K[x] einen Ring und weil wir als Definitionsbereich einen Körper K gewählt haben, ist dieser Ring auch kommutativ.

Ferner lässt sich für den Grad Gd der Summen bzw. Produkte sofort ableiten

(iii) Gd(p + q) ≤ max (Gd(p), Gd(q))

(iv) Gd(p · q) = Gd(p) + Gd(q)

Die Ungleichung ≤ in (iii) ist deshalb erforderlich, weil – wie wir am Beispiel K_2 gesehen haben – Summanden sich gegenseitig aufheben können.

Damit die Gleichung (iv) auch anwendbar ist, wenn eines der Polynome das Nullpolynom ist, ordnet man dem Nullpolynom, wie zuvor erwähnt, den Grad –∞ zu.

Das Beispiel CRC-12 = p = x^12 + x^11 + x^3 + x^2 + x + 1 = (x^11 + x^2 + 1) (x +1) lässt irrtümlich vermuten, dass man zwei Polynome dividieren könne und das Ergebnis wieder ein Polynom sei, also, „kein Rest“ bleibe und somit K[x] sogar ein Körper sei. Dass dies im Allgemeinen nicht der Fall ist, sollen folgende Überlegungen zeigen:

Das neutrale Element 1 der Multiplikation in K ist gleichzeitig neutrales Element der Multiplikation in K[x], denn p · 1 = 1 · p = p für alle p ∈ K[x]. (Zwecks Vereinheitlichung der Schreibweise setzt man gelegentlich x^0 = 1 und nennt es auch das Einspolynom.)

Wäre K[x] ein Körper, müsste (K[x] \ {0}, ·) die Gruppeneigenschaft haben, insbesondere müsste es zu jedem p ∈ K[x] \ {0} ein eindeutiges p-1 = q ∈ K[x] \ {0} geben, sodass p · q = 1.

Nun gilt aber 0 = Gd(1) = Gd(p · q) = Gd(p) + Gd(q), woraus folgt Gd(p) = Gd(q) = 0.

Daher hat z.B. x^2 kein inverses Polynom q, sodass x^2 · q = 1 wäre.

Man kann allerdings in Analogie zur Division mit Rest bei ganzen Zahlen vorgehen; dort gilt nämlich:

Zu jedem a ∈  und b ∈ gibt es eindeutig bestimmte ganze Zahlen, q, r, sodass a = bq + r mit 0 ≤ r < b.

Der entsprechende Satz für Polynome lautet:

Satz 4.14: Sind p, q zwei Polynome über einem Körper K und ist der Grad Gd(q) ≥ 0, dann gibt es eindeutig bestimmte Polynome s, r ∈ K[x] mit p = q · s + r und Gd(r) < Gd(q).

Analog zur Division mit Rest in kann hier der Rest r das Nullpolynom sein, was zu folgender Definition führt:

Definition 4.22: Ein Polynom p über dem Körper K heißt reduzibel, falls es Polynome q, s ∈ K[x] mit Grad Gd ≥ 1 gibt, sodass p = q · s. Andernfalls heißt p irreduzibel.

In Analogie zu Begriffen aus der elementaren Zahlentheorie nennt man bei einem reduziblen Polynom p = q · s die beiden Faktoren q und s auch Teiler des Polynoms p.

In der Definition ist der Zusatz „über dem Körper K“ ganz wesentlich. Beispielsweise ist das Polynom x^2 – 2 über dem Körper  der rationalen Zahlen irreduzibel, über dem Körper  der reellen Zahlen aber reduzibel:

Es sind x – √2 und x + √2 Teiler von x^2 – 2. Da √2 irrational ist, sind x – √2 und x + √2 nicht aus [x].

Beispiel:

Als Körper sei  (oder  ) gewählt.

Betrachten wir p = (x + 1) (x – 1) (2x + 1) = (x^2 – 1) (2x + 1) = 2x^3 + x^2 – 2x – 1.

Wir wissen also, dass bei der Division von p durch (x + 1) der Rest das Nullpolynom sein muss und das Ergebnis (x – 1) (2x + 1) = 2x^2 – x – 1 ist.

Beispiel:

Es gilt folgende Zerlegung:

p(x) = 3x^4 – 10x^3 + 22x^2 – 24x + 10 = (x^22 –2x + 3) (3x^2 – 4x + 5) + (–2x – 5)

Wir prüfen dies nach, indem p durch (z.B.) x^2 – 2x + 3 dividiert wird und dann der Rest (–2x – 5) übrig bleiben muss.

Beispiel:

Wir wählen als Körper K_2 und beachten, dass Addition und Subtraktion in K_2 ident mit XOR ausgeführt werden. Ferner gilt wegen 1 + 1 = 0 auch xj + xj = 0.

Sei p = x^7 + x^6 + x^4 + x^2, entspricht [11010100] und q = x^3 + x + 1 entspricht [00001011]

Das Ergebnis ist p = q · s + r mit s = x^4 + x^3 + x^2 + x und r = x^2 + x

Probe:

(x^4 + x^3 + x^2 + x) · ( x^3 + x + 1) + x^2 + x =

= (x^7 + x^6 + x^5 + x^4) + (x^5 + x^4 + x^3 + x^2) + (x^4 + x^3 + x^2 + x) + x^2 + x =

= x^7 + x^6 + x^4 + x^2 ·

4.5.3. Nullstellen

Im Hinblick auf die Anwendungen wenden wir uns nun wieder den Polynomfunktionen zu:

Sei p: K → K mit p(x) = anxn + an-1xn-1 + ... + … a_1x + a_0, wobei ai ∈ K für i = 0, 1, … n-1, n.

Definition 4.23: Ein Element α ∈ K, für das gilt p(α) = anαn + an-1 αn-1 + ... + a_1α + a_0 = 0 heißt Nullstelle der Polynomfunktion p.

Zum Unterschied zwischen Polynom und Polynomfunktion wird gleich mehr gesagt.

Wählt man K = , so lässt sich der Graph von p(x) im (x,y)-Koordinatensystem zeichnen.

Die Nullstellen sind dann jene Punkte auf der x-Achse, in denen der Graph der Funktion die x-Achse schneidet, also y = p(α) = 0 ist.

Am einfachen Beispiel y = p(x) = x^2 +a_0, a_0 > 0 erkennt man, dass eine Polynomfunktion nicht notwendigerweise eine Nullstelle haben muss, wenn K = , denn √− a 0 ∉ .

Insbesondere im Fall K =  führt obiges anschauliches Beispiel dazu, dass in der Algebra unterschieden wird zwischen einem Polynom p = anxn + ... + a_1x + a_0 und der zugehörigen („induzierten“) Polynomfunktion p(x) = anxn + ... + a_1x + a_0. Im ersteren Fall ist „+“ die Addition von Polynomen xn, xn-1, ..., x, x^0, im anderen Fall steht „+“ für die Addition in  bzw. allgemein im Körper K.

Man beachte, dass zwei verschiedene Polynome nicht unbedingt zwei verschiedene Polynomfunktionen induzieren müssen. Dazu ein ganz einfaches Beispiel im  2:

Sei p = x^2 und q = x, seien weiter p´ und q´ die zugehörigen Polynomfunktionen. Dann ist p´(0) = 0 und p´(1) = 1, aber ebenso ist q´(0) und q´(1) = 1. Damit sind die von p und q induzierten Polynomfunktionen identisch, die Polynome aber verschieden.

Es ist das Wesen der Algebra, dass sie sich durch Abstraktion von möglichen Interpretationen abhebt. Dessen ungeachtet wollen wir im Folgenden zwischen diesen zwei Gesichtspunkten nicht weiter unterscheiden. Ferner werden wir von den Beweisen der nachfolgenden Sätze absehen.

Für den vorhin genannten Satz über die Division mit Rest p(x) = q(x) s(x) + r(x) betrachten wir den Spezialfall eines Polynoms 1. Grades q(x) = (x – β) mit β ∈ K. Dividiert man p(x) durch (x – β), so erhält man als Faktor ein Polynom s(x) und als Rest p(β):

p(x) = (x – β) s(x) + p(β).

Man erkennt sofort, dass für eine Nullstelle α sich die Beziehung vereinfacht zu

p(x) = (x – α) s(x).

Beispiel:

p(x) = x^2 - 8x + 15. die Nullstellen sind α_1 = 5 und α_2 = 3:

p(x) = (x – 3) (x – 5) = (x – 2) (x – 6) + 3 = x^2 – 8x + 15

Es gilt dazu allgemein folgender

Satz 4.15: Ein Element α ∈ K ist dann und nur dann eine Nullstelle eines Polynoms p über dem Körper K, wenn (x – α) ein Teiler von p ist.

Wenn α die Nullstelle eines Polynoms p ist, so kann es sein, dass (x – α), (x – α)2, ..., (x – α)k aber nicht mehr (x – α)k+1 Teiler von p sind: die Zahl α tritt dann k mal als Nullstelle von p(x) auf und p(x) lässt sich schreiben als p(x) = (x – α)k s(x), wobei s(α) ≠ 0.

Die Zahl k heißt die Vielfachheit der Nullstelle α.

Beispiel:

p(x) = x^3 + x^2 – 5x + 3 hat 1 als zweifache und –3 als einfache Nullstelle:

p(x) = (x – 1)2 (x + 3)

Es gilt nun folgender

Satz 4.16: Ein Polynom vom Grad n über einem Körper K hat höchstens n Nullstellen, auch wenn man diese jeweils mit ihrer Vielfachheit zählt. Im Fall K =  gilt sogar die Gleichheit, mehr dazu in Kürze.

Beispiel:

p(x) = 2x^4 + 2x^3 – 4x^2 + 8x – 48

hat als Polynom  über die Nullstellen α_1 = –3 und α_2 = 2.

Dasselbe Polynom über dem Körper der komplexen Zahl  betrachtet hat neben –3 und +2 noch die Nullstellen α_3 = 2i und α_4 = –2i und lässt sich unter Beachtung von i^2 = –1 darstellen als:

2(z – 2i) (z + 2i) (z + 3) (z – 2)

(Es ist üblich, die Polynome über  als p(z) statt p(x) zu schreiben.)

Ist p(x) ein Polynom über einem Körper K, so kann man, weil die Division in K möglich ist, das Polynom normieren, d.h. den Koeffizienten der höchsten Potenz zu 1 machen, indem man die ai durch an dividiert und erhält

p(x) = xn + bn-1xn-1+ bn-2xn-2 + ... + b_1x + b_0.

Bei einem Polynom zweiten Grades über  entspricht das Aufsuchen der Nullstellen dem Lösen einer quadratischen Gleichung.

Für ein normiertes Polynom zweiten Grades gibt es zur Bestimmung der Nullstellen folgende Formel:

Zu beachten ist, dass der Radikand negativ sein kann. Dann sind α_1 und α_2 wegen i = √−1 komplexe Nullstellen und p(x) hat in diesem Fall zwar in  zwei Nullstellen, als Polynom über  aber keine.

Ist der Radikand null, so ist α_1 = α_2 und man hat eine mehrfache Nullstelle.

Beispiel:

p(x) = x^2 + 8x + 12 = 0

liefert α1,2 = – 4 ± √4^2 −12 = – 4 ± 2

α_1 = – 6; α_2 = – 2 sind Nullstellen in  und damit auch in

Beispiel:

p(x) = x^2 + 14x + 49 = 0

liefert α1,2 = – 7 ± √7^2 − 49 = – 7 ± 0

α_1 = α_2 = – 7 ist eine Nullstelle der Vielfachheit 2.

Beispiel:

p(x) = x^2 + 2x + 10

liefert α1,2 = – 1 ± √1−10 = – 1 ± 3i

α_1 = – 1 + 3i; α_2 = – 1 – 3i

Es sind α_1 und α_2 in Nullstellen des Polynoms, denn z.B.

(–1 + 3i)2 + 2 (–1 + 3i) + 10 = 1 –6i – 9 – 2 + 6i + 10 = 0

unter Beachtung von i^2 = – 1 bzw. i = √−1 .

Obiges Polynom hat demnach in  keine Nullstellen, in  aber genau 2, was dem Grad des Polynoms entspricht.

Auch für allgemeine Polynome dritten und vierten Grades über  gibt es noch Formeln, die aus den Koeffizienten mittels der Körperoperationen und Wurzeln die Nullstellen berechnen lassen. Für allgemeine Polynome höheren Grades ist die Existenz einer solchen Auflösungsformel als grundsätzlich unmöglich bewiesen und man muss Algorithmen der Numerischen Mathematik zur (approximativen) Berechnung der Nullstellen eines Polynoms heranziehen, es sei denn, man findet Nullstellen durch „Probieren“, dann kann man das Problem mittels Polynomdivision auf das Finden von Nullstellen eines Polynoms niederen Grades zurückführen.

In den obigen Beispielen haben wir folgende Beobachtungen gemacht:

(i)           Ob ein Polynom p(x) über einem Körper K überhaupt Nullstellen hat, hängt von K ab.

(ii)          Ein Polynom vom Grad n hat höchstens n Nullstellen.

(iii)         Ist K = , der Körper der komplexen Zahlen, so hat ein Polynom vom Grad n genau n Nullstellen.

Die letztere Beobachtung gilt in der Tat allgemein und ist die Aussage des Fundamentalsatzes der Algebra (C.F. Gauß, 1777 – 1855):

Satz 4.17: Jedes Polynom p(x) vom Grad n ≥ 1 hat über dem Körper  genau n Nullstellen. (Fundamentalsatz der Algebra).

Demnach lässt sich jedes Polynom p(z) = anzn + an-1zn-1 + ... + a_1z + a_0 über  mit den Nullstellen α_1, α_2, ... αn – vielfache Nullstellen entsprechend oft aufgezählt – anschreiben als

4.6. Endliche Körper

4.6.1. Vorbemerkungen

Für verschiedene Anwendungen der linearen Algebra im täglichen Leben ist mehr Information über Körper erforderlich. Zur Wiederholung: Körper sind algebraische Strukturen, in denen alle vier Grundrechnungsarten erlaubt sind.

Konkret befasst sich dieses Kapitel nicht mit den ganzen (  ), reellen ( ) oder komplexen () Zahlen, sondern mit endlichen Körpern. Das wichtigste Beispiel eines endlichen Körpers wurde bereits vorgestellt, nämlich p, die ganzen Zahlen modulo einer Primzahl. Alle diese Körper haben p Elemente, also „Primzahlordnung“.

Tatsächlich alle möglichen endlichen Körper erhält man wie folgt:

4.6.2. Die Konstruktion von endlichen Körpern

Wie schon bekannt, konstruiert man p, indem man die ganzen Zahlen  in Äquivalenzklassen einteilt, jede Klasse enthält genau ein Element k aus {0, 1, …, p-1} und alle ganzen Zahlen, die modulo p gleich k ergeben.

Man rechnet also so, dass man, wenn die Multiplikation zweier Zahlen a und b etwa eine Zahl größer p-1 ergibt, von dieser Zahl so oft p subtrahiert, bis man eine Zahl kleiner als p erhält. Alternativ betrachtet man den Rest der Division der Zahl durch p.

Beispiel:

Sei p=7: 3⋅5 = 15. Zweimaliges Subtrahieren von 7 liefert 1. Somit ist 3⋅5 = 1 modulo 7. Dies bedeutet aber, da 7 ein Körper ist, dass 3-1 = 5 bzw. 5-1 = 3 ist.

Oder mit modulo Arithmetik ausgedrückt: 15 ≡ 1 mod 7.

Endliche Körper seien nun sehr ähnlich konstruiert. Dazu sei an die Definition von K[x], den Ring aller Polynome über einem Körper K, also alle Polynome der Gestalt a_0 + a_1 x + … + anxn mit ai ∈ K, erinnert.

Man studiert jetzt konkret p[x] und sucht ein irreduzibles und normiertes Polynom f ∈ p[x]. Normiert bedeutet, dass an = 1, So ist etwa 2x² + x + 1 in 3 ein normiertes Polynom, denn weder 0, 1 noch 2 sind Nullstellen dieses Polynoms.

Anstatt modulo p rechnet man jetzt modulo einem solchen irreduziblen normierten Polynom. Analog zu n gilt auch hier: Wäre das gewählte Polynom p nicht irreduzibel würde man keinen Körper erhalten.

Man sucht also alle möglichen Reste, die bei Division durch ein solches Polynom entstehen können. Dies sind alle Polynome mit Grad < n und Koeffizienten aus p. Diese bilden dann:

Definition 4.24: GF(pn) := { k0 + k1 x + … + kn-1 xn-1 | ki ∈ p } heißt Galoisfeld der Ordnung pn.

Offensichtlich kann man in GF(pn) problemlos addieren und subtrahieren, nämlich komponentenweise.

Die Multiplikation zweier solcher Polynome p und q kann ein Polynom vom Grad ≥ n liefern, in diesem Fall geht man wieder analog wie in p vor, man bestimmt den Rest der Division des Produkt pq modulo f, wobei f das irreduzible normierte Polynom ist.

So erhält man einen Körper mit pn Elementen – jedes Element liegt in p und der Grad ist gleich n.

Beispiel:

Sei p=2 und n=2. Dieses Beispiel liefert das kleinste Galoisfeld, das nicht einem p entspricht, also speziell keine Primzahlordnung hat.

Als irreduzibles normiertes Polynom wählt man etwa f = 1+ x + x² ∈ 2[x]. Die Tatsache, dass f irreduzibel ist, ist klar: Weder 0 noch 1 sind Nullstellen von f. Welches irreduzible Polynom gewählt wird, ist egal, die Begründung folgt in Satz 4.18.c.

Die möglichen Reste eines Polynoms aus 2[x] bei Division durch f sind dann gleich 0, 1, x, 1 + x , also gilt:

GF(2²) =GF(4) = { k0 + k1 x | ki ∈2 } ist ein Körper mit vier Elementen.

Ein Beispiel zum Rechnen in GF(4):

Beispiel:

x ⋅(x + 1) = x² + x. Bei Division durch f = 1+ x + x² ergibt sich Rest 1, somit ist x² + x + 1 ≡ 1 modulo f.

Analog ergeben sich die anderen möglichen Produkte. Die Additions- bzw. Multiplikationstafeln lauten dann für dieses Galoisfeld:

4.6.3. Eigenschaften endlicher Körper

Es seien noch einige für die Praxis wichtige Fakten über endliche Körper angeführt, der Beweis entfällt. Wir erinnern an den Isomorphiebegriff für Körper aus Kapitel 4 und zwar daran, dass isomorphe Körper als „im Wesentlichen gleich“ angesehen werden können, das sie sich nur durch die Benennung der Elemente unterscheiden, mit denen aber auf dieselbe Weise gerechnet wird.

Satz 4.18:

(a) Für jede Primzahl p und jedes n ∈ gibt es (mindestens) ein normiertes irreduzibles normiertes Polynom. Das daraus resultierende Galoisfeld GF(pn) ist ein Körper mit pn Elementen.

(b) Umgekehrt hat jeder endliche Körper K eine Primzahlpotenzordnung der Form pn , wobei p eine Primzahl und n ∈ ist. K ist dann zu GF(pn) isomorph.

(c) Wegen (b) gilt, dass je zwei endliche Körper mit gleich vielen Elementen isomorph (also identifizierbar) sind. Daher ist es auch egal, welches irreduzible Polynom gewählt wird.

(d) Die multiplikative Gruppe der Elemente ohne Null eines endlichen Körpers ist zyklisch (es sei wieder an Kapitel 4 erinnert), das bedeutet, dass es ein erzeugendes Element a gibt, sodass es für jedes k ∈ K* = K\{0} ein m ∈ gibt mit k = am . Teil (d) führt auf eine alternative Darstellung eines endlichen Körpers, nämlich auf:

GF(pn) = { 0, 1, a, …, apn -2 }

Ein Sinn dieser Darstellung liegt darin, dass man dann viel einfacher multiplizieren, dividieren, potenzieren und wurzelziehen kann – einfach durch Addition, Subtraktion und Division der Exponenten.

4.7. Verbände

Von großer Bedeutung in der Algebra ist der Begriff des Verbandes, etwa für universelle Algebren, d.h. Verallgemeinerungen von Verknüpfungsgebilden mit mehreren inneren und äußeren mehrstelligen Verknüpfungen.

Auch spielen Verbände in der Informatik eine wichtige Rolle wie z.B. bei der formalen Beschreibung von elektronischen Schaltungen (Schaltalgebra) oder bei der Modellierung von Sicherheitsrichtlinien.

Definition 4.25: Ein Verband ist ein Tripel ( M,  ,  ) bestehend aus einer nichtleeren Menge M, sowie zwei Verknüpfungen („cap“) und („cup“), die folgende Regeln für alle x, y, z ∈ M erfüllen:

(i)    Kommutativität:                   x y = y x und x y = y x

(ii)    Assoziativität:                     x (y z) = (x y) z und x (y z) = (x y) z

(iii)    Idempotenz:                       x x = x und x x = x

(iv)    Verschmelzungsgesetz:   x (y x) = x (y x) = x

Wir beschränken uns in diesem Kapitel auf endliche Verbände, d.h. auf Verbände, in denen M eine endliche Menge ist.

Zur besseren Visualisierung von Verbänden und für einen wichtigen Satz benötigen wir:

Definition 4.26: Eine geordnete Menge (M, ≤) heißt verbandsgeordnet, falls je zwei Elemente v, w ∈ M ein Infimum inf(v,w) und ein Supremum sup(v,w) besitzen.

Hierbei ist inf(v,w) die größte untere Schranke von v,w, also unter allen Elementen z ∈ M mit z ≤ v und z ≤ w das größte.

Analog ist sup(v,w) die kleinste obere Schranke von v, w.

Beispiel:

Sei ({1,2,3,6,7,14,21,42}, ggT, kgV) ein Verband, so besitzen etwa im folgenden Diagramm 6 und 14 zwei untere Schranken (2 und 1), damit ist 2 das Infimum.

Abb. 4.1

Bemerkung:

Ein solches Diagramm wird auch als Hasse-Diagramm bezeichnet.

Verbände und geordnete Mengen lassen sich mit Hilfe folgenden Satzes identifizieren:

Satz 4.19:

(a) Sei ( M,  , ) ein Verband. Dann ist (M, ≤) mit v ≤ w :⇔ v w = v verbandsgeordnet.

(b) Umgekehrt sei (M, ≤) verbandsgeordnet, dann ist (M, inf, sup) ein Verband (inf bzw. sup seien die Funktionen, die das Infimum bzw. Supremum zweier Elemente des Verbands berechnen).

Der Beweis erfolgt durch einfaches (aber langwieriges) Nachrechnen.

Definition 4.27: Besitzt (M, ) ein neutrales Element, bezeichnet man dieses als Einselement (kurz: „1“) des Verbandes. Analog heißt ein eventuell vorhandenes neutrales Element von (M, ) Nullelement (kurz: „0“) des Verbandes.

Ein Verband, der sowohl ein Nullelement als auch ein Einselement besitzt, heißt beschränkt.

Es gilt dann: x 1 = x, x 1 = 1 sowie x 0 = x , x 0 = 0.

Definition 4.28: Sei ( M, , ) ein durch 0 und 1 beschränkter Verband.

Besitzt jedes Element v ein Element w mit v w = 0 und v w = 1, so heißt der Verband komplementär.

Weitere Beispiele zu Verbänden:

(i) „Mengenverband“:

(P(A), ∩,∪) ist ein beschränkter komplementärer Verband mit Nullelement {} und Einselement A.

Beispiel: Sei A = {1,2,3}, so sieht das Hassediagramm für den Mengenverband wie folgt aus:

Abb. 4.2

(ii) „Teilerverbände“:

Sei Tn die Menge aller Teiler einer natürlichen Zahl n, dann ist (Tn, ggT, kgV) einVerband mit Nullelement 1 und Einselement n.

Beispiel: Sei n=30, so sieht das Hasse-Diagramm wie folgt aus, wobei 1 dasNullelement ist (!) und 30 das Einselement.

Abb. 4.3

(iii) „Kettenverbände“:

Sei (M, ≤) eine linear geordnete Menge (z.B. die Menge {1,2,3} mit der gewöhnlichen Ordnung ≤ ), so ist (M, min, max) ein Verband. Besitzt M ein kleinstes bzw. ein größtes Element (was bei endlichen Verbänden ja immer der Fall ist), so sind diese Null- bzw. Einselement des Verbandes.

Das Hasse-Diagramm für den o.a. Verband ist:

(iv) „Untergruppenverbände“:

Sei „≤“ das Symbol für „Untergruppe von“, so lässt sich die Menge aller Untergruppen einer Gruppe als Verband interpretieren. So sieht etwa das Hasse-Diagramm des Untergruppenverbandes der Klein’schen Vierergruppe wie folgt aus:

Abb. 4.4

(v) Folgendes Diagramm stellt keinen Verband dar, da a und b keine obere Schranke besitzen:

Abb. 4.5

(vi) In folgendem Beispiel existiert zwar eine obere Schranke für c und d (sogar drei, nämlich a, b und e), aber kein Supremum, da a und b nicht vergleichbar sind. Damit liegt auch hier kein Verband vor.

Abb. 4.6

Definition 4.29: Ein Verband ( M, , ) heißt distributiv, wenn für alle x, y, z ∈ M gelten:

(i)       (x  y) z = (x z) (y z) und

(ii)      (x y) z = (x z) (y z)

Beispiel:

(i) Der Mengenverband (P(A), ∩,∪) ist für jedes A distributiv.

(ii) Das Pentagon (vgl. Abb. 4.7) ist nicht distributiv.

Abb. 4.7

(iii) Der Diamant (vgl. Abb. 4.8) ist nicht distributiv.

Abb. 4.8

Bemerkung: Es lässt sich zeigen, dass jeder nicht-distributive Verband entweder das Pentagon oder den Diamant als „Teilverband“ enthalten muss.

Sehr wichtig ist der Begriff der Boole’schen Algebra:

Definition 4.30: Ein beschränkter, distributiver und komplementärer Verband ( M, , ) heißt Boole’scher Verband oder Boole’sche Algebra.

Beispiel:

(i) Der Mengenverband (P(A), ∩,∪) ist für jedes A ein Boole’scher Verband.

(ii) Die Kette {0,1} mit 0 < 1 wird durch min und max zu einem Boole’schen Verband.

Eines der wichtigsten Beispiele für Boole’sche Algebren findet sich in der Schaltalgebra.

Beispiel (Schaltalgebra):

Gegeben seien Schalter S_1, …, Sn, die Strom leiten (1) oder nicht leiten (0). Diese Schalter können in Serie (∧) oder parallel (∨) geschaltet sowie mit Hilfe von Negationsschaltern zu Schaltungen zusammengebaut werden.

Bezeichnet man die Negation von Si mit ¬Si, so wäre etwa (S_1vS_2) w¬S_1 ein Beispiel für eine einfache Schaltung.

Hierbei gelten folgende Regeln:

(i)         0 ∧ 0 = 0, 0 ∧ 1 = 0, 1 ∧ 0 = 0, 1∧ 1 = 1

(ii)        0 ∨ 0 = 0, 0 ∨ 1 = 1, 1 ∨ 0 = 1, 1 ∨ 1 = 1

(iii)       50 =1, 51= 0

Eine Schaltung induziert demnach eine zugehörige „Schaltfunktion“ von {0,1}n nach {0,1} definieren. Das bedeutet, es gibt n Eingangswerte und einen Ausgangswert (Strom fließt oder fließt nicht).

Offenbar kann man ein und dieselbe Schaltung auf mehrere Arten zusammenbauen, so induzieren die verschiedenen Schaltungen ¬(S_1 ∧ S_2) und ¬S_1 ∨ ¬S_2 dieselbe Schaltfunktion. Zwei verschiedene Schaltungen, die wie hier dieselbe Schaltfunktion induzieren, heißen „äquivalent“. Somit können wir Äquivalenzklassen [S] von Schaltungen mit ihrer Schaltfunktion identifizieren. Dann ist ( {[S]}, ∧, ∨ ), bestehend aus allen (nicht äquivalenten) Schaltungen mit der Serien- und Parallelschaltung ein Boole’scher Verband mit Nullelement [0] (alle Schaltungen die bei jeder Belegung 0 aus Ausgabewert haben) bzw. (analog) Einselement [1].

Die Aussage, dass ¬(S_1 ∧ S_2) und ¬S_1 ∨ ¬S_2 äquivalent sind, ist eines der Gesetze von De Morgan (1815-1864, England), die sich aus den anderen Gesetzen der Boole´schen Algebra ableiten lassen.

(i)    ¬( x ∧ y) = ¬x ∨ ¬y

(ii)   ¬ (x ∨ y) = ¬x ∧ ¬y

Wegen der Bedeutung der DeMorgan Gesetze beim Rechnen in Boole´schen Verbänden findet man sie manchmal bei der Definition einer Boole´schen Algebra gleich zu den anderen Gesetzen hinzugefügt, unbeschadet ihrer Ableitbarkeit. Diesem Ansatz begegnet man vor allem dann, wenn das Konzept der Boole´schen Algebra direkt und nicht über einen Verband eingeführt wird.

4.8. Übungsaufgaben

4.1: Handelt es sich bei durch folgende Verknüpfungstafel gegebener Struktur um eine Halbgruppe/Gruppe/Monoid?

4.2: Warum kommt in jeder Zeile/Spalte der Verknüpfungstafel einer Gruppe jedes Element der Gruppe genau einmal vor?

4.3: Man bestimme

in S(4).

4.4: Man finde eine Gruppe (G,o) und Elemente x, y ∈G mit (x o y)−1 ≠ x−1 ο y−1

4.5: Man zeige die Behauptung nach Satz 4.2, dass für n ≥ 3 die S(n) nicht mehr abelsch ist.

4.6: (a) Ist {0,2,4,6} eine Untergruppe der ( 9, +)?

(b) Ist {0,2,4,6} eine Untergruppe der ( 8, +)?

4.7: (a) Man bestimme die Ordnung von 4 in ( 11*,·)

(b) Man bestimme die Ordnung von 4 in ( 11,+)

4.8: Sei G = ( 12,+). Man bestimme alle Nebenklassen sowie deren Vereinigung bzgl. U={0,3,6,9}

4.9: Sei wieder G = ( 12,+) und U={0,3,6,9}. Man bestimme den Index von U in G auf zwei Arten und vergleiche.

4.10: Rechnen modulo p: Man bestimme die Lösungsmenge folgender (in Kurzschreibweise gegebener) Gleichungssysteme in drei Variablen über 5 und die Anzahl der Lösungen.

4.11: (a) Man bestimme die Nullstellen von 1+ x^3 + x^4 + x^7 über K = 2 und faktorisiere das Ergebnis.

(b) wie (a) für -24 – 4x – 2x^2 – x^3 + x^4 und K=

4.12: Gilt folgende Behauptung:

Jede Untergruppe H einer zyklischen Gruppe G ist zyklisch.

4.13: Sei G = S(12) und

Bestimmen Sie g958003200.

4.14: (a) Man finden – falls möglich – einen nullteilerfreien Ring mit 15 Elementen

(b) Ist R = ( { a + b √2 | a, b ∈ }, +, ⋅ ) ein Körper?

4.15: (a) Hat jeder Unterring eines Integritätsbereichs, der kein Körper ist, ein Einselement?

(b) Ist 5 × 5 = ( { (a, b) | a, b ∈5), +, ⋅ ) ein Körper?

4.16: Man zeige:

Jeder Körper ist nullteilerfrei..

4.9. Applets

- Additive Restklassengruppe

Liefert die Gruppentafel für die additive Restklassengruppe.

- Multiplikative Restklassengruppe

Liefert die Gruppentafel für die multiplikative Restklassengruppe.

- Polynom-Addition

Addiert zwei Polynome vom Grad n ≤ 3 wahlweise über , 2, 3, 5 oder 7.

Die Addition erfolgt schrittweise mit Ausgabe der Zwischenergebnisse.

- Polynom-Multiplikation

Multipliziert zwei Polynome vom Grad n ≤ 3 wahlweise über , 2, 3, 5 oder 7.

Die Multiplikation erfolgt schrittweise mit Ausgabe der Zwischenergebnisse.

Für wird das Resultat im 2 gezeichnet.

- Primitivwurzeln

Untersucht wird, ob n eine Primitivwurzel mod p, prim, ist bzw. es wird die Ordnung von n in der (zyklischen) Gruppe p berechnet.

- Untergruppen

Berechnet und dargestellt werden die Untergruppen von p mit p = 2, 3, 5, 7, 11, 13, 17.

Alternativ kann man eine Teilmenge von p eingeben und testen, ob diese eine Gruppe bildet. Unter einem werden erzeugende Elemente von p besonders gekennzeichnet.

Abb. 4.9: Screenshot Applet: „Untergruppen“

Abb. 4.10: Screenshots Applet: „Polynom Multiplikation“

5. Vektorräume

5.1. Grundlagen

Zurück zu den Vektoren, die wir als Zahlenpaare ∈ 2 oder als Zahlentripel ∈ 3 auffassenkonnten. Wir haben gesehen, man kann sie (unter anderem) addieren und mit Zahlen ∈  multiplizieren („strecken“).

Wir verallgemeinern den Vektorbegriff in 3 Schritten:

(i) Von 2 bzw. 3 auf den n. Das ist nicht unsinnig, da man z.B. dann jede Lösung eineslinearen Gleichungssystems als „Vektor“ (x_1,…,xn) ∈ n ansehen kann.

Beispiel: Die Lösung des Gleichungssystems:

4x + 4y + z = 0

3x – 2y + 2z = 5

4x + 3y + 3z = 1

ist x = 1, y = – 1, z = 0, oder besser

(ii) Statt  kann man auch andere Körper wie ,  oder p nehmen. Das ist für viele Anwendungen wesentlich.

Beispiel: Wir rechnen in 2, über dem Körper , addieren also „Vektoren“ aus 2 miteinander und multiplizieren sie wie gewohnt mit Skalaren aus , das Ergebnis ist auf jeden Fall wieder ein Element des 2.

(iii) Überhaupt könnte man alles „Vektoren“ nennen, wenn man damit so rechnen kann wie mit den Vektoren im bisherigen Sinn. Dies öffnet das Tor für viele weitere Systeme, die nun unter einem einheitlichen Gesichtspunkt studiert werden können. Beweist man ein allgemeines Gesetz, so gilt dies automatisch in all den Fällen, in denen man von„Vektoren“ sprechen kann.

Definition 5.1: Es sei (K,+,·) =: K ein Körper mit neutralem Element 0 für die Addition und 1 für die Multiplikation. Eine abelsche Gruppe (V,+) heißt Vektorraum über K oder linearer Raum, falls eine Abbildung K×V → V, (λ,v) → λv definiert ist, welche für alle λ,λ' ∈ K und alle v,v' ∈ V die Rechengesetze

a) (λ+λ')v = λv + λ'v

b) λ(v+v') = λv + λv'

c) λ(λ'v) = (λλ')v

d) 1v = v

erfüllt.

Man beachte dabei, dass „+“ im Vektorraum nicht unbedingt dem „+“ im Körper entsprechen muss. (Im Vektorraum 3 ist die Addition in der Gruppe ( 3, +) als Vektoraddition (komponentenweise) definiert und im zugehörigen Körper ( , +, ·) als die gewöhnliche Addition reeller Zahlen.)

Die Bezeichnung KV sei eine „Kurzform“ für die Aussage „V ist ein Vektorraum über dem Körper K“. So verstehen wir etwa unter  den Vektorraum über dem Körper und nicht umgekehrt!

Wenn es klar ist, welcher Körper K gemeint ist, schreiben wir dafür auch kurz V. Die Elemente von V heißen Vektoren, die von K Skalare. Das neutrale Element von (V,+) heißt der Nullvektor; er wird meist mit o bezeichnet.

Beispiele für Vektorräume sind:

a) 2 und 3 sind Vektorräume über .

b) Allgemeiner ist, für n ∈ , n ein Vektorraum über  mit (x_1,…,xn) + (y_1,…,yn) : = (x_1+y_1,…,xn+yn) und λ(x_1,…,xn) : = (λx_1,…,λxn).

c) Noch allgemeiner ist für jeden Körper K und jedes n ∈ Kn ein Vektorraum über K. Die Elemente von Kn heißen Zeilenvektoren über K.

d) Analog ist für jeden Körper K und jedes n ∈

ein Vektorraum über K, dessen Elemente Spaltenvektoren heißen.

Nullvektor ist

Offenbar ist Kn „eigentlich dasselbe“ wie Kn. Doch dazu später.

Es muss nicht immer  sein:

e) Wichtig für Anwendungen wie z.B. höhere Codierungstheorie sind endliche Körper. Ein einfaches Beispiel Vektorraum über einem endlichen Körper ist ( 2, +) über dem Körper ( 2, +, ⋅).

f) Folgendes Beispiel hat zwar keine praktischen Anwendungen, illustriert aber sehr gut, dass man auch mit anderen „Dingen“ als Zahlen „rechnen“ kann:

Gegeben sei (P(M),Δ), also die Menge aller Teilmengen einer Menge M mit der Operation Δ (symmetrische Differenz), die definiert ist als:

M Δ N = (M∪N) \ (M∩N)

Definieren wir jetzt die Multiplikation als 1Α = Α und 0A = {} (neutrales Element bezüglich Δ ist hier die leere Menge { }) so erhalten wir mit (P(M),Δ) einen Vektorraum über 2.

Als Übung wollen wir diese Behauptung jetzt beweisen:

(i)      (P(M),Δ) ist eine abelsche Gruppe:

Neutrales Element ist die leere Menge { }, Δ ist kommutativ und jede Menge M ist wegen M Δ M = { } zu sich selbst invers.

(ii)      die Abbildung 2× P(M)→ P(M), (λ,A) → λΑ ist definiert, da → λΑ für eine Menge A ∈ P(M) ja laut Definition nur { } oder A selbst sein kann.

(iii)     (λ+λ')v = λv + λ'v, λ(v+v') = λv + λv' und λ(λ'v) = (λλ')v gelten trivialerweise (Fallunterscheidung λ = 1, λ = 0)

(iv)     1v = v gilt laut Definition

Nicht alles im Leben ist ein Vektorraum:

a) ( 2,+) ist kein Vektorraum über , weil etwa 2 ⋅ (1, 1) = ( 2, 2) ∉ 2, (wir erinnern uns: Die Quadratwurzel aus 2 lässt sich nicht als Bruch schreiben, ist daher keine rationale Zahl!) damit ist also die Abbildung  × 2 → 2, (λ,v) → λv nicht einmal definiert!

b) ( 2,+) mit der gewöhnlichen Multiplikation λ(x,y) := (λx,λy) ist kein Vektorraum über 2, weil etwa:

(1+1) (2, 3) =0 (2, 3)= o aber 1 (2, 3)+1 (2, 3)=(2, 3)+(2, 3)= (4, 6)

Somit ist (a) in Definition 5.1 verletzt

c) ( 2,+) mit λ(x,y) := (λx,0) ist kein Vektorraum über , weil (d) in Definition 5.1 verletzt ist.

Satz 5.1: In KV gilt

a)    ∀ λ ∈ K: λo = o

b)    ∀ v ∈ V: 0v = o

c)    ∀ v ∈ V ∀ λ ∈ K: (–λ)v = –(λv) = λ(–v)

d)     Speziell gilt (–1)v = –v.

e)    ∀ v,w ∈ V ∃! x ∈ V: v+x = w (nämlich x = w+(–v) = w–v).

f)     ∀ v ∈ V ∀ λ ∈ K: λv = o ⇔ (λ = 0 ∨ v = o)

g)    ∀ v,w ∈ V ∀ λ ∈ Κ: λ(v–w) = λv – λw

Um Elemente ∈ V von den Skalaren zu unterscheiden, schreibt man statt v,w,… oft v,w,… oder , … oder gotische Buchstaben.

Beweis:

a) z.z.:∀ λ ∈ K: λo = o

Diese Aussage mag trivial wirken, jedoch sind für den Beweis nur die vier Vektorraum Axiome zulässig!

Es gilt: v + o = v (neutrales Element in der Gruppe)

Daraus folgt: λ(v + o) = λv und wegen λv + λo = λv

Addition von (– λv) auf beiden Seiten liefert o + λo = o und damit λo = o

b) z.z.: ∀ v ∈ V: 0v = o

Es gilt: v = 1v = (Rechnen im Körper) = (1+0) v = 1v + 0v = v + 0v. Addition von (– v) auf beiden Seiten liefert jetzt 0v = o

c) z.z.: ∀ v ∈ V ∀ λ ∈ K: (–λ)v = –(λv) = λ(–v)

wegen der Existenz des inversen Elements gilt:

(i)    λ v + (–(λ v)) = o

(ii)   λ v + λ (−v) = λ (v + (–v)) = 0v = λo = o

(iii)  λ v + (–λ) v = (λ + (–λ)) v = 0v = o

Wir haben jetzt also mit (–λ)v, –(λv) und λ(–v) gleich drei inverse Elemente zu λ v gefunden, wegen der Eindeutigkeit des inversen Elements müssen diese natürlich identisch sein.

d) z.z.: (–1)v = –v.

diese (scheinbar triviale) Behauptung ergibt sich auch erst mit Hilfe der in (c) getroffenen Aussage mit λ = 1.

e) z.z.: ∀ v,w ∈ V ∃! x ∈ V: v+x = w (nämlich x = w+(–v) = w–v).

es gilt: v + (w + (–v)) = (Ass.-Ges., Komm-Ges.) = w + (v – v) = w + o = w

damit ist x = (w + (–v)) eine Lösung. Bleibt zu zeigen, dass x die einzige Lösung ist:

Seien also x, x’ zwei Lösungen, dann ist v + x = w und v + x’ = w, damit ist aber v + x = v + x’ und damit (wir rechnen in der Gruppe) x = x’

f) z.z.: ∀ v ∈ V ∀ λ ∈ K: λv = o ⇔ (λ = 0 ∨ v = o)

(i)  „⇒“: es genügt, zu zeigen, dass (λ v = 0 ∧ λ ≠ o) ⇒ v = o

(λ v = 0 ∧ λ ≠ o) ⇒ v = 1 v = (λ-1 λ) v = λ-1 (λ v) =λ-1 o = = (Satz 5.1 a) = o

(ii)  „⇐“: z.z.: (λ = 0 ∨ v = o) ⇒ λv = o

das ergibt sich direkt aus Satz 5.1 (a) oder (b).

g) ∀ v,w ∈ V ∀ λ ∈ Κ: λ(v–w) = λv – λw

λ(v–w) = λ(v + (–w)) = λv + λ(–w)) = λv – λw

5.2. Unterräume

Wir betrachten jetzt „Vektorräume innerhalb von Vektorräumen“, also Teilmengen von Vektorräumen, die wiederum Vektorräume sind. Diese Teilmengen erben natürlich die Rechenregeln des Raumes, dessen Teilmenge sie sind.

Definition 5.2: Sei V ein Vektorraum über K. Eine Teilmenge U ⊆ V, welche bzgl. der auf U eingeschränkten Operationen selbst einen Vektorraum bildet, heißt ein Unterraum von V. Dieser Umstand wird dann mit U ≤ K V bezeichnet.

Beispiel:

a) Jede Gerade in der „Ebene unserer Anschauung“ (also im 2) durch den „Ursprung“ o hat die Gleichung ax + by = 0. U := {(x,y) ∈ 2) |ax + by= 0} ≤ 2). Für d ≠ 0 ist aber {(x,y) ∈ 2) | ax + by = d} kein Unterraum!

b) Jede Ebene im „Raum“ 3), die durch den „Ursprung“ o geht, ist durch ax + by + cz = 0 gegeben.

U = {(x,y,z) ∈ 3) | ax + by + cz = 0} ≤ 3).

Analog zu (a) gilt:

Für d ≠ 0 ist {(x,y,z) ∈ 3) | ax + by + cz = d} kein Unterraum!

c) Allgemein gilt für KKn) und alle a_1,…,an ∈ K:

{(x_1,…,xn) ∈ Kn) | a_1x_1 +…+ anxn = 0} ≤ K Kn).

Und wieder ist {(x_1,…,xn) ∈ Kn) | a_1x_1 +…+ an)xn = d} mit d ≠ 0 kein Unterraum.

Bsp.: Sei 2( 2)3) unser Vektorraum, also alle Tripel (x_1,x_2,x_3) mit xi∈ 2.

Dann ist U= {(x1,x2,x3) ∈ ( 2)3) | x_1 +x_3 = 0} ≤ 2( 2)3), also ein Unterraum von 2( 2)3) .

d) {o} und V sind stets Unterräume von V, genannt die trivialen Unterräume.

Wie lässt sich jetzt schnell überprüfen, ob eine Teilmenge U eines Vektorraums V ein Unterraum ist? Wir brauchen natürlich nicht alle Vektorraumgesetze aus Definition 5.1 überprüfen. Rechenregeln, wie etwa (λ+λ')v = λv + λ'v oder 1.v = v gelten für alle Elemente des Körpers bzw. des Vektorraums, also auch für den Unterraum, der ja eine Teilmenge des Vektorraums bildet.

Worauf muss man also acht geben? Natürlich muss (U,+) wieder eine abelsche Gruppe sein.

Man kann aber durch Multiplikation mit einem λ aus dem Körper K oder durch Addition anderer Elemente des Unterraums „aus dem Unterraum hinaus fliegen“, ein paar Beispiele dazu:

Beispiel:

a) Der Einheitskreis E = {(x,y) ∈ 2) | x² + y² = 1} ist kein Unterraum des 2), denn (E,+) ist keine abelsche Gruppe, ja nicht einmal ein Monoid, denn E hat kein neutrales Element, d.h. es gibt keinen Punkt (a,b) ∈ Ε mit (a,b) + (x,y) = (x,y) für alle Elemente (x,y) des Einheitskreises.

b) Die Kugel {(x,y,z) ∈ 3) | x² + y² + z² ≤ 1} ist kein Unterraum des 3). Es existiert zwar jetzt anders als bei (a) mit (0,0,0) ein neutrales Element, aber die Menge ist nicht abgeschlossen bezüglich Addition und Multiplikation.

So ist etwa (1,0,0) + (0,0,1) = (1,0,1) kein Element von S mehr.

c) Die Ebene {(x,y,z) ∈ 3) | x + y + z = 1} ist kein Unterraum des 3). Beispielsweise ist

2 (1,0,0) = (2,0,0) kein Punkt dieser Ebene. (vgl. hierzu auch (b) im vorigen Beispiel).

Wir formulieren unsere Überlegungen:

Satz 5.2 (Unterraumkriterium): Sei U eine nichtleere Teilmenge des Vektorraums KV.

U ≤ K V  ⇔ ∀ u,u' ∈ U ∀ λ ∈ K: u + u' ∈ U ∧ λu ∈ U

⇔ ∀ u,u' ∈ U ∀ λ,λ' ∈ K: λu + λ'u' ∈ U

Beweis: Trivialerweise gilt: ∀ u,u' ∈ U ∀ λ ∈ K: u + u' ∈ U ∧ λu ∈ U

⇔ ∀ u,u' ∈ U ∀ λ,λ' ∈ K: λu + λ'u' ∈ U

Wir beweisen also noch U ≤ K V ⇔ ∀ u,u' ∈ U ∀ λ,λ' ∈ K: λu + λ'u' ∈ U

(i) „⇒“: Diese Richtung ist auch klar, ein Unterraum ist ja ein Vektorraum und dieser muss abgeschlossen bezüglich Multiplikation mit Elementen aus dem Körper und bezüglich Addition mit Elementen aus der Gruppe sein.

(ii) „⇐“: Wir müssen zeigen, dass eine Teilmenge U ⊆ V mit den gegebenen Eigenschaften ein Vektorraum ist.

Die vier Rechengesetze aus Satz 5.1 sind erfüllt, da U eine Teilmenge von V ist.

Des weiteren ist die Abbildung K×U → V, (λ,u) → λu definiert, weil:

λu = λu + o = λu + 0 u' ∈ U laut Vorraussetzung.

Bleibt zu zeigen, dass (U,+) wieder eine abelsche Gruppe ist:

Die Assoziativität „erben“ wir von V, neutrales Element ist o (liegt wegen o = u + (–u) = 1u + (–1u) wieder in U) und invers zu u ist –u (liegt wegen –u = –u + o = (–1)u + 0 u' = wieder in U)

Es ist intuitiv klar, dass es sich bei den Beispielen zur Definition 5.2 zumindest bei (a), (b), (d) um Unterräume handelt, wir wissen etwa, dass, wenn wir zwei Elemente einer Geraden oder Ebene durch addieren oder mit einer Zahl multiplizieren, die Gerade (Ebene) nicht verlassen.

Selbstverständlich lassen sich diese Behauptungen auch mit dem Unterraumkriterium überprüfen. Wir tun das für eine Gerade im 2):

Beispiel:

U := {(x,y) ∈ 2 | 2x – y = 0} ≤ 2.

Es muss also Definition 5.2 gelten: ∀ u,u' ∈ U ∀ λ ∈ : u + u' ∈ U ∧ λu ∈ U

Seien also jetzt u,u' ∈ U. Dann gilt (wegen y = 2x)

(i) u + u' = (x, y) + (x', y') = (x, 2x) + (x', 2x') = (x + x', 2x + 2x') = (x + x', 2(x + x') ) und das ist wegen 2(x + x') – 2(x + x') = 0 ∈ U.

(ii) λu = λ(x, y) = λ(x, 2x) = (λx, λ(2x)) = (wegen Definition 5.1.c) = (λx, (λ.2)x) =

= (λx, (2.λ)x) = (λx, 2(λx)) und das ist wegen 2(λx) – 2(λx) = 0 ebenfalls ∈ U.

Folgerungen:

a) Die Lösungsmenge eines homogenen linearen Gleichungssystems über einem Körper K:

ist ein Unterraum des Kn.

(Man kann sich das etwa im 3 (für n = 3, m = 2 in obigem Beispiel) als Schnitt zweier durch den Ursprung gehender Ebenen (weil rechts 0 steht) vorstellen, das Ergebnis ist entweder eine Ebene oder eine Gerade durch den Ursprung oder der Ursprung selbst, aber in jedem Fall ein Unterraum des 3).

Bsp.: 2x + y + z = 0

3x – x – z = 0

Dieses (homogene) Gleichungssystem betrachten wir als Schnitt zweier Ebenen, jede Ebene geht durch den Ursprung, (0, 0, 0) erfüllt die Gleichung, der Schnitt ist die Gerade x = 0, y = – z (oder in Parameterform: (0, 0, 0) + λ (0, 1, –1)) diese geht offenbar auch durch den Ursprung, bildet also wieder einen Unterraum des 3.

b) Unterräume von 2 bzw. 3 sind, wie wir gesehen haben:

Im 2: {o}, 2 und alle Geraden durch o.

Im 3: {o}, 3 und alle Geraden und alle Ebenen durch o.

(Später werden wir sehen, dass es im 2 und 3 außer den soeben erwähnten keine weiteren Unterräume gibt!)

Oft will man „ähnliche“ Vektoren als „gleich“ ansehen, also etwa den Vektor u von A = (1,1) nach B = (2,3) mit dem Vektor w von C = (4,1) nach D = (5,3) identifizieren. (Beide Vektoren zeigen in die gleiche Richtung und haben die gleiche Länge.) Der Vektor w von (0,0) nach (1,2) wäre ein geeigneter „Repräsentant“ für alle diese Vektoren, man könnte sie also alle durch (1,2) darstellen.

Der Rahmen dafür ist der einer Äquivalenzrelation ~ in einem Vektorraum KV.

Die Äquivalenzklasse eines Vektors v ∈ V ist durch [v] = {w ∈ V | w ~ v} gegeben.

Wenn ~ „verträglich“ ist, also wenn gilt:

so können wir definieren:   [v]  [w] := [v + w]

λ  [v] := [λv]

Wozu benötigen wir die Verträglichkeit? [v]  [w] etwa ist die „Summe“ zweier Äquivalenzklassen.

Wenn nun etwa v ~ v' gilt, dann ist [v] = [v'], dann sollte natürlich

[v]  [w] = [v']  [w] sein. Es soll also egal sein, mit welchem Repräsentanten einer Äquivalenzklasse man rechnet.

Satz 5.3 und Definition: Die Menge V/~ = {[v] | v ∈ V} wird mit  und  dadurch zu einem Vektorraum über K, genannt Faktorraum von V nach ~.

Beweis: (K,+,·) sei unser Körper mit den neutralen Elementen 0 bzw. 1. (Achtung! Man verwechsle nicht + mit  und · mit  !)

(i) (V/~, ) ist eine abelsche Gruppe:

Neutrales Element des Faktorraums ist wegen [v]  [o] = [v + o] = [v] die Äquivalenzklasse von o, also [o], Analog ist [– v] invers zu [v] Kommutativität und Assoziativität zeigt man genau so.

(ii) Die vier Rechengesetze aus Definition 5.1 für Vektorräume müssen erfüllt sein.

Auch hier zeigt man alles wie bei (i), wir beschränken uns einmal auf den Beweis von

1 [v] = [v]:

1 [v] = (laut Definition) = [1· v] = (V ist ein Vektorraum) = [v]

Beispiel:

Sei V = 2 und (x,y) ~ (x',y') ⇔ x = x'.

Das bedeutet, dass etwa (1,47) ~ (1,8) ~ (1,4) ~ (1, – 1) ~ … (es gilt immer x = 1)

Zwei Punkte stehen also genau dann zueinander in Relation, wenn ihre erste Koordinate gleich ist. Die Äquivalenzklassen sind also senkrechte Geraden (in unserem Beispiel die Gerade x = 1), und z.B. die „x-Achse“ {(x,0) | x ∈ } ist ein Repräsentantensystem, weil jede Äquivalenzklasse durch genau ein Element repräsentiert wird. Man könnte also sagen: 2/~ ist „so ziemlich das gleiche“ wie selbst.

Satz 5.4 und Definition:

a) Sei ~ eine verträgliche Äquivalenzrelation in KV. Dann ist

{v ∈ V | v ~ o} = [o] ein Unterraum von V.

b) Sei U ein Unterraum von V und sei ~U definiert durch v ~U w ⇔ v – w ∈ U.

Die Äquivalenzklasse von v ∈ V bzgl. ~U ist dann durch

v + U := {v + u | u ∈ U}gegeben und heißt eine lineare Mannigfaltigkeit.

Beweis:

a) Sei U = {v ∈ V | v ~ o} = [o]. Zu zeigen ist:

(i) z.z.: [u]  [u'] ∈ U:

u + u' = (weil u ~ o und weil u'~ o und weil „~“ verträglich ist) = o + o = o ∈ U

(ii) z.z.: λu ∈ U: wie in (i) gilt:

λu = λu = λo = o ∈ U

b) v ~U w ⇔ v – w ∈ U ⇔ w – v ∈ U bedeutet, dass es ein u ∈ U gibt mit

w – v = u oder w = v + u

(„v und w unterscheiden sich um ein Element des Unterraums“)

Alle derart gewählten u liefern dann genau {v + u | u ∈ U} = v + U

Beispiel:

V =2

U := {(x,y) ∈ 2 | 2x - y = 0} ≤ 2 wie in den Beispielen zum Unterraumkriterium bereits gezeigt.

V/U = { v + U, v ∈ V } = { {v + u, u ∈ U}, v ∈ V } = { {(x,y) ∈ 2 | 2x - y = c }, c ∈ }

Also alle Geraden, die parallel zu U sind.

Abb. 5.1

Beispiel:

V = ( 2)3,

U = {(x,y,z) ∈ V | x + y + z = 0} = {(0,0,0), (0,1,1), (1,0,1), (1,1,0)}.

V/U = {U, (1,1,1) + U} mit (1,1,1) + U = {(1,1,1), (1,0,0), (0,1,0), (0,0,1)}

(der Faktorraum hat hier als nur zwei Elemente, U und (1,1,1) + U).

Beispiel:

Wie rechnet man jetzt mit Äquivalenzklassen?

Sei V wie oben, dann gilt etwa:

[(1,1,1)]  [(0,1,1)] = [(1,1,1) + (0,1,1)] = [(1,0,0)] = [(1,1,1)] = (1,1,1) + U

Durch „Addition” von [(0,1,1)] bleibt man also in derselben Äquivalenzklasse, kein Wunder, ist doch (0,1,1) ~U (0,0,0) und beide liegen in U und U ist neutrales Element bezüglich „⊕“

Die Multiplikation geht genauso:

1  [(1,0,0)] = [ 1· (1,0,0) ] = [ (1,0,0) ]

Wir fassen unsere Erkenntnisse zusammen:

Im 2 und 3 haben wir:

Unterräume: {o}, Geraden bzw. Ebenen durch o, 2 bzw. 3.

Lineare Mannigfaltigkeiten: Punkte, beliebige Geraden bzw. Ebenen, 2 bzw. 3.

Ganz wichtig ist noch folgender Satz (ohne Beweis):

Satz 5.5: Die Lösungsmenge eines homogenen linearen Gleichungssystems ist ein Unterraum des Kn. Die Lösungsmenge eines beliebigen linearen Gleichungssystems ist eine lineare Mannigfaltigkeit, ihr „zugehöriger“ Unterraum ist der Lösungsraum des „homogenisierten“ Gleichungssystems.

5.3. Lineare Abhängigkeit

Wir wissen schon, dass zur Definition einer Ebene zwei „Richtungsvektoren“ ausreichen.

Liegen drei Vektoren in derselben Ebene, also etwa (1,0,0), (2,1,0) und (4,1,0), so lässt sich je einer dieser Vektoren durch eine Linearkombination der beiden anderen darstellen, in diesem Beispiel etwa gilt:

(4,1,0) = 2(1,0,0) + 1(2,1,0)

oder:

(2,1,0) = (4,1,0) + (–2) (1,0,0)

oder:

(1,0,0) = ½ (4,1,0) + (–½) (2,1,0)

Es gibt also λ_1, λ_2 ∈  mit (4,1,0) = λ1 (1,0,0) + λ2 (2,1,0)

Eine andere Wahl von λ_1, λ_2 liefert unter Umständen ein anderes Ergebnis. Wir formalisieren diesen Gedanken:

Definition 5.3: Sei V ein Vektorraum über dem Körper K, seien v_1,…,vn ∈ V und λ_1,…,λn ∈ K\{0}. Dann heißt λ_1v_1 +…+ λnvn eine Linearkombination der Vektoren v_1,…,vn. Ist S = {v_1,…,vn}, so heißt L(S) := {λ_1v_1 + … + λnvn |λ_1,…, λn ∈ K} die lineare Hülle von S.

Weiters definieren wir die lineare Hülle der leeren Menge, L(Ø) := {o}.

Bemerkung:

a) S ⊆ L(S) ⊆ V

(λi =1 liefert S ⊆ L(S), der zweite Teil muss gelten, da Vektorräume bzgl. der dort definierten Operationen abgeschlossen sind)

b) S ⊆ S' ⇒ L(S) ⊆ L(S')

(diese Behauptung ist auch klar, alle Linearkombination von Elementen aus S sind freilich auch in der Obermenge S' möglich)

Beispiel:

a) KV = 3; S = {(1,0,0),(0,1,0),(0,0,1)}; L(S) = 3.

(mit anderen Worten: Jeder Vektor im 3 lässt sich als Linearkombination dieser drei Vektoren darstellen, z.B.: ( –3, 0, 7) = –3(1,0,0) + 0(0,1,0) + 7(0,0,1)

b) T = {(1,0,0),(0,1,0)}; L(T) = ××{0}.

c) U = {(1,0,0),(1,1,0),(0,1,0),(2,1,0),(3,1,0)}; L(U) = ××{0}.

(für die Darstellung der xy-Ebene reichen freilich zwei Vektoren; in diesem Beispiel erhalten wir wieder nur die xy-Ebene, wir haben also „ein paar Vektoren mehr als notwendig“, dazu siehe Satz 5.8!)

d) KV = 3^2; S = {(1,2),(2,0)}. L(S) = 32

(alle Elemente aus 3^2 lassen sich durch diese beiden Vektoren darstellen, so ist etwa (1,1) = 2(1,2)+1(2,0) )

Die Definition der linearen Hülle erinnert an das Unterraumkriterium. Tatsächlich gilt für die Linearkombination einer Menge von Vektoren:

Satz 5.6:

a)  Für jedes S ⊆ V ist L(S) ein Unterraum von KV.

b)  L(S) ist der (bzgl. ⊆) kleinste Unterraum von V, der S umfasst.

c)  L(S) ist der Durchschnitt aller Unterräume von V, die S umfassen.

Beweisskizze:

a) Für jedes S ⊆ V ist L(S) ein Unterraum von KV.

Dass L(S) ⊆ V gilt, wissen wir bereits.

Laut Unterraumkriterium muss für u, u' ∈ L(S) auch λu + λ'u' ∈ L(S) gelten. Dies folgt aber gerade aus der Definition der linearen Hülle.

b) L(S) ist der (bzgl. ⊆) kleinste Unterraum von V, der S umfasst.

c) L(S) ist der Durchschnitt aller Unterräume von V, die S umfassen.

Beide Aussagen folgen aus der Tatsache, dass jeder Unterraum U, der S umfasst, nach dem Unterraumkriterium alle Linearkombinationen von Elementen aus S enthalten muss. Das ist aber gerade L(S).

Wenn sich durch das Bilden aller möglichen Linearkombinationen die Menge S nicht „vergrößert“, haben wir bereits einen Unterraum:

Satz 5.7: Für S ⊆ V gilt: S = L(S) ⇔ S ≤ KV

Beweis:

(i) „⇒“: das ist genau Satz 5.6a

(ii) „⇐“: z.z: S ≤ KV ⇒ : S = L(S)

Wäre S nicht gleich seiner eigenen linearen Hülle, so wäre das Unterraumkriterium verletzt und damit hätten wir einen Widerspruch zur Voraussetzung.

Wir erinnern uns jetzt an die „übergroße“ Menge im Beispiel (c) zu Definition 5.3.c.

Es kann allgemein sein, dass für S ⊂ S' gilt: L(S) = L(S'), dass also S' für die Bildung der linearen Hülle „überflüssige“ Elemente enthält. So ist in den Beispielen zur linearen Hülle (Definition 5.3) T ⊂ U, aber L(T) = L(U) = ××{0}. Auch diese Idee verpacken wir in einen Satz:

Satz 5.8: Sei S ⊆ V. Dann sind folgende Bedingungen gleichwertig:

a) ∃ s ∈ S: L(S) = L(S\{s})

b) ∃ s ∈ S: s ∈ L(S\{s})

c) ∃ n ∈ ∃ s_1,…,sn ∈ S ∃ λ_1,…,λn ∈ K:

(λ_1s_1 +…+ λnsn = o ∧ ∃ i ∈ {1,…,n}: λi ≠ 0)

Anstelle eines Beweises ein Beispiel dazu:

Beispiel:

Sei KV = 5; und sei S = { (1,0,0,0,0), (0,1,0,0,0), (1,1,0,0,0) }

Es gilt mit s = (1,1,0,0,0) die Aussage a) aus Satz 5.8 nämlich:

L(S) = L(S\{s}) = ××{0}×{0}×{0}.

Dieses s erfüllt aber auch 13.6.b) nämlich:

L(S\{s}) = L ( (1,0,0,0,0), (0,1,0,0,0) )

Und es gilt: λ_1s_1 + λ_2s_2 +λ_3s_3 = 1(1,0,0,0,0) + 1( 0,1,0,0,0) + (–1)(1,1,0,0,0) = o

In diesem Satz ist s also eine Linearkombination von Elementen aus S, s hängt also von diesen Elementen ab. Dies führt uns auf folgende Definition:

Definition 5.4: Die Vektoren v_1,v_2,…,vn eines Vektorraums KV heißen linear unabhängig, falls für λ_1,…,λn ∈ K gilt:

λ_1v_1 +…+ λnvn = o ⇒ λ_1 =…= λn = 0

Andernfalls heißen sie linear abhängig.

Beispiel:

a) In vorigem Beispiel sind s_1, s_2, s_3 linear abhängig

b) Im 2 sind die Vektoren (1,0) und (0,1) linear unabhängig, da sich (1,0) nicht als λ(0,1) schreiben lässt.

c) (2,1,0), (1,1,2), (0,2,2) sind in KK3 für K = 3 linear abhängig, da:

(2,1,0) = 2(1,1,2) + 1(0,2,2).

d) Für K = 5 sind obige Vektoren linear unabhängig.

e) In , (dem Vektorraum der Folgen von reellen Zahlen) sind ei = (0,…,0,1,0,…) (mit 1 an der i-ten Stelle) linear unabhängig.

f) In P_2( ), dem Raum der Polynome vom Grad 2 über den reellen Zahlen, sind p_1 = x, p_2 = 1 – x² und p_3 = – 1 + 2x + x² linear abhängig, da 2p_1 + (–1) p_2 = p_3

Satz 5.9: Seien S,T ⊆ V mit S ⊆ T.

a) S ist linear abhängig ⇒ T ist linear abhängig.

b) T ist linear unabhängig ⇒ S ist linear unabhängig.

Beweis:

a)  S ist linear abhängig ⇒ T ist linear abhängig.

Trivial (das Hinzufügen von Elementen ändert nichts an der Tatsache, dass es Elemente in der Menge gibt, die von anderen linear abhängig sind).

b)  T ist linear unabhängig ⇒ S ist linear unabhängig.

Analog zu (a) ist klar, dass, wenn man in T keine linear abhängigen Elemente findet, dies in einer kleineren Menge erst recht nicht möglich sein kann.

Beispiel:

a) { (2,1,0), (1,1,2), (0,2,2) } ist, wie wir aus den Beispielen zur linearen Abhängigkeit wissen in KK^3 für K = 3 linear abhängig.

b) { (2,1,0), (1,1,2), (0,2,2), v_4,…, vk } ist für ein beliebige vi ∈ K_3^3 natürlich wieder linear abhängig, auch dort gilt (2,1,0) = 2(1,1,2) + 1(0,2,2).

c) {o} ist linear abhängig (so ist etwa (mit λ = 1) λ ⋅ o = o. und λ ≠ 0.

d) damit ist wegen Satz 5.9.a jede Menge, die o als Element enthält, linear abhängig.

5.4. Basen

Wir suchen jetzt eine möglichst kleine Menge B von Vektoren, deren lineare Hülle einen ganzen Vektorraum V liefert, es darf also erstens kein „überflüssiger“ Vektor dabei sein, d.h. die Menge B muss linear unabhängig sein und zweitens soll wirklich jeder Vektor aus V in der linearen Hülle von B liegen, ein solches B nennen wir dann eine Basis von V, exakt:

Definition 5.5: Eine Familie B = ( b1,…,bn ) ⊆ KV heißt eine Basis von KV, falls gilt:

a) B ist linear unabhängig

b) L(B) = V

Achtung! Es ist wichtig, hier für B den Begriff „Familie“ und nicht „Menge“ zu fordern, die Reihenfolge der Elemente ist also nicht egal.

Mehr dazu in Kürze beim Thema „Koordinaten“

Definition 5.6 und Beispiel:

a) ( e_1, e_2,..., en ) := ( (1,0,…,0),(0,1,0,…,0),…,(0,…,0,1) ) heißt die kanonische Basis des n (kanonisch soll heißen „natürlich“)

Im 3 etwa lässt sich jeder Vektor (x, y, z) als x (1,0,0) + y (0,1,0) + z (0,0,1) darstellen, daher ist ( (1,0,0), (0,1,0), (0,0,1) ) eine Basis des 3.

b) Für jedes c ∈ ist ( (1,0),(c,1) ) eine Basis des 2.

Jedes Paar (x,y) ∈ 2 lässt sich eindeutig als (x – y c) (1,0) + b (c,1) darstellen, zum Beispiel für B = ( (1,0), (2,1) ) gilt: (3,5) = (3 – 5⋅2) ⋅ (1,0) + 5 ⋅ (2,1) = – 7 ⋅ (1,0) + 5 ⋅ (2,1) = (– 7,0) + (10,5) = (3,5)!

c) {1, } ist eine Basis von .

Jede komplexe Zahl x +  y lässt sich eindeutig als x ⋅ 1 + y ⋅ schreiben.

d) Analog lässt sich zeigen, dass ( (1,1,1),(1,1,0),(1,0,0) ) eine weitere Basis für KK^3 (für jeden Körper K) ist.

e) (1, x, x², …, xn) ist die kanonische Basis des Pn().

Bemerkung:

Man beachte, dass Basen eines Vektorraums nicht eindeutig sind. (Wir haben etwa gerade gesehen, dass sowohl ( (1,0),(0,1) ) als auch ( (1,0),(2,1) ) Basen des 2 sind.)

Wie findet man jetzt für einen gegebenen Vektorraum einen Basis?

Algorithmus:

Man kann mit einem beliebigen b_1 ≠ o starten. (Wegen Beispiel (c) zu Satz 5.9 gilt b1 ≠ o).

Ist L(b_1) ≠ V, so „fehlen noch Basiselemente“, also suche man ein b_2 ∈ V, b_2 ∉ L(b_1), damit die lineare Hülle „größer“ wird. Ist L(b_1,b_2) = V, so ist man fertig, andernfalls suche man ein b_3 ∉ L(b_1,b_2), etc. Gibt es schließlich ein n ∈ , sodass man L(b_1,…,bn) = V erhält, so heißt V endlichdimensional. (D.h. die Basis hat endlich viele Elemente).

Als nächstes klären wir, was zwei verschiedene Basen gemeinsam haben. Dazu brauchen wir:

Satz (Austauschsatz von Steinitz) 5.10:

Ist B = ( b_1,…,bn ) eine Basis von KV und sind c_1,…,cs (mit s ≤ n) linear unabhängig, so gibt es i_1,…,in–s ∈ {1,…,n}, sodass {c_1,…,cs, b i_1 ,…, bin −s } wieder eine Basis ist.

(Mit anderen Worten: Wir können s Elemente der Basis durch s andere ersetzen, sodass wir eine neue Basis erhalten.)

Beweis als Algorithmus:

(1) Es gilt sicherlich c1 = Σ λibi (jedes Element aus KV muss ja so darstellbar sein).

Ist nun für ein j ∈ etwa λj ≠ 0, so kann man bj durch die anderen Summanden und durch c_1 ausdrücken damit ist B_1 := (c_1, b_1,…,bj–2, bj+1,…,bn) wieder eine Basis (bj wurde durch c_1 ersetzt) – man kann also c_1 gegen jedes bi mit λi ≠ 0 austauschen.

(2) Dann kommt c_2 dran, man stellt es nun als Linearkombination der neuen Basis B_1 dar. Mindestens einer der Koeffizienten λk der verbliebenen bk's muss ungleich 0 sein. Man wechselt c_2 gegen bk aus und erhält eine neue Basis B_1.

(3) Diese Prozedur wird insgesamt s mal angewandt, also solange, bis man alle s Elemente ausgetauscht hat.

Beispiel:

Sei B=((1,0,0),(0,1,0),(0,0,1)) die kanonische Basis des 3 und sei C=((1,1,1),(1,0,1))

Wir wollen C durch Elemente von B zu einer Basis des 3 ergänzen.

(1) c1 = (1,1,1) = 1(1,0,0) + 0(0,1,0) + 1(0,0,1) der Koeffizient bei b_3 etwa ist also ungleich 0, wir tauschen also b_3 gegen c_1 aus und erhalten:

B_1= ((1,0,0),(0,1,0),(1,1,1))

(2) c_2 = (1,0,1) = 0(1,0,0) + (–1)(0,1,0) + 1(1,1,1) der Koeffizient bei b_2 ist ungleich 0, wir tauschen also b_2 gegen c_2 aus und erhalten:

B_2= ((1,0,0),(1,0,1),(1,1,1)), eine neue Basis, die C als Teilfamilie enthält.

Natürlich kann man auch alle Elemente aus einer Basis B austauschen, damit ergibt sich sofort:

Folgerung:

Ist (b_1,…,bn) eine Basis von KV und sind c_1,…,cn linear unabhängig, so bildet auch (c_1,…,cn) eine Basis von KV.

Die Anzahl der Basisvektoren muss also gleich bleiben:

Folgerung:

Je n linear unabhängige Vektoren des Kn bilden eine Basis. Je m Vektoren des Kn (mit m > n) sind linear abhängig.

Womit wir (mit Satz 5.9) folgenden Satz bereits bewiesen haben:

Satz 5.11 und Definition: Je zwei Basen eines endlichdimensionalen Vektorraums V haben gleich viele Elemente. Diese heißt die Dimension dimV von V.

Beispiel:

a) dim n = n

b) dim . = 2

c) allgemein: dim KKn (für jeden Körper K) = n

Wir haben in Definition 5.6 schon von der (eindeutigen) Darstellung eines Vektors durch die Elemente der Basis gesprochen, mehr dazu in:

Satz 5.12: B = (b_1,…,bn) sei eine Basis von KV. Dann lässt sich jedes v ∈ V eindeutig als  schreiben, d.h.:

Beweis: Dass sich v als Linearkombination von Basiselementen schreiben lässt, folgt aus der Definition der Basis, konkret aus L(B) = V, zu zeigen bleibt die Eindeutigkeit dieser Darstellung.

Angenommen es gäbe zwei verschiedene Darstellungen eines Vektors v, also:

v = Σ λibi = Σ μibi . Daraus folgt Σ (λi – μi)bi = o, also λi= μi für alle i, damit wären die Koordinaten also alle gleich, ein Widerspruch zu unserer Annahme.

Definition 5.7: Seien B und v wie vorher. Dann heißen die λi Koordinaten von v und wir definieren (v)B := (λ_1, … , λn ) also die Koordinaten von v bezüglich der Basis B.

Beispiel:

a) Die Koordinaten von (1,2,3) bzgl. der kanonischen Basis des 3 sind natürlich (1,2,3), die Eindeutigkeit der Darstellung ergibt sich durch Lösen des Gleichungssystems:

λ_1(1,0,0) + λ_2(0,1,0) + λ_3(0,0,1) = (1,2,3)

Die eindeutige Lösung ist (1,2,3)

b) Wir ändern jetzt die Reihenfolge der Basiselemente:

sei B = ((0,1,0),(1,0,0),(0,0,1)); wie in (a) lösen wir:

λ_1(0,1,0) + λ_2(1,0,0) + λ_3(0,0,1) = (1,2,3) und erhalten als Koordinaten:

(2,1,3), womit wir gezeigt haben, dass es sehr wohl auf die Reihenfolge der Basiselemente ankommt.

c) Sei V = P_2() und sei B = (1, 2x, 1– x²)

Wir berechnen die Koordinaten von –1 + 2x + x² :

λ_1 1+ λ_2 2x + λ_3(1 – x²) = –1 + 2x + x²

Und erhalten als Koordinaten: (0,1,–1)

5.5. Übungsaufgaben

5.1: Warum ist folgender „Beweis“ für Satz 5.1 a) (λ⋅o = o) nicht korrekt?

λ⋅o = λ⋅(v–v) = λv–λv = o

5.2: Man überprüfe, ob es sich bei folgenden Gruppen um Vektorräume handelt:

(a) (,+) über

(b) ( ,+) über

(c) ( { a + b √2 | a,b ∈ } ) über

(d) ( { a + b π | a,b ∈ }} ) über

5.3: Bei welchen der folgenden Mengen handelt es sich um Unterräume des ³ ?

(a) U1 := {(x,y,z) ∈ ³ | 2x - z = 0}

(b) U2 := {(x,y,z) ∈ ³ | x + y + 1 = 0}

5.4: Sei V = 3 und U := {(x, y, z)| (x = z) ∧ ( y = 0)} ein Unterraum von V.

(a) Man bestimme den Faktorraum

(b) Man beschreibe die Äquivalenzklasse von (3,-5,4) als lineare Mannigfaltigkeit (v+U).

(c) Man interpretiere die Ergebnisse aus (a) und (b) geometrisch.

5.5: Seien V, U wie oben. Wir rechnen jetzt im Faktorraum mit Äquivalenzklassen

Man bestimme jeweils:

5.6: (a) Sei V= 3. Ist M = ((1,2,1),(3,1,5),(3,−4,7)) linear unabhängig?

(b) Sei V= 3^3. Ist M = ((1,2,1),(1,1,0),(1,1,2)) linear unabhängig?

5.7: Gilt folgende Behauptung:

Ist M ⊆  linear unabhängig in ( ,+) über , so auch in ( ,+) über .

5.8: Man bestimme Basis und Dimension von U={(x, y, z)| x + y + z = 0} ⊆ 3

5.9: (a) Man bestimme eine Basis von V=(P(M),Δ) über 2 mit M={1,2,3}

(b) Wie lauten die Koordinaten von {1,3} bzgl. dieser Basis?

5.10: Sei V = P_2() und sei B = (– 1, x, x – x²)

(a) Ist B eine Basis von V?

(b) Man bestimme die Koordinaten von 1 + x² bezüglich dieser Basis.

5.11: Sei V der Vektorraum (P(M), Δ) über 2 aus dem Skriptum mit M= .

(a) Bilden die endlichen Teilmengen von  einen Unterraum von V?

(b) Bilden die unendlichen Teilmengen von  einen Unterraum von V?

5.12: Sei K = ( 5, +, ⋅), V = KK^3. Sei weiters U ≤ V mit U = { (x,y,z) ∈ V | x + z = 0 }

(a) Unter welchen Voraussetzungen gilt u ~U v für u, v ∈ U ?

(b) Man bestimme für obiges U die Äquivalenzklasse von (1,2,3).

(c) Wieviele Elemente hat diese Äquivalenzklasse? Man bestimme drei verschiedene v ∈ V mit v ~ (1,2,3).

5.13: Seien K, V und U wie oben

(a) Man bestimme V/U durch Aufzählen seiner Elemente.

(b) Wieviele Elemente hat V/U? Gilt (1,3,2) ∈ V/U ?

(c) Man bestimme eine 2-elementige Teilmenge des neutralen Elements des Faktorraums.

5.14: Gegeben sei der Vektorraum V = (P(),Δ) über 2 .

Man finden drei linear abhängige / drei linear unabhängige Elemente in V

6. Matrizen

6.1. Einführung und Definitionen

Ein lineares Gleichungssystem mit m Gleichungen und n Variablen

kann durch das „Zahlenschema“

auf kürzeste Art völlig beschrieben werden (abgesehen von den „Namen“ der Unbekannten, die aber freilich keinen Einfluss auf die Lösungsmenge des Systems haben und daher ohne weiteres weggelassen werden können).

Man definiert dann:

Definition 6.1: M sei eine Menge und m,n seien in .

(a) Eine m×n-Matrix über M ist eine durch {1,…,m} × {1,…,n} indizierte Familie

A = (a(i,j))(i,j>) ∈ {1,…,m}×{1,…,n}

von Elementen aus M, die man etwas kürzer als A= (aij)1≤ i≤ m, 1≤ j≤ n oder noch kürzer als (aij) anschreibt. Eine andere Schreibweise ist

die j-te Spalte von A.

bezeichnet die Menge aller m×n-Matrizen über M.

(b) Eine n×n-Matrix bezeichnet man als quadratische Matrix,

(c) In einer quadratischen Matrix   bezeichnet man die Folge (a_11,a_22,…,ann) als Hauptdiagonale von A, so ist etwa für obiges a die Hauptdiagonale gleich (1, –1, 2)

(d) Die zu A = (aij)1≤ i≤ m, 1≤ j≤ n ∈ transponierte Matrix ist durch At := (aji)1≤ j≤ n,1≤ i≤ m ∈ gegeben.

(e) Wenn beide Matrizen dieselbe „Dimension“ – also dieselbe Anzahl von Zeilen bzw. Spalten – haben und an jeder Komponente aij gleich sind, betrachtet man die Matrizen als gleich:

Sei also  dann gilt:

A = B ⇔ (m = p ∧ n = q ∧ ∀ (i,j) ∈ {1,…,m} × {1,…,n} : aij = bij)

Um mit Matrizen uneingeschränkt rechnen zu können, sei M in Zukunft ein Körper K.

Beispiele:

Lösung:    a-b = 2 b = 0          ergibt      a = 2    b = 0

c+d = 1 b+c = -1                    c = -1 d = 2

(man erinnere sich: über n rechnet man modulo n)

Lösung:    a+b = 1 c+2d = 0         ergibt          a = 1 b = 0

a+d = 2 b+c = 3                                c = 3 d = 1

Des weiteren kann man definieren:

Definition 6.2:

Die Zeilen einer Matrix sind (Zeilen-)Vektoren ∈ Kn, die Spalten sind (Spalten-) Vektoren aus Km. Weiters gilt  und  (aber ).

(b) Matrizen der Form A = (aij) mit aij = 0 für i > j heißen obere, solche mit aij = 0 für i<j untere Dreiecksmatrizen.

(c) Ist aij = 0 für i ≠ j, so heißt A ∈ K n n eine Diagonalmatrix und wird auch

Beispiele:

Es ist also E = diag(1,1,…,1) und   ist als O = diag(0,0,…,0) anschreibbar. Ohne Berücksichtigung der Klammerung kann man M aus Definition 6.1 als Zeilenvektor von Spaltenvektoren S1,…,Sn oder auch als Spaltenvektor von Zeilenvektoren Z_1,…,Zm auffassen.

Man schreibt dann

Definition 6.3: Seien a,b Elemente einer beliebigen nicht-leeren Menge.

δ heißt das Kronecker-Symbol (nach Leopold Kronecker, 1823-1891). Beispielsweise ist E = (δij), also die Matrix, deren Einträge genau für i = j den Wert 1 haben, ansonsten 0.

Die Addition von Matrizen bzw. die Multiplikation von Matrizen mit Skalaren funktioniert analog zu den entsprechenden Operationen bei Vektoren:

Definition 6.4: Es seien A = (aij) und B = (bij) Matrizen aus    und es sei λ ∈ K. A+B := (aij + bij) ; λA := (λaij)

In  ist also z.B.

Die Tatsache, dass man also ähnlich rechnet wie bei Vektoren, suggeriert folgenden

Satz 6.1:

(a) ist ein Vektorraum über K

(b) Eine Basis von K( )  ist (E_11,E_12,…,E1n, E_21,…,E2n,…,Em1,…,Emn), wobei

Ers := (eij) durch

(c) dimK(  ) = m⋅n. Neutrales Element in (  ,+) ist die Nullmatrix; zu A = (aij) ist in (  ,+) die Matrix –A = (–aij) invers.

Also haben  ,  , Kmn, Kmn alle dieselbe Dimension.

Beweis:

(a) (,+) ist eine abelsche Gruppe, da die Matrixaddition laut Definition kommutativ ist, 0 das neutrale Element ist und –A invers zu A ist.

Die Vektorraumgesetze aus Abschnitt 5 sind erfüllt, wie man leicht nachrechnet.

(b) Ers ist die Matrix, die in Zeile r und Spalte s einen Einser und sonst lauter Nullen enthält. Sei nun Ecd so gewählt, dass c ≠ r und d ≠ s. Dann sind Ers und Ecd offensichtlich linear unabhängig. Man erhält also eine Familie von n⋅m linear unabhängigen Elementen, diese bilden eine Basis (dim = n⋅m)

(c) folgt aus (b) und (a)

Und schließlich sei noch eine weitere Eigenschaft von Matrizen erwähnt, der Beweis erfolgt durch einfaches Nachrechnen.

Satz 6.2: Für A,B ∈  und λ ∈ K gilt : (A+B)t = At+Bt, (λA)t = λAt

6.2. Das Matrixprodukt

Will man auch ein Produkt von Matrizen A = (aij), B = (bij) definieren, so wäre wohl A·B := (aij·bij), also das komponentenweise Ausmultiplizieren naheliegend und am einfachsten. Die so definierte Operation hat jedoch in der Praxis kaum sinnvolle Anwendungen. Viel interessanter ist dagegen eine Idee, die von den linearen Gleichungssystemen herrührt:

Das einfachste all dieser Gleichungssysteme ist sicherlich:

schreiben, so muss A·x als

herauskommen.

Damit hat man also bereits die Rechenregel für die Multiplikation vorgegeben, man definiert also:

Definition 6.5:

also das aus Kaptiel 3 bekanne Skalarprodukt zweier Vektoren.

Die Rechenregeln a·(x+y) = ax + ay und (a+b)x = ax + bx sowie (λa)x = λ(a·x) = a(λx) lassen sich sofort nachweisen.

Definition 6.6: Seien

(also eine Matrix gegeben durch ihre Zeilenvektoren) und B = (bkr) = (S_1,…,Sp)matrix ∈ (gegeben durch die Spaltenvektoren). Dann sei A·B := (cir) ∈ mit cir = Zi·Sr .

Mit anderen Worten: in der i-ten Zeile und r-ten Spalte der Produktmatrix steht das Skalarprodukt der i-ten Zeile der ersten Matrix mit der r-ten Spalte der zweiten Matrix, also:

Bemerkung: Zur Dimension des Produktes der beiden Matrizen gilt folgende Merkregel: eine m×n Matrix multipliziert mit einer n×p Matrix liefert eine m×p Matrix, die „Innenglieder“ müssen also identisch sein und das Produkt hat die Dimension der „Außenglieder“

Ist die Zahl der Spalten von A ungleich der Anzahl der Zeilen von B, so ist das Matrixprodukt A·B daher nicht definiert!

Beispiel:

d) Über K =  (und freilich auch über K =  oder K =  ) ist für

zufälligerweise M^2 := M·M = M = M^3 = M^4 =…

6.3. Matrizen und lineare Gleichungssysteme

Mit den vorhin eingeführten Bezeichnungen lässt sich ein lineares Gleichungssystem jetzt auch formal definieren:

Definition 6.7: Ein lineares Gleichungssystem über einem Körper K von m Gleichungen in n Unbekannten ist eine m×(n+1)-Matrix über K, also in der Schreibweise des Gleichungssystems zu Beginn dieses Kapitels:

heißt die Koeffizientenmatrix des Gleichungssystems.

Obige Matrix

nennt man die erweiterte Koeffizientenmatrix des Gleichungssystems.

Die erweiterte Koeffizientenmatrix enthält alle im Gleichungssystem enthaltenen Informationen, ist jetzt also genau das eigentliche Gleichungssystem.

Jedes x ∈ Kn mit A x = b heißt eine Lösung des Gleichungssystems (A|b). Ist b = o, so heißt das Gleichungssystem homogen, andernfalls inhomogen. (A|o) heißt das zu (A|b) gehörige homogene Gleichungssystem.

Satz 6.3: Sei K ein Körper und seien m, n, p, q ∈ .

a) ∀ A ∈  K n ∀ B,C ∈ : A·(B+C) = A·B + A·C (1. Distributivgesetz)

b) ∀ A,B ∈ ∀ C ∈ : (A+B)·C = A·C + B·C (2. Distributivgesetz)

c) ∀ A ∈ ∀ B ∈ ∀ C ∈ K  : (A·B)·C = A·(B·C) (Assoziativgesetz)

d) ∀ A ∈ ∀ B ∈ ∀ λ ∈ K: (λA)·B = λ(A·B) = A·(λB)

e) ∀ A ∈ ∀ B ∈ : (A·B)t = Bt·At

f) ∀ A ∈ : A·En = Em·A = A (dabei seien En bzw. Em die n×n- bzw. m×m- Einheitsmatrix).

Beweis: Alle sechs Punkte lassen sich direkt über die Definition des Matrixprodukts beweisen. Es sei etwa (a) und (e) gezeigt, alle anderen Beweise führt man analog.

a) ∀ A ∈  ∀ B,C ∈  : A·(B+C) = A·B + A·C

A·(B+C) = (aik)(bkl +ckl) = (Definition des Matrixprodukts) =

Einerseits gilt: Element (i,j) der Matrix (A·B)t ist

Andererseits steht an derselben Stelle in der Matrix Bt·At das Element , also sind die beiden Ausdrücke identisch.

6.4. Die inverse Matrix

Wie löst man jetzt ein lineares Gleichungssystem A x = b ?

Ohne Wissen über Matrizen könnte man auf die Idee kommen, links und rechts „durch A zu dividieren“, also mit „A-1 multiplizieren. Dann würde man: x = A-1 b als Lösung erhalten.

Überraschenderweise erhält man die Lösung(en) tatsächlich so. Wie aber „dividiert“ man durch eine Matrix? Und wann ist das überhaupt möglich?

Da x = A-1 b auch als E x = A-1 b schreibbar ist, sucht man also eine Matrix A-1 mit A-1 A = E:

Definition 6.8: Gibt es zu A ∈  ein B ∈  mit AB = BA = E, so nennt man A auch regulär, andernfalls nicht-regulär oder auch singulär. Die Matrix B heißt die zu A inverse Matrix und wird mit A–1 bezeichnet.

Zwei Fragen stellen sich:

c) Wie erkennt man, ob eine Matrix invertierbar ist?

d) Wie berechnet man A–1 ?

Nicht jede Matrix kann invertierbar sein, wäre etwa  invertierbar, so käme man mittels

auf einen Widerspruch.

Für eine Erkennung invertierbarer Matrizen fehlt noch etwas Theorie. Vorerst daher zur Berechnung der Inversen:

Algorithmus zur Berechnung von A–1: Man setzt A–1 unbestimmt an und erhält für  genau n^2 lineare Gleichungen in n^2 Unbekannten. A–1 existiert genau dann, wenn dieses lineare Gleichungssystem lösbar und dann sogar eindeutig lösbar ist.

Dazu gleich ein Beispiel:

Beispiel:

Man berechne A–1.

Man setzt die Inverse allgemein an:

führt auf das Gleichungssystem

welches wegen a + 2b = 1 und 2a + 4b = 0, also a + 2b = 0 unlösbar ist.

Die Invertierbarkeit von Matrizen hat also viel mit der Lösbarkeit von Gleichungssystemen zu tun!

6.5. Invertierbarkeit von Matrizen und Lösbarkeit von linearen Gleichungssystemen

Die letzte Überlegung führt auf folgenden

Satz 6.4: Sei A x = b ein lineares Gleichungssystem mit regulärer Koeffizientenmatrix A. Dann hat dieses Systems genau eine Lösung, nämlich x = A–1 b

Beweis: Ist A regulär, so existiert A–1 und es gilt (siehe die Zeilen vor Definition 6.8) die Behauptung.

Wegen A–1 · o = o gilt daher:

Folgerung: A·x = o hat bei regulärem A nur die Lösung x = o.

Beispiel:

Über K = 5 sei

a + 2b + 3c = 4

b +   c = 1

a + 2b + 4c = 0

man löst (siehe 6.4, Algorithmus und Beispiel b):

a = 1, b = 0, c = 1.

Satz 6.5: Ist  invertierbar, so ist auch At invertierbar und es gilt (At)–1 = (A–1)t.

Beweis: At (A–1)t = (6.3.1.e) = (A–1 A)t = E, analog ist (A–1)t At = E

Dass die Matrix aus 6.2 Beispiel c nicht invertierbar ist, mag daran liegen, dass die 2. Zeile gleich das doppelte der ersten Zeile ist. In der Tat lässt sich zeigen:

Satz 6.6: Seien  regulär und a_1,…,ar ∈ Kn. Dann gilt:

a_1,…,ar sind linear unabhängig ⇔ A·a_1,…,A·ar sind linear unabhängig.

Jetzt aber die Theorie zur Gestalt der Lösungsmenge eines linearen Gleichungssystems:

Definition 6.9: Der Nullraum einer Matrix  ist die Lösungsmenge des linearen Gleichungssystems A.x = o.

Aus der Folgerung zu Satz 6.4 weiß man, dass der Nullraum { x∈Kn| A.x=o } einer regulären Matrix nur aus o besteht. Der nächste Satz (Beweis entfällt) rechtfertigt den Namen „Nullraum“:

Satz 6.7: Sei A.x = b ein lineares Gleichungssystem mit  .

a) Der Nullraum von A ist ein Unterraum von Kn.

b) Die Lösungsmenge { x∈Kn| A.x = b } des Gleichungssystems A.x = b ist entweder leer oder eine lineare Mannigfaltigkeit; zugehöriger Unterraum ist der Nullraum von A.

Folgerung:

Ist  eine Lösung von A.x = b mit A ∈  und ist U der Nullraum von A, so ist die Lösungsmenge L von A.x = b durch  gegeben.

Zu dieser vielleicht etwas abstrakt anmutenden Folgerung gleich ein Beispiel, welches illustriert, wie man die Lösungsmenge berechnen kann, auch wenn das System unendlich viele Lösungen hat:

Beispiel:

Zuerst bestimmt man den Nullraum U der Koeffizientenmatrix, man löst also:

Eine Lösung des Systems ist jetzt etwa  wodurch man die Lösungsmenge

Diese Lösung deckt sich mit der Lösung, die sich auf herkömmliche Art und Weise ergibt, nämlich durch Lösen von:

was auf L={(x,y)|x=2-2y} führt, Ersetzen von x durch λ liefert die Lösung von oben!

6.6. Das Gauß’sche Eliminationsverfahren

(nach Carl Friedrich Gauß, 1777-1850)

Wir betrachten ein lineares Gleichungssystem in der Notation von Kapitel 6.3, also mit der erweiterten Koeffizientenmatrix

Ist A eine reguläre Matrix, lässt sich die Lösung als x = A-1 b darstellen.

Ist jedoch A singulär bzw. die inverse Matrix nicht bekannt, so gibt es andere Methoden, zu bestimmen, ob das System lösbar ist, bzw. falls ja, wieviele und welche Lösungen existieren.

Ein solches Verfahren ist das Gaußsche Eliminationsverfahren, von dem es auch wieder mehrere Varianten gibt, etwa das Gauß-Jordan-Verfahren oder das Gauß-Seidel-Verfahren.

Bemerkung: Aus Gründen der Kompaktheit und weil das Verfahren dadurch schon ausreichend beschrieben ist, beschränken wir uns auf Gleichungssysteme, die nicht über- oder unterbestimmt sind, es seien also immer genauso viele Gleichungen wie Variablen gegeben, d.h. m = n, der Fall m ≠ n kann auf den Fall m=n zurückgeführt werden.

Das Verfahren macht von Äquivalenzumformungen Gebrauch, die am Resultat nichts ändern.

Es sind dies:

(i)        Vertauschen von Zeilen

(ii)       Multiplizieren einer Zeile mit λ ≠ 0 und anschließender Addition dieser Zeile zu einer anderen.

Die Reihenfolge, in der man die Gleichungen des Systems anschreibt, hat keinen Einfluss auf die Lösungen. Daher können wir auch annehmen, dass o.B.d.A. a_11 ≠ 0 gilt. Die Multiplikation einer Zeile mit λ ändert auch nichts an der Lösungsmenge, da man ja wieder kürzen kann. Addiert man auf beiden Seiten denselben Wert, so ändert sich ebenfalls nichts, was die Addition eines Vielfachen einer Zeile zu einer anderen Zeile rechtfertigt:

ai1x_1 + … + ainx + (λaj1x_1 + … + λajnxn) = bi + (λbj).

Algorithmus:

Gegeben sei das Gleichungssystem:

Der Algorithmus zum Bestimmen der Variablen besteht aus drei Schritten:

Schritt 1 – Vorwärtselimination

Schritt 2 – Rückwärtselimination oder Substitution

Schritt 3 - Normieren

Achtung: Treten während des Durchrechnens „Nullzeilen“ auf, d.h. gibt es ein i mit a’ij = 0 für alle j, so wird die entsprechende Zeile gestrichen.

Schritt 1 – Vorwärtselimination:

Man geht so vor, dass man das System durch Äquivalenzumformungen, die – wie oben vermerkt – an der Lösungsmenge des Systems nichts ändern, in eine Dreiecksform überführt, d.h. so, dass alle aik mit i > k = 0 sind:

Dies geschieht für jede Zeile durch Addition eines r-fachen der ersten Zeile zu einem s-fachen der entsprechenden Zeile. Dadurch werden alle aj1 mit j > 1 zu Null.

Anschließend verfährt man ebenso mit der zweiten Zeile und jeder darunter liegenden und erzeugt damit Nullen an den Positionen aj2 mit j > 2, es folgen alle weiteren Zeilen, bis obige Dreiecksform vorliegt.

Wir gehen davon aus, dass a_11 ≠ 0 ist, ansonsten vertauscht man Zeilen bzw. falls alle ai1 = 0 sind, hat man eine Variable weniger.

An dieser Stelle kann bereits festgestellt werden, wieviele Lösungen das System hat.

Hier gibt es drei Möglichkeiten:

(i) Wurden eine (oder mehrere) Nullzeilen gestrichen, so besitzt das System einen (oder mehrere) frei wählbaren Parameter, (also eine Variable, für die jede Belegung mit Elementen aus dem Körper eine korrekte Lösung des Systems liefert).

Man beachte, dass die Existenz eines frei wählbarer Parameters nicht unbedingt bedeuten muss, dass das System unendlich viele Lösungen hat, dies gilt freilich nur, wenn der Körper selbst unendlich ist, nicht also etwa über 5.

(ii) Tritt eine Zeile der Form 0 xk_1 + … + 0 xkr = c mit c ≠ 0 auf, so ist das System offensichtlich nicht lösbar.

(iii) In allen anderen Fällen ist das System eindeutig lösbar, dies ist genau dann Fall, wenn die Koeffizientenmatrix regulär ist. Die Lösung ist dann bei n = m auch gegeben durch x = A-1 b Ist das System nicht unlösbar, so fährt man fort mit:

Schritt 2 – Rückwärtselimination:

Dieser Schritt wird analog zum ersten Schritt durchgeführt, man geht jedoch von unten nach oben vor. Es wird also zuerst an den Stellen ain, i<n eine Null erzeugt, indem jeweils ein Vielfaches der letzten zu einem Vielfachen der darüber liegenden Zeilen addiert wird, etc. Das resultierende System hat dann die Gestalt einer erweiterten Diagonalmatrix, hier für den Fall m=n :

Schritt 3 – Normierung:

Durch Division jeder Zeile, in der der Koeffizient bei xi ungleich Null ist, ergibt sich die Lösung.

Bemerkung: Die Normierung kann freilich auch schon als Teil von Schritt 2 durchgeführt werden.

Es sei nun für jeden der drei Fälle ein Beispiel, jeweils über den reellen Zahlen, durchgerechnet. Die Gleichungssysteme seien wieder in Matrixform gegeben, die Zeilen seien durch römische Ziffern nummeriert.

Beispiel 1:

Beispiel 2:

(das System hat also unendlich viele Lösungen, Streichen der Nullzeile)

mit der Lösung (der frei wählbare Parameter x_3 sei mit t bezeichnet, um die nicht sehr sinnvolle Notation x_3 = x_3 zu vermeiden):

Beispiel 3:

Beispiel 4:

eine Nullzeile und kann daher gestrichen werden

letzte Zeile streichen und man erhält:

3 und x_4 frei wählbar. Man kann jetzt etwa x_3 = s und x_4 = t setzen, dann erhält man durch Ausdrücken der beiden Zeilen in obiger Matrix nach x_1 und x_2:

Beispiel 5:

jetzt über 5:

mit der Lösungsmenge { (1,0,2), (1,1,2), (1,2,2), (1,3,2), (1,4,2) }, da x_2 frei wählbar ist.

Der Gauß-Algorithmus ist sehr leicht durchführbar und wird daher bereits an Schulen gelehrt, hat jedoch den Nachteil, dass er numerisch nicht sehr stabil ist. Das bedeutet, dass bereits kleine Rundungsfehler sich in gewissen Fällen stark auf die Lösung auswirken können.

Wir betrachten dazu zwei Beispiele:

Beispiel 6:

x +                       y = 2

x +           1.0001y = 2.0001               die exakte Lösung ist (offenbar) gleich (1,1)

Wird aber vor der Rechnung gerundet, was etwa durch Messfehler passieren kann, erhält man etwa:

x +                      y = 2

x +          1.0001y = 2                         dieses System hat nun die Lösung (2,0) noch „schlimmer“ ist folgender Fall, wo sogar der Zeitpunkt des Rundens die Lösung total verfälscht:

Beispiel 7:

0.00001x +       y = 1

x +       y = 2

Runde vor der Rechnung liefert y = 1 und damit x = 1. exakte (ungerundete) Anwendung von Gauß liefert:

0.00001x +    y   = 1

-9999y   = -9998

Mit der exakten Lösung y=0.9999. Runden liefert jetzt y = 1 und damit x = 0 !

Die Numerische Mathematik liefert Mittel der Früherkennung für solche „schlecht konditionierte“ Gleichungssysteme.

6.7. Übungsaufgaben

6.1: Man berechne falls möglich:

6.2: Man löse folgende Gleichung mit

A + At = E (Lösungsmenge durch Aufzählen der Elemente)

6.3: Man berechne

für beliebiges n ∈ . (Hinweis: vollständige Induktion)

6.4: Man berechne – falls möglich – folgende Matrix und mache die Probe!

6.5: Man berechne – falls möglich – folgende Matrix und mache die Probe!

6.6: Man berechne – falls möglich – folgende Matrix und mache die Probe:

6.7: Man löse folgendes Gleichungssystem mit Hilfe von Matrizen:

6.8: Man löse folgendes Gleichungssystem mit Hilfe von Matrizen:

6.8. Applets

Alle Applets gehen von ganzzahligen (3,3) Matrizen A = (aij) aus, die Eingabe ist entweder

elementweise möglich oder man wählt einen Zufallszahlengenerator.

Verfügbar sind mit jeweils selbsterklärendem Namen

- Matrix-Skalar-Multiplikation

Zeigt wahlweise zusätzlich die Operationen symbolisch laut Rechenregel λ ai an.

- Matrix-Addition

Addiert wird wahlweise in , 2, 3, 5 oder 7 oder es wird symbolisch gerechnet.

- Matrix-Multiplikation

Multipliziert wird wahlweise in , 2, 3, 5 oder 7 oder es wird symbolisch gerechnet.

- Matrix-Vector-Multiplikation

Berechnet wird schrittweise Ax (x ist Spaltenvektor).

Gerechnet wird wahlweise in , 2, 3, 5 oder 7 oder es wird symbolisch gerechnet.

- Inverse Matrix

Schrittweise berechnet wird die Inverse einer (3,3) Matrix A. Die Elemente aij sind ganzzahlig aus [-10,10] wählbar oder werden zufällig generiert.

- Gauß´sches Eliminationsverfahren

Das Applet zeigt die einzelnen Schritte zur Lösung eines Gleichungssystems mit m ≤ 4 Gleichungen und m = n Unbekannten. Die wahlweise zufällig generierten oder wählbaren Koeffizienten müssen hier ganzzahlig sein, in der Ausgabe werden rationale Zahlen bei Bedarf gerundet und als Brüche dargestellt.

Abb. 6.1: Screenshot Applet: „Gauss Elimination“

7. Determinanten

7.1. Einleitung und Definitionen

Eine Determinante ist ein einer Matrix zugeordneter Wert, im Fall einer Matrix über den reellen Zahlen eine reelle Zahl. Daher spricht man auch von einer durch die Determinante erklärten Funktion (Determinantenfunktion). Determinanten haben mehrere nützliche Anwendungen. Historisch wurden Determinanten bereits vor der Definition von Matrizen verwendet, als eine Eigenschaft eines linearen Gleichungssystems. Dieses besitzt eine eindeutige Lösung genau dann, wenn die Determinante der Koeffizientenmatrix gleich Null ist. Auch kann man Gleichungssysteme mit Hilfe der Determinante der Koeffizienten-matrix lösen.

Eine andere Anwendung ist die Berechnung der inversen Matrix A-1 mit Hilfe der Determinanten bestimmter Teilmatrizen von A.

Zahllose sehr wichtige praktische Anwendungen haben die so genannten Eigenwerte einer Matrix, die wiederum über die Determinante berechnet werden können, mehr dazu in Matrizen.

Weitere Anwendungen gibt es etwa in der Vektorrechnung (Volumsberechnungen) oder bei „euklidischen Räumen“ (Begriff der „Orientierung einer Basis“).

Wenn nicht anders angegeben seien die Einträge der Matrizen reelle Zahlen.

Grundsätzlich kann man freilich auch die Determinanten von Matrizen über Ringen berechnen, aber etwa zum Invertieren von Matrizen über die Determinante ist es notwendig, über Körpern zu rechnen, weil dabei Divisionen vorkommen.

Zuerst zur Schreibweise:

Sei A eine quadratische Matrix über einem Körper K oder einem Ring R, vgl. Einleitung, dann schreibt man für die Determinante von A = (aik) , kurz

Die formale Definition einer nxn-Matrix verwendet Permutationen und ist für Matrizen höherer Dimension unpraktisch. Wir definieren statt dessen direkt die Determinante einer 1x1, 2x2 bzw. 3x3-Matrix. Matrizen höherer Dimension können, falls erforderlich, auf verschiedene Arten auf diese Fälle zurück geführt werden, etwa durch Rekursion (Rechenregel (d)):

Dazu führen wir vorab folgende Bezeichnung ein:

Definition 7.1: Für A sei Ai,k := die Matrix, die man aus A erhält, indem man die i-te Zeile und k-te Spalte streicht

Bsp.:

, A1,2 streicht also die erste Zeile und die zweite Spalte, übrig bleibt:

Definition 7.2: Die Determinante det(A) ist eine Abbildung von der Menge aller quadratischen Matrizen über einem Ring nach diesem Ring, die nach den Regeln (a)- (d) berechnet wird. Im für uns wichtigsten Fall, dass der Ring gleich dem Körper der reellen Zahlen ist, d.h. die Matrixelemente aik aus  sind, ist demnach det(A):

Berechnungsregeln:

d) rekursive Definition der Determinante für beliebiges n > 1

Sei nun A eine n x n-Matrix mit n > 1, dann ist

(siehe dazu auch Satz 7.9 (Laplace’scher Entwicklungssatz))

Bemerkung: Ist A eine n×n-Matrix, so ist Aj,i eine (n–1)×(n–1) Matrix, diese Rekursion terminiert also.

Bemerkung:

Für n=2 bzw. n=3 nennt man Definition 7.2.b/c auch „Regeln von Sarrus“ (Pierre F.Sarrus, 1798-1861). Die Bezeichnung „Regeln“ kommt daher, dass Sarrus von einer allgemeinen Definition von Matrizen ausgegangen ist und für die Fälle n=2 und 3 dann die oben genannten Regeln abgeleitet hat. Wir sind umgekehrt vorgegangen, haben für n=1,2 und 3 die Determinanten definitorisch eingeführt, um dann daraus durch die rekursive Beziehung (d) den allgemeinen Fall zu erklären!

Um den Zusammenhang zwischen Determinanten und Gleichungssystemen zu zeigen, betrachte man folgendes System von 2 Gleichungen mit zwei Unbekannten:

a_11 x_1 + a_12 x_2 = b1

a_21 x_1 + a_22 x_2 = b_2

Durch elementare Umformung und Einsetzen des Ausdruckes für x_2 aus der zweiten Zeile in die erste bzw. Einsetzen des Ausdruckes für x_1 in die zweite Zeile erhalten wir als allgemeine Lösung:

x_1 = (b_1a_22 – a_12 b_2) / (a_11 a_22 – a_12 a_21)

x_2 = (a_11 b_2 – b1a_21) / (a_11 a_22 – a_12 a_21)

Wir beobachten dabei folgendes:

(a) im Nenner der allgemeinen Formel für x_1 bzw. x_2 steht genau die nach der Regel von Sarrus definierte Determinante der Koeffizientenmatrix A

(b) im Zähler steht die Determinante jener Matrix, die man dadurch erhält, indem für x_1 bzw. x_2 die erste Spalte bzw. zweite Spalte durch den Lösungsvektor b = (b_1,b_2) ersetzt wird.

(c) Die Division kann naturgemäß nur ausgeführt und damit x_1 bzw. x_2 berechnet werden, wenn der Zähler ≠ 0 , also die Determinante der Lösungsmatrix von Null verschieden ist.

Diese Beobachtung gilt allgemein für lineare Gleichungssysteme in n Unbekannten und wir kommen darauf in Abschnitt 7.2 bei der Besprechung der Cramer´schen Regel zurück

Beispiele:

Beispiel zur rekursiven Berechnung:

a) det(O) = 0, det(E) = 1: für n= 1,2,3 trivial, für n > 3 ergibt sich dies unter Anwendung der Rekursionsformel

Für die Berechnung der Determinante ist es nicht von belang, ob man die Matrix aus Zeilen oder Spalten aufbaut, mit anderen Worten: eine Matrix A und ihre Transponierte At haben dieselbe Determinante:

Satz 7.1: Für alle A gilt: det(A) = det(At).

Ferner gilt:

Satz 7.2: Multipliziert man alle Elemente einer Zeile der Determinante mit c ≠ 0, so multipliziert sich det(A) mit c: det(c . A) = c . det(A).

Wenn die Zeilenvektoren, aus denen die Matrix aufgebaut ist, linear abhängig sind, so wirkt sich das wie folgt auf die Determinante aus:

Satz 7.3: Sind in A zwei Zeilen gleich oder ist eine Zeile = o, so ist det(A) = 0. Bemerkung:

Obige Sätze gelten auch, wenn man Spalte statt Zeile schreibt.

Besondere einfach ist die Determinante einer Dreiecksmatrix zu berechnen, egal welcher Dimension. Es ist daher oft günstig, eine Matrix auf Dreiecksform zu bringen. Dazu führen wir folgende Determinantenumformungen ein und erläutern, was eine solche Operation auf A für det(A) bedeutet:

(a) Vertauschen zweier Zeilen oder zweier Spalten

(b) Addition einer Linearkombination von Zeilen bzw Spalten zu einer anderen Zeile bzw. einer anderen Spalte.

Dazu gelten folgende Sätze:

Satz 7.4: Addiert man zu einer Zeile ein Vielfaches einer anderen Zeile, so bleibt det(A) unverändert

Satz 7.5: Vertauscht man zwei Zeilen (Spalten) von A, so ändert det(A) sein Vorzeichen.

Man kann zeigen, dass sich jede Matrix A durch eine endliche Folge von Operationen auf nachstehende Gestalt bringen lässt und es gilt

Satz 7.6:

Dann ist det(A) = a_11a_22 … ann.

Beispiel:

Wir betrachten wieder  und finden das Ergebnis jetzt schneller durch 1·4·2

Man kann also folgendermaßen vorgehen:

Algorithmus:

Man forme A durch Addition von Zeilen (Spalten) zu anderen Zeilen (Spalten) und durch insgesamt k Zeilen- bzw. j Spaltenvertauschungen in eine obere Dreiecksmatrix mit Diagonalelementen a_1,…,an über, so gilt nach obigem Satz:

det(A) = (–1)k+j a_1a_2…an

Beispiel:

Im ersten Schritt wurde die die erste Zeile mit –4 multipliziert und das Ergebnis zur 3.Zeile addiert, dann die dritte Spalte mit 11 Multipliziert und zur zweiten Spalte addiert.

Die folgenden Sätze liefern einen Zusammenhang zwischen der Determinante einer Matrix und der ihrer Inversen, wir benötigen hier also Matrizen über einem Körper, etwa über .

Satz 7.7: Für A,B ∈  gilt: det(A·B) = det(A)det(B).

Ist A ∈ regulär, so gilt A·A–1 = E, also nach obigem Satz auch |A · A–1 | = |E| = 1. Dies ergibt:

Satz 7.8: Ist A regulär, so gilt det(A–1) =

Und wir halten fest, dass die Aussagen „A ist regulär” und „det(A) ≠ 0“ äquivalent sind.

Dies hat wichtige Konsequenzen, etwa eine Möglichkeit, Vektoren auf lineare Unabhängigkeit zu testen:

Folgerung:

Für A ∈ sind äquivalent:

a) det(A) = 0

b) Die Zeilenvektoren von A sind linear abhängig.

c) Die Spaltenvektoren von A sind linear abhängig.

Eine andere Möglichkeit die Determinante von Matrizen zu berechnen, die besonders dann sehr effizient ist, wenn die Matrizen „dünn besetzt“ sind, also viele Nullen enthalten, liefert der Laplace’sche Entwicklungssatz.

Satz 7.9 (Laplace'scher Entwicklungssatz):

a) „Entwicklung von det(A) nach der i-ten Spalte“. Für jedes fixe i∈{1,…,n} gilt:

b) „Entwicklung von det(A) nach der k-ten Zeile“. Für jedes fixe k∈{1,…,n} gilt

Die Vorzeichen (–1)j+i bzw. (–1)k+j lassen sich über folgendes „Schachbrettmuster“ leicht merken:

Wir haben Teil (a) dieses Satzes bereits zu Beginn dieses Kapitels verwendet! Dort aber haben wir die Aussage des Laplace´schen Entwicklungssatz als Definition für eine rekursive Einführung von Determinanten verwendet. Es folgen übrigens auch die Regeln von Sarrus aus dem Entwicklungssatz.

Anhand einer 4x4-Matrix zeigen wir jetzt, wie schnell es mit dem Entwicklungssatz gehen kann, wenn mehrere Nullen vorkommen:

Beispiel:

Entwicklung nach der letzten Zeile, dort steht nur ein Eintrag ungleich Null:

Hier könnte man mit Sarrus weiterrechnen, wir verwenden zur Illustration aber nochmals den Entwicklungssatz, diesmal über die zweite Spalte:

Zum Abschluss dieses Unterkapitels sei für den interessierten Leser noch die allgemeine Definition der Determinante det(A) einer nxn-Matrix angeführt:

Wir erinnern uns hier zuerst an die Permutationen, also die bijektiven Abbildungen von

{1,2,…,n} nach {1,2,…n} aus dem Kapitel über Funktionen:

Definition 7.3: Eine Fehlstelle in einer Permutation π ist ein Paar (π(i),π(j)) mit i < j, aber π(i) > π(j). Hat π f Fehlstellen, so heißt sign(π) := (–1)f die Signatur von π.

Beispiel:

hat die fünf Fehlstellen (5,3), (5,4), (5,2), (3,2), (4,2), hat also die Signatur –1. Weiters ist sign(id)=1.

Definition 7.4: Sei A = eine n x n Matrix mit den Elementen aik aus einem Körper K.

Für A = (aik)1≤ i, k ≤ n definiert man

det A = det(aik) =

als die Determinante von A.

Wir erinnern, dass es n! Permutationen zu n Elementen gibt, d.h., dass die symmetrische Gruppe Sn insgesamt n! Elemente enthält. Daher ist diese Definition für das Ausrechnen der Determinanten nicht praktikabel, da bereits für die Determinante einer 5x5-Matrix über alle Elemente der S_5 summiert werden muss, man also 120 Summanden zu berechnen hat.

7.2. Die Cramer’sche Regel

Wie schon erwähnt, liefern Determinanten eine Möglichkeit, die Lösungsmenge eines linearen Gleichungssystems zu berechnen, sofern eine eindeutige Lösung existiert. Hierbei hilft die sogenannte Cramer’sche Regel. Das besondere dabei ist, dass man eine der gesuchten Variablen berechnen kann, ohne die anderen berechnen zu müssen.

Satz 7.10 (Cramer´sche Regel) (Gabriel Cramer, 1704-1752):

Im Gleichungssystem A·x = b sei A regulär,  und für i ∈ {1,…,n} sei Ai diejenige Matrix, die sich aus A ergibt, indem man die i-te Spalte durch b ersetzt [vgl. folgendes Beispiel]. Dann gilt

Dieser Satz liefert anders als Gauß also eine Formel, nicht einen Algorithmus, mit der sich Lösungen berechnen lassen.

Beispiel:

Die Variablen x_1 und x_2 sollen aus dem linearen Gleichungssystem

2x_1 +x_2 = 1

–x_1 +2x_2= 2

berechnet werden. Die Determinante der Koeffizientenmatrix A ist laut Sarrus:

A ist also regulär.

Jetzt ersetzen wir die erste Spalte durch den Vektor b und erhalten:

damit ist det(A1)=0 und

Jetzt ersetzen wir die zweite Spalte durch den Vektor b und erhalten eine unveränderte Matrix, also

damit ist det(A_2)=det(A)=5 und

Die Lösungsmenge des Gleichungssystems ist also L = { (0,1) }

Beispiel:

Die Variable x_2 soll aus dem linearen Gleichungssystem

4x_1 +    x_2 +          3x_4  = 1

2x_1 + 4x_2 + 2x_3 +  x_4  = 2

3x_1 + 2x_2 +          2x_4  = 3

4x_1                               = 4

berechnet werden.

Die Determinante der Koeffizientenmatrix A haben wir in dem Beispiel zum Entwicklungssatz schon berechnet, es gilt:

Wir berechnen det(A_2) =   mit dem Entwicklungssatz und mit Sarrus:

= (–2)⋅(0+36+8–36–32–0) = 48⋅; somit ist

7.3. Eigenwerte

Ein sehr wichtiges Anwendungsgebiet der Algebra liefern die so genannten Eigenwerte einer Matrix.

Untrennbar verbunden sind die Begriffe Eigenwert und Eigenvektor, es gilt hierbei folgender Zusammenhang: (Wir rechnen jetzt immer über Körpern, wobei bemerkt sei, dass eine Matrix über den reellen Zahlen nicht unbedingt nur reelle Eigenwerte haben muss, diese können auch komplex sein.):

Definition 7.5: Gilt für A∈  , x∈Kn , λ∈K , mit x ≠ o, die Gleichung A· x = λ x, so heißt x ein Eigenvektor von A zum Eigenwert λ, der größte Eigenwert von A heißt dominanter Eigenwert. Die Beziehung A· x = λ x wird oft als (λE-A) x = o geschrieben.

λ ∈ K ist also ein Eigenwert von A ∈  , falls es ein x ∈ Kn, x ≠ o, gibt mit A· x = λ x.

Formen wir letztere Gleichung um und wählen wir die reellen Zahlen als Körper K, so kommt man zu folgender Definition:

Definition 7.6: Reelle Zahlen λ∈ ,für die das homogene lineare Gleichungssystem mit seiner n x n Koeffizientenmatrix A– λE nichttriviale Lösungen hat, heißen Eigenwerte der Matrix A.

Wie findet man aber Eigenwerte einer Matrix A ? (Auf die Bestimmung der Eigenvektoren sei hier allerdings nicht weiter eingegangen.)

Satz 7.11: Für A ∈  sind folgende Bedingungen paarweise äquivalent:

a)     λ ist ein Eigenwert von A.

b)     λ E–A ist singulär.

c)     det(A–λE) = 0 (Bemerkung: det(A–λE) ist ein Polynom, genannt das charakteristische Polynom von A)

Die in Satz 7.11 steckende Kernaussage ist:

Das lineare Gleichungssystem (A– λE) x = o hat nicht triviale Lösungen dann und nur dann, wenn λ eine Lösung der charakteristischen Gleichung det(A– λE) = 0 ist. Jetzt aber zwei Beispiele zur praktischen Berechnung der Eigenwerte. Es sei noch angemerkt, dass diese Methode für Matrizen höherer Dimension nicht immer zweckmäßig ist. Es gibt dort aber andere Verfahren, die viel mehr Theorie erfordern.

Beispiel:

Man finde alle Eigenwerte von

Nach obigem Satz setzen wir det(λ E–A) = 0, also (nach Sarrus)

was auf die Gleichung λ²–2λ = 0 hinausläuft. Lösungen sind λ 1 = 0, λ 2 = 2.

Beispiel:

Man finde alle Eigenwerte von

Nach Satz 7.11 c) setzen wir det(λ E–A) = 0, also

was (z.B. wieder nach der Regel von Sarrus) die Gleichung λ^3+2λ^2–4λ = 0 liefert.

Lösungen sind λ 1 = 0, λ 2 = –1 + √5 , λ 3 = –1 ± √5 .

Beispiel:

Man finde alle Eigenwerte von

Die Eigenwerte sind gegeben durch 0, 1 und –3

Zum Abschluss bringen wir ohne Beweise einige wichtige Aussagen über Eigenwerte und Matrizen bzw ihren zugeordneten Determinanten:

Satz 7.12: A und ihre transponierte AT besitzen dieselben Eigenwerte.

Satz 7.13: Seien A und B n × n Matrizen. Dann besitzen die Matrizen AB und BA dieselben Eigenwerte.

Wir erinnern, dass das Matrixprodukt im Allgemeinen nicht kommutativ ist.

Satz 7.14: Ist λ ein Eigenwert der regulären Matrix A, dann ist ein λ –1 Eigenwert von ihrer Inversen A-1

Satz 7.15: Ist λ ein Eigenwert der Matrix A, dann ist λk Eigenwert von Ak.

Satz 7.16: Die Determinante einer n × n Matrix A ist gleich dem Produkt der Eigenwerte λi von A:

Beispiel:

Für die Eigenwerte erhalten wir:

(2 – λ)(4 – λ) – 48 = 0 ⇒ λ^2 – 6 λ – 40 = 0 und λ_1= 10 , λ_2 = –4

Satz 7.17: Die Summe der Eigenwerte λi einer Matrix A ist gleich der Summe der Diagonalelemente (der „Spur“) von A:

Die Spur der Matrix obigen Beispiels ist 2 + 4 = 6, ebenso die Summe der Eigenwerte (10 bzw. –4).

Die obigen Sätze geben einen Hinweis, dass zwischen Matrizen und darauf angewandten Operationen sowie den zugehörigen Determinanten enge Beziehungen bestehen. Entsprechend vielfältig in den Anwendungen ist die Theorie der Eigenwerte.

Eine tiefergehende Behandlung würde den gesteckten Rahmen hier allerdings sprengen.

7.4. Übungsaufgaben

7.1: Man berechne folgende Determinanten (über ) mit der Regel von Sarrus

7.2: Wie Frage 1.1 für:

7.3: Man berechne die Determinanten aus 7.2 rekursiv:

7.4: Man berechne folgende Determinanten auf möglichst effiziente Art und Weise:

7.5: Man berechne folgende Determinante mit dem Entwicklungssatz auf zwei Arten:

7.6: Man bestimme x_3 in folgendem Gleichungssystem mit der Cramer’schen Regel:

7.7: Man bestimmen die Eigenwerte von

7.8: Bestimmen Sie für obiges A Spur und Determinante sowie die Eigenwerte von A–1

7.9: Beweisen Sie folgenden Satz („Vandermonde’sche Determinante) mit vollständiger Induktion:

7.5. Applets

- Inverse Matrix

Berechnet wird die inverse Matrix A-1 zu einer (3,3) Matrix und zuvor die Determinante det(aik). Die Werte aik können einzeln oder mittels Zufallszahlen gesetzt werden.

- Matrix Determinant(e)

Berechnet wird die Determinante det(aij) einer (3,3) Matrix A nach den Regeln von Sarrus. Bei der symbolischen Darstellung werden die Zwischenschritte Zeile für Zeile angezeigt.

Abb. 7.1: Screenshot Applet: „Matrix Determinante“

Abb. 7.2: Screenshot Applet: „Inverse Matrix“

8. Graphentheorie

8.1. Vorbemerkung

Die Graphentheorie zählt als mathematische Disziplin zur Diskreten Mathematik und ist ein wichtiges formales Werkzeug der Informatik. Sie ist ein gut geeignetes Mittel, um bestimmte Klassen von Modellen und insbesondere Fragestellungen aus dem Bereich Datenstrukturen zu beschreiben.

Ein besonderer Vorteil der Graphentheorie ist der, dass die Objekte (Graphen), mit denen sie sich auseinandersetzt, bei Anwendungen durch Zeichnungen illustrativ dargestellt werden können. Damit wird die Argumentation in vielen Fällen leichter verständlich.

Allerdings muss man sich im Klaren sein, dass solche Zeichnungen mehr oder weniger willkürliche graphische Darstellungen sind. Die Metrik (Winkel zwischen zwei Geraden, Länge einer Strecke usw.), die wir aus der Euklidischen Geometrie kennen, ist in der Graphentheorie aufgehoben. Es zählt z.B. nur, ob zwei Knoten mit einer Kante verbunden sind oder z.B. über wie viele Kanten man „gehen“ muss, um von einem Knoten zu einem anderen zu kommen, sofern dies überhaupt möglich ist.

Es mag zunächst irritieren, dass man in der Graphentheorie etwa die in Abb. 8.1 dargestellte Figur als Zeichnung eines Graphen interpretiert, der dort als Kreis mit der Länge 3 verstanden wird:

Abb. 8.1

Wie jede spezielle mathematische Disziplin hat die Graphentheorie ihre eigene Terminologie, sodass wir anfangs einer größeren Zahl von Definitionen begegnen.

8.2. Ungerichtete Graphen

8.2.1. Elementare Definitionen

Wir behandeln zunächst ungerichtete Graphen und führen sie wie folgt ein:

Definition 8.1: Ein ungerichteter Graph X besteht aus einer Menge V = V(X), den Knoten von X, und einer Menge E = E(X) von ungeordneten Paaren e = [x,y] verschiedener Elemente aus V, den Kanten von X.

Wir schreiben X = (V,E) und sprechen kurz von einem Graphen. Bei der Anwendung von Graphen im Bereich der Datenstrukturen sind natürlich nur endliche Graphen relevant, d.h., besteht V nur aus endlich vielen Knoten. Wir beschränken uns fortan auf endliche Graphen.

Die folgende Terminologie ist in der Graphentheorie üblich: Eine Kante [x,y] verbindet ihre Endpunkte x und y und man nennt diese Punkte (Knoten) adjazent. Der Knoten x und die Kante [x,y] heißen inzident.

Beispiel:

Sei X_1= (V_1,E_1) mit V_1 = {a,b,c,d}, E_1 = {[a,b],[a,c],[a,d],[b,c],[b,d],[c,d]}

Abb. 8.2

In der Abbildung sind drei Zeichnungen von Graphen angegeben. Die ersten beiden sind mögliche Zeichnungen von X_1. Die dritte Zeichnung repräsentiert einen anderen Graphen X_2 mit V_2 = {A,B,C,D} und den Kanten E_2 = {[A,B],[A,C],[A,D],[B,C][B,D],[C,D]}.

Das Gemeinsame an beiden Graphen X_1 = (V_1,E_1) und X_2 = (V_2,E_2) ist evident: die linke und die rechte Zeichnung sind bis auf die Markierungen der Knoten gleich.

Formal wird dieser Sachverhalt wie folgt erklärt:

Definition 8.2: Gegeben seien zwei Graphen X_1 = (V_1,E_1) und X_2 = (V_2,E_2). Eine bijektive Abbildung f von V_1 und V_2 heißt ein Isomorphismus von X_1 auf X_2, wenn gilt: [x,y] ∈ E_1 genau dann, wenn [f(x),f(y)] ∈ E_2 ist. Gibt es einen Isomorphismus von X_1 auf X_2, so nennt man X_1 und X_2 isomorph, symbolisch X_1 ≅ X_2.

Definition 8.3: Ein Graph X_1 = (V_1,E_1) heißt Teilgraph von X = (V,E), wenn V_1 ⊆ V und E_1 ⊆ E ist. Ein Teilgraph von X ist spannender Teilgraph von X, wenn V_1 = V ist. Enthält E_1 alle Kanten aus E, deren Endpunkte in V_1 liegen, so sagt man, dass X_1 von V_1 ⊆ V in X aufgespannt wird oder dass X_1 ein gesättigter Teilgraph von X ist.

Beispiel:

X =: V = {a,b,c,d}, E = {[a,b],[a,c],[b,c],[c,d]}

Teilgraph: V_1 = {a,b,c,}, E = {[a,c,],[b,c]}

Spannender Teilgraph: V_2 = V, E_2 = {[a,c],[b,c],[c,d]}

Spannender Teilgraph: V_3 = V, E_3 = {[a,b],[b,c]}

Gesättigter Teilgraph: V_4 = {a,b,c,}, E_4 = {[a,b,],[a,c,],[b,c]}

Abb. 8.3

Unter dem Grad d(x) eines Knotens x ∈ V(X) versteht man die Anzahl der Kanten e ∈ E (X), die mit x inzident sind (d.h. die Anzahl der Kanten, die den Knoten „berühren“). Der Knoten c von X = (V,E) aus obigem Beispiel hat den Grad 3. Der Knoten d im spannenden Teilgraphen X3 von X hat den Grad d(x) = 0 und wird als isolierter Knoten bezeichnet. Ein Knoten vom Grad 1 heißt Endknoten. Hat jeder Knoten denselben Grad d, so heißt X regulär vom Grad d. Summiert man den Grad über alle Knoten von X, so liefert jede Kante genau zweimal einen Beitrag zu dieser Summe. Somit erhält man die Beziehung

Satz 8.1:

Bei der Anwendung von Graphen will man nicht selten entlang von Kanten etwas bewegen, transportieren; oder es kann sich um die Bedeutung „Zugriff“ handeln, indem man überlegt, wie und über welche Kanten gehend kann man von x ∈ V(X) einen anderen Knoten erreichen. Zur genauen Formulierung benötigen wir eine Reihe weiterer Definitionen.

Definition 8.4: Eine Kantenfolge von x_1 nach xn in einem Graphen X ist eine endliche Folge von Kanten[x_1,x_2],[x_2,x_3],...,[xi-1,xi],[xi,xi+1],...,[xn-1,xn], so dass je zwei aufeinanderfolgende Kanten einen Punkt gemeinsam haben.

Die Kantenfolge heißt offen, wenn x_1 ≠ xn ist, andernfalls, für x_1 = xn, heißt die Kantenfolge geschlossen.

Definition 8.5: Ein Kantenzug ist eine Kantenfolge, in der alle Kanten voneinander verschieden sind. Ein Weg W ist eine offene Kantenfolge, in der alle Knoten verschieden sind. Einen Knoten x fassen wir ebenfalls als Weg auf.

Definition 8.6: Ein Kreis ist ein geschlossener Kantenzug, bei dem die Knoten x_1,x_2,...xn-1 alle verschieden sind.

Beispiel:

In der Zeichnung des nachstehenden Graphen ist [a,d],[d,g],[g,h],[h,r] ein Weg von a nach r; [a,b],[b,c][c,d],[d,a],[a,c] ein Kantenzug, aber kein Weg, und [a,b],[b,e],[e,f],[f,g],[g,d],[d,a] ist ein Kreis, während [b,e],[e,f],[f,b],[b,e],[e,i] „nur“ eine Kantenfolge ist.

Abb. 8.4

Leicht einzusehen ist der folgende Satz:

Satz 8.2: Jede Kantenfolge von x_1 nach xn enthält einen Weg von x_1 nach xn. Zum Beweis braucht man aus der Folge [x_1,x_2],[x_2,x_3],...[xn-1,xn] nur in geeigneter Weise „mehrfach vorkommende“ Kanten wegzustreichen, bis dass jede Kante maximal einmal vorkommt.

Die Anzahl der Kanten in einer Kantenfolge bezeichnet man als ihre Länge. Sind x,y ∈ V(X) durch einen Weg verbunden, so gibt es unter der Menge dieser Wege W(x,y) einen mit minimaler Länge.

Er heißt ein kürzester Weg W(x,y) von x nach y und seine Länge d(x,y) wird als der Abstand d(x,y) der Knoten x und y in X bezeichnet.

In der allgemeinen Definition eines ungerichteten Graphen wird nicht verlangt, dass je zwei Knoten x,y ∈ V(X) durch einen Weg verbunden sind, jedoch steht die Betrachtung von Graphen mit dieser Eigenschaft oft im Vordergrund.

Daher untersuchen wir solche Graphenklassen etwas näher.

8.2.2. Zusammenhang und Komponenten

Definition 8.7: Ein Graph heißt zusammenhängend, wenn je zwei seiner Knoten durch einen Weg verbunden sind.

Definition 8.8: Die Komponente K(x) des Knotens x ist die Menge aller Knoten y, die mit x durch einen Weg verbunden sind: K(x) = {y : ∃ W (x,y)}. Aus dem nachfolgenden Satz 8.3 erkennt man, dass die Knotenmengen K(x), x ∈ V(X) eine Partition von V(X) bewirken.

Satz 8.3: Sind x ≠ y zwei Knoten des Graphen X und K(x) ∩ K(y) ≠ ∅, so ist K(x) = K(y).

Beweis: Sei z ∈ K(x) ∩ K(y). Dann gibt es einen Weg W(x,z) und auch einen Weg W(z,y). Die Vereinigung der Wege von x nach z und von z nach y enthält einen Weg W(x,y), woraus K(y) ⊆ K(x) und analog K(x) ⊆ K(y) folgt.

Definition 8.9: Die von den K(x) aufgespannten Teilgraphen heißen Komponenten von X.

Es ist klar, dass jede Komponente von X ein zusammenhängender Graph ist und dass ein Graph, der aus genau einer Komponente besteht, zusammenhängend ist. In vielen Anwendungsfällen geht man stillschweigend davon aus, dass der zu Grunde liegende Graph zusammenhängend ist. Darauf ist zu achten.

Abb. 8.5

In obiger Figur gilt K(a) = {a,e,f,g,c,h}, K(b) = {b} K(d) = {d,i}. Der Graph ist nicht zusammenhängend und zerfällt in drei Komponenten:

K_1 : V(K_1) = K(a), E(K_1) = {[a,e],[a,f],[e,f],[f,g],[g,c],[g,h],[c,h]}

K_2 : V(K_2) = K(b), E(K_2) =

K_3 : V(K_3) = K(d), E(K_3) = {[d,i]}

8.2.3. Artikulationen und Brücken

Man stellt sich sofort die Frage, inwieweit der Zusammenhang in einem Graphen gestört oder verändert wird, wenn man gewisse Knoten oder Kanten streicht. Denkt man an ein durch einen ungerichteten Graphen modelliertes Versorgungsnetz, so ist die Interpretation des Ausfalls eines Knotens oder eines Weges bzw. einer Kante unmittelbar zu interpretieren. Zunächst definieren wir formal, was das Ergebnis des Streichens von Knoten und Kanten ist.

Definition 8.10:  Ist X ein Graph und A ⊂ V(X), so erhält man durch Streichen von A in X, symbolisch X-A, folgenden Graphen:

V(X-A) = V(X)-A

E(X-A) = {[x,y] | [x,y] ∈ E(X), x ∉ A und y ∉ A}.

Der Knoten d in nachstehender Zeichnung hat die Eigenschaft, dass X – {d} nicht mehr zusammenhängend ist, während der Graph X – {i} noch zusammenhängend bleibt.

Abb. 8.6

Definition 8.11: Ein Knoten x ∈ V(x) heißt Artikulation von X oder Zerfällungsknoten, wenn X – {x} mehr Komponenten besitzt als X.

Wir bemerken, dass | V(X) | ≥ 3 sein muss, falls X eine Artikulation enthält. Weiterhin ist es auch möglich, dass ein zusammenhängender Graph X in mehr als zwei Komponenten zerfällt, falls man eine Artikulation streicht. Unten ist ein solcher Fall angegeben. Graphen mit Artikulationen heißen separabel.

Abb. 8.7

Man kann die Fragestellung nach Artikulationen auch insofern umkehren, indem nach maximal zusammenhängenden Teilgraphen ohne Artikulationen gesucht wird. Dazu definieren wir wie folgt:

Definition 8.12: Ein Teilgraph X1 von X heißt Block von X, wenn er ein gesättigter und zusammenhängender Teilgraph ist, keine Artikulation enthält und maximal ist, d.h., wenn kein Teilgraph X2 mit V(X2) ⊃ V(X1) diese Eigenschaft besitzt.

Abb. 8.8

Im obigen Graphen spannen die Knotenmengen {a,b,c,d,e}, {e,f,g}, {g,h}, {h,i,j,k} jeweils einen Block auf. Die Knoten e,g,h sind Artikulationen. Zwischen den Begriffen Block und Artikulationen besteht nicht nur definitorisch eine Verbindung.

Eine wichtige Aussage wird in Satz 8.4 getroffen, den wir ohne Beweis angeben:

Satz 8.4: Zwei Blöcke eines Graphen X haben höchstens einen gemeinsamen Knoten und dieser ist Artikulation von X.

Und daraus folgen:

Satz 8.5: Ein Knoten x ist Artikulation von X genau dann, wenn x in mindestens zwei Blöcken liegt.

Satz 8.6: Jede Kante und jeder Kreis von X liegen in genau einem Block von X. Beweis: Der Durchschnitt zweier Blöcke enthält höchstens einen Knoten. Also müssen die Endpunkte einer Kante im selben Block liegen. Ein Kreis besitzt keine Artikulation und ist daher in einem Block enthalten.

Wir übertragen nun die vorhin angestellten Überlegungen in gewisser Hinsicht analog auf Kanten, d.h., wir untersuchen das Verhalten bezüglich des Zusammenhangs von Graphen, wenn gewisse Teilmengen F ⊂ E(X) aus E(X) entfernt werden.

Definition 8.13: Ist F ⊂ E(X), so ist der Graph X – [F] definiert auf V(X) durch die Kanten aus E(X) – F.

Definition 8.14: Eine Kante e ∈ E (X) heißt Brücke von X, wenn X – [e] mehr Komponenten besitzt als X.

Wir halten fest, dass für einen zusammenhängenden Graphen X der Graph X – [e] aus genau zwei Komponenten besteht, wenn e eine Brücke ist. Unmittelbar einsichtig ist auch, dass jede Kante eines kreislosen Graphen eine Brücke ist.

Abb. 8.9

Wir beschreiben einige Eigenschaften von Brücken durch folgende Aussagen:

Satz 8.7: Sei X ein zusammenhängender Graph und e ∈ E(X). Dann sind die folgenden Aussagen äquivalent:

(i)         e ist eine Brücke von X

(ii)        e liegt auf keinem Kreis von X

(iii)       Es gibt Knoten x und y von X, so dass e auf jedem Weg von x nach y liegt.

Beweis: Wir führen den Beweis zyklisch, indem gezeigt wird (i) ⇒ (ii) ⇒ (iii) ⇒ (i).

(i)         ⇒  (ii): Sei e eine Brücke von X. Dann ist X – [e] nicht zusammenhängend und die Endpunkte von e = [x,y] liegen in verschiedenen Komponenten von X – [e]. Also ist e selbst der einzige Weg in X, der x und y miteinander verbindet. Daher kann e auf keinem Kreis liegen.

(ii)        ⇒   (iii): Liegt e auf keinem Kreis, so erfüllt e selbst für seine Endknoten x und y die Aussage (iii).

(iii)       ⇒  (i): Wenn jeder Weg von x nach y über e führt, dann sind x und y in X – [e] nicht mehr durch einen Weg verbunden. Also ist X – [e] nicht zusammenhängend und e eine Brücke.

8.2.4. Bäume

Besonders wichtig für Anwendungen, wie das Speichern einer Schlüsselmenge K und das Suchen nach Elementen k ∈ K, sind kreislose, zusammenhängende Graphen, die als Bäume bezeichnet werden.

Definition 8.15: Ein zusammenhängender ungerichteter Graph ohne Kreis heißt Baum. Ist jede Komponente eines Graphen X ein Baum, so heißt X ein Wald.

Zwei Zeichnungen von Bäumen sind unten gleichzeitig Beispiele für typische Anwendungen.

Abb. 8.10

Der folgende Satz gibt eine übersichtliche Aufzählung wichtiger Eigenschaften von Bäumen. Darunter ist insbesondere die Eigenschaft (ii) von praktischer Bedeutung.

Satz 8.8: Ist X ein Graph mit n = | V(X) | und m = | E(X) |, dann sind folgende Aussagen äquivalent:

(i)       X ist ein Baum.

(ii)     Je zwei Knoten in X sind durch genau einen Weg in X verbunden.

(iii)    X ist zusammenhängend und jede Kante von X ist eine Brücke.

(iv)    X ist zusammenhängend und m = n–1.

(v)     X besitzt keinen Kreis und m = n–1.

(vi)    X besitzt keinen Kreis. Verbindet man aber zwei Knoten von V(X), die nicht in X verbunden sind, durch eine Kante, so erhält man einen Graphen mit genau einem Kreis.

Beweis von Satz 8.8:

Wir führen den Beweis wieder zyklisch.

(i)            ⇒ (ii):  Sei X ein Baum. Dann ist X zusammenhängend und für x, y ∈ V(X) gibt es einen verbindenden Weg W1(x,y) in X. Gibt es noch einen Weg W2(x,y), W1 ≠ W2, so enthält W1 ∪ W2 einen Kreis. Widerspruch.

(ii)          ⇒ (iii): Aus der Voraussetzung (ii) folgt, dass X zusammenhängend ist. Ist e ∈ E(X), so ist e = [x,y] der einzige Weg, der x mit y verbindet. Also ist X – [e] nicht mehr zusammenhängend und e ist eine Brücke.

(iii)         ⇒ (iv): Da X zusammenhängend ist, folgt m = n–1 für | V(X) | = 1,2 unmittelbar.

Sei die Induktionsannahme richtig für |V(X) | ≤ n–1. Erfüllt laut Voraussetzung X die Bedingung (iii), so zerfällt X – [e], e beliebig aus E(X), in zwei Komponenten X_1 und X_2.

Laut Induktionsannahme gilt | E(X_1) | = | V(X_1) | –1 und | E(X_2) | = | V(X_2) | –1. Wegen E(X) = E(X_1) ∪ E(X_2) ∪ {e} gilt dann | E(X) | = | V(X_1) | –1 + | V(X_2) | –1+1 = | V(X) | –1.

(iv)          ⇒ (v): Gilt (iv), so ist X zusammenhängend und m = n–1. X selbst kann kein Kreis sein, denn sonst wäre m=n. Angenommen X enthält einen Kreis C mit k<n Knoten. Dann gibt es noch n–k Knoten von X, die nicht auf diesem Kreis C liegen. Wegen des vorausgesetzten Zusammenhanges ist jeder dieser n–k Knoten mit einem Knoten von C durch einen Weg verbunden. Wir wählen diese Wege durch Streichung überflüssiger Kanten so aus, dass jeder Knoten, der nicht auf C liegt, durch genau einen Weg mit einem Knoten auf C verbunden ist. Ist x ∈ V(C), so sei Wx die Menge der Knoten, die mit x durch einen der konstruierten Wege verbunden sind. Nach Konstruktion besitzt der Graph Yx mit V(Yx) = Wx ∪ {x} und mit den Kanten, die auf den gewählten Wegen liegen, die Eigenschaft (ii). Da aus (ii) die Aussage (iv) folgt, hat Yx genau | Wx | Kanten. Daher gibt es außer den Kanten von C noch mindestens  Kanten, d.h. insgesamt noch mindestens m=k+k=n Kanten. Widerspruch zu m = n–1.

(v)          ⇒ (vi): Unter der Voraussetzung, dass (v) gilt, hat X keinen Kreis. Also ist X ein Wald. Für jede Komponente Xi gilt daher (i) und daraus wieder folgt (iv). Also ist | E(Xi) | = | V(Xi) | –1. Gäbe es p > 1 Komponenten in X, so erhielte man durch Summation m = n-p, was der Voraussetzung (v) widerspricht. Somit ist X zusammenhängend und ein Baum. Daher bildet eine Kante e = [x,y] ∉ E (X), wenn sie zu E (X) hinzugefügt wird, mit dem eindeutig bestimmten Weg W(x,y) in X genau einen Kreis.

(vi)        ⇒ (i): Gilt (vi), so hat X keinen Kreis. Zu zeigen bleibt noch, dass X zusammenhängend ist. Sind x,y nicht durch eine Kante e = [x,y] miteinander verbunden, so erhält man durch Hinzufügen von [x,y] einen Kreis. Also müssen x,y bereits durch einen Weg W(x,y) in X verbunden sein und X ist zusammenhängend.

Die folgende Definition charakterisiert Teilgraphen T eines Graphen X, wenn sie zugleich Baum und spannender Teilgraph sind.

Definition 8.16: Ist X = (V(X),E(X)) ein zusammenhängender Graph und T ein Teilgraph von X, dann heißt der Graph T = (V(T),E(T)) ein spannender Baum oder Gerüst von X, wenn V(T) = V(X) und T ein Baum ist.

Die stark ausgezogenen Kanten in Abb. 8.11 bilden ein Gerüst des Graphen und man sieht, dass ein Gerüst im Allgemeinen nicht eindeutig bestimmt ist.

Abb. 8.11

8.3. Gerichtete Graphen

8.3.1. Zusammenhang und Komponenten

Viele Begriffe für ungerichtete Graphen können sinngemäß auf gerichtete Graphen übertragen werden. Dazu geben wir folgende Definition und Sätze an:

Definition 8.17: Ein gerichteter Graph X (kurz: g.Graph) besteht aus einer Menge V = V(X), den Knoten von X, und einer Menge E = E(X) von geordneten Paaren <x,y> verschiedener Elemente aus V, den Kanten von X.

Abb. 8.12

Bei einigen Anwendungen, etwa in der Modellierung von endlichen Automaten (Zustandsdiagramm) ist es zweckmäßig, auch Schlingen, also Kanten der Form <x,x>, einzuführen. Ebenso werden gegebenenfalls Mehrfachkanten zugelassen: dann ist E(X) keine Menge mehr und <x,y> heißt Mehrfachkante, wenn <x,y> in E(X) mehrfach auftritt.

Gerichtete Graphen entsprechen dem Konzept der Relation und umgekehrt definiert jeder g.Graph ohne Mehrfachkanten auf V(X) eine Relation.

Der Konnex zu den ungerichteten Graphen ergibt sich insbesondere auf folgende zwei Arten: Zunächst kann man jedem g.Graphen X einen ungerichteten Graphen Xu mit V(Xu) = V(X) und E(Xu) = {[x,y] | <x,y> ∨ <y,x> ∈ E(X)} eindeutig zuordnen. Der g.Graph heißt dann (schwach) zusammenhängend, wenn Xu zusammenhängend ist. Bezeichnet man schließlich einen g.Graphen als symmetrisch, wenn mit <x,y> ∈ E(X) folgt <y,x> ∈ E(X), so ergibt sich eine weitere unmittelbare Beziehung zu den ungerichteten Graphen. Die Klasse der symmetrischen g.Graphen entspricht der Klasse der ungerichteten Graphen insofern, dass <x,y> und <y,x> zusammen durch [x,y] ersetzt werden.

Definition 8.18: d+(x) = { | <x,y> | <x,y> ∈ E(X) | }

d- (x) = { | <y,x> | <y,x> ∈ E(X) | }

Definition 8.19: Unter dem Grad d(x) eines Knotens x ∈ V(X) versteht man d(x) = d+(x) + d- (x).

Wir ergänzen, dass  gilt.

Was den Zusammenhang von g.Graphen betrifft, so ist das Konzept des starken Zusammenhangs von besonderem Interesse. Zunächst führen wir eine gerichtete Kantenfolge (kurz: g.Folge) als Folge von Kanten e_1,e_2,...,en mit ei = <xi–1,xi> für i=1,2,...,n ein. Sie heißt offen, wenn x_0 ≠ xn ist. Ein g.Weg ist eine g.Kantenfolge, in der alle Knoten xi,i=0,1,2,...,n verschieden sind.

Analog können auch die Begriffe g.Kantenzug und g.Kreis (Zyklus) definiert werden. Ein Knoten xi alleine ist ebenfalls ein g.Weg.

Definition 8.20: Ein g.Graph X heißt stark zusammenhängend, wenn je zwei Knoten x,y durch einen g.Weg W(x,y) verbunden sind. Es gibt also nicht nur einen g.Weg von x nach y, sondern auch von y nach x.

Abb. 8.13

Ist X nicht stark zusammenhängend, so interessieren jedenfalls jene Teilgraphen, die diese Eigenschaft besitzen.

Definition 8.21: Eine starke Komponente eines g.Graphen X ist ein maximaler, stark zusammenhängender Teilgraph von X.

Abb. 8.14

In obiger Figur spannen {a,b,c,d,e} und {f,g,h,i} zwei starke Komponenten auf, die durch <a,f> verbunden werden. Diese Kante aber liegt auf keinem g.Kreis.

Satz 8.9: Ein g.Graph X ist stark zusammenhängend, genau dann, wenn X zusammenhängend ist und jede Kante e ∈ E(X) auf einem g.Kreis in X liegt.

Beweis: Sei X stark zusammenhängend und e = <x,y> eine Kante. Dann existiert ein g.Weg W(y,x). Dieser bildet mit e = <x,y> zusammen einen g.Kreis.

Sei nun umgekehrt vorausgesetzt, dass jede Kante e ∈ E(X) auf einem g.Kreis liegt und X zusammenhängend ist. Sind x ≠ y ∈ V(X), so gibt es in Xu einen Weg W(x,y). Jeder Kante dieses Weges entspricht eine in X, welche auf einem g.Kreis liegt.

Somit wird eine Folge von g.Kreisen C_1,C_2,...,Cr erklärt mit x ∈ V(C_1), y ∈ V(Cr), wobei V(Ci–1) ∩ V(Ci) ≠  ist.

Für r = 1 gibt es einen g.Weg von x nach y und ebenso von y nach x.

Sei die Induktionsannahme, dass g.Wege W(x,y) und W(y,x) existieren für r ≤ m; dann ist die Induktionsbehauptung für r = m+1 zu zeigen. Wir wählen auf Cm+1 einen gewissen Knoten z mit folgender Eigenschaft: durchläuft man Cm+1 von y aus entsprechend der Orientierung seiner Kanten, dann sei z der erste Knoten, der auf einem der Kreise Ci, i ≤ m liegt.

Nach Induktionsannahme gibt es einen g.Weg W(z,x). Dieser bildet gemeinsam mit W(y,z) auf dem Kreis Cm+1 den gesuchten g.Weg W(y,x).

Die Existenz eines g.Weges W(x,y) wird analog überlegt.

Wendet man Abb. 8.9 auf die starken Komponenten eines g.Graphen an, so erhält man eine Charakterisierung durch g.Kreise.

Eine Folgerung daraus ist auch, dass eine Kante, die zwei starke Komponenten verbindet, auf keinem Kreis liegt.

8.3.2. Arboreszenzen

Ein Sonderfall von azyklischen Graphen sind gerichtete Wurzelbäume (Arboreszenzen), auf die wir wegen ihrer Bedeutung in vielen Anwendungen noch genau eingehen.

Abb. 8.15

Definition 8.22: Ein g.Graph X heißt azyklisch, wenn er keine g.Kreise enthält.

Definition 8.23: Eine Arboreszenz A ist ein azyklischer Graph A, in dem genau für ein x_0 ∈ V(A) gilt d- (x_0) = 0 und für alle übrigen Knoten d- (x) = 1.

Wir bezeichnen x_0 als die Wurzel der Arboreszenz A und {x | d+(x) = 0} als die Menge der Endknoten oder Blätter von A.

Abb. 8.16

In obiger Figur ist eine Arboreszenz gezeichnet. Sie gibt einen wichtigen Sonderfall als Beispiel an, nämlich eine binäre Arboreszenz. Eine Arboreszenz A wird als binäre Arboreszenz bezeichnet, wenn zusätzlich entweder d+(x) = 2 oder d+(x) = 0 für alle x ∈ V(A) gilt. Die Sprechweise ist in diesem Punkt nicht eindeutig. Oft wird nur d+(x) ≤ 2 verlangt!

Wie schon früher erwähnt, werden in der Literatur manchmal überhaupt nur g.Graphen untersucht und dann Arboreszenzen (gerichtete Wurzelbäume) schlechthin als Bäume benannt. Darauf soll aufmerksam gemacht werden, um Missverständnisse zu vermeiden. Diese Bezeichnungsweise ist insofern gerechtfertigt, als man aus jedem Baum X bei beliebiger Wahl von x_0 ∈ V(X) eine Arboreszenz wie folgt konstruieren kann:

Ist d(x0,y) die Länge des eindeutig bestimmten Weges W(x_0,y) in X, so ersetzt man jede Kante [x,y] ∈ E(X) durch <x,y>, wenn d(x,x_0) < d(y,x_0) ist.

Abb. 8.17

Eine Eigenschaft von Arboreszenzen A mit der Wurzel x_0 ist, dass man A rekursiv begreifen kann: {x | <x_0,x> ∈ E(A)} ist eine Menge von Knoten, die selbst wieder Wurzeln von Arboreszenzen sind, die als Teilgraph in A enthalten sind. Wir erläutern dies am Beispiel einer binären Arboreszenz, die für die Infix Notation eines arithmetischen Ausdrucks a  b mit einem zweistelligen Operator  steht.

Abb. 8.18

Lässt man nun zu, dass die Operanden a, b selbst wieder durch Ausdrücke der Gestalt ai  bj ersetzt werden dürfen, so kommt je nach Ersetzung z.B. zu folgender Darstellung (siehe auch Abb. 8.10):

(a1  b1)  (a2  (a3  b2))

Abb. 8.19

Die rekursive Beschreibungsmöglichkeit zeigt, dass viele Aufgabenstellungen, in denen Arboreszenzen verwendet werden, durch rekursive Programme oft recht zweckmäßig gelöst werden können. Entsprechend ist auch die Sprechweise „Unterbaum eines Baumes“ zu verstehen.

Unter den binären Arboreszenzen A sind solche besonders ausgezeichnet, die einer gewissen Gleichmäßigkeit gehorchen, was den Abstand der Knoten x von der Wurzel x_0 betrifft. Man bezeichnet d(x_0,x) als Niveau von x und das Maximum als die Höhe der Arboreszenz A. Es ist klar, dass für h(A) das Maximum von d(x_0,x) nur über die Endknoten von A bestimmt zu werden braucht, daher wird die Höhe h(A) auch als maximale Astlänge bezeichnet. Da A binär sein soll, ist jeder Knoten x ∈ V(A), der kein Endknoten ist, Wurzel einer linken und einer rechten Arboreszenz Al bzw. Ar. Somit lässt sich zu jedem x die Größe b(x) = h(Ar) – h(Al) bestimmen, die als Balance von x bezeichnet wird.

8.4. Spannende Bäume

8.4.1. Definitionen und Einführung

Wir wiederholen zunächst die Definition eines Gerüstes:

Definition 8.24: Ist X = (V(X), E(X)) ein zusammenhängender ungerichteter Graph und T ein Teilgraph von X, dann heißt der Graph T = (V(T), E(T)) ein spannender Baum oder Gerüst von X, wenn V(T) = V(X) und T ein Baum ist.

Beispiel:

T_1 und T_2 sind spannende Bäume des Graphen X.

Abb. 8.20

Neben T_1 und T_2 enthält obiger Graph X noch weitere Gerüste. Aus den allgemeinen Eigenschaften von Bäumen sieht man:

Satz 8.10: Ein Teilgraph T eines zusammenhängenden Graphen X ist genau dann ein spannender Baum von X, wenn folgende zwei Bedingungen erfüllt sind:

(i)       T enthält keinen Kreis,

(ii)      fügt man zu T eine Kante e ∈ {E(X) – E(T)} hinzu, so enthält T genau einen Kreis.

8.4.2. Minimalgerüst

Wir wenden uns zunächst dem Problem des minimalen Gerüstes zu und setzen dazu voraus, dass der zusammenhängende Graph X bewertet ist, d.h. dass jeder seiner Kanten e eine Zahl g(e) zugeordnet ist.

Man kann g(e) als die Länge von e oder als Kosten für die „Konstruktion“ der Kante e oder Kapazität von e auffassen.

Definition 8.25: Man spricht von einem bewerteten Graphen X =(V(X),E(X)), wenn eine Abbildung g: E(X) → S definiert ist, wobei S eine (für anfallende Rechenoperationen) „geeignete“ algebraische Struktur ist.

Üblicherweise wählt man für g eine Abbildung von E nach  oder  oder bei der Modellierung nur ganzzahlige Bewertungen. Dazu gibt es meist noch die Einschränkung auf g(e) ≥ 0, um bei Algorithmen das Problem zu umgehen, dass die Summe der Kantenbewertungen eines Kreises „immer kleiner“ werden könnte, je öfter man den Kreis durchläuft.

Manchmal ist es zweckmäßig, zu verlangen, dass g injektiv ist: g(ei) ≠ g(ej) für ei ≠ ej.

Ist S irgendeine (endliche) Menge und hat man nicht die Absicht, mit den g(e) zu rechnen, sondern beispielsweise sie nur mit Namen zu versehen, so spricht man meist von einem markierten Graphen. Für diese gibt es keine einheitliche Sprechweise.

Definition 8.26: Ist X = (V(X), E(X)) ein bewerteter Graph mit g:E(X) -> , so heißt T = (V(T), E(T)) ein Minimalgerüst von X, wenn

Minimalgerüste haben wichtige Anwendungsbereiche. Interpretiert man die Knoten von X als Router in einem Computernetzwerk und die Kanten e ∈ E(X) als die Verbindungen zwischen Netzwerkknoten, über die Datenpakete laufen, und sind g(e) die Transferzeiten zwischen den Routern, so liefert ein Minimalgerüst jenes Netz, das einerseits die Gesamttransferzeit minimal hält, und andererseits den Transport von Paketen zwischen je zwei beliebigen Routern gewährleistet.

Ohne Beweis nennen wir folgenden wichtigen

Satz 8.11: Ist X = (V(X), E(X)) ein vollständiger Graph und sind die den Kanten e ∈ E(X) zugeordneten Zahlen g(e) paarweise verschieden, dann hat das Problem des Minimalgerüstes eine eindeutige Lösung.

Abb. 8.21

So einfach nachstehender Algorithmus zu formulieren ist, so trickreich ist eine effiziente Implementierung davon. Denn die unscheinbare Forderung (ii) lässt offen, wie man effizient überprüft, ob nicht durch Hinzunahme einer neuen Kante ein Kreis gebildet würde: Zur Vereinfachung der Formulierung nehmen wir g(ei) ≠ g(ej) für i ≠ j an.

Algorithmus zur Bestimmung eines Minimalgerüstes.

Sei X ein beliebiger zusammenhängender bewerteter Graph. Die Vorschrift zur Konstruktion eines Minimalgerüstes lautet:

(i)          Man wähle die Kante mit der kleinsten Bewertung.

(ii)         Solange wie möglich füge man zu den bereits gewählten Kanten eine noch nicht gewählte Kante mit kleinster Bewertung hinzu, die mit den schon gewählten keinen Kreis bildet

8.4.3. Kürzeste Wege

Wir greifen die Frage nach Wegen und ihrer Länge in gerichteten bzw. ungerichteten Graphen wieder auf. Die Länge eines Weges W(a,b) wurde als Anzahl der Kanten auf dem Weg von a nach b eingeführt. Implizit ist demnach den Kanten e = <x,y> der Wert 1 zugeordnet und es liegt nahe, dies durch eine Kostenfunktion g(<x,y>) mit Werten aus + zuzuordnen, wie dies im vorigen Kapitel eingeführt worden ist.

Damit kann die Definition der Weglänge W(a,b) bei gegebener Kostenfunktion g : E(X) → + erweitert werden zu

Allgemein lässt sich die Länge eines Graphen wie folgt einführen:

Definition 8.27: Ist X = (V(X), E(X)) ein bewerteter Graph X, so heißt

die Länge des Graphen X.

Da W(a,b), a,b ∈V(x) für sich alleine ein Graph ist, ist die Weglänge |W(a,b)| konform zu g(X) eingeführt. Damit ist kürzester Weg kW(x,y) selbsterklärend.

Die Nebenbedingung g(e) ≥ 0 ist bei der Interpretation als Kosten oder Länge einer Kannte sinnvoll. Für Algorithmen bringt sie den Vorteil, dass die Hinzunahme einer Kante zu einem Weg nicht zur Verkürzung führen kann. Bei Kantenfolgen wäre es ansonsten sogar möglich, die Länge ≤ 0 zu erreichen, wenn ein Kreis genügend oft durchlaufen wird.

Der folgende Algorithmus geht auf E. W. Dijkstra zurück und berechnet ausgehend von einem Startknoten s ∈ V(X) den kürzesten Weg zu allen anderen Knoten, sofern ein Weg W(s,x) überhaupt existiert.

Die Methode fußt auf folgendem Optimalitätsprinzip:

Ist kW(x_1,xk) ein kürzester Weg von x_1 über x_2,x_3… xk-1 nach xk, so ist jeder darin enthaltene Teilweg W(xi xj), 0 ≤ i < j ≤ k ein kürzester Weg kW(xi,xj).

Die Aussage ergibt sich durch eine Widerspruchsüberlegung. Wäre kW(xi,xj) nicht der kürzeste Weg von xi nach xj, so gäbe es einen kW´(xi,xj) und Ersetzen von kW(xi,xj) durch kW´(xi,xj) in kW(x_1,xk) ergäbe einen kürzeren Weg von x_1 nach xk.

Der Algorithmus geht im allgemeinen Schritt davon aus, dass für eine Teilmenge S ⊆ V(X) bereits die kürzesten Entfernungen vom Startknoten s berechnet sind.

Mit N(v) werden die Nachbarknoten von v ∈ (S) bezeichnet, sodass N(v) ( S = {x * <v,x> ∈ E(x), v ∈ S, x ∉ S}. Ferner liefere v = min(V(S) jenen Knoten v ∈ V ( S, der minimalen Wert d(v) hat.

Die Effizienz des Verfahrens hängt auch davon ab, wie min(V(S) implementiert wird.

Bei Hinzunahme eines Knoten v zu S hat man zu prüfen, ob die Distanzen d(x) jener Nachbarknoten von v, die nicht in S liegen, verkleinert werden müssen.

Wir erhalten in Pseudocode bei s als Startknoten:

Die schrittweise erzeugte Menge S spannt mit den zugehörigen Kanten eine Arboreszenz von kürzesten Wegen auf, die in s beginnen. Es ist zu beachten, dass im Falle eines ungerichteten Graphen diese durchaus verschieden von einem Mininmalgerüst sein kann, wie das folgende einfache Beispiel zeigt:

Abb. 8.22

8.5. Wichtige Baumklassen

8.5.1. Binäre Bäume

Der leere Baum und der Baum, der nur aus einem einzigen Knoten, seiner „Wurzel“ besteht, gehören zu jeder Klasse von Bäumen, wie immer wir sie definieren. Wir bezeichnen Bäume mit B oder T (tree). Auch werden wir in diesem Kapitel keinen Unterschied zwischen (ungerichteten) Bäumen und Arboreszenzen machen, was einen zweckmäßigen Grund hat:

Aus Anwendungssicht ist es immer notwendig, vorab bei der Erzeugung eines Baumes eine Wurzel r (root) festzulegen. Da nun in jedem Baum P der Weg W(x,y) zwischen zwei beliebigen Knoten x,y eindeutig ist, ergibt sich implizit eine Orientierung der Kanten, in dem der Weg W(r,x) mit x ∈ V(B) von der Wurzel beginnend durchschritten wird. Eine ganz natürliche Sache bis auf die Tatsache, dass in Zeichnungen von Bäumen immer die Wurzel oben (!) oder ganz links gezeichnet wird. Durch die implizite Orientierung ist es gestattet, weiterhin d+(x) bzw. d-(x) und d(x) = d+(x) + d-(x) zu verwenden.

Die einfachste Klasse von Bäumen, die in der Informatik Anwendung findet, ist die lineare Liste L und eine Zeichnung sagt alles, was damit gemeint ist.

Abb. 8.23

Die Wurzel r in diesem Baum heißt auch Kopf der Liste und ist der einzige Knoten x ∈V(B) mit d-(x) = 0. Das andere Ende (tail) der Liste, t ∈ V(B) ist das einzige Blatt und es gilt d+(t) = 0. Für alle anderen Knoten, sofern welche existieren, gilt d+(x) = d-(x) = 1.

Von der linearen Liste kommen wir zu den binären Bäumen, wobei wir auf eine Besonderheit in der Definition achten müssen, die sich in der Informatik als sehr zweckmäßig erwiesen hat: Den Grund dazu - er ist durch Programmierungstechniken bedingt - werden wir graphisch unten erläutern:

Übernimmt man die Definition einer binären Arboreszenz für einen binären Baum, so hat jeder Knoten mit Ausnahme der Blätter zwei Söhne (engl.: child, also gender-freundlich). Den Knoten eines Baumes werden in Anwendungen aber Daten, z.B. ein Schlüssel (ganze Zahl) k zugeordnet. Um dem Problem auszuweichen, dass kein passender Schlüssel – oder umgekehrt: z.B. kein linker Sohn für einen gegebenen Schlüssel – vorhanden ist, lässt man 1 ≤ d+(x) ≤ 2 für Knoten zu, die keine Blätter sind.

Abb. 8.24

Gedanklich kann man das Problem umgehen, indem statt des zweiten fehlenden Sohnes ein leerer Baum daran hängend gedacht wird (vgl.: NULL-Pointer in Programmiersprachen). So gesehen haben auch Blätter b mit d+(b) = 0 doch wieder Söhne dranhängen, allerdings „in Gestalt von leeren Bäumen“.

Eine zweite Sache, die gar nicht so recht in eine saubere Definition eines binären Baumes passt ist, dass von einem linken Sohn und einem rechten Sohn gesprochen wird.

Diese Unterscheidung stammt einerseits von Zeichnungen eines binären Baumes und andererseits aus der Programmierung. Dort muss man festlegen, welcher Sohn z.B. bei einem Durchlauf über alle Knoten des Baumes als nächster zu besuchen ist. Für (künftige) JAVA-Programmierer sei dazu ein Hinweis gegeben:

Da eigentlich jetzt schon klar ist, was ein binärer Baum ist, wollen wir ihn rekursiv definieren.

Definition 8.28: Ein binärer Baum ist entweder ein leerer Baum oder besteht aus einer Wurzel r, die „links“ und „rechts“ je einen Sohn hat, die jeweils wieder binäre Bäume sind.

Explizit halten wir fest:

- Ist r die Wurzel, so ist d-(r) = 0.

- Für jeden inneren Knoten x gilt d-(x) = 1 und 1 ≤ d+(x) ≤ 2

- Für jedes Blatt b gilt d-(b) = 1 und d+(b) = 0.

Dass zu einem Blatt b ein leerer Baum links und rechts „dazugedacht“ wird, berührt demnach d+(b) nicht.

Obige Definition gibt Anlass, eine lineare Liste als degenerierten binären Baum zu verstehen.

Beispiele für binäre Bäume sind:

Abb. 8.25

Definition 8.29: Unter der Höhe h(B) eines binären Baumes versteht man die Länge (= Anzahl der Kanten) des längsten Weges W(r,b) von der Wurzel r bis zu einem Blatt b.

In obiger Abb. 8.25 ist:

h(B1) = 0,   h(B2) = 1,   h(B3) = 2,   h(B4) = 2,   h(B5) = 3.

Hinweis:

In der Literatur wird manchmal für die Höhe eines Baumes die Anzahl der Knoten im längsten Weg gezählt. Dies vermeidet zwar die akademische Diskussion, wie hoch der leere Baum im Vergleich zu jenem Baum ist, der nur aus einem Knoten e besteht, wäre aber nicht konform zur Definition der Weglängen oder zur Länge eines Kreises. Eine weitere Konsequenz ist dann, dass sich die unten abgeleiteten Abschätzungen für die Anzahl der Knoten bei gegebener Höhe h(B) entsprechend unterscheiden. Darauf möge beim Literaturstudium geachtet werden!

8.5.2. Suchbäume

Wir haben erwähnt, dass man Bäume zum Speichern von Daten (Schlüsseln) verwenden kann: Daher ist die Frage nach der Anzahl der Knoten oder Blätter eines Baumes bei gegebener Höhe wichtig, ebenso auch die Umkehrung: wie sieht ein Baum kleinster Höhe h aus, wenn er n Knoten hat?

Um diese Fragestellung bei aller mathematischen Einfachheit würdigen zu können, erklären wir, was man unter einem (binären) Suchbaum versteht.

Definition 8.30: Sei B ein nichtleerer binärer Baum und w : V(B) → K eine bijektive Abbildung von V(B) auf eine Schlüsselmenge K.

B heißt Suchbaum, wenn für jeden Knoten x, der kein Blatt ist, gilt

w(y) < w(x), für alle y aus dem linken Unterbaum von y, und

w(y) > w(x), für alle y aus dem rechten Unterbaum von y ist.

Beispiel:

Abb. 8.26

Man erkennt, dass man bei der Wurzel beginnend zum Aufsuchen eines Schlüssels k bzw. zum Entscheiden, ob k ∈ K, bei jedem Knoten x auf Grund der Markierung folgende Information erhält: entweder man hat den gesuchten Schlüssel dort angetroffen oder weiß im Vergleich „k < w(x)?“, ob man links oder rechts weitersuchen soll.

Im schlechtesten Fall muss man bis zu einem Blatt absteigen: die Höhe h(B) bestimmt demnach die Anzahl der Suchschritte, insbesondere, wenn k ∉ K.

Die Frage nach der Beziehung zwischen h = h(B) und n = |V(B)| klärt folgender

Satz 8.12: Ein binärer Baum B mit n Knoten hat

- mindestens die Höhe h = log_2(n+1) –1,

- höchstens b = 2h Blätter

bzw.

ein binärer Baum B der Höhe h hat höchstens n = 2h+1 – 1 Knoten.

Den Beweis führt man über vollständige Induktion, indem man den günstigsten Fall betrachtet, der bei kleinster Höhe h möglichst viele Knoten beherbergen kann: dies ist der vollständige binäre Baum.

Abb. 8.27

Beweis:

Induktion betreffend die Blattanzahl b

bh = 2h für h = 0 und h = 1 richtig.

Erhöht man h um 1 so erhält jedes Blatt zwei Söhne (und ist nun selbst kein Blatt mehr), sodass bh+1 = 2bh = 2 · 2h = 2h+1, weil für bh die Induktionsannahme verwendet werden kann.

Induktion betreffend die Knotenanzahl n

nh = 2h+1 – 1 ist für h = 0 richtig.

Erhöht man h um 1, so kommen 2b = 2h+1 neue Knoten (Blätter) hinzu:

nh+1 = nh + 2b.

Für nh gilt die Induktionsannahme. Daher ist

nh+1 = nh + 2b = (2h+1 –1) + 2 (2h) = 2h+1 – 1 + 2h+1 = 2(h+1)+1 – 1 = 2h+2 – 1.

Aus n = 2h+1 – 1 folgt durch Umformung n + 1 = 2h+1 und somit h + 1 = log_2(n+1), also h = log_2(n+1) – 1.

Hat man genau n = 2h+1 – 1 Schlüssel in einem Suchbaum abzuspeichern, dann ist der vollständige binäre Baum eine ideale Struktur. In diesem Falle braucht man nur h = log_2(n+1) – 1 Vergleiche durchführen.

Mehr noch! Verdoppelt man n auf 2n, so wächst die Anzahl der Vergleich nur um 1: die Anzahl der Vergleiche wächst logarithmisch.

Darum schätzen Informatiker den Logarithmus Dualis (log_2 x) so sehr!

Umgekehrt aber verstehen wir, warum man eine lineare Liste im Zusammenhang mit Suchbäumen als degenerierten Suchbaum bezeichnet. Nachstehende Abb. 8.28 erklärt dies: Dieser Baum erfüllt alle Kriterien eines Suchbaumes, seine Höhe h (von links nach rechts gezeichnet) wächst aber linear mit der Anzahl n der Knoten, und damit auch die Anzahl der Vergleiche bei einer Suche: wenn man „Pech“ hat, ist der gesuchte Schlüssel im letzten Knoten gespeichert oder nicht vorhanden und man benötigt n Vergleiche.

Abb. 8.28

In beiden Fällen ist die Anzahl der Vergleiche durch die Baumhöhe bestimmt. Daher ist man an Klassen von Bäumen interessiert, die als Suchbäume verwendet bei n Knoten eine möglichst kleine Höhe haben

8.5.3. Fibonacci Bäume

Diese Klasse von Bäumen ist ein Spezialfall der balanzierten Bäume, die im nächsten Abschnitt besprochen werden.

Wir besprechen sie zunächst, indem wir einen Zusammenhang zu den Fibonaccizahlen (benannt nach Leonardo Fibonacci von Pisa, 1170 – vermutlich 1240) herstellen.

Definition 8.31: Die Fibonaccizahlen sind F(0) = 0, F(1) = 1 und F(n+1) = F(n) + F(n-1) für n ≥ 1.

Demnach ist im allgemeinen Fall die n-te Fibonaccizahl die Summe ihrer beiden Vorgänger und wir erhalten die Zahlenfolge 0, 1, 1, 2, 3, 5, 8, 13, ....

Die Fibonaccizahlen selbst hängen mit dem „Goldenen Schnitt“ zusammen, einem u.a. in der klassischen Architektur als harmonisches und dem Betrachter gefälliges oft verwendetes Teilungsverhältnis:

Eine Strecke ist im Verhältnis des Goldenen Schnittes geteilt, wenn sich die beiden Teilstücke zueinander verhalten wie das längere Teilstück zur ganzen Strecke.

Abb. 8.29

Nehmen wir die ganze Strecke normiert mit der Länge 1 an und bezeichnen laut Abbildung das längere Teilstück mit x, so gilt demnach

Diese Gleichung hat die beiden Lösungen

Da die Länge x positiv ist, kommt nur x = x_1 in Frage.

Im Zusammenhang mit der Fibonaccizahl ist der reziproke Wert q davon wichtig. Durch Ausrechnen erhält man wegen (–1 + √5 ) (–1 – √5 ) unter Verwendung von

(a + b) (a – b) = a^2 – b^2

Ferner setzen wir q = 1 – q = -x_1 ≈ - 0,618.

Zum Rechnen ist noch folgende Gleichung wichtig: q^2 = 1 + q

Satz 8.13: Es gilt qn-2 ≤ F(n) ≤ qn-1 für n ≥ 1

Der Beweis erfolgt durch vollständige Induktion. Man überzeugt sich zunächst durch direktes Einsetzen, dass die Ungleichungen für n = 1, 2, 3 richtig sind:

Die Induktionsannahme ist: richtig für m ≤ n; die Induktionsbehauptung demnach:

qn-1 ≤ F(n+1) ≤ qn.

Für die linke Seite der Ungleichung erhält man unter Verwendung der Induktionsannahme:

qn-2 ≤ F(n) und qn-3 ≤ F(n-1)

Eine Addition der beiden Teile liefert    qn-2 + qn-3 ≤ F(n) + F(n-1) = F(n+1).

Wegen q^2 = 1+q ist qn-2 + qn-3 = qn-3(1+q) = qn-1 und daher qn-1 ≤ F(n+1).

Der Beweis für die rechte Seite der Ungleichung wird analog geführt:

F(n+1) = F(n) + F(n-1) ≤ qn-1 + qn-2 = qn-2(1+q) = qn.

Auf gleiche Weise lässt sich unter Verwendung von F(n+1) = F(n) + F(n-1) und q^2 = 1+q bzw. q 2 = 1 + q die Formel von Binet (Jacques Philippe Marie Binet, 1786 – 1856) herleiten:

und wegen q n → 0 für große n gilt approximativ

Und daraus wieder folgern wir, was durch die Inspektion der Fibonaccifolge

0, 1, 1, 2, 3, 5, 8, 13, 21, .... schon zu erahnen war:

die Fibonaccizahlen F(n) wachsen für n → ∞ exponentiell an.

Das Bildungsgesetz für die Fibonaccizahlen kann man auf die Konstruktion von Fibonacci- Bäumen übertragen und zugleich wird die Formel von Binet als Basis für eine Abschätzung der Baumhöhe bei gegebener Knotenzahl (oder umgekehrt) dienen.

Definition 8.32:

- Der leere Baum ist der Fibonaccibaum F_0.

- Ein einzelner Knoten ist der Fibonaccibaum F_1 der Höhe h = 0.

- Ein Baum bestehend aus der Wurzel w und der Kante [w,b] zu einem Blatt b ist der Fibonaccibaum F_2 der Höhe h=1.

- Sind Fh und Fh-1 zwei Fibonacci Bäume der Höhen h–1 bzw. h–2, so erhält man den Fibonaccibaum Fh+1 der Höhe h, in dem man einen neuen Wurzelknoten mit jeweils einem Fh (links) und Fh-1 (rechts) als Unterbäume kombiniert: „ Fh+1 = <Fh, w, Fh-1>“

- Keine anderen Bäume sind Fibonaccibäume

Beispiele:

Abb. 8.30

Was die Anzahl n(h) der Knoten eines Fibonacci Baumes Fh+1 betrifft, so beobachten wir aus obiger Abbildung folgenden Zusammenhang für seine Höhe h:

Die letzte Zeile ergibt sich aus folgender Überlegung: der Fh+1 der Höhe h besteht aus einer Wurzel und den Unterbäumen Fh bzw. Fh-1 links und rechts angehängt. Also gilt für die Anzahl n(h) seiner Knoten entsprechend der Konstruktion: n(h) = 1 + n(h-1) + n(h-2) und man kann induktiv schließen, wobei der Induktionsanfang aus obiger Tabelle entnommen wird:

n(h+1) = 1 + n(h) + n(h-1) = 1 + F(h+3) – 1 + F(h+2) – 1 = F(h+4) – 1, entsprechend dem Bildungsgesetz der Fibonaccizahlen F(i).

Satz 8.14: Der Fibonaccibaum Fh+1 der Höhe h hat F(h+3) – 1 Knoten.

Wir ergänzen, dass die Formel auch für den leeren Baum F_0 richtig bleibt, wenn wir ihm die fiktive Höhe h = – 1 zuweisen.

Aus dem Bildungsgesetz für Fh+1 folgen wir: Die Höhe seines linken Unterbaumes A_1 ist genau um 1 größer als die des rechten Unterbaumes Ar: h(Ar) = h(A_1) – 1 und das gilt rekursiv für jeden Teilbaum, zu dem man bei der Wurzel w beginnend absteigt.

Aus der vorhin abgeleiteten Binet´schen Formel können wir zwischen der Knotenanzahl n = n(h) eines Fh+1und seiner Höhe h einen weiteren Zusammenhang ausrechnen.

Da Informatiker fast immer alles in den logarithmus dualis umrechnen, erhält man unter Verwendung von logc x = logb x/logb c mit 1/log_2 q = 1.4404 und logq 5 – 3 ≈ –1.328 die Beziehung h < 1.44 log_2 (n+2) – 1.328

Dies ist deswegen so interessant, weil die Interpretation davon besagt: die Höhe h eines Fh+1 wächst „nur“ logarithmisch an, wenn die Anzahl der Knoten n → ∞, oder umgekehrt: wächst die Höhe h linear, so wächst damit die Anzahl der Knoten exponentiell. Und dies ist wichtig, wenn man daran denkt, Baumknoten Daten zuzuordnen, und wie beim Suchbaum dabei die Höhe möglichst klein halten will.

8.5.4. Balanzierte Bäume

Definition 8.33: Ein binärer Baum T heißt ausgeglichen oder balanziert (engl.: balanced tree), wenn für die Balance b(x) jedes Knotens x gilt: | b(x) | ≤ 1; d.h., wenn sich die Höhen der beiden Unterbäume T_1,Tr mit der Wurzel x um höchstens 1 unterscheiden.

Man beachte, dass diese Definition rekursiv zu sehen ist, dass also für jeden Unterbaum und auch für dessen Unterbäume dieselbe Beschränkung für die Höhen gilt.

Im Beispiel sind zwei ausgeglichene Bäume gezeichnet und es ist zu jedem x die Balance b(x) angegeben.

Abb. 8.31

Ausgeglichene Bäume spielen als Suchbäume verwendet eine wichtige Rolle.

Bei den binären Suchbäumen haben wir uns überlegt, dass der Suchaufwand durch die Baumhöhe h bestimmt ist. Der Idealfall ist der vollständige binäre Baum, der schlechteste Fall die Degeneration zu einer linearen Liste.

Die Balanzierungsbedingung | b(x) | ≤ 1 ist eine der Möglichkeiten, um die Höhe h klein zu halten und zugleich möglichst viele Knoten im Baum unterzubringen.

Der vollständige binäre Baum ist trivialerweise ausgeglichen und somit hat ein balanzierter Baum höchstens n = 2h+1 – 1 Knoten oder umgekehrt: h = log_2 (n+1) – 1.

Damit interessiert die Höhe h eines balanzierten Baumes T im „schlechtesten Fall“. Dies ist der Fall, wenn T ein Fibonacci-Baum ist. Denn dort werden entsprechend der Konstruktionsvorschrift von der Wurzel ausgehend immer Bäume mit der Balance b(x) = –1 angehängt. Alles zusammengenommen ergibt folgenden wichtigen

Satz 8.15: Ist T ein ausgeglichener Baum mit n Knoten, dann gilt log_2 (n+1) –1 ≤ h(T) ≤ 1,4404 · log_2 (n+2) – 1,328

8.5.5. B-Bäume

Die Idee, binäre Bäume als Suchbäume zu verwenden, kann auf Bäume übertragen werden, die mehr als 2 Söhne pro Knoten haben können. Allerdings muss durch Zusatzbedingungen gesichert sein, dass auch solche Bäume nicht „zu hoch“ werden.

Aus graphentheoretischer Sicht führt dies zur Klasse der B-Bäume (auch genannt: B(k,h) Bäume) die wir wie folgt einführen:

Definition 8.34:

Ein B-Baum oder B(k,h) Baum liegt vor, wenn gilt:

- alle Blätter b haben denselben Abstand h zur Wurzel r

- die Wurzel ist entweder ein Blatt oder hat mindestens 2 Söhne

- jeder von der Wurzel verschiedene innere Knoten x hat wenigstens k+1 Söhne

- jeder Knoten hat höchstens 2k + 1 Söhne

- der leere Baum ist ein B(k,h) Baum

Beispiel: B(2,2) Bäume

Abb. 8.32

Satz 8.16: Die Anzahl der Knoten in einem B(k,h) Baum ist mindestens

Der Beweis erfolgt durch Aufsummierung über die einzelnen Niveaus i = 0, 1, 2, ..., h, ausgehend von der Wurzel r auf Höhe h = 0. Anstatt eines strikten Beweises wollen wir anschaulich argumentieren und dabei das Konstruktionsprinzip wiederholen.

Höhe h = 0: nur die Wurzel

Höhe h = 1: die Wurzel und zwei Söhne

Höhe h = 2: Wurzel + 2 Knoten + 2(k+1) Knote

Dies führt zu folgender Tabelle.

Für die maximale Knotenanzahl geht man analog vor:

Satz 8.17: Die Anzahl der Knoten in einem B(k,h) Baum ist höchstens

In beiden Fällen erkennt man, dass B-Bäume die gewünschte Eigenschaft bringen: ihre Knotenanzahl wächst mit der Höhe h exponentiell an.

8.6. Weitere Graphenklassen

Die in diesem Abschnitt vorgestellten Graphenklassen und Fragestellungen sind in der Komplexitätstheorie, einem Teilgebiet der Theoretischen Informatik, von besonderem Interesse. Einige der beschriebenen Aufgabenstellungen gehören zur Klasse der NP-vollständigen Probleme.

Eine nähere Besprechung der NP-Vollständigkeit liegt jedoch außerhalb der Ziele dieses Buches. Im Wesentlichen geht es darum, dass es vermutlich keine effizienten Algorithmen zur Lösung solcher Probleme geben wird, wobei das besonders reizvolle auch darin besteht, dass Aufgaben aus dieser Klasse in Polynomialzeit ineinander transformierbar sind.

Wir halten fest, dass nicht alle der folgenden Themen in diese Klasse fallen.

Zunächst führen wir vollständige Graphen Kn ein und definieren, was man unter einem zu x komplementären Graphen X versteht.

Definition 8.35: Ein ungerichteter Graph X = (V(X), E(X)) heißt vollständig, wenn je zwei verschiedene Knoten x,y ∈ V(X) mit einer Kante verbunden sind (d.h.: adjazent sind).

Ist n = |V(X)|, so wird der vollständige Graph dazu mit Kn bezeichnet.

Kn hat  Kanten und jeder Knoten hat den Grad n-1.

Abb. 8.33

Ist nun X = (V(X), E(X) ein Graph, so kann man mit Bezug auf Kn einen komplementären Graphen X = (V(X), E(X) ) einführen:

Definition 8.36: Der zu X komplementäre Graph X , das Komplement zu X, ist der Graph

mit

V( X ) = V(X)

E( X ) = {[x,y] | x ≠ y, x,y ∈ V(X), [x,y] ∉ E(X) }

X entsteht, anschaulich gesprochen, durch Streichen aller Kanten [x,y] ∈ E(X) im zu X „zugehörigen” Kn. Interessant ist die Suche nach Teilgraphen Q = (V(Q), E(Q)) mit V(Q) ⊆ V(X), E(Q) ⊆ E(X), die für sich alleine betrachtet einen vollständigen Graphen Kk mit k = |V(Q)| bilden:

Definition 8.37: Eine k-Clique Qk in einem Graphen X ist ein vollständiger Teilgraph Qk davon mit k Knoten.

Die algorithmische Aufgabe ist die Untersuchung, ob bei gegebenem k ein Graph X eine k-Clique enthält bzw. die Bestimmung einer maximalen Clique in X. Wir weisen darauf hin, dass in der Literatur oft eine Clique von vornherein als maximaler vollständiger Teilgraph definiert wird.

Das Cliquenproblem ist NP-vollständig.

Zu einer äquivalenten Fragestellung kommt man mit folgender Festlegung:

Definition 8.38: Eine Knotenüberdeckung in X = (V(X), E(X)) ist eine Teilmenge W ⊆ V(X), wenn jede Kante aus E(X) in einem x ∈ W inzidiert.

Es stellt sich die Frage nach der kleinsten Knotenüberdeckung bzw. wie man algorithmisch feststellen kann, ob ein Graph X eine Knotenüberdeckung mit |W| = k Kanten hat. Auch dieses Problem ist NP-vollständig und wir zeigen gleich (Satz 8.18), wie das Cliquen-Problem mit Knotenüberdeckungen zusammen hängt.

Abb. 8.34                                    Abb. 8.35

In Abb. 8.34 ist z.B. der Teilgraph Q ⊂ X der durch V(Q) = {1,4,5} induziert (auch: aufgespannt) wird, eine 3-Clique, gleiches gilt für {1,2,5}. In Abb. 8.35 ist der komplementäre Graph X gezeichnet. Eine Knotenüberdeckung W_1 in X ist {2,3}, eine andere ist W_2 = {3,4}. Man beachte folgendes: W_1 = V(X) \ {1,4,5} und W_2 = V(X) \ {1,2,5}. X enthält als 2 Clique z.B. Q_2 = {{2,3}, [2,3]}, anderseits bildet W_3 = {1,4,5} in X eine Knotenüberdeckung.

Diese Beobachtung ist nicht zufällig, denn es gilt allgemein

Satz 8.18: Sind X = (V(X), E(X)) und sein komplementärer Graph X = (V(X), E(X) ) gegeben, dann spannt Q(S) ⊆ V(X) in X genau dann eine Clique auf (induziert sie), wenn V(X) \ Q(S) in X eine Knotenüberdeckung ist.

Beweis: Sei Q eine Clique in X mit den Knoten Q(S). Dann sind je zwei verschiedene x,y ∈ Q(S) in X durch eine Kante verbunden und sind demnach im komplementären X nicht adjazent. Daher muss jede Kante e ∈ E(X) mit mindestens einem Knoten y ∈ V(X) \ Q(S) inzidieren, also ist V(X) \ Q(S) eine Knotenüberdeckung in X .

Ist umgekehrt V(X) \  Q(S) eine Knotenüberdeckung in X , dann inzidiert definitionsgemäß jede Kante e ∈ E(X) mit mindestens einem Knoten aus V(X) \ Q(S) und kann daher nicht mit zwei Knoten aus Q(S) verbunden sein.

Daher sind in X je zwei Knoten von Q(X) durch eine Kante verbunden: Q(S) spannt in X eine Clique auf.

In Abb. 8.36 und Abb. 8.37 ist ein weiteres Beispiel gezeichnet. Der Graph X in Abb. 8.37 ist zum Graphen X in Abb. 8.36 komplementär. Man erkennt, dass durch {2,3,4,5} in X eine Clique induziert wird und dass in X der Knoten {1} bereits eine Knotenüberdeckung liefert.

Abb. 8.36                       Abb. 8.37

Weitere Fragestellungen befassen sich mit Kreisen in ungerichteten Graphen und wir beginnen mit dem Klassiker, dem Königsberger Brückenproblem, das von Leonhard Euler (1707 – 1783) bereits 1736 gelöst worden ist. Es geht um einen Rundgang in Königsberg, der über alle dortigen Brücken über den Fluß Pregel führen soll. Euler bewies, dass dies bei gegebener Streckenführung nicht möglich ist und seither ist in das Problem nach ihm benannt.

Definition 8.39: Eine Eulertour in X = (V(X), E(X)) ist ein geschlossener Kantenzug, der jede Kante von X genau einmal enthält. Gibt es in X eine Eulertour, so heißt X eulersch oder Euler-Graph.

Eine Eulertour hat demnach die Länge |E(X)|.

Die Topographie in Königsberg führt zunächst zu einem Graphen wie in Abb. 8.38. Man entfernt die Schlingen, in dem jede Kante [x,y] durch zwei Kanten [x,u] [u,y] ersetzt wird, wie dies in Abb. 8.39 gezeichnet ist.

Abb. 8.38                                      Abb. 8.39

Euler-Graphen sind durch folgenden Satz eindeutig charakterisiert:

Satz 8.19: Ein zusammenhängender Graph X ist genau dann ein Euler-Graph, wenn jeder seiner Knoten geraden Grad hat.

Auf der Basis dieses Satzes gibt es sehr effiziente Algorithmen (Polynomialzeit) zur Bestimmung einer Euler-Tour, sofern ein Graph eine solche überhaupt enthält.

Die nächste Fragestellung, das Problem des Handlungsreisenden (engl.: Travelling Salesman Problem) ist ungleich schwieriger und führt wieder zurück zu NP-vollständigen Problemen. Man muss also davon ausgehen, dass für große n = |V(X)| mutmaßlich keine effizienten Algorithmen dazu existieren, obgleich die Problemstellung selbst einfach und anschaulich ist. „Mutmaßlich“ deshalb, weil man einerseits für NP vollständige Probleme bislang noch keinen effizienten Algorithmus gefunden hat (effizient heißt: in Polynomialzeit, beschrieben durch ein Polynom p(n)), anderseits aber scheinbar nicht beweisen kann, dass es solche effiziente Verfahren wirklich nicht gibt.

Der Ausgangspunkt ist die Suche nach Hamilton´schen Linien, benannt nach William Rowan Hamilton (1805 – 1865): man sucht nach einem geschlossenen Kantenzug, der im Kontrast zur Euler Tour nicht unbedingt jede Kante, aber dafür jeden Knoten genau einmal enthält.

Definition 8.40: Gibt es im Graphen X einen geschlossenen Kantenzug (Kreis) C, der jeden Knoten x ∈ V(X) genau einmal enthält, so heißt C eine Hamilton´sche Linie und der Graph Hamilton´scher Graph.

Abb. 8.40

Das Hamilton´sche Linienproblem, also die algorithmische Feststellung, ob X hamilton´sch ist oder nicht, ist ein Spezialfall des Problems des Handlungsreisenden und genau so schwer.

Beim letzteren hat man noch eine Kostenfunktion c : E → + und sucht – soferne überhaupt existent – unter allen Hamilton´schen Linien C jene, für die die Gesamtlänge entsprechend der Funktion c minimal ist

Varianten des Travelling Salesman Problems, das auch als Rundreiseproblem bezeichnet wird, lassen Knotenwiederholungen in der zu planenden Tour zu.

Abb. 8.41                                                                           Abb. 8.42

Wie aus Abb. 8.41 unmittelbar einsichtig ist, ist eine Rückkehr zum Startknoten s nur möglich, wenn die Brücke [x,y] und damit x,y zweimal betreten werden. Gleiches gilt für die Artikulation (Zerfällungsknoten x) in der Abb. 8.42. Wir bemerken, dass die Bestimmung von Brücken und Artikulationen effizient, also in Polynomialzeit, möglich ist.

Eine weitere wichtige Fragestellung ist, ob bzw. für welche Klassen man Zeichnungen von Graphen anfertigen kann, sodass sich keine zwei Kanten in einer solchen Zeichnung im 2 überschneiden. Wir gehen davon aus, dass anschaulich klar ist, worum es geht. Ansonsten würde nachstehende Definition zu ungenau sein und man müsste vorab genau diskutieren, wie Zeichnungen im 2 bzw. Polygonzüge Graphen zugeordnet werden können.

Definition 8.41: Ein Graph X heist planar oder plättbar, wenn man ihn so in der Ebene zeichnen (einbetten) kann, dass sich keine zwei Kanten überkreuzen.

Ein planarer Graph zusammen mit seiner Darstellung in der Ebene heißt dann eben. Ist ein Graph planar, so ist seine planare Darstellung in der Ebene nicht eindeutig.

Die Abb. 8.43 zeigt zwei Zeichnungen von K_4 und man erkennt daraus, dass K_4 plättbar ist.

Abb. 8.43

Ein ebener Graph unterteilt die Ebene in Gebiete, wobei das äussere dazuzählen ist. Aus der ebenen Darstellung des K_4 in Abb. 8.43 lesen wir für K_4 ab, dass er 4 Gebiete hat, drei innere und das äußere.

Dazu gilt die Euler´sche Polyederformel:

Satz 8.20: Ist X (V(X), E(X)) zusammenhängend und eben, dann gilt |E(X)| - |V(X)| + 2 = g = Anzahl der Gebiete.

Die Frage nach der Plättbarkeit von Graphen und das Auffinden einer Einbettung in die Ebene ohne Kantenüberschneidungen kann technisch motiviert sein, etwa beim Layout für Schaltungen, wo überschneidende Bahnen Probleme elektronischer Natur oder auch in der Fertigung aufwerfen. Das Finden einer ebenen Zeichnung kann aber auch ästhetisch motivert sein, obgleich die Frage, was schön oder wenig schön ist, kaum quantifizierbar ist (Abb. 8.44).

Abb. 8.44

Eine unmittelbare Folgerung aus der Euler´schen Polyederformel ist Satz 8.21, aus dem wieder folgt, dass der vollständige Graph K_5 nicht plättbar ist.

Satz 8.21: Ist X = (V(X), E(X)) mit |V(X)| ≥ 3 planar, dann ist |E(X)| ≤ 3 |(X)| - 6. Beweis: In der planaren Einbettung ist jedes Gebiet mit mindestens 3 Kanten begrenzt und jede Kante begrenzt höchstens zwei Gebiete. Sei n = |V(X)| und m = *E(X)*. Sind g Gebiete vorhanden, so folgt daraus 3 g ≤ 2 m und wegen m – n + 2 = g erhält man 3 m – 3 n + 6 ≤ 2 m m – 3 n + 6 ≤ 0 und daher m ≤ 3 n – 6.

Da der K_5 genau 10 Kanten bei 5 Knoten hat, erfüllt er die Ungleichung von Satz 8.21 nicht.

Es gibt effiziente Verfahren, die einen Graphen auf Planarität testen.

Eine Charakterisierung von planaren Graphen erfolgte durch Kazimierz Kuratowski (1896 – 1980). Das „K” in der Notation für vollständige Graphen Kn steht für seinen Namen.

8.7. Petrinetze

8.7.1. Einführung

Mit Petrinetzen (Carl Adam Petri, * 1926) bringt man Dynamik in spezielle Graphen, insbesondere zur abstrakten Beschreibung von Prozessen ein. Ein Petrinetz ist ein gerichteter bipartiter Graph, d.h. seine Knoten V zerfallen in zwei disjunkte Mengen S (Stellen oder Plätze) und Transitionen T, also V = S ∪ T, und es gibt keine direkten Kanten von Stellen zu Stellen und keine von Transitionen zu Transitionen.

Es ist üblich in Zeichnungen von Petrinetzen Stellen als Kreise und Transitionen als Rechtecke darzustellen.

Die Stellen sind mit Marken (Token) markiert und haben gegebenenfalls eine Kapazität für die jeweilige maximale Tokenzahl zugeordnet. Ist jedoch eine solche Kapazität nicht angegeben, so nimmt man implizit eine unbegrenzte Kapazität für die jeweilige Stelle an.

Die Belegung der Stellen heißt Markierung des Petrinetzes und beschreibt damit den Zustand des Netzes.

Einer Kante kann ein Gewicht zugeordnet sein, das die Kosten der Kante repräsentiert.

Ist das nicht der Fall, so wird 1 als Gewicht angenommen.

Abb. 8.45

Die angesprochene Dynamik entsteht nun dadurch, dass Transitionen nach bestimmten Regeln (engl.: firing rules) schalten können, indem sie von allen Eingangsstellen entsprechend der Kantengewichte Marken abziehen und auf alle Ausgangsstellen den Kantengewichten eine entsprechende Anzahl von Marken hinzufügen.

In unseren Beispielen werden wir immer 1 als Gewicht annehmen, ebenso werden wir für die Stellen eine unbegrenzte Kapazität voraussetzen (Abb. 8.46) und es kann nur geschaltet werden, wenn auf allen Eingangsstellen mindestens eine Marke liegt.

In diesem Fall wird von jeder Eingangsstelle genau eine Marke abgezogen und zu jeder Ausgangsstelle genau eine weitere Marke hinzugefügt.

Abb. 8.46

8.7.2. Definitionen

Wir kommen nun unter den genannten vereinfachenden Voraussetzungen (Kosten = 1, unbeschränkte Kapazität) zu folgender

Definition 8.42: Eine Transition heißt aktiviert oder schaltbereit, falls sich auf jeder Eingangsstelle mindestens eine Marke befindet. Schaltbereite Transitionen können zu einem beliebigen Zeitpunkt schalten (feuern).

Definition 8.43: Beim Schalten einer Transition wird aus deren Eingangsstellen je eine Marke abgezogen und jeder Ausgangsstelle je eine Marke hinzugefügt. Eine anschauliche Interpretation des Schaltens ist z.B. ein Produktionsablauf. Eine Transition produziert das den Ressourcen (Marken) der Eingangsstellen ein oder mehrere neue Produkte, die dann die als Marken auf den Ausgangsstellen dargestellt werden. Das Schalten (Produzieren) kann nur stattfinden, wenn alle benötigten Bauteile auf den Eingangsstellen vorhanden sind, wenn also jede Eingangstelle mindestens mit einem Token markiert ist.

Im allgemeinen Fall definiert man wie folgt:

Definition 8.44: Eine Transition ist schaltbereit, falls sich in allen Eingangsstellen mindestens so viele Marken befinden, wie die Transition an Kosten verursacht und wenn zugleich die Ausgangsstellen genügend Kapazität zur Aufnahme der neuen Marken haben.

Definition 8.45: Beim Schalten einer Transition werden aus deren Eingangsstellen den Kantengewichten entsprechend Marken weggenommen und den Ausgangsstellen den Kantengewichten entsprechend viele Marken hinzugefügt.

Beispiel: Petrinetz-Modell eines Erzeugers mit Zähler (Abb. 8.47)

Abb. 8.47

Im Beispiel von Abb. 8.47 ist eine unbeschränkte Kapazität der beiden Stellen s_1 und s_2 vorausgesetzt. Hätte s_1 nur die Kapazität 1, so könnte die Transition nicht schalten (d.h. wäre nicht schaltbereit). Analoges gilt für die für die als Zähler arbeitende Stelle s_2. Hätte sie nach z Schaltvorgängen die Kapazität z von t_1 erreicht, so wäre t_1 nicht mehr schaltbereit.

Aus diesem Grunde fordert man für spezielle Klassen von Petrinetzen die Bedingung, dass keine Transition eine Stelle sowohl als Eingabe- als auch als Ausgabestelle haben darf.

In diesem Falle modelliert man das Beispiel von Abb. 8.47 wie folgt:

Abb. 8.48

Was die Schaltfolgen und damit die Folge der Zustände betrifft, können Petrinetze einen Indeterminismus enthalten, sobald Auswahlmöglichkeiten bestehen, welche unter den schaltbereiten Transitionen als nächstes schalten sollen.

Insbesondere können Transitionen im Konflikt stehen, wenn sie gemeinsame Eingabestellen haben, wie dies Abb. 8.49 illustriert:

Abb. 8.49

Es kann zu Beginn nur entweder t_1 oder t_2 schalten. Schaltet dann t_4, so beginnt das Spiel von neuem. Schaltet aber t_3, so ist anschließend keine der Transitionen mehr aktiviert: „das Petrinetz ist tot“.

Zum Abschluss geben wir eine formale Definition für den allgemeinen Fall von Petrinetzen an:

Definition 8.46: Ein Petrinetz ist ein 6-Tupel (S, T, F, K, W, Mo), wobei

(1) S: eine nicht leere Menge von Stellen (Plätzen) S = {s_1, s_2, ..., sn}

(2) T: eine nicht leere Menge von Transitionen T = {t_1, t_2, ..., tm}

(3) S ∩ T =

(4) F: eine nicht leere Menge von Kanten: F ⊆ (S × T) ∪ (T × S) d.h. es führen nur Kanten von Stellen zu Transitionen und von Transitionen zu Stellen. F heißt Flussrelation.

(5) K: S → ∪ {∞}. K heißt Kapazitätsfunktion.

(6) W: F → . W ist die Kostenfunktion für die Kanten

(7) Mo ist die Startmarkierung, eine aktuelle Markierung M nennt man Zustand des Petrinetzes, mit M(s) bezeichnet man die Anzahl der Markierungen auf der Stelle s ∈ S.

Definition 8.47: Die Eingangsstellen (Vorbereich) zu einer Transition t sind

*t = {s ∈ S | (s,t) ∈ F}, die Ausgangsstellen (Nachbereich) sind

t* = {s ∈ S | (s,t) ∈ F}.

8.8. Transportnetze

Bei Anwendungen von gerichteten Graphen denkt man unmittelbar auch an Transportnetze, also an Netzwerke, in denen etwas transportiert wird oder etwas „fließt“. Dieser Begriff bedarf daher einer genaueren Bestimmung. Ähnlich wie bei Petrinetzen interessiert aus der Sicht der Graphentheorie weniger, um welche transportierten Güter es sich handelt und wie sie beschaffen sind: es könnte sich um eine Flüssigkeit handeln, die durch ein Röhrensystem gepumpt wird, um Container, die auf einem Schienen- oder Straßennetz von einer Beladestation zu einer Entladestation gebracht werden, oder um aus Bitfolgen bestehende Pakete, die in einem Computernetzwerk von einem Host zu einem Client über diverse Router transportiert werden müssen.

Wir werden uns (einschränkend) auf das Zählen von Einheiten beschränken, also auf die Menge der ganzen Zahlen , und die intuitiven Begriffe wie „Kapazität einer Kante“ und „Fluss“ durch eine solche entsprechend definieren. Eine weitere Einschränkung wird sein, dass wir von Graphen (Netzen) ausgehen, die von genau einer sogenannten Quelle q zu genau einem Ziel, der Senke s, etwas transportieren bzw. fließen lassen. Schlussendlich wird unterstellt, dass auf keinem Weg von q nach s etwas verloren geht.

Gerichtete Graphen im Zusammenhang mit Fluss- oder Transportaufgaben werden üblicherweise mit N = (V(N), E(N)) bezeichnet.

Definition 8.48: Ein ganzzahliger Fluss Φ auf einem Transportnetz N ist eine Abbildung φ von E(N) in die Menge der ganzen Zahlen .

Man nennt φ(e) den Fluss durch die Kante e ∈ E(N).

Ist φ(<x,y>) = φ(e) > 0, so fließt φ in die Richtung von e = <x,y> ∈ E(N) mit x,y ∈ V(N)

Ist φ(e) < 0, so fließt φ gegen die Richtung von e.

Betrachtet man irgend eine Knotenmenge A ⊂ V(N), so interessiert, was bzw. wie viel nach A fließt und von A wegfließt:

Definition 8.49: Mit A ⊂ V(N) ist Φ(A) = Φ+(A) – Φ-(A) erklärt, wobei

Φ+(A) = Σ φ(e), e<x,y>, x ∈ A, y ∈ V(N) – A

Φ-(A) = Σ φ(e), e<x,y>, x ∈ A, y ∈ V(N) – A

Betrachtet man einen einzelnen Knoten x ∈ V(N), so spricht man von einem Durchgangsknoten, wenn Φ(x) = Φ+(x) – Φ-(x) = 0 und von einer Quelle, wenn Φ(x) > 0 bzw. Senke, wenn Φ(x) < 0 ist.

In der Interpretation heißt dies, dass aus einer Quelle mehr herausfließt als durch (etwaige) andere Kanten hineinfließt. Analoges gilt für eine Senke. Wir werden aber nicht nur, wie bereits erwähnt, voraussetzen, dass es nur genau eine Quelle und genau eine Senke geben soll, sondern die Begriffe weiter einschränken.

Definition 8.50: Ein Knoten q ∈ v(N) mit d-(q) = 0, d+(q) > 0 heißt Quelle und Φ(q) = Φ+(q) ihre Ergiebigkeit. Ein Knoten s ∈ V(N) mit d-(s) > 0 und d+(s) = 0 heißt Senke und Φ(s) = Φ-(s) ihr Verbrauch. Besitzt ein Fluss ϕ von q nach s genau eine Quelle und genau eine Senke, so heißt φ ein Fluss von q nach s und Φ(q) der Wert von φ.

Die geforderte Erhaltungsregel – nichts geht verloren im Netzwerk N – liefert somit für x ∈ V(N) und bei genau einer Quelle und einer Senke s folgenden:

Satz 8.22:

Wir weisen darauf hin, dass die Beschränkung auf genau eine Quelle und genau eine Senke nicht wesentlich ist, da ein Transportnetz immer durch Einführung z.B. einer fiktiven Quelle, die alle anderen speist, umgeformt werden kann (Abb. 8.50). die Beschränkung auf ganzzahlige Flüsse anstatt auf beliebige reellwertige hat als Hintergrund, dass Fragen der Konvergenz bei Algorithmen auf Transportnetzen dann wegfallen. Rationale Zahlen  kann man durch Multiplikation mit einer ganzen Zahl (→ kleinstes gemeinsames Vielfaches) auf

Ganzzahligkeit transformieren. Negative Flüsse φ(e) < 0 lassen sich durch Umorientierung der Kante e = <x,y> auf e´ = <y,x> vermeiden, sodass wir weiter einschränken wollen auf φ (e) ∈ o = ∪ {0}.

Abb. 8.50

Ferner ist nahe liegend, auf Kanten sogenannte Kapazitäten c(e) einzuführen, sodass ein (zulässiger) Fluss diese nicht überschreiten darf: 0 ≤ φ(e) ≤ c(e).

Im Lichte dieser Vorbereitungen definieren wir nun wie folgt: Daher werden wir nur Transportnetze mit Kapazitäten betrachten.

Definition 8.51: Ein Transportnetz N mit Kapazitäten ist ein endlicher gerichteter Graph N = (V(N), E(N)) mit:

(i)           Es gibt genau einen Knoten q mit d+(q) > 0 und d-(q) = 0. Er heißt Quelle von N.

(ii)          Es gibt genau einen Knoten s, mit d-(s) > 0 und d+(s) = 0. Er heißt Senke von N.

(iii)         Auf den Kanten von N ist ein positiver ganzzahliger Fluss φ erklärt: φ: E(N) → 0.

(iv)         Für alle von der Quelle und der Senke verschiedenen Knoten x ∈ V(N), x ≠ q, s gilt

(v)          Jeder Kante e ∈ e(N) ist eine nichtnegative ganze Zahl c(e) als ihre Kapazität zugeordnet.

(vi)         Für jeden Fluss φ gilt 0 ≤ φ(e) ≤ c(e) ∀ e ∈ E(N).

In der nachstehenden Zeichnung (Abb. 8.51) ist ein solches Transportnetz mit Kapazitäten dargestellt.

Die Kanten sind mit den 2-Tupeln (c(e), φ(e)) markiert und geben so bei gegebener Kapazität c(e) Auskunft über den momentanen Fluss φ(e), der über sie fließt.

Wie werden uns daher später nach dem maximalen Fluss fragen, der höchstens von der Quelle q zur Senke s fließen kann: ein maximaler Fluss ist ein zulässiger Fluss (d.h.: φ(e) ≤ c(e) ∀ e ∈ E(N)) mit größtmöglichem Wert Φ(q).

Abb. 8.51

In obiger Zeichnung hat die Kante <a,d> die Kapazität 3 und der Fluss durch sie den Wert 2. Der Gesamtfluss von q nach s beträgt Φ(q) = Φ(s) = 13.

Man erkennt auch folgendes: erhöht man φ (q,c) auf 5, φ(c,d) auf 4, φ(f,s) auf 5 und verringert φ(f,d) auf 1, so erhöht sich der Gesamtfluss auf 15.

Nun machen wir folgende Beobachtung:

Durch jedes solches Transportnetz können wir einen „Schnitt“ ziehen, der die Knotenmenge derart partitioniert, dass die Quelle in der einen und die Senke in der anderen Menge liegt:

V(N) = V_1(N) ∪ V_2(N) mit V_1(N) ∩ V_2(N) =  und q ∈ V_1, s ∈ V_2.

Dann interessieren uns die Kanten, die von Knoten aus V_1 zu Knoten aus V_2 führen und deren Kapazitäten.

Es ist intuitiv einleuchtend, dass ein maximaler (zulässiger) Fluss nicht größer sein kann als die Summe der Kapazitäten des Schnittes der Kanten von V_1 nach V_2. Und ebenso intuitiv erfasst man, dass jener Schnitt, der minimale Kapazität aufweist, genau den maximalen Fluss bestimmt.

Diese Beobachtung ist in der Tat durch ein Theorem (Max-Flow-Min-Cut Theorem, s.u.) abgesichert.

Definition 8.52: Ein Schnitt (V_1,V_2) (engl.: cut) in einem Transportnetz N mit der Quelle q und der Senke s ist eine Partition von V(N) der Art, dass q ∈ V_1, s ∈ V_2 mit V_1 ∩ V_2 =  und V_1 ∪ V_2 = N.

Definition 8.53: Die Kapazität c(V_1,V_2) eines Schnittes (V_1,V_2) ist die Summe der Kapazitäten aller Kanten, die von V_1 nach V_2 führen:

c(V_1,V_2) = Σ c(<x,y>), x ∈ V_1, y ∈ V_2.

Und alles mündet in den zentralen Satz von Ford und Fulkerson (1956):

Satz 8.23 (Max- Flow-Min-Cut Theorem):

Der maximale Wert eines Flusses φ von der Quelle q zur Senke s ist gleich der minimalen Kapazität eines Schnittes.

Wir werden hier zwar auf den Beweis dieses Theorems verzichten, dennoch aber eine kurze Skizze davon geben, weil diese auch den Kern des von Ford-Fulkerson entwickelten Algorithmus zur Bestimmung eines maximalen Flusses in Transportnetzen mit Kapazitäten erläutert.

Der erste Schritt ist nahe liegend: man finde einen g.Weg(q,s) in N der Art, dass auf allen Kanten entlang dieses Weges die Kapazitäten noch nicht ausgeschöpft sind. Dann kann man entlang dieses Weges den Fluss φ(e) für jede Kante z.B. um 1 erhöhen. Dies kann man solange wiederholen, bis ein solcher g.Weg(q,s) nicht mehr gefunden werden kann.

Der zweite Schritt ist etwas komplizierter. Im Beispiel der Abb. 8.51 haben wir gesehen, dass eine Vergrößerung des Flusses (auch) dadurch möglich war, dass bei einer Kante (dort: <f,d>) der Fluss zu Gunsten einer anderen reduziert worden ist.

Tatsächlich geht man wie folgt vor: Man sucht im zugehörigen ungerichteten Graphen einen Weg (q,s) mit folgender Eigenschaft: sind die Kanten entsprechend ihrer Orientierung in N sozusagen im Sinne des g.Weges orientiert, so soll wieder φ(e) < c(e) verlangt werden. Bei den gegengesetzt orientierten Kanten gelte 0 < φ(e) < c(e) , sodass man von ihnen 1 abziehen kann zu Gunsten der anderen Kanten. Man verringert sozusagen den Rückfluss.

Genau dies ist in Abb. 8.51 geschehen:

Die Kantenfolge war

(<q,c>, <c,d>, <f,d>, <f,s>)

mit der „rückführenden“ Kante <f,d>. Bei den Kanten <q,c>, <c,d>, <f,s> war |c(e) – φ(e)| ≤ 2 und man erhöhte daher auf: φ (<q,c>) = 5, φ (<c,d>) = 4, φ (<f,s>) = 5 und reduzierte im Gegenzug φ (<f,d>) von 3 auf 1.

Die genannten Schritte werden solange als möglich wiederholt und wegen der Ganzzahligkeit der Flüsse bricht das Verfahren ab: man kommt ausgehend von der Quelle nicht mehr zur Senke unter den besprochenen Nebenbedingungen bezüglich φ(e) und c(e), bestimmt damit aber einen Schritt mit minimaler Kapazität.

Für die Umkehrung, dass der maximales Wert eines Flusses höchstens gleich der Kapazität eines Schnittes sein kann, haben wir intuitive Argumente eingebracht. Formal lässt sich dies durch Anschreiben der Summenformeln unter Verwendung von Satz 8.22 und den Eigenschaften gemäß Definition 8.50 nachvollziehen.

8.9. Matching

Ein Matching auf einem ungerichteten Graphen X = (V(X), E(X)) ist ein Spezialfall aus der Klasse der Zuordnungsprobleme. Als oft zitiertes Beispiel sei folgende Aufgabe gewählt: Lehrer oder Lehrerinnen {ti | i = 1, …, n} sollen Kurse {ci | i = 1, …, m} zur gleichen Zeit abhalten. Jeder Lehrer bzw. Lehrerin ti hat einen oder mehrere Kurse cj vorbereitet und kommt daher bei einer Zuteilung nur für diese in Frage.

Das Ziel ist, möglichst viele Kurse abhalten zu können, wobei die Nebenbedingung klar ist: Unterrichtende ti halten höchstens einen Kurs cj, den sie vorbereitet haben.

In der nachstehenden Zeichnung ist die Situation illustriert: Kanten [ti, cj] besagen, dass ti für cj in Frage kommt und eine (nicht eindeutige) Lösung ist durch fette Kanten herausgehoben.

Abb. 8.52

Wir werden später sehen, dass im Beispiel bereits ein Spezialfall von Graphen unterstellt ist, beginnen aber vorerst mit einer allgemeinen Definition für beliebige ungerichtete Graphen:

Definition 8.54: Sei X = (V(X), E(X)) ein ungerichteter Graph. Eine Teilmenge M ⊆ E(X) heißt Matching in X, wenn keine zwei Kanten ei, ej ∈ E(X) adjazent sind. Ein Knoten a ∈ V(X) heißt bezüglich M gesättigt, wenn eine Kante [a,x] ∈ M existiert, also a mit einer Kante e ∈ M inzidiert.

Andernfalls nennt man a ungesättigt bezüglich M.

Beispiel: X = ({a,b,c,d,e,f}, {[a,b], [a,d] [a,e], [b,c], [b,e], [b,f], [d,e], [e,f]}

Abb. 8.53

Aus der Abb. 8.53 erkennt man, dass das dort eingezeichnete Matching M = {[a,b], [e,f]} nicht maximal ist, denn es kann durch M_1 = {[d,a],[b,c],[e,f]} ersetzt werden. Diese Vergrößerung entsteht, indem man den alternierenden Weg [d,a], [a,b], [b,c] nimmt, der die beiden ungesättigten Knoten d und c verbindet, und entlang der alternierend zu M bzw. nicht zu M gehörigen (fett gezeichneten) Kanten sozusagen umfärbt (Abb. 8.54).

Abb. 8.54

Damit liegen folgende Definitionen auf der Hand.

Definition 8.55: Ein Matching M mit größtmöglicher Anzahl von Kanten heißt maximales Matching. Ein Matching M heißt perfekt, wenn es keine ungesättigten Knoten bezüglich M gibt.

Ein perfektes Matching ist zugleich auch ein maximales.

Ferner ergänzen wir noch, dass für die Themenstellung nicht verlangt wird, dass der Graph X zusammenhängend ist. Man betrachtet dann einfach die Matchings für die Komponenten getrennt und nimmt die Vereinigungsmenge der Matchings auf den Komponenten.

Definition 8.56: Ein Weg W[a,b] in X heißt alternierend bezüglich M oder M-alternierend, wenn in W abwechseln Kanten e ∈ M und Kanten e ∉ M aufeinander folgen. Ein solcher Weg W[a,b] heißt erweiternd, wenn a,b bezüglich M ungesättigt sind.

Man sieht sofort, wie man bei gegebenem Matching M und erweiterndem Weg W = W[a,b] zu einem Matching M1 kommt, das um eine Kante mehr enthält: M1 = (M ∪ E(W)) \ (M ∩ E(W))

Dazu folgender von C. Berge bewiesener Satz:

Satz 8.24: Ein Matching M im Graphen X = (V(X),E(X)) ist genau dann maximal, wenn es bezüglich M keinen erweiternden Weg W gibt.

Die notwendige Bedingung haben wir vorhin überlegt: gäbe es einen erweiternden Weg, so könnte man M vergrößern und M wäre nicht maximal.

Für die Umkehrung überlegen wir die komplementäre Aussage: Ist M nicht maximal, so gibt es einen erweiternden Weg W[a,b] in X.

Wenn M nicht maximal ist, so existiert ein Matching M_1 mit mindestens einer Kante mehr: | M_1| > | M |. Wir betrachten nun jenen Graphen G, der durch die symmetrische Differenz der Kantenmengen M und M_1 aufgespannt wird: E(G) = (M_1 ∪ M) \ (M_1 ∩ M_2)

Da jeder Knoten von G höchstens einmal mit einer Kante von M oder M1 inzidiert, besteht G nur aus Komponenten, die Kreise oder Wege sind, enthält aber wegen | M_1< > | M | mehr Kanten aus M_1.

Jeder Kreis hat gleich viele Kanten aus M und M_1. Demnach gibt es mindestens einen Weg W, dessen Kanten einerseits abwechselnd aus M und M_1 sind, wegen | M_1| > | M | mit einer Kante in M_1 beginnt und mit einer Kante in M_1 endet. Damit ist aber W ein erweiternder alternierender Weg bezüglich M.

Wir kommen nun auf das Beispiel zurück, welches in der Einleitung zum Thema gewählt wurde. Daraus resultierende Graphen haben, wie leicht einzusehen ist, folgende besondere Eigenschaften: V(X) ist in zwei disjunkte Mengen partitioniert und Kanten verbinden ausschließlich Knoten aus der einen Menge mit Knoten aus der anderen. Dies führt zu folgender

Definition 8.57: Ein Graph X = (V(X), E(X)) heißt paarer (oder bipartiter) Graph, wenn V(X) = V_1 ∪ V_2 mit V_1 ∩ V_2 =  und mit e = [x,y] ∈ E(X) folgt, dass x ∈ V_1 und y ∈ V_2.

In Analogie zum vollständigen Graphen Kn erklärt man einen vollständigen bipartiten oder vollständigen paaren Graphen als einen paaren Graphen Knm, bei dem zusätzlich verlangt wird, dass jeder Knoten der einen Menge V_1 mit jedem Knoten der anderen Menge V_2 adjazent ist.

Paare Graphen sind demnach typisch für die Modellierung von Zuordnungsproblemen.

Eine weitere Verallgemeinerung des Matching-Problems besteht darin, dass man die Kanten von X mit 0 ≤ g(e) ∈  bewertet und jenes maximale Matching M bestimmen will, für das  maximal oder minimal ist.

Eine zur Definition 8.57 äquivalente Aussage trifft der Satz 8.25:

Satz 8.25: Ein Graph X ist genau dann paar, wenn er keine oder nur Kreise mit gerader Länge enthält.

Wir überlegen nur die eine Richtung der Aussage. Da in einem Kreis C = [x_1,x_2], [x_2,x_3], [x_3,x_4] … [xi,x_1] abwechselnd Knoten aus V_1 bzw. V_2 folgen, muss der Kreis C eine gerade Anzahl von Kanten haben. Die Umkehrung ist deutlich aufwändiger zu zeigen.

Aus der Definition 8.57 folgt speziell, dass Bäume bzw. Wälder paare Graphen sind, denn sie sind überhaupt kreislos. Eine weitere Beobachtung ist, dass man in paaren Graphen die Knoten x ∈ V(X) immer so mit den „Farben“ „1“ bzw. „2“ markieren (färben) kann, dass zwei adjazente Knoten nie dieselbe Farbe haben.

8.10. Übungsaufgaben

8.1: Gegeben sei folgender Graph X:

Überprüfen Sie für die vier folgenden Graphen, ob es sich um spannende Bäume für X handelt.

(1) E(X) = {[a,b],[b,c],[b,d],[e,d],[d,g],[e,f],[d,g]}

(2) E(X) = {[a,d],[b,d],[c,g],[d,g][e,d]}

(3) E(X) = {[a,b],[a,d],[b,c],[c,g],[d,g],[e,f]}

(4) E(X) = {[a,b],[b,c],[b,d],[e,d],[e,f],[d,g]}

8.2: Gegeben seien die Abstände (in Metern) zwischen 5 Geländepunkten P, Q, R, S, T.

Ermitteln Sie eine Minimalgerüst und sein Gewicht. Geben Sie diesen spannenden Baum durch die Menge seiner Kanten an.

8.3: Man beweise folgende Behauptung (Bemerkung nach Satz 8.9)

Enthält der Graph X zwei starke Komponenten K_1 und K_2, und verbindet die Kante e = <x,y> mit x ∈ V(K_1) und y ∈ V(K_2) die beiden Komponenten, so liegt e auf keinem Kreis in X.

8.4: Man gebe eine Folge von n natürlichen Zahlen an, sodass der resultierende, schrittweiseaufgebaute Suchbaum dazu zu einer linearen Liste degeneriert.

8.5: Man beweise Satz 8.17: Die Anzahl der Knoten in einem B(k,h) Baum beträgt höchstens

8.6: Man stelle den arithmetischen Ausdruck 2 + (2 + 3)⋅(5 + 4) als Baum dar.

8.7: Man bestimme die Anzahl der Kanten im vollständigen bipartiten Graphen Knm.

8.8: Das „Tanzkursproblem“: Gegeben sei ein Menge von 7 Damen und 7 Herren. Möglichst viele Paare sollen sich auf der Tanzfläche einfinden, wobei aufgrund der Größe der Personen / Bekanntschaften / etc. nur folgende Damen als Partner für die Herren in Frage kommen:

h1: d3, d4 (also der erste Herr will/kann lediglich mit Dame 3 oder 4)

h2: d1, d2, d3, d5

h3: d3

h4: d1, d2, d5, d6, d7

h5: d3, d4, d6

h6: d1, d7

h7: d4, d6

8.11. Applets

- Binaerbaum

Visualisiert wird der schrittweise Aufbau eines nichtbalanzierten Suchbaumes mit n Knoten. Nach der Eingabe von n ≤ 99 können die Werte für die Knoten wahlweise zufällig erzeugt oder einzeln eingegeben werden.

- Diverse Applets zu gerichteten Graphen

Dieses umfangreiche Applet ermöglicht es, entweder vorgefertigte Graphen zu wählen oder gerichtete Graphen zu zeichnen bzw. zu editieren und auch abzuspeichern.  Wahlweise dazu wird die Adjazenzmatrix angezeigt. Zusätzlich existieren für die graphische Darstellung verschiedene Optionen, z.B. ob Kantennamen oder die Gewichte der Kanten angezeigt werden sollen oder nicht. Kürzeste Wege, Flüsse, Tiefensuche, Breitensuche, Starke Komponenten.

- Diverse Applets zu ungerichteten Graphen

Spannender Baum (Gerüst), Minimalgerüst, Brücken, kürzeste Wege, Tiefensuche, Breitensuche, Flooding und Komponenten.

- Matching

- Petrinets

Dieses Applet erlaubt entweder vorgefertigte Petri-Netze auszuwählen oder diese selbst zu zeichnen. Nach der Vergabe der Tokens auf frei wählbare Stellen, kann man das Schalten im Netz entweder im Einzelschrittmodus oder mit wählbarer Geschwindigkeit beobachten.

Abb. 8.55: Screenshot Applet: „Ungerichtete Graphen - Fluten“

Abb. 8.56: Screenshots Applet: „Suchbaum“

Abb. 8.57: Screenshot Applet: „Gerichtete Graphen - Fluss“

9. Grundkonzepte der Automatentheorie

9.1. Alphabete und Sprachen

Anwendungen von Automaten sind in der Informatik vielfältig. Unter anderem behandelt man damit Fragestellungen im Bereich der formalen Sprachen (z.B.: Programmiersprachen) wie zum Beispiel: „Entspricht eine vorgelegte Zeichenkette w einer vorgegebenen Grammatik G?“

Es soll entschieden werden, ob ein Wort w gemäß der eine bestimmte Sprache definierenden Grammatik G konstruiert worden ist.

Um derartige Fragen systematisch untersuchen zu können, muss vorab geklärt werden, welche Klassen von Sprachen (Wortmengen über A) von welchen Typen von Automaten beherrschbar sind. Man sagt: welche Sprachen akzeptiert werden.

Umgekehrt kann man einen Automaten vorgeben. Er akzeptiert eine bestimmte Menge von Wörtern über einem Alphabet A und erklärt damit eine formale Sprache L.

Ohne auf das Thema tiefer einzugehen, bringen wir hier nur die entsprechenden Definitionen, wie sie in der Theorie der Informatik dazu gebräuchlich sind (vgl. dazu auch die Definitionen im Kapitel über Codierungstheorie):

Definition 9.1: Ein Alphabet A ist eine endliche Menge von Zeichen.

Beispiel:

A = {a b c .....z A B .....Z 0 1 ...9 , . ! „ § & / ( ) = ? }

A = {0 , 1}

Um hervor zuheben, dass {und} sowie das Trennzeichen „ , “ nicht zu A gehören, wurden sie hier kursiv geschrieben.

Definition 9.2: Ein Wort über einem Alphabet A besteht aus einer endlichen Folge von Symbolen aus A. Das leere Wort wird dargestellt durch ε und ist eine leere Folge von Symbolen und ein Wort über jedem beliebigen Alphabet A. Die Länge eines Wortes w ist bestimmt durch die Anzahl der Symbole in w.

Deshalb gilt | ε | = 0.

Definition 9.3: A* bezeichnet die Menge aller Wörter

Man beachte, dass jedes Wort w über A eine endliche Länge hat, während A* eine unendliche Menge ist.

Definition 9.4: Eine Sprache L (über einem Alphabet A) besteht aus einer Menge von Wörtern über A. Somit ist L über A eine Teilmenge von A*.

Beispiel:

A = {x , y , z}. Dann sind ε, x, xx, yz Wörter über A, nicht aber uxz.

Man kann eine Sprache mit endlich vielen Wörtern durch Auflistung derselben definieren. Eine weitere Methode besteht in der Angabe einer Konstruktionsvorschrift.

Beispiel:

Sei A = { ( , ) } und L werde durch folgende drei Regeln erklärt:

(i)               ε ist in L

(ii)              wenn x in L ist, dann ist auch (x) in L

(iii)             wenn x und y in L sind, dann ist auch ihre Verkettung (Konkatenation) in L.

Wenn wir Wörter nach diesen Regeln konstruieren, sieht man, dass L beispielsweise ( ), ( )( ), ( ( ) ( ) ) enthält. Sie entsprechen den „Klammergebirgen“, die wir bei arithmetischen Ausdrücken wie z.B. (( a+b)*(c+d) /(a+b)) antreffen.

Ferner kann man Sprachen durch Angabe grammatikalischer Regeln, der Syntax der Sprache L, spezifizieren, wozu spezielle Metasprachen wie die EBNF (Extended Backus Naur Form), benannt nach J.Backus und P.Naur, verwendet werden.

Folgende Regeln gelten für EBNF:

(i)              A ::= B das Konstrukt A auf der linken Seite kann durch das Konstrukt B auf der rechten Seite ersetzt werden.

(ii)            Besteht ein Konstrukt A aus B gefolgt von C, so schreibt man A = BC und nennt B und C syntaktische Faktoren von A.

(iii)           Besteht A alternativ entweder aus B oder C, so schreibt man A = B|C. Man nennt B und C syntaktische Terme. A ::= B | C heißt dann, dass A entweder durch B oder durch C ersetzt werden kann.

(iv)           Ist A entweder leer, in Zeichen ε, oder besteht genau aus B, so schreibt man A = [B] als Kurzform für A = ε | B.

(v)            Ist A entweder leer oder besteht A aus einer beliebig langen Folge von B, so notiert man A = {B} als Kurzform für A = ε | B | BB | BBB | …

(vi)           Ein Symbol x innerhalb von Anführungszeichen „ “ oder ´ ´ bedeutet das Zeichen x selbst, z.B. „c“ oder ´c´ bezeichnen den Buchstaben c.

(vii)          Die Klammern „(„ und „)“ dienen zur Zusammenfassung von Termen.

Beispiel:

X ::= (A|B)(C|D)

X kann durch einen der vier möglichen Terme ersetzt werden: AC, AD, BC, BD

Beispiel:

digit ::= „0“ | „1“ | „2“ | „3“ | „4“ | „5“ | „6“ | „7“ | „8“ | „9“ | ;

ganze Zahl::= [„+“ | „-“] digit{digit};

9.2. Endliche Automaten

Vor allem bei grundlegenden Untersuchungen in der Theorie der formalen Sprachen werden Automaten eingesetzt. Da wir an dieser Stelle darauf nicht weiter eingehen wollen und noch gar nicht genau definiert ist, was man in der Informatik unter einem Automaten versteht, soll nur intuitiv der Ansatz dazu erläutert werden:

Genau so wie ein Getränkeautomat eine eingeworfene Münze prüft, akzeptiert oder eben wieder auswirft, kann man einem Automaten ein Wort über einem Alphabet A zur Prüfung vorlegen. Der Automat wird das Wort akzeptieren oder eben nicht und definiert somit durch die Menge der von ihm akzeptierten Wörter nach obiger Sprechweise eine Sprache L über A.

Wir kommen zum Ende des Kapitels nochmals kurz darauf zurück, was man unter „akzeptieren“ genau versteht.

Die Theoretische Informatik setzt sich nun neben anderen Themen mit folgender Fragestellung auseinander:

(i)           welche Klassen von Automaten erkennen welche Typen von formalen Sprachen?

(ii)          Ist ein Wort w einer durch eine Grammatik beschriebenen formalen Sprache L gegeben, kann man dazu überhaupt einen Automaten angeben, der alle Wörter, die zu L gehören, akzeptiert und somit ein Äquivalent zur L definierenden Grammatik ist?

Es zeigt sich, dass die unten eingeführten endlichen Automaten nur relativ einfache Sprachen, sogenannte reguläre Sprachen, erkennen können. Für tiefergehende Details muss auf die einschlägige Literatur verwiesen werden. Wir wählen als Motivation für die Vorstellung von Automaten den Bereich der Modellierung, was auch dem umgangssprachlichen Konzept eines „Automaten“ nahe kommt. Hier geht es nicht um eine konkrete technische Beschreibung, sondern wie das Verhalten eines solchen Automaten, z.B. eines Getränkeautomaten, abstrakt modelliert werden kann: Ein solcher befindet sich bei möglicher Zustandsmenge S in einem Zustand s ∈ S, bekommt einen Input in Form einer eingeworfenen Münze und der Wahl eines Getränkes und soll dann entweder weitere Münzen verlangen oder das gewählte Getränk als Output zur Verfügung stellen. Um das Zählen eingeworfener Münzen – der Automat akzeptiere nur 1 € Münzen – bewerkstelligen zu können, bedarf eines weiteren darin enthaltenen Automaten, eines Zählers.

Im Anschluss an grundlegende Definitionen wollen wir mit Blick auf die Graphentheorie vor allem den Begriff Zustandsgraphen näher bringen.

Eine erste Definition eines endlichen Automaten lautet:

Definition 9.5: Ein endlicher Automat EA = (S, I, Σ, t, F) besteht aus:

(i)           einer endlichen Menge von Zuständen S (S = states, oft auch mit Z oder Q bezeichnet)

(ii)          einer Menge von Anfangszuständen I ⊂ S

(iii)         einer (endlichen) Eingabe, dem Alphabet Σ

(iv)         einer Menge von Endzuständen F ⊆ S und

(v)          einer Übergangsrelation t ⊆ S μ Σ μ S

Obige Definition ist sehr allgemein. Es ist keine Ausgabe für den Automaten vorgesehen, es sei denn man wählt speziell für F = {ja, nein} und bekommt implizit eine ja/nein Entscheidung als „Ausgabe“. Ferner ist bei gegebenem Zustand s ∈ S und bei einlangender Eingabe a ∈ Σ der Nachfolgezustand s´, in den der Automat übergeht, nicht eindeutig definiert. Auch ist nicht festgelegt, mit welchem Anfangszustand (Initialzustand) i ∈ I ⊂ S der Automat zu arbeiten beginnt: ein solcher EA ist nicht deterministisch.

Daher wollen wir für unser Beispiel folgende Definition verwenden:

Definition 9.6: Ein deterministischer endlicher Automat DEA ist ein 5-Tupel (S, so, Σ, δ, F), wobei im Vergleich zum EA folgendes verlangt wird:

(i)          es gibt genau einen Anfangszustand so ∈ S

(ii)         anstatt einer Übergangsrelation t wird eine Übergangsfunktion δ : S μ Σ → S eingesetzt.

Damit wird der Automat deterministisch, denn bei gegebenem bzw. vorliegendem Zustand s ∈ S und hereinkommendem Input a ∈ Σ wird exakt festgelegt, in welchen Nachfolgezustand s´ der DEA übergeht: die Relation wurde durch eine Funktion ersetzt. Genauer könnte man sagen: durch eine totale Funktion, denn δ ∈ S soll für jedes s∈ S eindeutig definiert sein. Außerdem ist der Anfangszustand mit so festgelegt.

Nun brauchen wir den DEA nur mehr um eine Ausgabemöglichkeit erweitern. Dies erreicht man durch Hinzunahme eines Ausgabealphabetes Θ und einer Ausgabefunktion θ, die bei vorliegendem Zustand s ∈ S und Input a ∈ Σ eine Ausgabe d ∈ Θ produziert. In der Definition ist nicht festgelegt, ob Σ ≠ Θ oder Σ = Θ.

Definition 9.7: Ein deterministischer endlicher Ein/Ausgabe Automat E/A_DEA = (S, so, Σ, δ, Θ, θ, F) besteht aus:

(i)            einer endlichen Menge von Zuständen S

(ii)           genau einem Anfangszustand so

(iii)          einem Eingabealphabet Σ

(iv)          einer Zustandsüberführungsfunktion δ : S μ Σ → S

(v)           einem Ausgabealphabet Θ

(vi)          einer Ausgabefunktion θ : S μ Σ → Θ

(vii)         einer Menge von Endzuständen F ⊆ S

Ist die Ausgabefunktion θ unabhängig von Σ, also θ : S → Θ, so spricht man von einem Moore-Automaten, benannt nach E. F. Moore.

Die Interpretation der Definition von E/A_DEA ist folgende: der Automat befindet sich zu Beginn im Anfangszustand so, später allgemein im Zustand s. Erhält er die Eingabe a ∈ Σ, so geht der Automat in einen durch δ eindeutig bestimmten Nachfolgezustand s´ über und liefert zugleich mittels θ eine eindeutig bestimmte Ausgabe d ∈ Θ.

Man kann die obige Definition, was in der einschlägigen Literatur üblich ist, durch Weglassen von F zu (S, so, Σ, δ, Θ, θ) reduzieren. Man denke sich das so, dass der Automat bei Erreichen eines bestimmten Zustandes st über seine Ausgabefunktion θ mitteilt, dass er „fertig“ ist. Endzustände sind einfach besonders ausgezeichnete Zustände. Es folgt nicht zwingend, dass ein Automat von einem Endzustand nicht wieder in einen anderen kommen könnte.

Um Automaten für Modellierung verwenden zu können, taucht die Frage auf: Wie kann man einen DEA bzw. E/A_DEA bequem beschreiben. Dazu gibt es u.A. drei Standardmethoden, die wir an Hand eines Münzzählers mit m= 4 kurz beschreiben.

(i)      Durch Angabe eine „Formel“:

Der Zähler hat die Zustände S = {0,1,2,.......,m-1} für ein Getränk, das m Euro kostet.

Er wird als Modulo-m Zähler verstanden. Der Anfangszustand ist s0 = 0.

Das Eingabealphabet Σ ist {0,1} = {keine Münze, 1€ Münze}.

Befindet er sich im Zustand s, so ist der Nachfolgezustand δ(s,1) = s+1 mod m bzw. δ(s,0) = s .

Das Ausgabealphabet θ ist {f,t} = {kein Schaltsignal, Schaltsignal senden} mit: θ(s,a) = t für s = 3, a = 1, ansonsten θ(s,a) = f.

(ii)      Durch Angabe einer Tabelle δ/θ:

mit s´= δ(s,a) und d = θ(s,a). Man beachte, dass δ(s,a) ∈ S und θ(s,a)∈ Θ.

(iii)     Durch einen Zustandsgraphen ( State Diagram ).

Dabei halten wir fest, dass in diesem Graphen, dessen Knoten die Zustandsmenge repräsentieren, Schlingen <s,s> zugelassen sind. Mit Kanten <s,s´> werden die Zustandsübergänge δ : S μ Σ → S modelliert. Für jedes Paar (s,a), s∈ S, a ∈ Σ, wird eine Kante von s nach s´ mit s´= δ(s,a) gezogen und mit a/d markiert, wobei d = θ(s,a) ist. Schlingen dienen daher dazu, um „bleibt im selben Zustand“ modellieren zu können.

Abb. 9.1

Manchmal werden bei Zustandsgraphen der Startknoten und – wenn vorhanden – die für die Endzustände stehenden Knoten gesondert markiert: Ersterer durch einen Pfeil davor, letztere durch Doppelkreise.

Bei Zustandsgraphen sind i.A. auch Mehrfachkanten <si,sj> erlaubt. Dies benötigt man, wenn - z.B. beim Eingabealphabet Σ = {0,1} – für jeden Input im Zustand s_1 ein Übergang zum Zustand s_2 erfolgen soll.

Abb. 9.2

Dasselbe gilt für Mehrfachschlingen: damit modelliert man z.B., dass für jeden Input 0 oder 1 der Automat im Zustand s z.B. mit Ausgabe θ(s,0)= θ(s,1)= f „schleifen“ soll (Abb. 9.3).

Abb. 9.3

Abb. 9.4

In diesem Falle kann man bei Einfachkanten bleiben und diese mit den betroffenen Eingaben (bzw.: Paaren von Eingabe/Ausgabe) insgesamt markieren. Dies ist in der Abb. 9.4 mit Σ={0,1) illustriert: Sobald der Zustand s erreicht wird, schleift der Automat dort.

In einem Zustandsgraphen kann man auch einen Weg durchlaufen und damit das Verhalten des Automaten bei einer Folge von Eingaben studieren. Eine solche Folge ist nichts anderes als ein Wort über dem Eingabealphabet Σ bzw. bzw. Element von Σ* . Da in Σ* auch das leere Wort ε liegt, ist auch „kein Input“ vorgesehen.

Zur formalen Beschreibung erweitert man daher die Definition der Zustandsüberführungsfunktion δ : S μ Σ → S induktiv auf δ´: S μ Σ* → S wie folgt:

(i)           δ´(s, ε) = s

(ii)          δ´(s, a) = δ (s,a)

(iii)         δ´(s, a1,a2) = δ(δ(s,a1),a2)

(iv)         usw.

und kommt zu folgender Definition:

Definition 9.8: Die Folge s, δ´(s, a_1), δ´(s, a_1,a_2), ......., δ´(s, a_1,a_2........an ) heißt Zustandstrajektorie von s unter w = a_1a_2......an .

Gleiches kann man auch für die Ausgabefunktion θ einführen. Dabei soll θ´ (s,w) der letzte Output sein, wenn auf s die Inputfolge w gewirkt hat.

Man spricht vom Verhalten V eines Ein/Ausgabe Automaten, in dem man betrachtet, welche Folgen von Inputs welchen Output erzeugen: V: Σ*→ Θ*.

Beispiel:

Seien S= {s_0, s_1, s_2, s_3} mit s_0 als Startzustand und nachstehender Automat gegeben: Mit Σ = Θ = {0,1} erzeugt das Eingabewort 101101 die Zustandstrajektorie s_0 s_3 s_1 s_2 s_3 s_1 und den Output 001001. Für 1101110 als Input wird s_0 s_3s_0 s_1 s_2 s_0 s_0 s_1 mit der Ausgabe 0011001 generiert.

Abb. 9.5

Mit der Erweiterung von δ auf δ´ können wir zum Abschluss erklären, was man unter der von einem endlicher Automaten EA akzeptierten Sprache L(EA) über einem Alphabet Σ versteht:

Definition 9.9: Die von einem DEA = (S, s0, Σ, δ, F) akzeptierte Sprache L(DEA) ist { w ∈ Σ* | δ´ (s0, w) ∈ F }.

Es kann gezeigt werden, dass die Menge {L | es gibt einen DEA, sodass L = L(DEA)} jene Menge von Sprachen ist, die man als reguläre Sprachen bezeichnet und umgekehrt: die Menge der regulären Sprachen genau durch die Menge der DEA erklärt wird. Dazu kommt, dass es zu jedem EA einen DEA gibt, der dieselbe Sprache akzeptiert.

Beispiel:

Σ = {0,1}, der DEA von Abb. 9.6 mit Anfangszustand s_0 und Endzustand s_3 akzeptiert alle Bitfolgen (w ∈ Σ* ), die zwei aufeinander folgende 1 oder 0 enthalten: L(DEA) = {w ∈ {0,1}* | 11 oder 00 ist Substring von w }

Abb. 9.6

Beispiel:

Der nachstehende DEA (Abb. 9.7) akzeptiert Σ* mit Σ = {0,1}: L(DEA) = Σ*.

Abb. 9.7

Generell halten wir fest, dass ein DEA das leere Wort genau dann akzeptiert, wenn der Startzustand zugleich auch zu den ausgezeichneten Endzuständen gehört.

9.3. Übungsaufgaben

9.1: Man gebe den Zustandsgraphen zu folgendem DEA mit Σ = {x,y) an:

9.2: Man gebe die Zustandstabelle zu folgendem DEA mit Σ = {0,1) an und beschreibe die Zustandstrajektorie bei Eingabe von 101.

9.3: Man zeichne das Zustandsdiagramm zu nachstehenden E/A_DEA und gebe den Output für die Eingabe 010101 an:

9.4. Applet

Das Applet DEA simuliert nach Wahl einen deterministischen Automaten DEA oder einen E/A_DEA. Die Automaten werden durch ihre Zustandsdiagramme dargestellt. Man kann ähnlich wie bei den Applets zur Graphentheorie oder Petrinets vorgegebene Zustandsdiagramme laden, modifizieren oder überhaupt neu zeichnen. Ferner kann zwischen verschiedenen Ein- Ausgabe-Alphabeten gewählt werden.

Abb. 9.8: Screenshot Applet: „DEA“

10. Codierungstheorie

10.1. Allgemeines

Grundvoraussetzung, dass ein Empfänger eine von einem Sender ausgesandte Nachricht interpretieren kann, ist eine Übereinkunft über ein gemeinsames Alphabet A, eine (in der Praxis geordnete) Menge von Zeichen. Daher ist es oft notwendig, dass Zeichen aus A vorab in Wörter über ein anderes Alphabet B codiert werden müssen. Dies gibt Anlass zu

Definition 10.1: Ein Code ist eine Abbildung von Zeichen eines Alphabetes A in Wörter über einem Alphabet B. Wir erinnern daran, dass Wörter durch Aneinanderreihen (Konkatenation) von Zeichen aus dem Alphabet A entstehen und A* als Menge aller Wörter über A mit dem leeren Wort ε das freie Monoid oder Wortmonoid über dem Alphabet A genannt wird.

Ein wichtiges Beispiel ist der erweiterte ASCII Code, bei dem die Zeichen des Lateinischen Alphabetes und weitere Sonderzeichen, insgesamt 256, in Wörter über B = {0,1} abgebildet werden.

Man unterscheidet hinsichtlich der Aufgabenstellung zwischen Quellencodierung und Kanalcodierung.

Bei der Quellencodierung geht es darum, eine vorliegende Datenmenge (Datei) einem bestimmten Optimierungsziel folgend neu zu codieren und zu speichern. Die häufigste Aufgabe ist Komprimieren, um ein zu speicherndes oder über einen (zuverlässigen!) Kanal zu übertragendes Datenvolumen zu reduzieren.

Bei der Kanalcodierung, dem Hauptthema der Codierungstheorie, konzentriert man sich auf den Transport von Daten über einen Kanal, der nicht notwendigerweise zuverlässig sein muss.

Das besondere Ziel ist, dass der Empfänger einer Nachricht feststellen kann, ob ein empfangenes Wort mit dem vom Sender versandten übereinstimmt. In bestimmten Fällen ist es auch wünschenswert, bei aufgetretenen Fehlern eine Korrektur auf Empfängerseite vornehmen zu können

Wir beginnen mit einer für die Codierungstheorie typischen Anwendung:

Eine Nachricht soll über eine große Distanz wie etwa bei Bildübertragungen von Raumsonden zur Erde übertragen werden. Üblicherweise codiert man diese Nachricht als eine Folge von Bits, also 0 und 1. Ein solches Nachrichtenwort wäre etwa 1001011. Durch „Rauschen“ und andere Störungen der Übertragung können diese Nachrichten jedoch verfälscht werden. Obiges Wort könnte dann z.B. als 1011011 empfangen werden. Ist etwa die Wahrscheinlichkeit, dass ein Zeichen richtig übertragen wird, 99 %, so werden bei einer Nachricht von 1000 Zeichen im Mittel schon 10 Fehler (!) auftreten. Handelt es sich bei der Nachricht z.B. um eine Korrektur der Flugbahn einer Raumsonde, so kann bereits ein falsches Bit es für die Sonde unmöglich machen, das vorgesehene Ziel überhaupt zu erreichen.

Man sucht daher Methoden, um diese Fehler so unwahrscheinlich als nur irgendwie möglich zu machen. Hierzu seien ein paar Ideen angeführt:

1. Methode: Man wiederholt die Nachricht. Im obigen Beispiel wird dann 1001011 1001011 ausgesandt und etwa 1011011 1001011 empfangen. Der zweite Block ist vom ersten verschieden, es muss also ein Fehler passiert sein. Aber es ist nicht feststellbar, welcher Block der richtige ist.

2. Methode: Man wiederholt die Nachricht 10-mal. Diese Methode hat auch ihre Nachteile: jede Nachricht wird extrem lang, dies kann zuviel Speicherplatz oder auch Zeit kosten.

3. Methode: („Single-Parity-Check“). Man hängt an ein Nachrichtenwort 0 an, wenn die Summe der Einser je Wort gerade ist; andernfalls hängt man 1 an. In obigem Beispiel wird 1001011 zu 10010110. Erhält der Empfänger 10110110, so erkennt er, dass entweder 1,3,5 oder 7 Fehler passiert sein müssen. Wo, ist allerdings nicht feststellbar.

Allen drei Methoden ist jedenfalls gemeinsam, dass sie zur Fehlererkennung und etwaiger Fehlerkorrektur Redundanz in der Übertragung vorsehen.

Das allgemeine Prinzip der Codierung ist meist folgendes:

Man will ein Wort x_1x_2x_3…xk über einem beiden Seiten vertrauten Alphabet A übertragen und hängt n Testsymbole xk+1,…,xn, xi ∈ A, an. Das resultierende Wort der Länge n wird verschickt und kommt als y_1y_2…ykyk+1…yn an.

In der Folge werden wir für A immer A={0,1} annehmen, sodass die Bits xi, yj als Elemente von (2,+,·) betrachtet werden können. Ferner setzen wir voraus, dass anstatt eines speziellen Trennsymbols t ∉ A zwischen zwei Wörtern vereinbart ist, dass alle versandten Wörter gleiche Länge haben. Nachrichten bestehen aus einer Folge von Wörtern.

Definition 10.2: Ein Einfachfehler liegt vor, wenn in einem übertragenen Wort genau ein Bit fehlerhaft übertragen wird. Man spricht von einem Doppelfehler bzw. n-fach Fehler, wenn genau zwei bzw. n Bits fehlerhaft sind.

Definition 10.3: Wird eine Folge von n Bits hintereinander falsch übertragen, so spricht man von einem Fehler-Burst der Länge n.

Typisch für einen Fehler-Burst ist ein temporärer Leitungsausfall.

Schon der oben genannte Single-Parity-Check ist sehr leistungsfähig. Nehmen wir beispielsweise an, die Fehlerrate sei p=10-8, es wird also im Schnitt ein Bit unter 10^8 fehlerhaft übertragen. Die Wahrscheinlichkeit, ein falsches Wort zu erhalten ist in diesem Fall ungefähr gleich der Wahrscheinlichkeit für einen Einfachfehler, da Doppelfehler verglichen mit

Einfachfehlern so unwahrscheinlich sind, dass sie in Bezug auf die Gesamtwahrscheinlichkeit vernachlässigt werden können. Falls man jetzt etwa Wörter der Länge 11 (ohne Testsymbole) mit der Übertragungsrate von 10^7 Zeichen pro Sekunde ausschickt, so gilt:

Es werden  Wörter pro Sekunde übertragen, die Fehlerwahrscheinlichkeit für ein falsches Wort ist jetzt 11 mal der Wahrscheinlichkeit für ein falsches Bit, also gleich 11 ⋅ 10 −8 und somit kommen im Mittel demnach 11.10−8 ⋅ = 0.1 Wörter pro Sekunde oder 360 Wörter pro Stunde fehlerhaft an!

Der simple Paritycheck verlängert die Wörter auf 12 Bits. Die Wahrscheinlichkeit, dass jetzt ;ein falsches Wort unentdeckt bleibt, ist – da der Paritycheck Einfachfehler ja erkennen kann – nun etwa gleich der Wahrscheinlichkeit des Auftretens eines Doppelfehlers, da Dreifachfehler ja wieder wegen ihrer geringen Wahrscheinlichkeit vernachlässigt werden können – also gleich der Anzahl der Möglichkeiten, 2 aus 12 Stellen zu wählen multipliziert mit der Wahrscheinlichkeit, dass 10 Stellen korrekt und 2 Stellen falsch übertragen werden:

das entspricht in diesem Fall einer Rate von einem unentdeckten Fehler in ca. 6 Jahren!

Dennoch nützt der Paritycheck nichts, wenn man die Fehler auch korrigieren will.

Es gibt im allgemeinen nun Codiermethoden, um gewisse Fehler zu erkennen, und solche, die gewisse Fehler sogar korrigieren. So unterscheidet man fehlererkennende und fehlerkorrigierende Codes. Da die Wahrscheinlichkeit für mehrfache Fehler in einem Wort bei einer guten Übertragungstechnik sehr klein ist, achtet man zuerst auf Einfachfehler.

Beispiel:

Es folgt nun ein Beispiel für einen sehr intelligenten Einfachfehler-korrigierenden Code: Man sendet Wörter x_1x_2x_3 der Länge k=3 ab und hängt vorher noch 3 Testsymbole x_4,x_5,x_6 dran, die sich folgendermaßen berechnen:

Man beachte, dass hier über 2 gerechnet wird. Dies vereinfacht natürlich sämtliche Berechnungen.

ist die Koeffizientenmatrix des so entstandenen linearen Gleichungssystems. Ist x = (x_1,…,x_6), so können wir (*) als  schreiben.

Die Lösungsmenge C dieses homogenen linearen Gleichungssystems bildet einen Unterraum von V := (2)6, (= 2 × 2 × 2 × 2 × 2 × 2 – alle 6-Tupeln mit Elementen aus {0,1}) ist

also bezüglich der Addition eine Untergruppe von (V,+). Dies bedeutet, dass wegen der Abgeschlossenheit der Gruppe bzgl. „+“ die Addition von Codewörtern wieder ein Codewort liefert. Die Elemente von C, ohne Klammern und Beistriche geschrieben, also etwa kurz 001011 statt (0,0,1,0,1,1), sind genau die möglichen ausgesandten Codewörter:

C = {000000, 001011, 010101, 011110, 100110, 101101, 110011, 111000}.

Es gilt dann |C| = 8, |V| = 64.

Der Vektorraum V enthält alle Wörter, seien sie richtig oder falsch übertragen. Nun unterteilen wir V in disjunkte Mengen, sogenannte Nebenklassen, sodass zwei Bitfolgen (Wörter) x,y genau dann in derselben Nebenklasse liegen, wenn x - y ∈ C. Diese Bedingung besagt mit anderen Worten: es hat x + c = y zu gelten, sodass sich zwei Bitfolgen in einer Nebenklasse um genau ein zu addierendes Codewort unterscheiden, gerechnet in 2. Da der Code C eine Gruppe bildet und somit bezüglich der Addition abgeschlossen ist, entspricht C selbst genau einer Nebenklasse.

Aus unten stehender Tabelle ist leicht ersichtlich, dass die Elemente dieser Klasse exakt alle möglichen Fehler darstellen, die bei der Übertragung passiert sein können.

Mathematisch lässt sich das auch so begründen:

Passiert ein Fehler im Wort x an der Stelle k, dann ändert sich das k-te Bit von x. Damit liegt x nicht mehr im Code sondern in einer Nebenklasse. Diese Nebenklasse enthält aber laut obiger Definition alle Elemente x, y aus V, für die gilt: x – y ∈ C. Sie enthält außer x also auch das Wort c = 00…010…0 (ein Einser an der k-ten Stelle, sonst lauter Nullen), da x – c das fehlerkorrigierte Wort und damit aus C ist. Ergo liegen sämtliche an der k-ten Stelle verfälschten Wörter in genau dieser Nebenklasse.

Da n-fach-Fehler mit zunehmendem n immer unwahrscheinlicher werden, sofern nur die Wahrscheinlichkeit der richtigen Übertragung eines Bits größer als ½ ist, sucht man in jeder Zeile das Element mit der geringsten Anzahl von Einsern, welches nicht immer eindeutig bestimmt sein muss. Dieses Element ist der wahrscheinlichste Fehler und heißt coset leader. (In obigem Paragraph war dies etwa das Wort c = 00…010…0) Allgemein sind für einen Code wie oben die 64 Elemente von V, als Wörter geschrieben, so aufgelistet, dass die i-te Zeile genau die i-te Klasse darstellt. Die erste Zeile stellt C selbst dar, unten fett gedruckt, die zweite „000001 + c mit c ∈ C“, also die möglichen Wörter, die bei einem Fehler an der letzten Stelle entstehen können, und so weiter.

Die fünfte Zeile etwa stellt alle durch einen Fehler an der vierten Stelle entstandenen Wörter dar. In der letzten Zeile schließlich stehen in diesem Beispiel die noch fehlenden acht Elemente des Vektorraums.

Die coset leader stehen jeweils an erster Stelle, bilden die erste Spalte, in den Zeilen 2 bis 7 also jeweils die möglichen Einfachfehler.

Soll z.B. 101 übertragen werden, so wird es zu 101101 codiert. Bei der Übertragung passiere ein Fehler an der 4. Stelle und x = 101001 wird empfangen, ist unterstrichen. Da 101001 nicht in C ist, weiß der Empfänger, dass ein Fehler passiert sein muss. Er kann ihn – allerdings nur im Vertrauen darauf, dass keine Mehrfachfehler passiert sind – aber sogar korrigieren:

x = 101001 steht in der 5. Zeile. Der Fehler ist der coset leader, die Bitfolge mit den wenigsten Einsern, also y = 000100 und – nachdem x – y im Code liegen muss, berechnet man x – y = 101001 – 000100 = 101101 und erhält das korrigierte Codewort.

Eine zweite Lösungsmöglichkeit wäre „Lösen durch Hinschauen“: 101101 ist das Codewort, das 101001 am „nächsten“ liegt. Im Vertrauen darauf, dass nur Einfachfehler passiert sind, muss es daher das gesuchte Codewort sein.

Dies war ein Beispiel eines Gruppencodes oder 2-Vektorraum-Codes. Gruppencodes können bereits sehr viel leisten. Sie sind u.a. dafür verantwortlich, dass wir auf der Erde gute Fotos von der Marsoberfläche haben.

Jetzt aber zur formalen Definition eines Codes aus algebraischer Sicht::

Definition 10.4: Ein (linearer) Code über dem Körper K = p ist der Nullraum

C = {c∈Kn| A·ct = o} einer Matrix A ∈ −k , also alle Spaltenvektoren, die mit A multipliziert den Nullvektor ergeben.

A heißt dann eine Kontrollmatrix von C und C heißt ein linearer (n,k)- Code. Elemente aus C heißen Codewörter. Für p = 2 spricht man von binären Codes.

Wir beschränken uns fortan auf p = 2 und damit auf sogenannte binäre (lineare) Codes.

Beispiel:

Der Nullraum der Matrix aus oben genanntem Beispiel entspricht der Lösungsmenge von:

Und damit genau gleich {000000, 001011, 010101, 011110, 100110, 101101, 110011, 111000}, wieder in Kurzschreibweise.

Ein linearer Code kann natürlich viele verschiedene Kontrollmatrizen haben, da man die Gleichungssysteme ja auf mehrere Arten ansetzen kann. Die Codierung eines k-Tupels (c_1,…,ck) erfolgt durch (c_1,…,ck,…,cn), sodass A·(c_1,…,ck,…,cn)t = o ist.

Oft, so auch in unserem ersten Beispiel, hat A die Gestalt A = (B | E)matrix , in obigem Beispiel etwa bildet die Einheitsmatrix die „rechte Hälfte“ von A. Dies vereinfacht das Codieren, da die entsprechenden Variablen, die mit diesem Block multipliziert werden, oben x_4, x_5, x_6, dann nur in einer Gleichung vorkommen.

Für eine erfolgreiche Strategie zur Decodierung fehlen noch ein paar Definitionen:

Definition 10.5: Seien x = (x_1,…,xn), y = (y_1,…,yn) ∈ (2)n. Die Hamming-Distanz d(x,y) ist die Zahl der Stellen, an denen sich x und y unterscheiden.

Es gilt d(x,y) = d(x–y,0), diese Funktion „d“ ist ein Beispiel für eine sogenannte „Metrik“, eine Art „Maß für Distanzen“. Ein eintreffendes Wort y = (y_1,…,yn) decodiert man nun in der Hoffnung auf eine halbwegs gute Nachrichtentechnik in das nächstliegende Codewort.

Dieses sollte freilich eindeutig sein, hier können folgende Fälle auftreten:

Abb. 10.1

Jedes c∈C hat also einen „Einzugsbereich“. In diesem Bereich eintreffende Wörter y werden zu c decodiert. Diese „Kreise“ um die Codewörter sollten gleich groß sein. Sind sie zu groß und überlappen sich, (s. Abb. 10.2) so weiß man nicht, ob man y zu c oder zu c' decodieren soll.

Abb. 10.2

Sind sie zu klein (s. Abb. 10.3), so weiß man auch nicht, was mit dem y geschehen soll. Man muss also den besten Kompromiss suchen. Entscheidend wird sein, wie nahe sich zwei Codewörter kommen können.

Abb. 10.3

Definition 10.6: Die kleinste Hamming-Distanz zwischen je zwei (verschiedenen) Codewörtern aus C heißt die Minimaldistanz von C und wird mit dmin(C) bezeichnet.

Mit der soeben vorgestellten „Nächste-Nachbar-Decodierung“ lässt sich nun zeigen:

Satz 10.1: Ist d = dmin(C), so kann C bis zu d–1 Fehler erkennen und bis zu  richtig decodieren.

Mit anderen Worten formuliert: zum Auffinden von d Einzelbitfehlern benötigt man einen Hammingabstand d+1 und zum Korrigieren einen Abstand von 2d+1.

Beispiel:

ASCII 8-Bit Code + Prüfbit

Hier ist d = 2, dieser Code gestattet das Auffinden, aber nicht das Beheben, von einem gekippten Bit, ein Einzelbitfehler liefert ein falsches Paritätsbit. Zwei gekippte Bits, insbesondere Burst von zwei, bleiben unentdeckt.

Wie bestimmt man aber dmin(C) ? Natürlich könnte man alle Codewörter miteinander vergleichen, es geht freilich aber auch besser, dazu in Kürze.

Definition 10.7:

a) d(x,0) =: w(x) heißt das Hamming-Gewicht von x.

b) Sei A eine m×n-Matrix. Dann sei rg(A) das größte r, sodass je r Spalten von A linear unabhängig sind.

Satz 10.2: Sei C ein (n,k)-Code mit Kontrollmatrix A.

a) dmin(C) = das kleinste Gewicht eines Codeworts ≠ 0.

b) dmin(C) = rg(A) + 1.

Beispiel:

Man berechne dmin(C) von C aus dem Beispiel vom Anfang des Kapitels, also

C = {000000, 001011, 010101, 011110, 100110, 101101, 110011, 111000}.

Um es direkt nach Definition zu machen, müsste man bei allen Kombinationen verschiedener Codewörter jeweils vergleichen, an wieviel Stellen sie sich unterscheiden. Dies ist freilich besonders bei großen Codes nicht effizient.

Unter Verwendung des Hamming-Gewichtes geht es viel einfacher: Die Codewörter haben der Reihe nach die Gewichte 0,3,3,4,3,4,4,3. Also ist dmin(C) = 3.

Nach Satz 10.2 b) ist rg(A) zu berechnen. Je zwei Spalten sind verschieden, also unabhängig. Die dritte Spalte ist die Summe der beiden ersten. Also ist rg(A) = 2 und wiederum dmin(C) = 3.

Nach Satz 10.1 kann dieser Code also alle Einfachfehler korrigieren und alle Doppelfehler erkennen.

Besonders einfach geht das Decodieren bei der folgenden, nach ihrem Erfinder Richard Hamming (1915-1998) benannten Klasse von Codes. Es ist dann nicht nötig, eine Tabelle von Kn anzufertigen.

Definition 10.8: Falls A aus allen st mit s ∈ ( 2)n , s ≠ o, besteht, also falls alle möglichen n-stelligen Binärzahlen spaltenweise vorkommen, so heißt A bzw. der dadurch definierte Code ein Hamming-Code; es handelt sich dann um einen (2n–1,2n–1–n)-Code.

Man ordnet die Spalten eines binären Hamming-Codes nach ihrer Binärzahldarstellung. Für n=3 erhält man:

Dann gilt folgender leicht zu zeigender Satz:

Satz 10.3:

a) rg(A) = 2, also dmin(A) = 3.

b) Ein Hamming-Code kann also alle Einfachfehler korrigieren und alle Doppelfehler erkennen.

c) Ist bei der Übertragung von x in y genau ein Fehler passiert, dann war er an der i-ten Stelle, wobei i die Binärzahl von A·yt ist. (vgl. folgendes Beispiel)

Beispiel:

Sei C der oben genannte Hamming-Code. Falls y = 1010101 = (1,0,1,0,1,0,1) eintrifft, so gilt Ayt = o, also ist wahrscheinlich kein Fehler passiert und 1010 war die eigentliche Nachricht.

Trifft jedoch etwa z = 1011101 ein, so gilt

Die zugehörige Binärzahl ist 0·2^0+0·2^1+1·2^2 = 4, das niedrigste Bit steht unten, also ist wahrscheinlich ein Fehler passiert; trifft dies zu, so ist die vierte Stelle verfälscht worden, das ausgesandte Codewort war 1010101, die eigentliche Nachricht also 1010.

Dieser Code lässt sich noch verbessern mittels:

Definition 10.9: Beschreibt die Kontrollmatrix A einen Hamming-Code, so kann man durch Anhängen einer „Nullspalte“ und Darüberschieben einer „Einerzeile“ den erweiterten Hamming-Code A erhalten.

Für n=3 ergibt sich dann:

Offenbar gilt für den dadurch bestimmten Code C :

rg(A) = 3 und damit dmin( C ) = 4. C kann daher alle Dreifachfehler erkennen, aber auch nicht mehr als Einfachfehler korrigieren.

Bemerkung:

Lineare Gruppencodes können maximal Einfachfehler korrigieren.

Wie „gut“ ist ein linearer Code? Dazu folgende Definition:

Definition 10.10: Sei C ein (n,k)-Code mit Minimaldistanz dmin(C) =: d.

Sowohl   als auch  sind Zahlen zwischen 0 und 1. Je größer, desto besser ist der Code.

In der Informatik besonders wichtig sind folgende Codes:

Definition 10.11: Ein zyklischer Code ist ein Code, für den gilt: c_0…cn-1 ist Codewort ⇒ cn-1 c_1 … cn-2 ist Codewort.

Ein bekanntes Beispiel für einen zyklische Code ist der Cyclic Redundancy Check, der CRC-Code, von dem es wiederum mehrere Varianten gibt. (CRC-16, CRC-CCITT, …)

Das Prinzip ist folgendes, wobei wir den Konventionen der Informatik entsprechend die Bits von 0 bis n-1 nummerieren.

Eine Bitfolge c_0…cn-1 wird als Polynom c_0 + c_2 x + … + cn-1x n-1 interpretiert.

G(x) sei das sogenannte erzeugende Polynom (Generatorpolynom).

Als Generatorpolynome werden genormte Polynome verwendet, die sowohl dem Sender als auch dem Empfänger bekannt sind, z.B.: CRC-CCITT (CRC-16) x^16 + x^12 + x^5 + 1

Codierungs-Algorithmus:

- Die zu codierenden binären Daten werden mit dem Grad des Generator-Polynoms multipliziert, d.h. an die Daten werden entsprechend dem Grad des Generator-Polynoms Nullen angehängt, bei CRC16 etwa 16 Nullen.

- Die dadurch entstandene neue binäre Zeichenkette wird durch das Generator-Polynom geteilt und der Rest dieser Division bestimmt.

- Dieser Rest wird zu den binären Daten addiert.

Man beachte, dass bei dieser Methode die Division als fortlaufende Subtraktion des Divisors durchgeführt wird, die sich binär mittels XOR leicht durchführen lässt.

Beispiel:

Das Generator-Polynom sei x^5 + x^2 + x. Dies entspricht der binären Zahl 100110. Jetzt ist natürlich auch noch eine binäre Zeichenkette notwendig, die die Eingangsdaten darstellt.

Wir wählen (willkürlich) 1110100111001

(a) Sender:

• Die Daten werden mit x5 multipliziert (5 Nullen anhängen): 1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0

• Die Daten müssen jetzt durch das Generator-Polynom dividiert und somit der Rest ermittelt werden: (Division als XOR Operation)

Der Rest ist also 100.

• Nun muss nur noch der Rest zu den Daten hinzugezählt werden:

1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0

(b) Empfänger:

1. ohne Fehler

Der Empfänger ermittelt seinerseits jetzt natürlich ebenfalls aus diesen empfangenen Daten den Rest:

Der Rest ist also wirklich 0.

2. mit Fehler

Addiert man beispielsweise als angenommenen Fehler 1100 zu den Daten hinzu, so erhält man also:

Jetzt führt man die Division erneut durch und betrachtet den Rest:

Somit bleibt also 10100 als Rest und dies bedeutet, dass die Daten nicht korrekt beim Empfänger angekommen sind!

Eine weitere wichtige Gruppe von zyklischen Codes (vgl. Definition 10.11) stellen die sogenannten „Reed-Solomon“ Codes (nach Irving S. Reed und Gustave Solomon) dar. Diese Codes finden Verwendung bei der Fehlerkorrektur von Speichermedien wie CDs, DVDs oder Festplatten sowie im Mobilfunk, bei Hochgeschwindigkeitsmodems wie ADSL, etc. Allgemein gut geeignet sind diese Codes zur Korrektur von langen Fehlerbursts (Kratzer auf einer DVD, Signalunterbrechungen u.ä.)

Reed-Solomon-Codes bilden eine Unterklasse der sogenannten BCH-Codes (nach Bose, Chauduri, Hocquenghem).

Für die Theorie hinter diesen Codes sei auf das Kapitels über endliche Körper verwiesen.

Sei im folgenden q = pn>n; eine Primzahlpotenz.

Definition 10.12: Ein Reed-Solomon Code mit k Informationsstellen der Länge q–1>k über GF(q), kurz ein RS(n,k)-Code entsteht auf folgende Weise:

1. Man wählt ein erzeugendes Element a der multiplikativen Gruppe von GF(q). Es ist dann aq-1 = 1.

2. Die zu codierenden Wörter seien Folgen (w_0,w_1,…,wk-1) der Länge k mit Komponenten wi ∈ GF(q).

3. Zur Codierung schreibt man eine solche Folge (w_0,…,wk-1) als Polynom w_0 + w_0x + … + wk-1xk-1 =: w(x) und codiert es zu (w(1),w(a),…,w(aq-2)) und erhält eine codierte Folge der Länge q-1, die verschickt wird.

4. Der Empfänger erhält also q-1 Werte für eine – ihm unbekannte – Polynomfunktion w(x) vom Grad k < q-1. Da für die Interpolation zum Berechnen von w(x) schon k Werte ausreichen würden, kann man aus der Redundanz das ursprüngliche Polynom w(x) auch bei einigen fehlerhaften Werten den w(ai) berechnen.

Allgemein gilt für die Fehlerkorrektur von RS(n,k)-Codes:

Satz 10.4 (ohne Beweis):

Der so entstehende RS(n,k)-Code hat eine Minimaldistanz von q–k, kann also bis zu  Fehler richtig decodieren.

Beispiel:

Besonders beliebt ist der Körper GF(256), weil dessen Elemente ja als Folgen (a_0,….,a_7) ∈ (2)8 geschrieben werden können. Folgen der Länge 8 mit Elementen aus {0,1} stellen aber genau ein Byte dar.

Beispiel:

Sehr häufig verwendet wird für GF(256) der Wert k = 223. Die Nachrichtenwörter der Länge k = 223 über GF(256) werden also um 32 Prüfstellen erweitert, um auf die Länge n = 255 zu kommen. Nach obigen Satz hat RS(255,223) die Minimaldistanz 256 – 223 = 33; der Code kann also bis zu 32 Fehler erkennen und bis zu  = 16 Fehler korrigieren.

Auf die Decodierung kann hier nicht eingegangen werden; man verwendet dazu am besten die sog. Diskrete Fourier-Transformation (DFT). RS-Codes sind „optimal“ in dem Sinn, dass kein anderer linearer (n,k)-Code eine größere Minimaldistanz besitzt, also noch mehr Fehler entdecken bzw. korrigieren kann.

Der RS(255,223) wird (in leicht abgeänderter Form) oft für RAID-Systeme zum Einschub redundanter Laufwerke in parallel arbeitende Plattenlaufwerke (zur Korrektur ev. auftretender Fehler) verwendet, aber auch bei CDs sowie für die Übertragung von Fotos der Mars- und Jupitersonden.

Grundlage dieser Codes war eine kurze 5-Seiten-Arbeit von Reed und Solomon im Jahr 1960.  Damals war dies eine reine Grundlagenforschung; die große Anwendbarkeit kam erst mit der Entwicklung leistungsfähiger Rechner zum Rechnen in (relativ) großen endlichen Körpern.

Es sei noch erwähnt, dass die Codierung von RS-Codes auch anders beschrieben werden kann, nämlich durch Multiplikation der Nachrichtenwörter w_0 + w_1x + … + wk-1xk-1 mit dem fixen „Generatorpolynom“ (x-1)(x-a)(x-a^2)…(x-aq-k).

10.2. Übungsaufgaben

10.1: Bestimmen Sie den durch die Kontrollmatrix

bestimmten binären Code durch Aufzählen der Codewörter.

10.2: Machen Sie die Probe: Ist die Summe zweier Codewörter wieder im Code?

10.3: Sei

P : die Prüfmatrix eines Codes.

Bestimmen Sie eine Basis des zugehörigen Codes C.

10.4: Wieviele Testsymbole hat ein Codewort dieses Codes?

10.5: Wieviele Fehler kann dieser Code korrigieren? Wieviele erkennen?

10.6: Bestimmen Sie Informations- und Korrekturrate dieses Codes

10.7: Sei C der Code von oben und sei weiters das Alphabet durch A=0000, B=0001, etc. gegeben.

Vercodieren Sie das Wort „Feind“

10.8: Warum ist etwa das Wort „Piranha“ nicht vercodierbar?

11. Ausgewählte Anwendungen

11.1. Vorbemerkungen

Die hier vorgestellten Anwendungen sind in ihrer Auswahl weder repräsentativ noch vollständig. Im Vordergrund steht das Ziel, bewusst zu machen, dass viele in der Informatik verwendete Methoden und Verfahren eine solide Basis in der Algebra und ihr nahestehenden Gebieten wie der Zahlentheorie sowie in der Graphentheorie haben: Informatik kommt auch als Ingenieurdisziplin ohne solide formale Grundlagen nicht aus.

In den Beispielen wird teilweise auf Sätze und Ergebnisse zurückgegriffen, die in den vorangegangenen Kapiteln nicht behandelt worden sind. In solchen Fällen werden diese ohne Beweis jeweils kurz angeführt.

11.2. Speicherung von Dreiecksmatrizen

Um einen Graphen mit nummerierter Knotenmenge V(X) = {x_1,x_2,…,xn} in einem digitalen Rechner darstellen zu können, kann man sich seiner Adjazenzmatrix bedienen:

Definition 11.1: Die Adjazenzmatrix A(X) = {aij} eines Graphen X = (V(X), E(X)) mit n Knoten ist eine n × n Matrix A mit den Elementen aij = 1, wenn xi und xj adjazent sind, aij = 0 sonst.

Für ungerichtete Graphen ist A symmetrisch und es genügt daher, nur die untere Hälfte der Dreiecksmatrix darzustellen. Die im Kapitel über Graphentheorie vorgestellte Definition eines ungerichteten Graphen entspricht sogenannten schlichten Graphen, da für E = E(X) nur ungeordnete Paare [x,y] (bzw. bei g. Graphen <x,y>) verschiedener Elemente x,y ∈ V(X) zugelassen sind. Solche Graphen haben keine Schlingen [x,x] bzw. <x,x>. In diesem Fall enthält die Hauptdiagonale von A nur Nullen.

Höhere Programmiersprachen stellen den Datentyp Feld (array) zur Anordnung von Elementen gleichen Typs zur Verfügung:

Damit wird eine 10 × 10 Matrix namens graph mit Elementen vom Typ integer angelegt, die als Adjazenzmatrix eines Graphen mit n = 10 Knoten interpretiert werden kann. Ist der Graph ungerichtet, so verschwendet man damit Speicherplatz, weil die Matrix symmetrisch ist.

Daher stellt sich allgemein folgende Aufgabe:

Ordne die Elemente aij einer Dreiecksmatix A der Gestalt

a00

a_10a11

a_20a_21a22

..................

ai0ai1ai2 ... aii

..........................

an0an1an2 ......... ann

als lineares Feld (Vektor, z.B. int a[ ]) an, sodass darin mit gegebenem Indexpaar i,j im Sinne einer bijektiven Abbildung die Position (d.h.: Adresse in a [ ]) in a[ ] bestimmt werden kann, auf der aij abgelegt ist.

Zur Lösung tut die abgeleitete Summenformel

gute Dienste. Man erhält nämlich

unter der Annahme, dass addr (a_00) = 0 ist. Denn vor aij befinden sich genau i Zeilen und damit 1 + 2 + 3 + … + i Elemente.

Aus Effizienzgründen, um die wiederholte Berechnung von ((i+1)i)/2 zu vermeiden, berechnet man diesen Ausdruck für i = 0, 1, 2, …, n im voraus und speichert das Ergebnis in einem sogenannten Dope-Vektor d ab.

Damit erhält man für die benötigte Adressrechnung

addr(aij) = d[i] + j.

11.3. Erzeugung von Zufallszahlen

Bei vielen Experimenten bzw. mittels Computer durchgeführten Simulationen bedarf es an Algorithmen zur Erzeugung von möglichst langen Folgen x_0, x_1, x_2, … xn von Zufallszahlen.

Da aber Algorithmen (i.A.) deterministisch sind, scheint ein solches Vorhaben zunächst widersprüchlich zu sein: Wenn man z.B. aus xi den Nachfolger xi+1 algorithmisch bestimmen kann, sollte man nicht mehr von „Zufall“ sprechen. In der Tat geht es aber darum, eine Folge von Zahlen {xi} in einem Intervall [a,b] so zu erzeugen, dass sie sich insgesamt statistisch gesehen wie eine Folge von Zufallszahlen verhält.

Man spricht daher von Pseudozufallszahlen, die von einem Zufallszahlengenerator erzeugt werden.

Die gängigste unter den einfacheren Methoden ist die lineare Kongruenzmethode (x_0, a, c, m) mit

xi+1 = (a xi + c) mod m.

Dabei ist ein Startwert x_0 ≠ 0, z.B. durch Abfrage der Systemzeit oder sonst irgendwie willkürlich vorzugeben. Bei gleichem Startwert erhält man demnach dieselbe Folge von Pseudozufallszahlen, sobald die Parameter a,c und m fixiert sind.

Wir werden uns hier nicht mit der Qualität einer durch (x_0, a, c, m) erzeugten Zahlenfolge befassen, also nicht der Frage weiter nachgehen, mit welchen Testmethoden überprüft werden kann, dass bzw. inwieweit die erzeugte Folge den Eigenschaften einer geforderten Gleichverteilung nahe kommt. Von Gleichverteilung spricht man dann, wenn jede in der Zahlenfolge auftretende Zahl gleich wahrscheinlich ist.

Klar ist, dass die Folge {xi} wegen des Moduls m spätestens nach m Schritten periodisch wird. Es kann aber auch sein, dass diese Periodenlänge deutlich kürzer wird, wie man am Beispiel (2,2,1,7) leicht nachrechnen kann.

Es ist daher das Ziel, die Parameter a,c und allenfalls auch m so zu wählen, dass eine Periodenlänge maximal wird. Unter diesen sind dann solche zu wählen, dass der Zufallszahlengenerator dem Test auf Gleichverteilung stand hält. Der Startwert x_0 spielt dabei keine Rolle, es werden für x_0 ≠ x_0 nur andere Folgen {xi} generiert.

Bestimmend für die Überlegungen ist folgender Satz:

Satz 11.1: Die lineare Kongruenzmethode (x_0, a, c, m) hat die maximale Periodenlänge m dann und nur dann, wenn

(i)         ggT(c,m) = 1

(ii)        a-1 ein Vielfaches von p für jeden primen Teiler von m ist

(iii)       a-1 ein Vielfaches von 4 ist, falls m ein Vielfaches von 4 ist.

Klar ist, dass m sehr groß zu wählen ist, um überhaupt lange Folgen von Pseudozufallszahlen erhalten zu können.

Es genügt c = 1 zu wählen, soferne der Multiplikand a „gut“ gewählt ist. Dafür gibt es praktische Hinweise: a sollte um eine ~ 10er Potenz kleiner als m gewählt werden und selbst keine signifikante Ziffernfolge beinhalten.

Beispielsweise kann man a = 3141592621 wählen (vgl. π = 3,14159265 …). Zusätzlich erfüllt dieses a neben (ii) und (iii) noch die Bedingung a ≡ 5 mod 8, worauf wir später noch eingehen werden.

Obiger Satz legt nahe, für m eine Primzahl p zu wählen. Informatiker haben aber eine Präferenz für m = 2n in Hinblick auf die üblichen Wortlängen 232 oder 2^64 bei digitalen Rechenanlagen.

Aus Gründen der Performanz, nämlich um sich die Addition in xi+1 = a xi + c mod m zu sparen, gibt es Generatoren, die c = 0 wählen. Dies liefert den Spezialfall (x_0, a, 0, m) mit

xi+1 = a xi + mod m.

Der Nachteil davon ist, dass sich die mögliche maximale Periode auf ein Viertel davon reduziert. Diesem Umstand werden wir etwas genauer nachgehen.

Im Rückblick auf die Definition der Ordnung eines Elementes x aus einer Gruppe definieren wir wie folgt:

Definition 11.2: Eine zu m relativ prime Zahl a mod m heißt primitives Element modulo m, wenn ihre Ordnung ord(a) maximal ist.

In zyklischen Gruppen heißen solche Elemente Primitivwurzeln. Wir erinnern, dass ( n*, ·) zyklisch ist für n = 2, 4, n = pj oder n = 2pj mit j ∈ und p prim.

Für den obigen Spezialfall gibt ein Satz von Gauß vollständig Auskunft:

Satz 11.2: In einer Folge xi+1 = a xi mod m wird eine maximale Periode μ erreicht, wenn

(i)           ggT(x_0,m) = 1 und

(ii)          a primitives Element modulo m ist.

Für m = 2j gilt dann: μ(2) = 1, μ(4) = 2 und μ(2j) = 2j-2 für j ≥ 3.

(Hinweis: Gauß hat den Satz sogar für beliebige m abgeleitet).

Aus diesem Satz folgt für m = 2j und j ≥ 3 die Reduzierung der maximal erzielbaren Periodenlänge auf ein Viertel. Ist m = p > 2, prim, so ist ( p*, ·) zyklisch und a muss eine Primitivwurzel sein.

Der Satz 11.2 kann mit dem folgenden Satz 11.3 kombiniert werden, um eine Aussage bezüglich a zu erhalten:

Satz 11.3: Ist m = 2j mit j ≥ 4, so ist a ein primitives Element modulo m dann und nur dann, wenn entweder a mod 8 = 3 oder a mod 8 = 5 ist.

Nun wissen wir auch, warum in der Diskussion über die Wahl von a bei entsprechend großem m = 2j die Empfehlung auf a = 3141592621 gefallen ist: a mod 8 = 5.

11.4. Speichern und Suchen in Tabellen mittels Hashfunktionen

11.4.1. Aufgabenstellung

Wir gehen aus von einer Schlüsselmenge K ⊆ und einem Adressraum A in Gestalt einer Tabelle T der Größe n mit A = {0, 1, 2, ..., n-1}⊂ 0 und einer Speicherabbildungsfunktion (Hashfunktion) f_0: K → A und somit T[a] ∈ K für k ∈ K. Im allgemeinen ist | K | >> n .

Obwohl nur eine kleine Teilmenge K´ ⊂ K mit | K´ | ≤ n zum Wiederauffinden in A gespeichert wird, muss man davon ausgehen, dass f_0 nicht injektiv ist, also zwei verschiedene Schlüssel k_1, k_2 ∈ K dieselbe Hausadresse zugeordnet bekommen können: ∃ ki, kj ∈ K mit a_0 = f_0(ki) = f_0(kj). In diesem Falle tritt eine Primärkollision auf und es bedarf einer Kollisionsstrategie q, um einen Ersatz für eine bereits belegte Adresse a_0 zu finden. Aus a_0 = f_0(k) folgt also nicht notwendiger Weise T[a_0] = k.

Wir betrachten das sogenannte offene Hashcoding. Dabei wird im Falle einer Primärkollision in der Tabelle selbst eine noch unbesetzte Adresse ai ≠ a_0 gesucht. Diese Kollisionsadresse muss beim Suchen naturgemäß rekonstruierbar sein. Der Preis des offenen Hashcoding ist, dass es zu Sekundärkollisionen kommen kann:

Angenommen es ist für k_1 ≠ k_2 f_0(k_1) = f_0(k_2) = a_0 und wegen dieser Primärkollision sei k_2 durch die Kollisionsstrategie nach a_3 abgelegt worden. Soll nun ein Schlüssel k_3 mit k_3 ≠ k_1, k_3 ≠ k_2 und f_0(k_3) = a_3 in die Tabelle T eingetragen werden, so ist seine Hausadresse a_0 bereits belegt, es tritt eine Sekundärkollision auf und k_3 muss anderswo, z.B. auf a_4 abgelegt werden. Damit wird für einen weiteren Schlüssel k_4 mit f_0(k_4) = a_4 erst recht wieder eine Kollision provoziert.

Im allgemeinen Fall wird also für k zuerst auf der Hausadresse probiert und wenn diese besetzt ist, eine Folge von Adressen a_1, a_2, ..., ai durchlaufen, bis die erste freie Tabellenposition ai als Ersatzadresse (Kollisionsadresse) gefunden worden ist. Man beachte, dass über die durch die Kollisionsstrategie bestimmte Adressfolge zunächst nichts ausgesagt ist, also aus i > j nicht ai > aj mod n folgen muss.

Die Bestimmung von ai durch die Kollisionsstrategie q hängt von der Tabellenlänge n = | A |, von i und bei bestimmten Verfahren auch noch von k selbst ab.

Wir verwenden folgende Schreibweise:

fi(k) = f_0(k) + qi(k,n,i) mod n mit q_0 = 0 wobei i das kleinste 0 ≤ i < n ist,

(i)          für das mittels fi(k) beim Eintrag eines neuen Schlüssels ein noch unbelegter Tabellenplatz ai gefunden wurde. Kann so ein i nicht gefunden werden, so wird die Tabelle als voll bezeichnet. Wir werden zur Vereinfachung immer annehmen, dass bei t belegten Positionen der Tabelle der Belegungsfaktor f = t/n < 1 ist, d.h. dass mindestens eine Position noch frei ist. Es kann durchaus sein, dass qi(k,n,i) gar nicht alle Tabellenplätze erreicht und daher das Verfahren abbricht, obgleich noch freie Tabellenplätze verfügbar wären.

(ii)         sodass beim Suchen nach einem Schlüssel k dieser mittels qi (k,n,i) gefunden oder erfolglos ein leerer Tabellenplatz erreicht worden ist.

Damit steht das Interesse im Vordergrund, möglichst einfache Verfahren fi(k) zu bestimmen, die

(i)           alle Adressen A = { 0, 1, ... n-1 } erreichen

(ii)           Sekundärkollisionen und dadurch entstehende Cluster von bereits besetzten Kollisionsadressen nach Möglichkeit vermeiden.

Da wir uns im Folgenden auf q(k,n,i) konzentrieren, können wir o.B.d.A. annehmen, dass f_0(k) = 0. Bei unbekannter Verteilung der tatsächlich auftretenden Schlüsselmenge K’ ⊂ K verwendet man meist f_0(k) = k mod p mit p > 2 prim , sodass A den (kleinsten Repräsentanten der) Restklassen { 0 , 1 ,..., p-1 } entspricht.

11.4.2. Kollisionsstrategien

Lineare Kollisionsstrategie:

fi(k) = f_0(k) + c * i mod n

Damit q(k,n,i) = q(n,i) = c * i mod n auf jeden Fall die gesamte Tabelle ansprechen kann, müssen der Modul n und der Koeffizient c relativ prim zueinander sein: ggT(n,c) = 1.

Die lineare Kollisionsstrategie hat das Problem der Clusterbildung, denn selbst bei f_0(k_1) ≠ f(k_2) wird, sobald einmal qi(k_1) = qj(k_2) für i ≠ j gilt, in der Folge stets fi+m(k_1) = fj+m (k_2) für m ≥ 0. Damit müssen für k_2 wieder dieselben Adressen durchlaufen werden, die etwa für k_1 zur Beseitigung einer Kollision schon erfolglos probiert worden sind.

Kollisionsstrategie mittels Pseudozufallszahlengenerator:

Dieses Verfahren hat das Ziel, im Falle einer Kollision eine Clusterbildung zu vermeiden. Der Ansatz ist der, dass die Kollisionsadressen durch einen Pseudozufallszahlengenerator bestimmt werden. Dabei steht weniger die Frage der Qualität eines solchen Generators im statistischen Sinne im Vordergrund, sondern die Forderung, dass seine Periode so ausgelegt sein muss, dass die gesamte Tabelle durchprobiert werden kann. Für Tabellen der Länge n = 2j eignet sich der Generator

q(n,i) = (5i mod 2j+2)/4 = (5i mod 4*n)/4.

Hier ist die Periode maximal, es werden also die Adressen A = {0,1,2,...,n= 2j -1} ohne Wiederholung durchlaufen. Wir haben nämlich im Prinzip einen multiplikativen Generator der Gestalt

xi+1 = 5i mod m, allgemein xi+1 = ai mod m und ggT(a,m)=1

wobei wir beobachten, dass vorab (5i mod 2j+2) gerechnet und nachträglich durch 4 dividiert wird, um im Adressbereich [0, n-1] zu bleiben. Die im Abschnitt über Zufallszahlen zuletzt genannten Sätze über die maximale Periodenlänge μ und die Bedingung a mod 8 = 5 liefern die Begründungen dazu:

Wegen μ(2j) = 2 j-2 sowie j ≥ 4 wird mod 2j+2 gerechnet und es ist a mod 8 = 5. Ferner ist xo = 5^0 trivialerweise relativ prim zu n = 2j.

Kollisionsstrategie mittels Quadratresten:

Es wird folgender Ansatz verwendet, wobei für die Tabellenlänge eine Primzahl p > 2 vorausgesetzt wird:

q(p,i) = i^2 mod p, also fi(k) = f0(k) + i^2 mod p

Das heißt, dass die Folge der Quadratreste als Ausweichadressen herangezogen wird. Wir wissen, dass es allerdings nur (p-1)/2 Quadratreste gibt und daher nur die halbe Tabelle für Kollisionsadressen zur Verfügung steht, wenn über p nichts weiter vorausgesetzt wird. Also muss man noch die Nichtreste NR(p) aufspüren. Dies geschieht unter Verwendung der Beziehung NR(p) = QR(p)*NR.

Im Falle von Primzahlen der Gestalt p = 8*j +3 oder p = 8*j –3 kann als NR(p) die Zahl 2 verwendet werden. Somit erzeugt man die zu 1^2,2^2, ….., ((p-1)/2)2 komplementären Adressen, die NR(p), durch

{i^2 * 2| i = 1,2,..,(p-1)/2}, also durch einen einfachen shift left auf jeden erzeugten Quadratrest.

Kollisionsstrategie mittels Primitivwurzeln:

Zum Verständnis des folgenden Verfahrens möge man sich Definitionen und Begriffe in Erinnerung rufen, die im Abschnitt über zyklische Gruppen eingeführt worden sind.

Der Ausgangspunkt ist die multiplikative prime Restklassengruppe mod n, ( n*, ·), wobei wir für n = p > 2 wählen. Damit ist ( p*, ·) zyklisch und hat φ(p) = p-1 Elemente, nämlich 1,2, .... p-1. Das sind genau die Adressen der Tabelle (0 wird durch die Hashfunktion f_0(k) = 0 erreicht).

Wählt man nun eine Primitivwurzel w, dann sind die kleinsten Reste der Potenzen w,w^2,w^3,….,wp-1 alle voneinander verschieden und erzeugen die gewünschte Adressmenge A\{0} = {1,2,…,p-1}.

Beispiel:

Modul p = 7

Restklasse:        2      3      4      5      6

Primitivwurzel:   n       j       n       j       n

w,w^2,w^3,….,wp-1 mit w = 3 liefert 3,2,6,4,5,1; Ordnung φ(p) = p-1 = 6

w,w^2,w^3,….,wp-1 mit w = 5 liefert 5,4,6,2,3,1

a,a^2,a^3,….,ap-1 mit a = 6 liefert 6,1,6,1,6,1; Ordnung 2.

Für Hashtabellen der Länge p sind aus Effizienzgründen besonders jene p als Tabellenlänge interessant, für die w = 2 eine Primitivwurzel ist, denn dann kann man das Potenzieren iterativ durch einen shift left erledigen!

Da A und A\{0} zusammen einen Körper bilden, erhalten wir mit fi(k) = f_0(k) + q(i,p) mod p und einer Primitivwurzel w mod p und q(0,p) = 0 einfach

f_0(k) = k mod p

fi(k) = f_0(k) + wi mod p, i=1,2,..., p-1

als Verfahren für die Kollisionsstrategie zusammen mit der Hashfunktion k mod p.

11.5. Berechnung ganzzahliger Potenzen

Bei einer Reihe von Anwendungen, insbesondere in der Kryptographie ist für x ∈ , d, m ∈ die Berechnung von xd mod m erforderlich.

Ein unmittelbarer Ansatz wäre, x mit sich selbst d-1 mal zu multiplizieren. Es geht aber schneller; nämlich in der Größenordnung log_2 d (man schreibt dazu: O(log d)). Die Idee für das Verfahren fußt auf der Technik „divide et impera“ (divide and conquer) und ist aus nachfolgender rekursiver Beschreibung unmittelbar einsichtig:

Bei der algorithmischen Umsetzung kommt es auf die Performanz an, die durch folgende Überlegungen erzielt wird:

Mit Blick auf die Implementierung in einer digitalen Rechenanlage, in der ganze Zahlen in einem Wort der Länge n Bit dargestellt werden, denken wir uns d zur Basis 2 dargestellt.

Man beachte, dass wegen d > 0 das Vorzeichenbit dn-1 = 0 ist.

Unter Anwendung der Rechenregeln xn xm = xn+m und (xm)k = xmk erhält man daher

Beispiel: x^18= x2^4 + 2n

Dadurch ist xd als Produkt von Quadraten dargestellt und das Verfahren wird in der Literatur als Square – and – Multiply-Methode bezeichnet.

Die algorithmische Umsetzung in Pseudocode lautet damit:

Zunächst wird immer der Zwischenwert z^2j berechnet.

Mit der Abfrage von Bit dj wird entschieden, ob mit dem bisherigen Wert x^2j zu multiplizieren ist oder ob wegen ( x x^2j)0 = 1 diese Multiplikation gar nicht ausgeführt zu werden braucht. Da n ~ log_2d bei größtmöglichem Wert in der Binärdarstellung von d ist, werden insgesamt höchstens 2 log_2d Multiplikationen ausgeführt.

11.6. Kryptographische Hashfunktionen

11.6.1. Fragestellung

Im Zusammenhang mit Hashcoding (gestreuter Speicherung) für Speichern und Suchen in Tabellen hatten wir von einer Hashfunktion f(k) → A gesprochen: Eine im Allgemeinen nicht bijektive, aber surjektive Abbildung von Schlüsseln k aus einer Schlüsselmenge K auf eine Adressmenge A.

Bei kryptographischen Aufgaben und bei elektronischen Signaturen geht es darum, einem Text (Nachricht, message) m∈T einer Textmenge T variabler Länge einen bestimmten Zahlenwert f(m) zuzuordnen und anzuhängen. Wird der Text unbefugt zu m_1 verändert, so sollte man eine solche Manipulation durch Vergleich von f(m_1) mit f(m) erkennen können.

Daher bedarf es zusätzlicher Eigenschaften für solche Hashfunktionen und man spricht dann von kryptographischen Hashfunktionen:

- die Länge des Inputs m∈T ist beliebig

- das Bild der Funktion f(m) hat feste Länge

- f(m) muss leicht und schnell berechnet werden können

- f(m) soll kollisionsresistent sein

- f(m) soll eine so genannte „Einwegfunktion“ sein.

Hashfunktionen sind (i.A.) nicht injektiv, daher gibt es Kollisionen:

f(m_1) = f(m_2) für m_1 ≠ m_2.

Eine Hashfunktion heißt schwach kollisionsresistent, wenn es kein effizientes Verfahren gibt, das bei Eingabe von m ein m_1 findet mit f(m) = f(m_1). Sie heißt stark kollisionsresistent, wenn es keinen effizienten Algorithmus gibt, der zwei Nachrichten m_1, m_2 findet mit f(m_1) = f(m_2).

Dies ist eine stärkere Forderung.

Die letzte Eigenschaft in obiger Aufzählung verlangt: Es gibt entweder wirklich keine Inverse f -1(m) oder man kennt kein effizientes Verfahren (d.h. innerhalb realistischer Rechenzeiten, Größenordnung: einige hundert Jahre), mit dem f -1(m) bestimmt werden könnte und man zugleich gute Gründe angeben kann, ein solches Verfahren niemals finden zu können.  Einwegfunktion bedeutet demnach, dass man aus gegebenem h = f(m) und bekannter Funktion f den Text m nicht berechnen kann.

Die Forderung, dass f(m_1) ≠ f(m_2) für m_1 ≠ m_2 sozusagen in praktischen Fällen fast immer gelten soll, kann man auch unter Verwendung des intuitiven „praktisch nicht errechenbar“ so umschreiben: Es soll kein bekanntes Verfahren geben, mit dem man zu einem Text m_1 einen anderen (sinnvollen) Text m_2 finden kann, sodass f(m_1) = f(m_2) ist, außer man würde alle Möglichkeiten durchprobieren.

11.6.2. Beispiele für kryptographische Hashfunktionen

Man kann sich einen Text m in kürzere Blöcke mi fester oder variabler Länge dargestellt denken. Jedes mi wird als Zahl ∈ interpretiert. Damit sind bei theoretischen Überlegungen Methoden und Sätze der Zahlentheorie bzw. Gruppentheorie verwendbar. Ferner ist es auch möglich, dass das Ergebnis von f(mi) die nachfolgende Operation f(mi+1) beeinflusst. Wenn es von der Schreibweise her zweckmäßig ist, notieren wir m statt mi.

Methode durch Exponentiation:

Vorauszuschicken ist, dass diese Methode nur für kurze Nachrichten m (z.B. Passwörter und dgl.) sinnvoll ist, da das Ergebnis f(m) gleich lang wie m ist und der Berechnungsaufwand nicht vernachlässigbar ist.

Man wählt zwei sehr große (> 200 Ziffern) Primzahlen p, q und bildet n = p · q. Die Zahlen p und q müssen geheim bleiben! Die Euler´sche φ-Funktion ist φ(n) = φ(p) · φ(q) = (p-1) · (q-1) und wir wissen

xφ(n) ≡ 1 mod n

da φ(n) die Ordnung der primen Restklassengruppe mod n ist.

Daraus folgt allgemein für k ∈

xk φ(n)+1 ≡ x mod n

Man wählt nun eine Zahl e mit ggT(e,φ(n)) = 1 und bildet als Hashfunktion

f(m) ≡ me mod n

Dieser Ansatz bildet auch die Basis für die später vorgestellte RSA Verschlüsselungsmethode. Wir setzen zur Vereinfachung c für den resultierenden Hashwert: c= f(m).

Hätte man die Absicht, aus c wieder den ursprünglichen – jetzt unbekannten – Text m zu berechnen, müsste man die Zahl d aus der Kongruenz

e·d ≡ 1 mod φ(n)

berechnen bzw. wegen obiger Folgerung

e·d ≡ k·φ(n)+1

lösen. Denn es gilt

cd ≡ (mw)d ≡ med ≡ mk φ(n)+1 ≡ m mod n.

Es ist zwar unbewiesen, gilt aber praktisch als abgesichert, dass dies nur bei bekannter Primzahlzerlegung n = p·q innerhalb praktikabler Zeit machbar ist, sofern die geheimen Primzahlen p und q mit genügend vielen Stellen gewählt worden sind.

Das Verfahren von Jueneman:

Das Verfahren beruht auf Quadratresten mod p und der in der Praxis bestätigten Beobachtung, dass außer durch Durchprobieren – und damit bei genügend großer Primzahl p nicht innerhalb brauchbarer Zeit - die Kongruenz x^2 ≡ a mod p nicht gelöst werden kann.

Allerdings ist hinzuzufügen, dass dieses Verfahren nicht als kryptographisch sicher gilt und besonders ausgefeilten Attacken laut Literatur nicht standhält, sodass kompliziertere Variationen davon eingeführt worden sind.

Die Nachricht m wird in t Bit-Blöcke mi je der Länge k unterteilt, sodass die mi als Zahlen im Intervall [0, 2k-1] zu verstehen sind.

Dann berechnet man mit einem zufällig zu wählenden Anfangswert f_0 die Ausdrücke

fi = (fi-1 + mi)2 mod p, p prim

wobei p so zu wählen ist, dass p ≥ 2k – 1. Bei k = 16 wird die Mersenne´sche Primzahl 2^31-1 empfohlen.

11.6.3. Speichern von Passwörtern

Neben den vielen Anwendungen von kryptographischen Hashfunktionen sei eine ausgewählt: die sichere Speicherung von Passwörtern in einem Computersystem. Ein Spezialfall für ein Computersystem ist die Chipkarte.

Es geht um die Frage der Authentizität einer Person, also um die Überprüfung, ob eine bestimmte Nachricht von einer Person stammt, die sie zu sein vorgibt.

Zunächst bedarf es eines Geheimnisses P, über das nur diese Person verfügt. Bei einem Computersystem ist dies das Passwort, bei einer Chipkarte spricht man von einer PIN (Persönliche Identifikations-Nummer).

Das Computersystem verfügt über eine Passwortdatei und nach Eingabe von P kann überprüft werden, ob P in dieser Datei abgespeichert ist. Wenn dies der Fall ist, können davon Rechte oder Ereignisse abgeleitet werden, z.B. ein „Log In“ oder im Falle der PIN eine finanzielle Transaktion bzw. Kommunikation mit einem Computersystem, das die gewünschte Transaktion zulässt und durchführt.

Damit ist die Passwortdatei der neuralgische Punkt. Ein erster Ansatz ist, diese zu verschlüsseln, wobei der Schlüssel nur dem System bekannt ist. Gelingt es aber einem Angreifer, dieses Schlüssels habhaft zu werden, etwa die Stelle ausfindig zu machen, wo dieser gespeichert ist, so ist nichts gewonnen bzw. alles verloren.

Unbeschadet, ob die Passwortdatei aus zusätzlichen Sicherheitsüberlegungen dennoch verschlüsselt wird, bedient man sich folgenden Ansatzes:

Anstatt von P wird ein Hashwert f(P) in der Passwortdatei abgespeichert. Wenn die Hashfunktion die eingangs geforderten Eigenschaften aufweist, ist es praktisch nicht möglich, aus f(P) das Originalpasswort zu errechnen. Das System (die Chipkarte) muss demnach „nur“ bei eingegebenem Passwort (PIN) PE vergleichen, ob f(PE) mit einem in der Passwortdatei bzw. mit dem auf der Chipkarte abge speicherten Hashwert f(P) übereinstimmt. Wegen der Kollisionsresistenz kann auch kein zu P äquivalentes P_1 mit f(P) = f(P_1) gefunden werden.

In der Praxis kommen zusätzliche Sicherheitsmerkmale hinzu:

- Um ein systematisches Durchprobieren zu verhindern (Beispiel: Chipkarte hat i.A. nur einen 4-stelligen numerischen PIN), sperrt das System bspw. nach dem 3. Versuch.

- Intern wird P durch einen längeren Schlüssel PI ersetzt, in dem mit Hilfe von Zufallsgeneratoren zusammen mit sonstigen benutzerspezifischen Daten der Schlüssel P zu PI ergänzt wird. Die Sprechweise ist: P wird durch „Salt“ (Salz) auf PI ergänzt. Es wird dann der Hashwert f(PI) anstatt von f(P) berechnet. Um später den erforderlichen Vergleich durchführen zu können, muss allerdings f(PI) zusammen mit dem Klartext des Salzes ergänzt werden. Anstatt des Klartextes kann man eine Verschlüsselung davon mit nur intern bekanntem Schlüssel ablegen.

- Der Hashwert wird in einer geschützten Datei (in UNIX-Derivaten „shadow Datei“ genannt) abgelegt, auf die nur über das Administrator-Passwort zugegriffen werden kann.

Diese Maßnahmen bringen folgende Vorteile:

- Durch die Zugriffskontrolle über ein gesondertes Administratorpasswort soll ein Auslesen (Kopieren) der Datei verhindert werden. Bei einer Chipkarte kann ein Kopieren aus physikalischen Gründen ausgeschlossen werden, ein Vorteil, den die alte Bankomatkarte mit Magnetstreifen nicht hatte! Bei Computersystemen (PCs) ist das Auslesen der Passwortdatei allerdings oft nicht verhinderbar, weil man bei physikalischem Zugriff auf den PC die Harddisk ausbauen und in ein System einbringen könnte, in welchem der Angreifer das Administrator – Passwort kennt (mögliche Gegenmaßnahme: verschlüsseltes Dateisystem). Gegen Angriffe von Außen ist Shadowing aber sehr effektiv. Sehr wichtig ist die Wahl eines „starken“ Passwortes: Mindestens 8, besser 10 Zeichen, Groß- und Kleinbuchstaben und Sonderzeichen! Auch sollte ein solches Passwort nicht „sprechend“ sein wie z.B. „1Help4You!“.

- Wenn Anwender unbeschadet empfohlener Richtlinien für Passwörter kurze oder häufig vorkommende Passwörter verwenden, so bringt das Salzen (partielle) Abhilfe, da dann auch zwei idente Passwörter durch das hinzugefügte Salz verschiedene Hashwerte liefern. Somit kann durch bloßes Vergleichen von Hashwerten nicht festgestellt werden, welche Benutzer idente Passwörter verwenden.

Zusätzlich wird folgender Angriff erschwert: Ist das verwendete Hashverfahren (MD5, SHA1, s.u.) bekannt und ist ein Zugriff auf die Passwortdatei einem Angreifer tatsächlich gelungen, so könnte dieser im Internet verfügbare Listen von häufig verwendeten Passwörtern bzw. Einträgen in Wörterbüchern um deren Hashwerte ergänzen und dann der Reihe nach die Einträge vergleichen. Durch das für jedes Passwort unterschiedliche „Salz“ muss aber für jeden Eintrag in der Vergleichsliste die Ergänzung um das Salz vorgenommen und der Hashwert neu berechnet werden. Außerdem muss man den verwendeten Schlüssel für das chiffrierte Salz kennen. Dies erhöht den Aufwand damit insgesamt jedenfalls beträchtlich. Die beste Vorkehrung gegen solche Wörterbuch-Attacken aber ist nach wie vor die Wahl eines starken Passwortes.

11.6.4. Standardisierte kryptographische Hashfunktionen

In Computernetzwerken bzw. allgemein in verteilten Systemen muss client- und serverseitig eine Übereinkunft hinsichtlich der verwendeten Hashfunktion bestehen, um den für eine Authentifizierung erforderlichen Vergleich der Hashwerte durchführen zu können. Es darf ja nur der Hashwert und nie der Schlüssel selbst über das Netz vom Client zum Server transportiert werden. Daher gibt es weltweit einige genormte Verfahren wie z.B. MD5 (Message Digest Algorithm 5) für einen 128 Bit Hashwert oder SHA1 (Secure Hash Algorithm, NIS (National Institute of Standards)) für 160 Bit. Für beide Verfahren wurden jedoch (2004 und 2006) Kollisionsangriffe entdeckt, sodass z.B. anstatt SHA1 das SHA2 Verfahren für einen 256 Bit Hashwert (oder Varianten davon, wie z.B. SHA384 ) verwendet (werden) wird. Die genannten Verfahren sind alle im Prinzip ähnlich und basieren auf Sätzen aus der Zahlentheorie und Algebra. In der Implementierung allerdings werden die Rechenoperationen durch zyklische Shift-Operationen und XOR-Verknüpfungen der in Blöcken zusammengefassten Bitmustern mit aus Boole’schen Ausdrücken errechneten Bits umgesetzt. Dieser Vorgang wird in vielen „Runden“ wiederholt.

Um dem Leser einen Eindruck zu vermitteln, wie solche Verfahren algorithmisch ablaufen, stellen wir hier den SHA1 Algorithmus in einer an JAVA bzw. C angelehnten Notation vor. Für die weiteren Erläuterungen werden folgende Operationen vorausgesetzt:

XOR Verknüpfung (Wörter à 32 Bit)

+            Addition modulo 32

<<< s     zyklisches Verschieben nach links um s Bits (32 Bit Gesamtlänge)

¬            NOT

^, v         UND, ODER

Als Eingabe dient ein Bit-String B der Länge b, wobei b < 2^64. Die Ausgabe ist der berechnete Hashwert, der aus 160 Bit besteht.

Folgende Konstanten sind als definiert gegeben:

A = 0x67452301

B = 0xEFCDAB89

C = 0x98BADCFE

D = 0x10325476

E = 0xC3D2E1F0

In einem ersten Schritt wird B unterteilt in Blöcke à 512 Bits. Weiters wird B um Folgendes erweitert, wobei nachfolgende Abbildung schrittweise den Prozess visualisiert:

• 1

• dann 0…0, sodass letzter Block 448 Bits hat

• in verbleibende 64 Bits: Eintrag der Länge b (big endian Format)

• Ergebnis: n Blöcke je 512 Bit lang

Abb. 11.1

Der erste der 512 Bit langen Blöcke wird aufgeteilt in 16 Wörter mt, t = 0, …, 15 à 32 Bits.

Diese 16 Wörter werden durch 80 Wörter wt à 32 Bits ersetzt, wobei:

wt = mt

für t = 0, 1, ..., 15

wt = (wt-3  wt-8 wt-14 wt-16) <<< 1

für t = 16, 17, …, 79

Es folgen 80 „Runden“, bei denen folgende Berechnung erfolgt:

Ferner werden in der „Loop“ (s.u.) spezielle Konstanten verwendet:

kt = 0x5A827999                 t = 0, …, 19

kt = 0x6ED9EBA1               t = 20, …, 39

kt = 0x8F1BBCDC              t = 40, …, 59

kt = 0xCA62C1D6               t = 60, …, 79

Die in der Loop verwendeten Variablen a, b, c, d, e werden mit A, B, …, E initialisiert und bilden einen Initial-Hashwert mit 160 Bits:

a = A         d.h. a = 0x67452301

...

e = E         d.h. e = 0xC3D2E1F0

In der Loop werden die Werte von a, b, c, d, e in 80 Runden verändert. a, b, c, d, e werden zum Initialhashwert für den ersten Block, wobei h (anstatt von A, …, E) für den zweiten Block als Initialwert verwendet wird, usw.

11.7. Asymmetrische Verschlüsselung

Allen Verschlüsselungsverfahren ist gemeinsam, dass sie auf das Schlüsselgeheimnis setzen und nicht etwa davon ausgehen, dass das Chiffrierverfahren selbst geheim gehalten wird. Letzteres wäre weder möglich noch sinnvoll, da Kryptologen als Wissenschaftler ihre Ergebnisse publizieren und gezielt von Kryptoanalysten testen lassen wollen.

Das Schlüsselgeheimnis setzt nicht nur voraus, dass ein beliebig wählbarer Schlüssel k nicht verraten werden darf, sondern dass er auch „stark“ ist: Er muss eine Mindestlänge an Stellen haben. Beim ASCII-Zeichensatz verlangt man mehr als 8 Zeichen und k soll Sonderzeichen, Groß-/Kleinbuchstaben und Ziffern enthalten. Da jeder Bitstring als Zahl x ∈ interpretiert werden kann, nehmen wir in der Folge k ∈ an.

Man unterscheidet zwischen symmetrischen und asymmetrischen Verschlüsselungsverfahren.

Bei ersteren verwendet man für das Ver- und Entschlüsseln denselben Schlüssel k. Es gibt eine Reihe von standardisierten und schnellen Algorithmen für solche symmetrische Verfahren. Ihr einziger aber besonderer Nachteil ist, dass es vorher zu einem Schlüsselaustausch kommen muss, wenn der Empfänger einer Nachricht ein Chiffrat entschlüsseln will. Wenn mehrere Sender Si einem einzigen Empfänger E verschlüsselt Nachrichten zukommen lassen wollen und zugleich verhindert werden soll, dass Si die Nachricht von Sj an E entschlüsseln darf, muss E ein Verzeichnis der von den Si verwendeten Schlüsseln ki haben. Damit tut sich eine Sicherheitslücke auf.

Asymmetrische Schlüsselverfahren verwenden zwei Schlüssel: einen öffentlichen „e“ und einen geheimen Schlüssel „d“.

Das wichtigste asymmetrische Verfahren ist die RSA-Methode, benannt nach ihren Erfindern R. Rivest, A. Shamir und L. Adleman.

Die Methode beruht auf der Schwierigkeit, sehr große Zahlen zu faktorisieren, wie wir dies bei kryptographischen Hashfunktionen schon erwähnt haben. Das RSA Verfahren folgt den Überlegungen bei der Beschreibung der Methode durch Exponentation, sodass wir hier nur mehr die Vorgangsweise beschreiben. Zur Vereinfachung der Schreibweise nehmen wir wieder an, dass die zu verschlüsselnde Nachricht m ∈ kurz ist.

(1) Man wählt zwei große, geheim zu bleibende Primzahlen p und q und bildet n = p · q. Die Zahl n selbst wird öffentlich bekannt gegeben.

(2) Als öffentlichen Schlüssel e wählt man das Paar (e,n), wobei e relativ prim zu φ (n) = (p-1) · (q-1) ist.

(3) Als privaten Schlüssel bestimmt man das Paar (d,n) mit d = e-1 mod φ (n) was in Kenntnis von e und n möglich ist. Dieser Schlüssel d muss geheim bleiben.

(4) Das Verschlüsseln einer Nachricht m zum Chiffrat c erfolgt durch c = me mod n

Da (e,n) öffentlich bekannt ist, kann jede Person bzw. System eine Nachricht m verschlüsseln und dem Empfänger zukommen lassen. Diese Nachricht kann aber von einem Spion ohne Kenntnis von p bzw. q nicht (in vernünftiger Zeit) entschlüsselt werden.

(5) Der Empfänger kann die erhaltene verschlüsselte Nachricht c entschlüsseln mittels m = cd mod n

Die Bestimmungen (2) und (3) bedeuten: man hat e und d so zu wählen, dass e·d mod φ (n) = 1. Sobald e mit ggT(e, φ (n)) =1 gewählt worden ist, kann man d mit dem erweiterten Euklid´schen Algorithmus berechnen.

Nach dem Hauptsatz über den ggT gibt es a,b ∈ mit ggT(a,b) = u zwei Zahlen x, y ∈ , sodass ax + by = u. Der Algorithmus liefert x,y, in unserem Falle daher x·φ (n) + y·e = 1. Da ferner x·φ (n) ≡ 0 mod φ (n) ist, erhält man mit y den gesuchten Wert für d.

Beispiel:

Sei p = 193 und q = 577 und somit n = 111361. Des Beispieles wegen sind hier p und q (viel zu) klein gewählt. In der Praxis sind Primzahlen mit mindestens 130 Stellen zu nehmen!

Es ist φ (n) = 192·576 = 110592 und wir nehmen e = 563.

Für d erhält man d = 104699.

Ein Klartext m = 688 wird so zu c = 11665.

Dass nach (5) mit cd mod n wieder m geliefert wird, wurde im vorigen Abschnitt bereits abgeleitet.

Mit der RSA Methode, die wegen des erforderlichen Rechenaufwandes nur für kleine m zweckmäßig ist, hat man eine elegante Methode zur Lösung des Problems des Schlüsselaustausches:

Der Sender verschlüsselt einen großen Text m mittels eines symmetrischen Verfahrens zu c. Dann teilt er dem Empfänger nicht nur das Chiffre c mit, sondern zugleich auch den verwendeten Schlüssel k, nachdem dieser mittels des öffentlich bekannten Schlüssel (e,n) des Empfängers ebenfalls verschlüsselt worden ist. Der Empfänger kann nun mit dem nur ihm bekannten privaten Schlüssel (d,n) das k berechnen und hat damit den benötigten Schlüssel zum Dechiffrieren von c.

Eine besondere Eigenschaft des RSA-Verfahrens ist, dass der geheime und der öffentliche Schlüssel vertauscht werden können. Damit eignet sich RSA gut für elektronische Unterschriften: Man kann ein zugeteiltes Zertifikat (Unterschrift) mit (d,n) verschlüsseln und jeder kann mit (e,n) entschlüsseln und so die Unterschrift prüfen.

Das RSA Verfahren birgt ein mögliches Problem: Wie kann der Sender A einer Nachricht sicher sein, dass der von ihm verwendete öffentliche Schlüssel (e,n) wirklich vom Empfänger B stammt? Es gibt da immer noch den berüchtigten „man in the middle“, der z.B. bei der Übertragung bzw. Publikation des öffentlichen Schlüssels dem Empfänger diesen gegen seinen eigenen austauschen kann, später dann die vom Sender A empfangene Nachricht dechiffriert und nach Verschlüsseln mit dem ihm bekannten tatsächlichen öffentlichen Schlüssel von B an den Empfänger B ganz harmlos weiterleitet. Man umgeht dieses Problem u.a. damit, dass international zertifizierte Agenturen diese öffentlichen Schlüssel in geeigneter Form verwalten. Man muss diesen Agenturen dann trauen: Sie garantieren - z.B. durch eine elektronische Signatur - die Authentizität.

11.8. Schlüsselaustausch über unsicheren Kanal

Es gibt aber noch eine weitere Möglichkeit, sich auf einen gemeinsamen Schlüssel k zu einigen. Sie wird nach ihren Erfindern als Diffie-Hellman-Schlüsselaustauschverfahren bezeichnet.

Zwar ist dasselbe Authentifizierungsproblem wie beim RSA gegeben, doch ist das Verfahren verblüffend einfach und gestattet n > 2 Personen Ai, sich gemeinsam auf Schlüssel kij zur Kommunikation zwischen Person Ai (Sender) und Person Ai (Empfänger) zu einigen, ohne dass die kij explizit (verschlüsselt) über Kommunikationskanäle versandt werden müssen.

Die Methode ist aus zahlentheoretischer bzw. algebraischer Sicht nicht unähnlich dem RSA Verfahren. Sie basiert auf dem diskreten Logarithmus in endlichen Körpern.

Wir kennen den Logarithmus als Umkehrfunktion der Exponentialfunktion in

Beim diskreten Logarithmus geht man von folgendem aus:

y = wx mod p

Man nennt f(x) = wx mod p eine diskrete Exponentialfunktion und entsprechend der Umkehrfunktion stellt sich die Aufgabe, ein ganzzahliges x mod p als Lösung zu suchen. Diese existiert eindeutig, wenn für w eine Primitivwurzel mod p gewählt wird. Der Wert x heißt diskreter Logarithmus.

Beispiel:

y ≡ 4x mod 17 : für x = 6 → y = 16

umgekehrt: aus 16 ≡ 4x mod 17 → x = 6

Im Folgenden werden wir mit Blick auf das Diffie - Hellman -Verfahren immer die multiplikative Gruppe p voraussetzen, die mit p prim einen Körper ( p+,·) bildet, sodass man wie gewohnt rechnen kann.

Es gilt nun als akzeptiert, dass die Berechnung des diskreten Logarithmus aus der Beziehung y = wx mod p praktisch nicht möglich ist, wenn p genügend groß gewählt wird. Diese Annahme ist ähnlich wie jene bei der Aufgabe, sehr große Zahlen zu faktorisieren. Bewiesen ist dies allerdings nicht. Wichtig ist dazu noch die Forderung, dass φ(p) = p-1 selbst mindestens einen großen Primfaktor q besitzt. Ansonsten gibt es tatsächlich Algorithmen zur Berechnung des diskreten Logarithmus innerhalb realistischer Zeit, wie die Erfinder des zu besprechenden Verfahrens selbst nachgewiesen haben.

Unter diesen Annahmen ist das Diffie-Hellman –Verfahren jedenfalls denkbar einfach:

Die Sender Ai und die Empfänger Aj einigen sich auf zwei Zahlen p und w mit

(1) p ist eine sehr große Primzahl

(2) w ist eine Primitivwurzel mod p, d.h.: ord(w) = p-1 und wi mod p erzeugt für i = 1,2,... p-1 die Zahlen 1,2,... (p-1) in einer gewissen Reihenfolge. Dadurch ist sichergestellt, dass die Lösung von y = wx mod p ein Element der Gruppe und eindeutig ist.

(3) p und w müssen dabei gar nicht geheim bleiben, sodass man diese Werte aus einer Tabelle o.Ä. nehmen kann.

Der Ablauf des Verfahrens ist nun wie folgt:

(1) Jeder Ai wählt eine große zufällige Zahl xi < (p-1) und sendet an jeden anderen beteiligten Aj den Wert yi = wxi mod p. Die Zahl xi selbst wird geheimgehalten.

Um das Authentifizierungsproblem zu umgehen, kann yi von einer der oben genannten Agenturen zertifiziert werden.

Damit haben alle Ai Kenntnis über die yi und kennen zudem ihr ganz persönliches xi, nicht aber die xj mit i ≠ j.

(2) Wenn später Ai mit Aj kommunizieren will, etwa eine Nachricht mit einem symmetrischen Verfahren austauschen will, so haben beide folgende Operation durchzuführen, um einen gemeinsamen Schlüssel kij zu vereinbaren:

kij = (yj)xi mod p.

Wir haben schon ein Verfahren angegeben, wie man selbst für große Exponenten diese Potenz mod p effizient berechnen kann, die Square – and – Multiply-Methode.

Man beachte nun folgende Beziehung: kij = (yjj)xi = (wxj) xi = w xi xi mod p = w xi xj = kji

Somit sind die kij und kji mod p ident und beide Seiten können chiffrieren und wieder dechiffrieren, ohne den Schlüssel selbst ausgetauscht zu haben.

Natürlich könnte ein Angreifer die bekannten Größen yi bzw. yj z.B. aus dem Verzeichnis der Agentur nehmen oder durch Abhören des Übertragungskanals erfahren. Dann wäre der diskrete Logarithmus xi, die Umkehrung von k = (yi)xi mod p, zu berechnen. Unter den genannten Voraussetzungen kann man aber zur Zeit davon ausgehen, dass dies praktisch nicht möglich ist.

11.9. Breitensuche in einem Graphen

Gerichtete oder ungerichtete Graphen werden meist als Modelle zur Beschreibung bestimmter Aufgabenstellungen herangezogen. Die Knoten können für Städte, Produktionsorte, technische Geräte (z.B. Router) in einem Computernetzwerk usw. stehen, während die Kanten mit ihren Bewertungen darüber Auskunft geben, ob zwischen zwei Knoten z.B. etwas transportiert (Güter, Datenpakete o.ä.) werden kann und wie weit die Entfernung zwischen zwei Knoten ist oder wie hoch die Errichtungs- oder Transportkosten sind. Die Interpretation der Kantenbewertung hängt vom Zweck des Modells ab.

Eine häufige Aufgabe ist, von einem gewählten Startknoten s ∈ V(X) alle anderen Knoten x ∈ V(X) zu besuchen.

Dazu stellen wir eine Methode vor, die Breitensuche, die sich sowohl für gerichtete Graphen als auch ungerichtete Graphen eignet.

Bei zusammenhängenden ungerichteten Graphen X werden damit alle Knoten erreicht. Ist X nicht zusammenhängend, so wird die Komponente bestimmt, in der s liegt und das Verfahren hat mit einem neuen Startknoten, der bislang noch nicht erreicht worden ist, wiederholt zu werden.

Bei gerichteten Graphen X erreicht man alle Knoten x, die von s ausgehend über einen g.Weg W(s,x) erreichbar sind. Ist X stark zusammenhängend, so besucht man demnach immer alle Knoten.

Im Prinzip besteht das BSF-Verfahren aus folgenden Schritten:

(1) Man wähle den Startknoten s und markiere ihn als „besucht“. Er sei der „momentan untersuchte“ Knoten a. Alle anderen Knoten werden als „unbesucht“ markiert.

(2) Im allgemeinen Schritt betrachte man den momentan untersuchten Knoten a und

- betrachte (besuche) alle seine als „unbesucht“ markierten Nachbarn y, also die Knoten y, die mit a durch eine Kante [a,y] (bzw. <a,y>) verbunden sind und die noch nicht besucht worden sind. Markiere jeden dieser Knoten y als „besucht“ und füge ihn in eine Warteschlange Q am Ende derselben ein.

- anschließend nehme man den ersten vorderen Knoten b aus Q heraus, mache ihn zum momentan untersuchten Knoten a und wiederhole die in (2) genannten Schritte.

(3) Das Verfahren bricht ab, wenn die Warteschlange Q leer ist, also keine weiteren Knoten mehr enthält.

Im Zuge der Ausführung des Algorithmus wird systematisch ein Baum T = (V(X), E(T)) aufgebaut. Dieser ist, wenn der ungerichtete Graph X zusammenhängend ist, ein spannender Baum von X.

In der in Pseudocode notierten algorithmischen Umsetzung verwenden wir drei spezielle Operationen für eine Schlange Q von Knoten:

empty(Q):               Abfrage, ob Q leer ist

front(Q,b):               retourniert das vorderste Element b ∈ Q einer nicht leeren Schlange Q und entfernt dieses aus Q

enqueue(Q,y):       fügt den Knoten y am Ende von Q ein.

Ob ein Knoten x ∈ V(X) bereits besucht worden ist, erkennt man an einem Feld besucht[x] mit den Werten true bzw. false, das mit besucht[x] = false ∀ x ∈ V(X) initialisiert wird.

Mit output(x) werde der Knoten x (bzw. die Nummer des Knotens) ausgegeben und mit insert([x,y], E(T)) ein anfangs leerer Baum T schrittweise aufgebaut. Man beginnt mit einem Startknoten s.

11.10. Fluten und Link-State Routing in einem Netzwerk

Die vorliegende Aufgabe ist nicht unähnlich der vorigen. In einem ungerichteten Graphen als Modell für ein Computernetzwerk soll ein Router als Startknoten s an alle anderen Knoten (Router) ein bestimmtes Datenpaket versenden.

Die Aufgabe variiert aber in einem entscheidenden Punkt, sodass die BSF Methode nicht unmittelbar übernommen werden kann:

Jeder Knoten im Netz ist autonom und hat zunächst nur unmittelbare Kenntnis über seine Nachbarknoten.

Allerdings nehmen wir an, dass jedem Knoten die maximale Ausdehnung des Netzes bekannt ist. In einem Computernetzwerk spricht man von der maximalen Anzahl von Hops, graphentheoretisch formuliert entspricht dies der maximalen Länge eines Weges W(x,y) zwischen zwei Knoten in diesem Graphen. Dieser Wert wird in der Variablen maxhop festgehalten. In jedem Datenpaket wiederum wird die Variable hopcount, welche mit dem Wert von maxhop einmalig initialisiert wird, bei Erreichen eines Knotens y vor dem Weiterversand um 1 heruntergezählt.

Abb. 11.2

Obige Abbildung zeigt schematisch die Situation:

Der Knoten r ist über Eingangs/Ausgangsleitungen – der Graph ist ungerichtet – mit den ihn umgebenen Routern yi verbunden. Der Router r kennt die Namen (Adressen) dieser Router yi, nicht aber die Nachbarn zj der yi.

Ein geeignetes Protokoll sorgt für diese Kenntnis: r versendet ein Hello Paket an alle seine Nachbarn yi und diese versenden dieses wiederum an ihre Nachbarn unter Mitteilung ihres Namens (IP Adresse) usw., also auch an r.

Und damit ist auch schon die Basisidee des als Flooding (Fluten) bezeichneten Verfahrens charakterisiert. Um nun zu verhindern, dass auf dem i.A. nicht kreisfreien Graphen die Pakete ständig im Kreis herumgereicht werden, verwendet man den Zähler hopcount. Es wird bei der Ankunft in einem Knoten heruntergezählt: dec(hopcount). Hat hopcount den Wert Null, so wird das Paket einfach verworfen und nicht mehr weiter versandt:

Flooding Methode, autonom für jeden Knoten r:

Konkrete Implementierungen von Flooding sorgen dafür, dass bereits erhaltene und versandte Pakete nicht nochmals versandt werden und enthalten weitere Mechanismen, um die durch Flooding ausgelöste Redundanz im Pakettransport zu reduzieren. Dies kann man z.B dadurch erreichen, dass in den versandten Paketen zusätzliche Identifikationsmerkmale eingeführt werden. Unter der Voraussetzung, dass die lokalen Knoten Speicherfähigkeit haben, kann dann entschieden werden, ob ein Paket schon einmal eingelangt und weitergeleitet worden ist. Das Verfahren wurde daher nur im Prinzip vorgestellt.

Das nächste Verfahren setzt teilweise auf die vorigen Konzepte auf. Es geht aber auch darum, dass die einzelnen autonom arbeitenden Knoten einen Gesamtüberblick über das durch den Graphen modellierte Netzwerk bekommen.

Um Pakete von einem Knoten s zu einem anderen Knoten y - die Knoten haben eindeutige Nummern, die Adressen (IP-Adressen) genannt werden - nach bestimmten optimierende Kriterien versenden zu können, muss der Sender jedenfalls zum beobachteten Zeitpunkt mehr Information über seine Nachbarn haben, weil einer davon auszuwählen ist. Als Optimierungsziel kann z.B. die Bestimmung eines kürzesten Weges genommen werden  oder die Wahl eines Weges, in dem Engpässe vermieden werden, weil zum Zeitpunkt der Beobachtung bestimmte Kanten mit ihren vorgegebenen Kapazitäten (vgl.: Bandbreite) bereits gesättigt sind. Zum Optimieren ist daher zunächst die Kenntnis über die Topologie des Netzes, also den Graphen, notwendig.

Eine gängige Methode, um einen Graphen X in einem Computer darstellen, beruht auf der Adjazenzmatrix A von X. Nun genügt es aber, zu einem Knoten i in der zugehörigen Zeile von A nur jene aij zu speichern, die verschieden von Null sind. A wird reduziert zu einer Liste von Nachbarschaftslisten und umgekehrt kann man bei vollständiger Sammlung der Nachbarschaftslisten die Adjazenzmatrix aufbauen. Auf dieser Idee fußen sogenannte Link-State Protokolle, nach denen Router in Netzwerken Pakete mit bekannter Zieladresse (IP-Nummer) des empfangenden Knoten versenden:

(i)      Mit Hilfe (z.B.) der Flooding Methode werden spezielle Hello-Pakete H an alle anderen Router im Netz versandt.

(ii)    Das Link-State Protokoll – davon gibt es mehrere Varianten, auf eines davon müssen sich die Router geeinigt haben – verlangt von jedem ein Paket H empfangenden Knoten, dass er seinerseits mit einem Reply Paket R antwortet, welches wieder an alle anderen Knoten gesandt wird.

Jeder Knoten x versendet demnach einerseits Hello-Pakete H an alle anderen Knoten und erhält andererseits von allen Knoten y darauf hin ein Reply-Paket R. In jedem dieser R ist wiederum die Information über die Nachbarn von y enthalten.

Damit finden sich nach einer netzspezifischen Zeit alle Link-Pakete R bei jedem Knoten x ein, sodass vor Ort daraus der Graph konstruiert werden kann. Da sich das Netz dynamisch verändern kann, etwa durch Änderung in der Verkehrslast oder Ausfall oder Hinzufügen eines neuen Routers, sorgt das Protokoll dafür, dass dieser Datenaustausch periodisch wiederholt wird. An Hand von Zusatzinformation in den Paketen R kann ein Router entscheiden, ob er es schon einmal erhalten hat und daher verwerfen kann.

Als Bewertung der Kanten [x,y] kann man die Zeit nehmen, die verstreicht, bis von einem Nachbarn y von x ein Paket R als Antwort auf das versandte Paket H bei x eingegangen ist.

Ein Router x kann damit den kürzesten Weg berechnen, den ein Paket auf seiner Reise von x nach z einnehmen soll. In jedem Paket P, verschieden von H und R, steht auch die konkrete Zieladresse. Weil aber alle Knoten x selbst Router und damit autonome Rechner sind, wird in einer sogenannten Routing-Tabelle nicht der ganze Weg abgespeichert. Es genügt, diejenige Leitung und somit Nachbarn von x einzutragen, über die ein Paket nach momentanem Kenntnisstand zum Router z gesandt werden soll. Erhält ein Router ein Paket P mit einer ihm bislang unbekannten Zieladresse z, so wird P auf alle Leitungen mit Ausnahme der Eingangsleitung weitergesandt.

Die einzelnen Link-State-Verfahren unterscheiden sich nicht nur in der Datenstruktur der Link-Pakete, sondern auch durch die Regeln, wann und unter welchen Voraussetzungen neue Hello-Pakete H zu versenden sind und ob hereinkommende Reply Pakete R zu verwerfen sind oder zu einer Neuberechnung der Routing-Tabelle führen müssen. Ähnlich wie bei Flooding geht es bei konkreten Implementierungen auch darum, den Datenverkehr auf dem Netz so klein wie möglich zu halten. Zu diesem Zweck enthalten Pakete P Zusatzinformationen wie Folgenummern, Zeitmarken u.ä.

11.11. Maximaler Fluss und Matching in paaren Graphen

Zum Berechnen eines maximalen Matching Mmax in X = (V(X),E(X)) verwendet man erweiternde Wege. Bei paaren Graphen gibt es effiziente Verfahren, solche erweiternde Wege zu finden, um derart iterativ zu einem maximalen Matching Mmax zu kommen.

Das folgende Beispiel – unbeschadet, dass ein deutlich komplexerer Flussalgorithmus verwendet wird - ist aus Modellierungssicht interessant. Es zeigt sehr schön, dass man ein graphentheoretisches Modell für eine bestimmte Anwendungsdomäne D_1 (hier: maximaler Fluss) auf eine andere D_2 (hier: Zuordnungsproblem in paaren Graphen) übertragen kann. In diesem Sinne folgt man dem Prinzip der Wiederverwertung von bereits gefundenen Algorithmen. Durch Abstraktion in D_1 kommt man zu den Lösungen in D_2.

Die Problemstellung ist bekannt (Abb. 11.3):

Gesucht ist ein maximales Matching Mmax in einem paaren Graphen X mit V(X) = V_1 ∪ V2 und V_1 ∩ V_2 = ∅ .

Abb. 11.3

Man formt X zu einem Graphen N so um, dass N ein Transportnetz mit Quelle q, Senke s und Kapazitäten c(e) = 1 für seine Kanten E(N) wird:

(i)    Ergänze X um eine Quelle q und Senke s, sodass

V_1(N) = V_1(X) ∪ {q}

V_2(N) = V_2(X) ∪ {s}

V(N) = V_1(N) ∪ V_2(N)

(ii)   Ersetze die ungerichteten Kanten [x,y] ∈ E(X) durch <x,y> mit x ∈ V_1(X), y ∈ V_2(X) und verbinde jeden Knoten x ∈ V_1(N), x ≠ q, durch eine Kante <q,x> und jeden Knoten y ∈ V_2(N), y ≠ s durch eine Kante <y,s>. Alle diese Kanten bilden E(N).

(iii)   Als Kapazität aller Kanten e ∈ E(N) definiere c(e) = 1.

Durch diese Transformation von X zu N erhält man auf N ein Transportnetz. Es ist sofort einzusehen, dass ein maximaler Fluss Φ auf N ein maximales Matching Mmax auf X induziert.

11.12. Huffman Code

Die folgende Aufgabenstellung ist der Quellencodierung zuzurechnen. Der zu besprechende Code über A = {0,1} ist nach David A. Huffman (1925 – 1999) benannt. Der Code ist aus zwei Gründen interessant.

Zunächst besitzt er die sogenannte Präfixeigenschaft, die auch Fano-Bedingung (G. Fano, 1871 – 1952) genannt wird: Kein Codewort ist der Anfang eines anderen. Damit kommt der Huffman Code ohne gesondertes Trennsymbol t ∉ A aus.

Beispiel ohne Fano-Bedingung:

Es seien a,b,c,d codiert als 01, 011, 11, 101.

Dann ergibt sich für

abcd → 0101111101

aacca → 0101111101

und man kann wegen eines fehlenden Trennsymboles nicht eindeutig decodieren.

Beispiel mit Fano-Bedingung:

Es seinen a,b,c,d codiert als 00, 011, 11, 101, was durch einen binären Baum darstellbar ist:

Abb. 11.4

Die Codewörter für a,b,c,d ergeben sich, in dem man von der Wurzel zu den Blättern absteigt und dabei die Markierungen der Kanten anschreibt. Kanten, die zu einem linken Nachfolger eines Knotens führen, werden mit 0 markiert, die anderen mit 1. Es ist leicht einsehbar, dass ein derart konstruierter Code die Präfixeigenschaft hat und zugleich ist erklärt, woher die Bezeichnung „Präfix“ rührt: Kein Weg von der Wurzel zu einem Blatt ist Teilweg (Vorspann) eines anderen.

Für die zweite besonders wesentliche Eigenschaft bedarf es einer zusätzlichen Forderung: Man geht davon aus, dass in Texten, z.B. bei natürlichen Sprachen, manche Zeichen häufiger und manche relativ selten vorkommen. Das Ziel ist nun, die Länge der Codewörter so zu gestalten, dass häufig vorkommende Zeichen mit möglichst kurzen Wörtern über A und selten vorkommende mit entsprechend längeren codiert werden. Übertragen auf die Baumdarstellung bedeutet dies, dass häufige Zeichen möglichst nahe bei der Wurzel liegen sollen, während die seltenen durch entsprechend längere Wege erreichbar sein sollen. A. Huffman hat einen Algorithmus vorgeschlagen, der solche Huffman-Bäume konstruiert und bewiesen, dass der dadurch definierte Code im obigen Sinne optimal ist. Die Baumkonstruktion ist nicht eindeutig, sodass verschiedene Ergebnisse möglich sind:

(i)     Zeichne für jedes zu codierende Zeichen ein Blatt, gereiht nach den Häufigkeiten z.B. von links nach rechts und markiere (bewerte) die Blätter mit ihren korrespondierenden Häufigkeiten.

(ii)    Im allgemeinen Schritt wähle unter den Knoten, die noch keinen Vaterknoten haben, zwei Knoten x,y aus, die die kleinste Bewertung haben, kreiere einen Vaterknoten v dazu und bewerte v mit der Summe der Bewertungen von x und y.

Das Verfahren bricht ab, sobald die Wurzel w mit der Summe der Bewertungen ihrer Söhne markiert ist. Die Auswahl in Schritt (ii) ist nicht immer eindeutig. Daher können sich verschiedene Lösungen für den gesuchten Code ergeben.

Beispiel:

Angenommen, wir haben in einem Text für die Zeichen a,b,c,d,e festgestellt, dass sie mit folgenden relativen Häufigkeiten p(x) vorkommen:

p(a) = 0.12, p(b) = 0.42, p(c) = 0.09, p(d) = 0.3, p(e) = 0.07

Dann ist nachstehender Baum eine mögliche Lösung:

Abb. 11.5

Der Huffman Code ist sehr gut geeignet, um Dateien zu komprimieren. Man kann entweder die relativen Häufigkeiten für einen Text vorab bestimmen oder in Form einer Tabelle Erfahrungs- bzw. Mittelwerte für vergleichbare typische Texte verwenden.

Eine nette Anwendung findet man bei der Analyse der Texte von Autoren. Man kann bei gegebenem Algorithmus die mittleren erzielten Komprimierungsfaktoren für Texte eines Autors M_1 mit denen eines anderen M_2 vergleichen bzw. versuchen, ob man einen bestimmten Text einem Autor, für den ein „charakteristischer Komprimierungsfaktor“ bekannt ist, auf diese Weise zuordnen kann.

11.13. Halden

Eine Halde (engl.: heap) ist in Anwendungen der Informatik eine wichtige Datenstruktur, weil damit das Minimum (oder wahlweise Maximum) einer Menge von Zahlen nach entsprechender Organisation sofort, in einem Zugriff, bestimmt werden kann. Modelliert werden Halden durch Binäre Bäume und zugleich erhält man aus der Definition einen Hinweis, wie man solche Halden elegant in einem linearen Feld (array) speichern kann.

Definition 11.3: Eine Folge H = {k_1, k_2, …, kn} von n Schlüsseln ki ∈ heißt Halde, wenn folgende Beziehung gilt:

ki ≥ ki DIV 2 für 2 ≤ i ≤ n

Daraus folgen die Beziehungen ki ≤ k2i und ki ≤ k2i+1, für 2i ≤ n bzw. 2i + 1 ≤ n.

Der Ausgangspunkt ist die in Abb. 11.6 veranschaulichte Überlegung, wie man einen streng binären Baum, dessen Knoten Schlüssel ki zugeordnet sind, in einem Feld abspeichern kann.

Abb. 11.6

Für die Positionen (Index) des Knotens i, dem der Schlüssel ki zugeordnet ist, gilt:

(i)          das linke Kind von i hat den Index 2 * i

(ii)         das rechte Kind von i hat den Index 2 * i + 1

(iii)        der Vater (Mutter) von Kind i ist auf Index i DIV 2 zu finden.

Nachstehend sind zwei weitere Beispiele gezeichnet. In der Abb. 11.7 ist eine Halde dargestellt, deren Baum binär aber nicht vollständig ist, in der Abb. 11.8 ist eine Situation gezeigt, die gegen die Haldenbedingung verstößt.

Abb. 11.7

Abb. 11.8

Darauf basierend folgt die Anwendung als Vorrangswarteschlange (engl: Priority Queue): Aus n Zahlen ≥ 0 (Prioritäten, die höchste Priorität sei durch die kleinste Zahl repräsentiert) wird eine Halde konstruiert, sodass im zugehörigen Baum die höchste Priorität (kleinste Zahl) der Wurzel zugeordnet ist.

Eine typische Anwendung ist: Beim Prozess-Scheduling in Betriebssystemen ist es z.B. wichtig, aus einer Menge von wartenden Prozessen sehr schnell jenen Prozess zu finden, der momentan die höchste Priorität hat, um ihm die CPU zuordnen zu können. Kommt ein neuer Prozess mit Priorität p hinzu, so wird

(i)      p zunächst als Blatt im Baum „rechts unten“, also als letztes, eingefügt.

(ii)     Dann wandert p im Baum solange hinauf, bis die Heap-Bedingung erfüllt ist. Der Index des Vaters (d.h. Position im Feld) ist durch die Operation DIV 2 leicht zu bestimmen.

Die Vorgangsweise ist in der Abb. 11.9 und der Abb. 11.10 illustriert.

Man beachte, dass der Aufwand für das Vergleichen der Werte spätestens beim Erreichen des Wurzelknotens endet und damit durch die Höhe des Baumes O(log_2n) beschränkt ist.

Der folgende Codeausschnitt skizziert die Situation, dass zu einer Vorrangswarteschlange a[ ] der Länge n+1 ein neues Element i hinzugefügt werden soll. Bei der Initialisierung von a[0], a[1], …, a[n-1], a[n] vom Typ Integer wird trickreich a[0] mit dem kleinstmöglichen Wert (in JAVA: Integer.MIN_VALUE) initialisiert, sodass in der while Schleife ein Abbruch sichergestellt ist.

Abb. 11.9

Abb. 11.10

Beim Löschen des kleinsten Elementes in der Wurzel geht man invers vor.

(i)       Man ersetzt es zunächst durch das letzte Blatt „rechts unten“.

(ii)      Anschließend wandert der temporäre Wurzelwert solange nach unten, bis die  Haldenbedingung erfüllt ist. Dieser Vorgang heißt „versickern nach unten“.

Abb. 11.11

Abb. 11.12

Die hier besprochenen Operationen kann man ihrer Idee nach dazu verwenden, um ein Sortierverfahren (Heap-Sort) anzugeben.

(i)          Eine Vorsortierung existiert: Das kleinste Element steht in der Wurzel, es wird entfernt (ausgegeben o.Ä).

(ii)         Der linke und der rechte Unterbaum der Halde sind wieder Halden, haben also - für sich betrachtet – das kleinste Element in ihrer Wurzel.

(iii)        Somit müssen die beiden Halden zu einem neuen Baum mit gemeinsamer Wurzel zusammengeführt werden. Man nimmt von der einen Halde das letzte Element weg und lässt es „versickern”, bis die Haldenbedingung erfüllt ist und beginnt wieder mit Schritt (i) usw.

11.14. Organisation von großen Datenmengen mit B-Bäumen

Im Kapitel über Bäume wurden B-Bäume eingeführt, um sie als Verallgemeinerung von Suchbäumen einsetzen zu können.

Offen geblieben ist aber die Antwort, wie Daten (d.h.: Schlüssel ki ∈ ki ≠ kj für i ≠ j) den Knoten eines B-Baumes zugeordnet werden, sodass Einspeichern, Suchen und Löschen durch die Baumhöhe und damit logarithmisch beschränkt bleiben.

Wir rufen zunächst die Definition eines B(k,h) in Erinnerung.

Ein B-Baum oder B(k,h) Baum liegt vor, wenn gilt:

- alle Blätter b haben denselben Abstand h zur Wurzel r

- die Wurzel ist entweder ein Blatt oder hat mindestens 2 Söhne

- jeder von der Wurzel verschiedene innere Knoten x hat wenigstens k+1 Söhne

- jeder Knoten hat höchstens 2k + 1 Söhne

- der leere Baum ist ein B(k,h) Baum

Die Werte (k + 1) bzw. (2k + 1) liefern den Hinweis, wie viele Schlüssel ki mindestens und wie viele höchstens einem Knoten zugeordnet werden müssen bzw. dürfen. Bei einer Implementierung zum Zwecke der Verwaltung von Schlüsselmengen ist auf Folgendes zu achten:

- Der erste wichtige Punkt ist, dass die einem Knoten zugewiesenen Schlüssel ki, i = 1, 2, …, t dort aufsteigend sortiert sind.

- Die zweite Forderung ist, dass der Zeiger vor einem Schlüssel ki zu einem Baum zeigt, in dem nur Schlüssel kj < ki anzutreffen sind, und der Zeiger nach einem kj analog zu einem Unterbaum mit Schlüsseln kj > ki verweist. Damit zeigen in einem Knoten mit k ≤ t ≤ 2k Schlüsseln insgesamt t+1 Zeiger zu Unterbäumen (Abb. 11.13).

- Die dritte Forderung ergibt sich unmittelbar aus der Definition eines B(k,h) Baumes: Mit Ausnahme der Wurzel enthält jeder Knoten mindestens t = k und höchstens t = 2k Schlüssel.

Wir betrachten die Situation in Abb. 11.13 für einen B(2,h) Baum. Im gezeichneten Knoten seien die Schlüssel 30 und 40 gespeichert, in den Wurzeln der Unterbäume {1, 20, 21, 29}, {31, 39} und {41, 99}.

Abb. 11.13

Die Bedingung k ≤ t ≤ 2k ist für jeden Knoten eingehalten.

Nun kommen wir zur Erklärung des Sonderfalles „Wurzel” am Beispiel des Einfügens eines neuen Schlüssels:

Die Wurzel ist entweder ein Blatt oder hat mindestens 2 Söhne.

Das erste Argument ist trivial: Wenn der Baum zunächst leer ist und der erste Schlüssel eingefügt wird, kann die Bedingung t ≥ k für k ≥ 2 gar nicht erfüllt sein. Die Situation wird heikel, wenn in einem Knoten bereits t = 2k Schlüssel gespeichert sind. Dann muss dieser Knoten gesplittet werden, sodass zwei Knoten mit je k Schlüsseln resultieren, während der Schlüssel in der Mitte zum Elternknoten nach oben wandert. Sind dort weniger als 2k Schlüssel gespeichert, so findet er leicht Platz, wobei die richtige Position durch binäres Suchen bestimmt wird. Die Abb. 11.14 zeigt, wie in dem in Abb. 11.13 dargestellten Baum durch Einfügen des Schlüssels 19 ein neuer Knoten angelegt wird.

Abb. 11.14

Ist der Elternknoten aber bereits voll, so ist dieser wiederum zu teilen usw. Erreicht man damit schließlich die Wurzel und ist dort auch kein Platz frei, so wird – der Baum wächst also nach oben! – eine neue Wurzel erzeugt, an die links und rechts die durch das Splitten entstandenen Bäume gehängt werden: Dann hat die Wurzel genau 2 Kindknoten und enthält nur einen einzigen Schlüssel.

In der Abb. 11.15 wird die Situation vor dem Einfügen des Schlüssels 19 gezeigt und Abb. 11.16 stellt das Endergebnis dar.

Abb. 11.15

Abb. 11.16

Wir hatten für die minimale bzw. maximale Anzahl von Knoten abgeleitet

Damit kann bei 2k Schlüsseln je Knoten ein B(k,h) Baum maximal (2k + 1)h+1 -1 Schlüssel aufnehmen. Bei der Minimalzahl ist zu berücksichtigen, dass die Wurzel nur 1 Schlüssel enthält. Damit ergibt sich für die minimale Schlüsselzahl 2(k + 1)h -1 .

Selbst dann ist die Baumhöhe noch logarithmisch beschränkt.

Um einen Eindruck zu vermitteln, welch große Schlüsselmengen damit verwaltbar sind, nehmen wir k = 60 und h = 4 an. Die Wahl k = 60 ist durchaus realistisch, wenn man unterstellt, dass für Schlüssel, Zeiger und einen Zähler je Knoten 4 KByte allokiert werden. Als maximale Anzahl erhält man fast 26 Milliarden Einträge und im schlechtesten Fall immer noch rund 27 Millionen und dies bloß bei einer Baumhöhe von h = 4.

11.15. CRC Codes in der Praxis

Der theoretische Hintergrund zu diesem Codierungsverfahren wurde bereits ausführlich erläutert. Die konkrete Anwendung betrifft Kanäle, die als besonders zuverlässig angesehen werden können. Tritt dennoch ein Fehler auf, so soll er mit hoher Wahrscheinlichkeit entdeckt werden. Wir geben hier dem algorithmischen Aspekt mit geänderter Schreibweise den Vorzug, sodass auch erkannt wird, wie einfach dieses Prüfsummenverfahren umzusetzen ist.

Codewörter werden als Bitblöcke oder Pakete der Länge n bezeichnet und als Polynome vom Grad r = n-1 über 2 interpretiert, sind also Elemente von (2)n . Sie bestehen aus d ursprünglichen Datenbits, die durch r Prüfbits ergänzt werden:

Beim Auslesen einer Bitfolge (Bitblockes) aus einem Puffer soll ein Fehler zu einem neuerlichen Lesen führen, wie dies z.B. bei CD/DVD-Abspielgeräten realisiert ist. Bei Übertragung von Paketen in einem Netzwerk wird dem verwendeten Übertragungsprotokoll entsprechend ein „resend“ Paket vom Empfänger an den Sender zurückgesandt, sodass ein nochmaliges Senden veranlasst wird. Unter der Voraussetzung, dass der Übertragungskanal im Normalfall als zuverlässig angesehen werden kann, ist diese Vorgangsweise auch wirtschaftlich.

Was die Wahl der Generatorpolynome betrifft, so gibt es zwei Ansätze:

(i)        Auf Grund von technischen Normen besteht vorab eine vorgegebene Festlegung, sodass auch (weltweit) Kompatibilität erreicht wird.

Bei CD-Geräten ist dies das Polynom „CRC-16": x^16 + x^15 + x^2 + 1

Bei Bluetooth Übertragungstechnik ist es: x^5 + x^4 + x^2 + 1

(ii)      In Computernetzwerken wird das Generatorpolynom implizit durch das verwendete Übertragungsprotokoll in der sogenannten Sicherungsschicht festgelegt. Aufgabe der Sicherungsschicht ist es, der darüber liegenden Schicht als Dienst (soweit möglich) die „Garantie“ anzubieten, dass ein übernommenes Datenpaket frei von Fehlern ist. Das Zusammenspiel der einzelnen Netzwerkschichten wird durch Übereinkünfte geregelt, die man Protokolle nennt. Bei einigen dieser Protokolle ist es auch möglich, dass Sender und Empfänger vorab durch Austauschen besonderer Pakete sich auf ein gemeinsames Generatorpolynom verständigen. Ein typischer Vertreter für die Sicherungsschicht ist (s.u) CRC-32, das bei der Datensicherung von Blöcken in der Ethernet-Familie für lokale Netzwerke verwendet wird.

Zur Anwendung kommen unter anderen folgende Polynome:

Für die späteren Überlegungen erinnern wir an eine bei der Einführung von Polynomen erwähnte Eigenschaft einiger spezieller Polynome hinsichtlich des Faktors (x + 1):

Ein Polynom über 2 kann (x+1) dann und nur dann als Faktor haben, wenn 1 eine Nullstelle ist. Demnach muss die Anzahl der Summanden gerade sein, wie dies bei CRC-12, CRCCCITT und CRC-16 der Fall ist. Das Polynom CRC-CCITT (CRC-4) hat hingegen diese Eigenschaft nicht.

Nun halten wir fest:

(i)         Anhängen von r Nullen an ein Datenpaket D der Länge d entspricht in 2 algorithmisch der Multiplikation mit 2r und dies wieder ist ein „shift left“ um r Positionen. Dies führt zu einem Paket der Länge d+r, das rechtsbündig zunächst r Nullen hat.

(ii)       Das Ersetzen der Nullen durch die r CRC Bits – ein Polynom R – erfolgt einfach mit der bitweisen logischen Operation XOR mit R.

(iii)      Dividieren erfolgt in 2 durch wiederholte Subtraktion und diese wieder ist ident mit der Addition bzw. mit dem bitweisen XOR.

Die Bestimmung der CRC Bits hat so zu erfolgen, dass das resultierende Datenpaket T, interpretiert als Polynom T(x), durch das vereinbarte Generatorpolynom G(x) ohne Rest teilbar ist. Letzteres heißt, es gibt irgendein Polynom n(x) mit kleinerem Grad als G(x), sodass T(x) = n(x)* G(x) mit dem Nullpolynom als Rest und T(x) = D * 2r XOR R, also D * 2r XOR R = n*G.

Durch Umformen erhält man D * 2r = (n*G XOR R).

Hier hat D * 2r eine Gestalt, die durch untenstehende Graphik beschrieben werden kann.

Wegen der rechsbündigen Nullen in D * 2r heißt das nichts Anderes, als dass die gesuchten r CRC Bits, das Polynom R, bestimmt sind durch den Rest, der sich aus der Division von D durch G ergibt. Genau das ist aber die Vorschrift, wie sie im Theorieteil über CRC Codes als Algorithmus angegeben ist:

R ist „Rest von (D* 2r / G)“ und übertragen wird T(x) = „D konkateniert mit R".

In Analogie zu a mod b schreiben wir zur Vereinfachung R = D* 2r mod G.

Bei der Bestimmung von R brauchen wir uns dabei n(x) gar nicht weiter zu merken!

Nun sehen wir uns die Situation aus der Sicht des Empfängers eines Datenpaketes an.

Tritt ein Übertragungsfehler auf, so kommt anstatt des Polynoms T(x) beim Empfänger ein Bitmuster an, das als T(x) + E(x) gelesen werden kann. Demnach bestimmt E(x), ob und welche Art von Fehlern passiert sind. Nur wenn E(x) = 0, dann war die Übertragung fehlerfrei.

Der Empfänger dividiert durch das Generatorpolynom G(x) und weil das korrekte T(x) ohne Rest durch G(x) teilbar ist, erhält er: T(x) + E(x) mod G(x) = E(x) mod G(x).

Wenn nun zufälliger Weise das die Fehler bestimmende E(x) selbst durch G(x) teilbar ist, dann würden diese nicht erkannt werden, da kein Rest bleibt! Man erkennt aus dieser Beobachtung, wie wichtig die Wahl des Generatorpolynoms ist.

Wir besprechen einige erwünschte Eigenschaften von Generatorpolynomen, halten aber ausdrücklich fest, dass bei den in der Praxis verwendeten nicht immer alle diese Eigenschaften gleichzeitig gegeben sind. Man nimmt für unterschiedliche Anwendungsfälle verschiedene Polynome und die Wahl ist gewissermaßen ein Kompromiss mit Blick auf dort typische Fehler.

Tritt ein Einzelfehler an der Position i auf, so ist dieser charakterisiert durch E(x) = xi. Keines der genannten CRC Polynome teilt xi, denn sobald ein G(x) aus mehr als einem Term besteht, kann das nicht mehr der Fall sein. Also werden alle Einzelfehler erkannt.

Liegen zwei Einzelfehler an den Positionen i und j vor, so hat E(x) die Gestalt E(x) = xi + xj = xj ( xi-j + 1), mit o.B.d.A. i > j . Ist 1 < k < (i-j) < n, so darf G(x) nicht durch (xk + 1) teilbar sein. Denn sonst hätten in diesem Fall E(x) und G(x) einen gemeinsamen Faktor und bei der Division bliebe kein von 0 verschiedener Rest. Ist dies nicht der Fall, dann entdeckt man auch alle Zweifachfehler für Paketgrößen bis zu k Bits.

Betrachten wir dazu folgende Zerlegung von x31 -1 in ein Produkt von irrreduziblen Polynomen über 2 :

x^31 -1 = (x+1) * (x^5 + x^3 + x^2 + x + 1) * (x^5 + x^4 + x^2 + x + 1) * (x^5 + x^4 + x^3 + x + 1)

* (x^5 + x^2 + 1) * (x^5 + x^4 + x^3 + x^2 + 1) * (x^5 + x^3 + 1).

Einer der Faktoren ist dabei das CRC Polynom USB und (x+1) ist wieder ein Faktor. Aus dieser Zerlegung und weil keiner der Faktoren weiter zerlegbar ist, folgt, dass USB = (x^5 + x^2 + 1) kein Teiler von Polynomen der Gestalt xk + 1 mit k < 31 sein kann.

Liegt eine ungerade Anzahl von Einzelfehlern vor, so lässt sich E(x) schreiben als E(x) = xi1 + .....+ xi2n+1

Damit kann aber (x+1) kein Faktor von E(x) sein.

Dies überlegt man sich indirekt: Wäre E(x) = (x+1)* Q(x) und Einsetzen von x = 1 liefert wegen 1+1 = 0 daher E(1) = 0. Anderseits, da eine ungerade Zahl von Einzelfehlern vorliegen soll, hat E(x) eine ungerade Anzahl von Summanden xi und es ist E(1) = 1. Widerspruch!

Somit können wir hinsichtlich der Entdeckung einer ungeraden Anzahl von Einzelfehlern folgern, dass (x+1) ein passender Faktor für G(x) ist, weil in diesem Fehlerfall ein von Null verschiedener Rest bei E(x) nach dem Dividieren verbleibt. Wir hatten für einige wichtige Polynome eingangs schon auf den Faktor (x+1) hingewiesen: Er ist der Garant für das Erkennen dieser Fehlerklasse.

Für andere Fehlertypen gibt es teilweise analoge, teilweise aber tiefergehende Überlegungen. Für das CRC 16 Generatorpolynom gilt beispielsweise: Es werden alle Einzelfehler, alle Doppelfehler und alle Fehler mit ungerader Bitzahl sowie alle Fehlerburst der Länge ≤ 16 erkannt.

11.16. Eigenwerte und Potenzen von Matrizen

Bei der Besprechung von homogenen linearen Gleichungssystemen haben wir Eigenwerte einer Matrix A ∈  eingeführt. Um den Lösungsansatz für die folgende Aufgabe begründen zu können, bedarf es noch einer zusätzlichen Definition zur Diagonalisierbarkeit von Matrizen und einer Aussage, in welchem Zusammenhang diese mit den Eigenvektoren einer Matrix A ∈ n×n steht.

Definition 11.4: Eine Matrix A ∈ n×n heißt diagonalisierbar, wenn es eine Matrix C ∈ n×n gibt, sodass D = C-1⋅A⋅C und D eine Diagonalmatrix ist. In diesem Fall gilt dann natürlich A = C⋅D⋅C-1

Satz 11.4: Eine Matrix A ∈ n×n ist genau dann diagonalisierbar, wenn sich mit n Eigenvektoren von A eine Basis von n bilden lässt. Im dreidimensionalen Fall bedeutet dies etwa, dass es drei linear unabhängige Eigenvektoren von A gibt. Diese n Eigenvektoren bilden dann die Spalten von C und damit erhält man A = C⋅D⋅C-1.

Satz 11.5: Besitzt eine Matrix A ∈ n×n n verschiedene Eigenwerte, so ist sie diagonalisierbar.

Damit ausgerüstet können wir folgende Anwendung erläutern.

Eine Bakterienkultur bestehe aus 200 Bakterien vom Typ I, 300 vom Typ II und 1000 vom Typ III. Von einer Generation zur nächsten transformieren sich die Bakterien gemäß:

Wie viele Bakterien existieren nach 12 Generationen?

A sei die Matrix, die eine Transformation von einer Generation zur nächsten angibt, also:

Nach einer Generation existieren also A⋅x Bakterien, nach zwei Generationen A⋅A⋅x und nach 12 Generationen A^12⋅x Bakterien.

Alleine schon die zwölfte Potenz von A zu berechnen, ist aufwändig. Will man im allgemeinen Fall einen stabilen Endzustand herausfinden, so kann die notwendige Anzahl von Potenzierungen deutlich ansteigen, sodass effizientere Methoden gefragt sind. Genau hier soll angesetzt werden.

Man zerlegt A in das Matrixprodukt C · D · C-1. Im obigen Beispiel ist dies möglich, denn A hat drei Eigenwerte (s.u.). Die Diagonalmatrix D besteht aus den Eigenwerten von A, und C ist die Matrix, die spaltenweise aus Eigenvektoren von A konstruiert wird:

A12 = (C⋅D⋅C-1)12 = (C⋅D⋅C-1) (C⋅D⋅C-1)…(C⋅D⋅C-1)

= (C⋅D⋅E ⋅D⋅E…E⋅D⋅C-1) = (C⋅D12⋅C-1).

Damit ist D12 sehr leicht zu bestimmen, da nur die Diagonalelemente potenziert werden müssen.

Als Nebenrechnung erhält man für die Eigenwerte  und drei linear unabhängigeEigenvektoren sind (4,1,0), (0,0,1) und

Damit gilt

und

mit C⋅D⋅C-1= A.

Somit ist   (auf ganze Zahlen gerundet).

Es existieren also nach 12 Generationen 7948 Bakterien vom Typ I, 2058 vom Typ II und 3138 vom Typ III.

11.17. Bewertung von Web-Seiten

Eine interessante Anwendung von Eigenwerten zusammen mit einem Graphenmodell des Web (WWW) ist der PageRank Algorithmus nach L. Page und S. Brin. (Auf die Namenskoinzidenz von Page für Seite und dem Autor L. Page sei hingewiesen.)

Die Seiten im Internet und ihre wechselseitigen Bezugnahmen durch Hyperlinks (URLs) werden durch einen gerichteten Graphen X = (V(X), E(X)) modelliert, wobei V(X) für die Seiten im WWW steht und ein Link von der Seite si zur Seite sj einer Kante <si , sj > ∈ E(X) entspricht. Mehrfachkanten werden nicht berücksichtigt.

Auf Grund der Größe des WWW mit seinen Millionen an Seiten kann man immer nur einen im formalen Modell nicht weiter definierten Ausschnitt daraus abbilden. Im vereinfachten Modell wird auch auf das Problem der hängenden Zeiger (dangling pointers) nicht weiter eingegangen, also wenn Seiten Verweise auf nicht (mehr) existierende andere gesetzt haben.

Man unterstellt im Modell, dass die Anzahl der Kanten <si , s>, die von anderen Seiten si als URL zu s führen, einen semantisch nicht näher erklärten Stellenwert von s im WWW ausdrückt: Man bezeichnet diese Zahl als Rang oder PageRank R(s) der Seite s.

Der Rang R(s) ist naturgemäß keine inhaltliche Aussage über die „Wichtigkeit“ einer Seite s. Es ist aber eine plausible Annahme, dass R(s) als Maßzahl dafür verwendet werden kann, ob andere Webnutzer eine Seite s relevant einschätzen, indem sie einen Verweis darauf setzen.

Hat nun eine Seite s einen Rang R(s) und verweist sie ihrerseits auf eine andere Seite si , so soll sie den Rang R(si ) durch ihren eigenen Rang anteilsmäßig entsprechend der Zahl der von ihr zu anderen Seiten wegführenden Links beeinflussen.

Betrachten wir dazu ein kleines Beispiel:

Abb. 11.17

Es sei

(i)           |L(s)| die Anzahl der Kanten, die von s zu einer anderen Seite führen, wobei Links zur selben Seite nur einmal gezählt werden: L(s) = {<s,si > | <s, si > ∈ E(x)} .

(ii)         M(s) ⊆ V(x) die Menge aller Seiten (Knoten), von denen eine Kante zu s führt: M(s) = {si | <si , s> ∈ E(x)}

(iii)        R(s) der Rang (PageRank) der Seite s zu einem bestimmten Beobachtungszeitpunkt bzw. Rechenschritt in dem später beschriebenen Iterationsverfahren. Als Anfangswert setzt man R(s) = 1 – d mit 0 < d < 1. Der durch Studien empfohlene Wert für d ist 0,85.

In einer anderen Interpretation, auf die hier nicht näher eingegangen wird, reflektiert d die Wahrscheinlichkeit, dass ein sich im WWW zufällig bewegender Surfer nach einem Mausklick einen weiteren ausführt, um zu einer anderen Seite zu gelangen.

Page und Brin haben als PageRank R(s_1 ) folgende grundlegende Beziehung vorgeschlagen:

und mit n = | V(X) | sowie mit Einbezug einer als Dämpfungsfaktor bezeichneten Größe d, folgende Formel eingeführt:

Jede Seite si , die auf s verweist, liefert demnach einen Beitrag für R(s), allerdings gewichtet durch die Anzahl der Links | L(si ) |, die von si überhaupt wegführen. Da man nur über si ∈ M(s) summiert, ist immer | L(si ) | > 0.

Würde diese Formel für alle Webseiten im WWW aufgestellt werden, erhielte man ein riesiges Gleichungssystem. Daher bedient man sich einer iterativen Lösungsmethode, wobei dazu 1 – d als Startwert R(s) für eine Seite gewählt wird.

Für den in Abb. 11.17 gezeichneten Graphen erhalten wir:

| L(s_1)| = | L(s_2) | = | L(s_3) | = 1; | L(s_4) | = 2; | L(s5) | = 0

und

R(s_1) = 1 – d = 0,15 mit d = 0,85; R(s_2) = 1 – d;

R(s_3) = 1 – d + d (R(s_1) + R(s_2) + ; R(s_4) = 1 – d + d R(s_3); R(s_5) = 1 – d + d

Nach bereits 10 Iterationen erhalten wir schon eine sehr genaue Lösung, nämlich (gerundet)

R(s_1) = 0,15      R(s_2) = 0,15      R(s_3) = 0,734      R(s_4) = 0,774      R(s_5) = 0,479

die sich auch nach 40 Iterationen in der dritten Kommastelle nicht mehr verändert. Wir zeigen später, dass dieses System genau dann lösbar ist, wenn 0 < d < 1.

In der Abbildung Abb. 11.18 sind zwei weitere Graphen gezeichnet und die PageRank-Werte ihrer Knoten angegeben.

Abb. 11.18

Um nun den Zusammenhang mit einem Eigenwertproblem herzustellen, führen wir das Graphenmodell in eine Matrizenschreibweise über und definieren dazu eine aus der Adjazenzmatrix von X abgeleitete Link-Matrix wie folgt:

Jede Zeile beschreibt die von Seite sj ausgehenden Links, daher enthält jede Zeile lauter gleiche Elemente ungleich Null. Da für jede erreichte Seite sj ein Eintrag in dieser Zeile existiert, ist die Zeilensumme gleich 1.

Die PageRanks R(si), i = 1, 2, ..., n ordnen wir als Zeilenvektor R an und ebenso sei D ein Zeilenvektor, dessen Komponenten alle 1-d sind. Dann kann man die vorgestellte Formel für alle Seiten in Matrixschreibweise folgendermaßen anschreiben:

R = D + d R A

Umformen liefert:

R(E–dA) = D

Dieses Gleichungssystem ist genau dann lösbar, wenn (E–dA) regulär ist, die Lösung ist dann gleich D(E–dA)-1, wobei mit E die Einheitsmatrix bezeichnet ist.

Satz 11.6: Es ist R(E–dA) = D lösbar, wenn 0 < d < 1 gilt.

Beweis: Nach obiger Argumentation ist zu zeigen, dass mit 0 < d < 1 die Matrix E – dA invertierbar ist. Aus den Sätzen über Eigenwerte (Satz 7.11) wissen wir: λE – A ist invertierbar genau dann, wenn λ kein Eigenwert von A ist.

Um zu zeigen, dass E – dA invertierbar ist, muss man also zeigen, dass 1 kein Eigenwert von dA ist, also: aus (dA) v = v folgt v = o für einen Spaltenvektor v.

Die j-te Komponente des Vektors Av ergibt sich durch Multiplikation von der zu einer Webseite gehörigen Zeile von A mit v. Damit ist diese Komponente entweder gleich 0, falls die Zeile lauter Nullen enthält, oder

also der Mittelwert m einiger Werte von v.

Sei v(k) die betragsgrößte Komponente von v. Mann kann o.B.d.A annehmen, dass diese nicht-negativ ist, da man ansonsten einfach –v betrachtet. Aus der k-ten Zeile von (dA)v = v folgt nun, dass v(j) = 0 oder v(k) = d⋅m. Freilich gilt m < v(k) und erst recht d⋅m < v(k), wegen 0 < d < 1. Man erhält also v(k) = d⋅m < v(k), einen Widerspruch. Damit muss v(k) = 0 gelten. Da v(k) maximal gewählt wurde, gilt jetzt v = o, was zu zeigen war.

Obiger Satz garantiert also die Lösbarkeit des Problems. Wegen der großen Zahl von Gleichungen muss man aber einen effizienten Algorithmus finden bzw. ein Iterationsverfahren zur näherungsweisen Bestimmung der PageRanks finden. Dieses haben wir in den Beispielen schon im Prinzip vorgestellt:

Die gespeicherten Seiten werden durchnummeriert und der Reihe nach die Formel für die PageRanks darauf angewandt. Existiert für eine Seite noch keine Bewertung, verwendet man einen Startwert, üblicherweise 1-d. Sobald alle Seiten durchlaufen wurden, wird dieser Prozess wiederholt. Nach etwa 50 Iterationen, erhält man eine sehr gute Näherung. Es lässt sich zeigen, dass mit diesem Verfahren jede Variable gegen den ihrer Seite entsprechenden PageRank konvergiert.

11.18. Anwendung von Matrizen in der Computergrafik

Wir beschränken uns in der Fallstudie auf den 2-dimensionalen Fall, also die Repräsentation von Objekten in der Ebene und verwenden ein kartesisches Koordinatensystem. Dabei ist es in der Computergrafik üblich, den Ursprung O = (0,0) auf dem Bildschirm links oben zu fixieren, was aber bei den späteren Abbildungen nicht berücksichtigt wird. Objekte werden modellhaft durch einzelne sie bestimmende Punkte repräsentiert, zwischen denen dann die Linien bzw. Kurven gezeichnet werden.

Abb. 11.19

Wir gehen von ganzzahligen Koordinatenwerten der Punkte p = (p_1,p_2) aus. Dabei sei p der Ortsvektor des Punktes P und wir betrachten die Situation an Hand eines Rechteckes, das zunächst mit seinen Seiten parallel zur x- bzw. y-Achse liegt.

(1) Translation T

Will man ein grafisches Objekt, hier ein achsenparalleles Rechteck, geradlinig verschieben, so muss auf seine Eckpunkte P_1=(x_1,y_2) und P2=( x_2,y_2) eine Translation T mit dem Translationsvektor t = (tx,ty) ausgeführt werden, was wir symbolisch als P1T = P_1 + T bzw. P2T = P_2 + T anschreiben.

Die Translation ist bei dieser Wahl von Koordinaten eine einfache Vektoraddition:

PT = (xt,yt) = (x + tx , y + ty ), also pT = p + t.

Abb. 11.20

Nach der Berechnung der resultierenden Koordinaten PT = (xt,yt) kann man dann das Rechteck neu zeichnen.

(2) Skalierung S

Eine Skalierung S erreicht man bezüglich des Fixpunktes O = (0,0) durch Multiplikation der Koordinaten mit den Skalierungsfaktoren sx ≠ 0, sy ≠ 0 und definiert für die einzelnen Punkte P = (x,y) die Beziehung PS = (xs, ys) = (sx·x, sy·y).

Man spricht von einer Verzerrung, wenn sx ≠ sy.

Abb. 11.21

Man beachte, dass entsprechend (sx,sy) nicht nur die Seitenlängen gestreckt worden sind, sondern sich auch die Lage von P_1 zu P1S geändert hat.

In Matrixschreibweise kann man eine Skalierung von einem Punkt P = (x,y) zu P = (xs,ys) wie folgt als Produkt notieren:

Will man statt des Ursprungs einen beliebigen anderen Fixpunkt F = (xf,yf) wählen, so verschiebt man mittels einer Translation (-xf,-yf ) zunächst zum Ursprung, skaliert dann und verschiebt den resultierenden Punkt wieder zurück mit (xf,yf). Insbesondere, wenn sich die Position von P_1 im Koordinatensystem nicht ändern soll, dann ist P_1 als Fixpunkt zu wählen.

(3) Rotation R

Bei der Drehung (Rotation) um einen Winkel β bezüglich des Fixpunktes O = (0,0) verwendet man folgende Zusammenhänge, die aus der Abbildung ersichtlich sind. Man beachte, dass auf dem Bildschirm die y-Achse nach unten zeigt und eine Rotation um β > 0 dann nicht gegen, sondern mit dem Uhrzeigersinn verläuft.

Abb. 11.22

Es gelten folgende Beziehungen:

Nicht weiter berücksichtigt wird, dass nach einer solchen Drehung um β die resultierenden Werte (xr,yr) nicht mehr ganzzahlig sein müssen und daher geeignet zu runden sind. Nun ist es aber so, dass bei Anwendungen meist eine Folge von Transformationen auf ein Objekt ausgeübt wird und dazwischen sich die vorhin genannten Rundungsfehler aufschaukeln können.

Es ist demnach zweckmäßig, Translation, Skalierung und Rotation zu kombinieren, wobei sich das Matrizenkalkül als nützlich erweist. Allerdings bereitet zunächst die Translation einekleine Schwierigkeit, da sie im Gegensatz zur Skalierung und Rotation keine Multiplikation mit einer Transformationsmatrix S bzw. R, sondern eine Vektoraddition ist.

Dieses Problem wird nun durch einen Kunstgriff umgangen: Man führt homogene Koordinaten ein, indem man der 2D-Ebene künstlich eine dritte Dimension hinzufügt:

Ein Punkt P = (x,y) hat dann mit w ≠ 0 die homogenen Koordinaten

Wählt man nun w = 1, so können die vorgestellten Transformationen in Matrizenschreibweise wie folgt notiert und damit nach den Regeln der Matrizenmultiplikation zusammengesetzt werden, wobei die „alten“ kartesischen Koordinaten trivial ohne Division durch w erhalten werden.

(i) Translation

(ii) Skalierung

(iii) Rotation

Da das Assoziativgesetz A · B · C = (A · B) · C = A · (B · C) gilt, kann man erforderliche Transformationen in entsprechender Reihenfolge durch Matrizenmultiplikation ausführen und dann erst das Resultat neu zeichnen. Das vorhin genannte Problem der Rundung auf ganzzahlige Koordinaten muss damit zum Schluss nur einmal erfolgen. Wichtig ist, auf die Reihenfolge zu achten, da die Multiplikation im Allgemeinen nicht kommutativ ist: AB ≠ BA. Aus der geometrischen Interpretation erkennt man aber, dass z.B. zwei hintereinander folgende Rotationen um zunächst θ und dann um φ kommutativ sind, weil sich die Drehwinkel addieren.

Dies wollen wir kurz durch Ausrechnen zweier Rotationen hintereinander nachvollziehen:

Für r_11 erhält man cos β · cos φ - sin β · sin φ = cos (β + φ),

für r_12 ergibt sich –cos β · sin φ - sin β · cos φ = - sin (β + φ), usw.

Beispiel:

Man rotiere einen Punkt P um das Zentrum (3,3) um α = 30o.

Lösung:

(1) Zunächst wird P nach (0,0) verschoben.

(2) Dann wird um den Ursprung als Zentrum rotiert.

(3) Schließlich wird nach (3,3) zurück verschoben.

Man erhält als Ergebnis die Transformationsmatrix

11.19. Verbandsstrukturen

11.19.1. Schaltnetze

In Abschnitt 4.7 wurden Verbände besprochen und als wichtiger Spezialfall die Boole´sche Algebra eingeführt. Im Mittelpunkt der Anwendungen steht die Boole´sche Algebra, die aus dem Nullelement und dem Einselement alleine besteht, was wir mit B = {0,1} modellieren. Man kann „0“ z.B. „keine Spannung anliegend“ und „1“ entsprechend „Spannung liegt an“ in einer Interpretation zuordnen. In der Aussagenlogik nimmt man die Wahrheitswerte „T, true“ und „F, false“. Mit Blick auf Gatter (s.u) und auf durch Zusammenschaltung von Gattern entstehende Schaltnetze verwenden wir ∧ (bzw: AND, Konjunktion) sowie ∨ (bzw: OR, Disjunktion) als Grundoperatoren und den einstelligen Operator ¬ für die Negation (NOT). Alternativ wird anstatt „ ¬x“ oft auch „ ,x “ geschrieben und für ∧ das Zeichen „·“ (bzw. „·“ wird ganz weggelassen) sowie ∨ für das Zeichen „+“ genommen, was längere Ausdrücke leichter lesbar macht. Wie in der Informatik üblich verwenden wir auch die Zuordnung „0“ ↔ „F“ und „1“ ↔ „T“.

Die Operationen werden durch Tabellen definiert:

Für die graphischen Beschreibungen von elektronischen Schaltungen, in denen man die technische Realisierung dieser (elementaren) Verknüpfungen als Gatter bezeichnet, wird dazu nach Standard DIN 40900 / IEC 917-12 das unten stehende Symbol für AND vereinbart, wobei das rechts gezeichnete Gattersymbol eine naheliegende Verallgemeinerung ist.

Abb. 11.23

Für die OR Verknüpfung definiert man:

Abb. 11.24

Die Negation NOT ist erklärt durch:

Abb.11.25

Bei den Gattersymbolen ist ein Signalfluss von links nach rechts angenommen und ein „schwarzer Punkt“ bedeutet, dass ein ankommendes Signal invertiert wird.

Mit Bezug zur vorgestellten Anwendung erhalten wir für den verwendeten Boole´schen Verband folgende Gesetze, in die auch abgeleitete wie die Gesetze von De Morgan eingebracht sind:

Unmittelbar aus den Tabellen herleiten lassen sich folgende Rechenregeln:

¬T = F , ¬F = T, x ∧ T = x, x ∧ F = F, x ∨ T = T, x ∨ F = x .

Sehr häufig kommt in der Praxis die Peirce-Funktion (Charles Sanders Peirce, 1839-1914) vor, die als NOR Verknüpfung bezeichnet wird: z = ¬x ∧ ¬y = (nach De Morgan) ¬(x ∨ y), daher auch „NOR“.

Abb. 11.26

Ebenso gibt es ein Gatter für die Sheffer-Funktion (Henry Maurice Sheffer, 1883-1964), die auch NAND Verknüpfung heißt: z = ¬(x ∧ y ):

Abb. 11.27

Das folgende Schaltnetz realisiert einen Halbaddierer, eine Schaltfunktion, die zwei Binärziffern (1-stellige Binärzahlen) a, b addiert und den resultierenden Übertrag c (carry) liefert:

Abb. 11.28

Die zugehörige Schaltfunktion lässt sich aus dem Diagramm direkt ablesen:

s = a ⋅b + a ⋅b und c = a ⋅ b

Oder auch als Wertetabelle definiert:

Die besondere Bedeutung der NOR bzw. NAND Gatter liegt darin, dass man entweder mit NOR oder auch mit NAND alleine auskommt, um beliebige Schaltungen zu realisieren.

Die Verbandsgesetze ermöglichen, ausgehend von einem Boole´schen Ausdruck (bzw. einem Schaltungsentwurf) durch Umformen Vereinfachungen zu erzielen. Die Aufgabe ist nun, eine im logischen Sinne äquivalente (siehe Kapitel 4.7) Schaltung mit gleichem Verhalten anzugeben, die nach einer (hier nicht näher definierten Kostenfunktion) einfacher ist. Die Vereinfachung kann darin bestehen, dass weniger Gatter verwendet werden oder dass die Anzahl der „Pins“ und damit Leitungen zwischen Gattern reduziert werden.

Wir geben hier einige einfache Beispiele zur Umformung von Boole´schen Ausdrücken:

(i)          z = (a . b) + ( a . b ) + (a . b ) = ((a . b ) + ( a . b )) + (a . b ) = ((a + a ) . b)+ (a . b ) =

(T . b) + (a . b ) = b + (a . b ) = (b + a) . (b + b ) = (b + a) . T = b + a = a + b

(ii)        z = x 1 x 2 x_3 + x 1 x_2 x 3 + x 1 x_2 x_3 + x_1 x_2 x_3

Zur Vereinfachung des Schreibaufwandes setzen wir

Eine Schaltfunktion f mit n Variablen ist eine Abbildung Bn → B und wird geschrieben als f(x_1,x_2,...,xn). Bei einer zweistelligen Schaltfunktion f (x_1,x_2) stehen in der Wertetabelle vier Positionen zur Verfügung und damit gibt es 2**2^2 = 2^4 = 16 Belegungen, also 16 mögliche Schaltfunktionen. Für eine n-stellige Schaltfunktion gibt es daher 2**2n verschiedene Funktionen (sei a**b = ab).

Ohne Beweis geben wir noch das Boole´sche Normalformentheorem an. Es ermöglicht, aus einer Wertetabelle eine zugehörige Schaltfunktion zu bestimmen, die dann allenfalls nach den Rechenregeln, wie oben gezeigt wurde, umgeformt und vereinfacht werden kann. Bei „kleinen“ und damit überschaubaren Schaltungen kann man nach einer Umformung die resultierende Wertetabelle aufstellen und damit die Äquivalenz überprüfen. Boole´sches Normalformen Theorem:

Eine Schaltfunktion mit n Variablen lässt sich in ihrer sogenannten Disjunktiven Normalform wie folgt darstellen:

Die einzelnen Zeilen heißen Minterme, wobei alle 2n Bitmuster in f(u_1, u_2,...... un) durchlaufen werden: ein Minterm ist eine n stellige Konjunktion, die entweder jede Variable selbst oder ihre Negation enthält. Wegen der Verknüpfung ∧ innerhalb der Minterme fallen die mit f(u_1, u_2,...,un) = F weg, es verbleiben 0 ≤ k ≤ 2n Terme. Somit kommt man zu folgender Vorgangsweise bei gegebener Wertetabelle:

(i)      Wähle alle Zeilen der Tabelle aus, deren Funktionswert „T“ ist und verknüpfe diese „Terme“ mit ∨ (daher der Name Disjunktive Normalform).

(ii)     Verknüpfe die Variablen x1, x2, ..., xn jeder solchen Zeile mit ∧, wobei xj zu invertieren ist, wenn xj in der Tabelle den Wert „F“ hat.

Beispiel:

(i)       (Zeile 2) ∨ (Zeile 3) ∨ (Zeile 4) ∨ (Zeile 8)

(ii)       Zeile 2: (¬ x_1) ∧ (¬ x_2) ∧ x_3

Bzw. in Kurzschreibweise:    x 1 · x 2 · x 3

Zeile 3:                                    x 1 · x 2 · x 3

Zeile 4:                                    x 1 · x 2 · x 3

Zeile 8:                                    x 1 · x 2 · x 3

Die Schritte (i) und (ii) liefern für unsere Tabelle dann

f (x 1,x 2,x 3) = x 1 · x 2 · x 3 + x 1 · x 2 · x 3 + x 1 · x 2 · x 3 + x 1 · x 2 · x 3

Diesen Ausdruck hatten wir in einem vorigen Beispiel vereinfacht zu

f (x 1,x 2,x 3) = x 1 x 2 + x 1 x 3 + x 2 x 3

und durch Nachprüfen über die Tabelle stellt man die Äquivalenz fest.

11.19.2. Sicherheitsmodelle

Für Objekte in Computersystemen o ∈ O, (z.B. Dateien) müssen Vertraulichkeit und Integrität garantiert werden. Vertraulichkeit verlangt, dass Subjekte s ∈ S, wie z.B. Anwender oder Prozesse, nicht unbefugt den Inhalt von Objekten lesen dürfen. Die Forderung nach Integrität soll gewährleisten, dass Subjekte solche Objekte nicht unautorisiert und vor allem nicht unbemerkt verändern können.

Daher führt man Zugriffsrechte R (kurz: Rechte) wie {read, write, …} ein und beschreibt ihre Zuordnung zu S μ O durch eine Zugriffsmatrix M mit M = (m[s,o] ), s ∈ S, o ∈ O, m[s,o] ⊆ R.

Abb. 11.29

Capability Vector als benutzerzentrierte Sicht:

Speichert man eine Zeile m[s,oi], oi ∈ O pro Subjekt s, so spricht man von einem Capability Vektor. In diesem sind die Fähigkeiten (= Zugriffsrechte) eines Subjekts s im gesamten Computersystem, also auf alle Objekte oi, zusammengefasst.

Access Control List als objektzentrierte Sicht:

Speichert man hingegen bei jedem Objekt o die jeweiligen Zugriffsrechte m[si,o] für alle si ∈ S, so nennt man den Spaltenvektor für das Objekt o aus der Matrix M Zugriffskontroll- Liste (Access Control List, ACL) des Objektes o.

Beide Ansätze bilden die Basis für Discretionary Access Control (DAC). Dabei geht dieses Konzept von der Annahme aus, dass der Erzeuger eines Objektes als Besitzer (owner) anderen Benutzern Rechte auf „seine“ Objekte einräumen kann.

Nun ist folgendes möglich: ein Subjekt s_1 hat Leserecht {read} auf ein Objekt o_1, welches vor einem Lesezugriff eines anderen s_2 ∈ S durch m[s_2,o_1] = { } geschützt sein soll. Das Subjekt s_1 kann aber entsprechend seiner Rechte eine Kopie oc von o_1 anfertigen und als Erzeuger von oc dem Subjekt s_2 dort ein Recht {read} einräumen: m[s_2,oc] = {read}.

Dies kann missbräuchlich geschehen oder unbedacht, wenn in einem System z.B. als Standardeinstellung bei neu erstellten Dateien grundsätzlich allen Subjekten Rechte wie {read, write, …} eingeräumt werden.

Daher ist man an einer Ergänzung zu DAC oder an alternativen Modellen interessiert, die den Informationsfluss überwachen.

Solche Methoden werden als MAC-Methoden (Mandatory Access Control) bezeichnet. Eines dieser Modelle, eingeführt von Dorothy E. Denning, werden wir hier in vereinfachter Form beschreiben.

Es verwendet zur Beschreibung erlaubter Flüsse „→“ einen Verband (siehe 4.7).

Die bestimmenden Prinzipien sind:

- Ein Subjekt muss zur Erledigung seiner Aufgaben auf den benötigten Objekten alle dafür erforderlichen Rechte, aber nicht mehr, besitzen (need to know principle).

- Jedem Objekt o ∈ O wird durch eine Abbildung sc(o) eine Sicherheitsklasse c ∈ SC = {c_1, c_2, …} zugewiesen, beispielsweise ein Element aus SC = {öffentlich, vertraulich, geheim, streng geheim}.

Anmerkung: Interpretiert man Subjekte (user) s ∈ S ebenfalls als Informationsquellen wie „klassische“ Objekte, so kann auch Subjekten jeweils eine Sicherheitsklasse zugewiesen werden.

- Auf SC wird über eine Ordnungsrelation ein Verband definiert.

- Mit Blick auf das Hasse-Diagramm von SC darf ein Informationsfluss „→“ nur von „unten“ nach „oben“ erfolgen, z.B. von öffentlich → geheim, aber nicht umgekehrt.

- Damit kann beispielsweise dann jedem Subjekt s von der Sicherheitsadministration über Capabilities der Zugriff auf bestimmte „hohe“ Sicherheitsklassen generell und verpflichtend (= mandatory) verwehrt werden.

Über die Menge der Sicherheitsklassen SC = {c_1, c_2, …} soll also ein Verband erklärt werden:

Für die Flussrelation c_1 → c_2 mit c_1, c_2 ∈ SC definiert man eine partielle Ordnung „≤ ” auf SC. c_1 ≤ c_2 bedeutet, dass von Objekten o mit sc(o) = c_1 Information zu Objekten fließen darf, die ebenfalls mit c_1 markiert sind oder die der Klasse c_2 zugeordnet sind. Eine andere Sprechweise ist: c_2 dominiert c_1.

In Anlehnung an Definition 4.26 nehmen wir jedoch anstatt der geforderten Existenz von sup(c1, c_2) bzw. inf(c_1, c_2) zwei Operatoren ⊕ und ⊗, die mit c_1 ⊕ c_2 bzw. c_1 ⊗ c_2 das sup(c_1, c_2) bzw. inf(c1, c_2) bei erklärter partieller Ordnung „≤ “ liefern.

Es bildet das 4-Tupel (SC, ≤ , ⊕, ⊗) einen Verband, der ein Infimum inf und ein Supremum sup enthält. Objekte, die mit inf markiert sind, können z.B. von allen Subjekten gelesen/beschrieben werden, das sup entspricht dann der höchsten Sicherheitsstufe.

Es lassen sich für den Informationsfluss ≤ folgende Rechenregeln für alle c_1, c_2, c_3 ∈ SC ableiten bzw. überlegen:

− c_1 ≤ c_1 ⊕ c_2, c_2 ≤ c_1 ⊕ c_2 denn aus (c_1 ≤ c_3 ∧ c_2 ≤ c_3) folgt c_1 ⊕ c_2 ≤ c3

− c_1 ⊗ c_2 ≤ c_1, c_1 ⊗ c_2 ≤ c_2 denn aus (c_3 ≤ c_1 ∧ c_3 ≤ c_2) folgt c_3 ≤ c_1 ⊗ c_2

Die Interpretation des Operators ⊕ ist:

Werden zwei Objekte o_1, o_2 zu einem neuen Objekt o_3 kombiniert, so wird die Sicherheitsklasse des neuen Objektes o_3, also sc(o_3), spezifiziert durch sc(o_3) = sc(o_1) ⊕ sc(o_2). Da die Operation ⊕ sowohl assoziativ als auch kommutativ ist, kann man c_1 ⊕ c_2 ⊕ c_3 ⊕ c_4… ebenfalls berechnen und somit auch Fälle abdecken, in denen Daten aus beliebig vielen Objekten kombiniert werden.

Beispiele:

- Wir wählen für SC die linear geordnete Menge {öffentlich < vertraulich < geheim < streng geheim} und mit (SC, ≤ ) den resultierenden Kettenverband.

- Noch einfacher wird dies mit SC = {öffentlich, geheim}. Die erlaubten Flüsse sind öffentlich → öffentlich, geheim → geheim, öffentlich → geheim. Die Ordnung ist somit öffentlich ≤ öffentlich, geheim ≤ geheim, öffentlich ≤ geheim.

Die echte Mächtigkeit des Konzeptes erkennt man an folgendem Beispiel:

In einem Studenteninformationssystem seien Studierendendaten gespeichert, die aus einzelnen „Sätzen“ bestehen, und folgenden Sicherheitskategorien angehören:

d allgemeine Personendaten (Name, Geschlecht, Adresse, …)

v Studienverlaufsdaten (abgelegte Prüfungen, Studienabschnitte, …)

f Finanzdaten (Einkommensverhältnisse z.B. für Stipendien)

Jeder Datensatz ist mit einem eindeutigen gemeinsamen Schlüssel (z.B. Matrikelnummer) versehen, sodass durch Kombination von Sätzen etwa aus d und f neue Informationen erzeugt werden können, denen man die Sicherheitsklasse (d⊕f) geben muss.

In einem ersten Schritt wird der Mengenverband (P{d,v,f}, ∩, ∪) aufgestellt und man erhält folgendes Hasse-Diagramm:

Abb. 11.30

Anwendungsbezogen betrachtet man dann für die Sicherheitsklassen oft nur einen Teilverband, beispielsweise SC={d, dv, df, dvf} mit d≤ dv, d≤ df, dv≤ dvf, df≤ dvf.

Abb. 11.31

Eine mögliche Interpretation ist: Es gibt vier unterschiedliche Sicherheitsklassen, welche die unterschiedlichen Sicherheitsstufen repräsentieren. Personendaten werden mit der Marke „d“ versehen, Finanzdaten, welche implizit Zugriff auch auf die Personendaten benötigen, sind mit „df“ markiert. Weiters werden die Studienverlaufsdaten von Studierenden mit „dv“ abgelegt. Daten, welche sowohl fiskalischer Natur sind, als auch den individuellen Studienverlauf darlegen, sind mit „dvf“ zu kennzeichnen, und damit in der höchsten Sicherheitsstufe. Als Beispiel für letztere seien Basisdaten zur Berechnung von einkommensabhängigen Stipendien bei gutem Studienverlauf genannt, welche dann als Serienbrief an die Studierenden ausgesandt werden.

Wiederum obliegt der Sicherheitsadministration, festzulegen, welchen Subjekten der Zugriff auf welche Sicherheitsklassen prinzipiell verwehrt wird.

11.20. Applets

- Simulation einer Hashtabelle (Einfügen)

Wählbar sind die Länge der Tabelle und diverse Kollisionsstrategien. Visualisiert werden die Hausadressen und die entstehenden Kollisionen.

- Ganzzahlige Potenzen

Implementiert ist die Square and Multiply Methode zur Berechnung von xd mod m.

- Hash Algorithmen

Das Applet zeigt die Ergebnisse verschiedener Hashfunktionen, welche auf einem beliebigen Text angewendet werden. Im oberen Bereich kann ein beliebiger Text in das Eingabefenster eingegeben werden. Wahlweise kann der Eingabetext noch um einen fünfstelligen "Salt-Wert" ergänzt werden. Wird der Salt-Wert verwendet, so wird dieser an den Benutzertext angehängt und sorgt so in der Praxis für erhöhte Sicherheit.

- RSA-Verfahren

Nach Eingabe des privaten und öffentlichen Schlüssels wird nach der RSA-Methode ein Schlüssel (Zahl) chiffriert. Als Eingabehilfe ist bei Bedarf ein Schlüsselgenerator verfügbar, der aus zwei Primzahlen p,q die benötigten Schlüssel erzeugt.

- Diffie-Hellman zum Schlüsselaustausch

Entsprechend dem Verfahren zum Schlüsselaustausch kann man eine Basis, einen Modul und die beiden Geheimnisse der Partner eingeben oder zufällig belegen. Dann werden die einzelnen Schritte bis zum geheimen Schlüssel durchgespielt.

- Graphentheorie

Bei den Applets zur Graphentheorie gibt es grundlegend zwei verschiedene Arten, gerichtete oder ungerichtete Graphensimulationen.

Für gerichtete Graphen gibt es folgende Simulationen:

- Breitensuche

- Komponenten

- Tiefensuche

- Kürzeste Pfade

- Flüsse

Für ungerichtete Graphen gibt es folgende Simulationen:

- Breitensuche

- Brücken

- Komponenten

- Tiefensuche

- Kürzeste Pfade

- Fluten

- Minimal spannender Baum

- Spannender Baum

- Heap

Es wird ein Heap (Halde) an Hand von zufällig erzeugten oder einzugebenden Zahlen aufgebaut. Der Heap wird sowohl als Baum als auch als resultierendes Array gezeigt. Neben dem Einfügen neuer Elemente wird auch das Löschen des obersten Elementes mit anschließendem Versickern visualisiert (Priority Queue).

- CRC-Code

Dieses Applet berechnet nach Auswahl eines CRC-Polynoms und Eingabe eines Datenpaketes die Prüfbits, die an das zu übertragende Paket anzuhängen sind. In einer Variante wird korrekt übertragen, in der anderen werden Fehler eingestreut und das Ergebnis wird angezeigt.

- Page Rank

Die Berechnung des PageRanks wird in 6 Schritten visualisiert. Bereits besuchte Schritte werden dabei grün, der gerade Besuchte Schritt orange und nicht zu besuchende Zustände grau eingefärbt.

Abb. 11.32: Screenshot Applet: „PageRank Simulation“

Abb. 11.33: Screenshots Applet: „CRC“

Abb. 11.34: Screenshots Applet: „Hash Tabellen“

Abb. 11.35: Screenshot Applet: „RSA“

12. Lösungen zu den Übungsaufgaben

12.1. Zahlen, Relationen und Funktionen

Lösung 1.1:

1. Induktionsanfang:

Die Formel ist trivialerweise richtig für n = 1

2. Induktionsannahme:

Wir nehmen an, dass die Formel für n = k gilt, dass also

3. Induktionsschluss:

Es ist zu zeigen, dass die Formel auch für n = k + 1 gilt, d.h. dass

(Einsetzen der Induktionsannahme) =

Lösung 1.2:

Induktionsschluss:

Es ist zu zeigen, dass die Formel auch für n = k + 1 gilt, d.h. dass

(Einsetzen der Induktionsannahme) =

Lösung 1.3:

Induktionsschluss:

Es ist zu zeigen, dass die Formel auch für n = k + 1 gilt, d.h. dass

(1+ x)k+1 > 1+ (k +1)x

(1+ x)k+1 = (1+ x)k (1+ x) > (Einsetzen der Induktionsannahme) =

> (1+ kx)(1+ x) = 1+ kx + x + kx2 > 1+ kx + x = 1+ (k +1)x

Lösung 1.4:

Induktionsschluss:

Es ist zu zeigen, dass die Formel auch für n = k + 1 gilt, d.h. dass

(Einsetzen der Induktionsannahme) =

Lösung 1.5:

Induktionsschluss:

Es ist zu zeigen, dass die Formel auch für n = k + 1 gilt, d.h. dass

≤ (Erste Dreiecksungleichung) ≤

≤ (Einsetzen der Induktionsannahme) ≤

Lösung 1.6:

1. Induktionsanfang:

Die Behauptung ist trivialerweise richtig für n = 1 =1⋅ 20

3. Induktionsschluss:

Es ist zu zeigen, dass die Behauptung auch für n = k + 1 gilt.

Wir machen hier eine Fallunterscheidung:

(i) Ist k+1 gerade, so besitzt   laut Induktionsannahme eine Binärdarstellung und damit auch k+1 (Multiplikation mit 2 liefert wieder eine Binärdarstellung)

(ii) Ist k+1 ungerade, so ist k gerade und besitzt laut Induktionsannahme eine Binärdarstellung. Die Binärdarstellung von k+1 ergibt sich durch Addition von 1 (da k gerade ist ändert sich in der Binärdarstellung von k nur die Stelle bei 20 )

Lösung 1.7:

Der Induktionsanfang n=1 gilt nicht!

Lösung 1.8:

(1) Für ( x – 2 ) ≥ 0, als für x ≥ 2 gilt: | x – 2 | = x – 2 < 3, also x < 5

es gilt also in diesem Fall x ≥ 2 und x < 5.

(2) Für ( x – 2 ) < 0, als für x < 2 gilt: | x – 2 | = –(x – 2) < 3, also x > –1

es gilt also in diesem Fall x < 2 und x > –1.

Die Lösungsmenge ergibt sich als Vereinigung der Lösungen aus Fall 1 und 2, also alle reellen Zahlen x mit –1 < x < 5

Lösung 1.9:

(a) Lösung:

(b) Lösung:

Lösung 1.10:

(a) Lösung:

(b) Lösung:

Lösung 1.11:

Induktionsanfang: n=1

(1+ a)1 = (1+ a) ≤ 1+ (2^1 −1)α stimmt.

Induktionsannahme: die Formel gelte für n = k :

für alle a ∈ [0,1] und alle k ∈ : (1+ a)k ≤ 1+ (2k −1)α

Induktionsschluss: wir zeigen, dass die Formel dann auch für n = k+1 gilt:

Lösung 1.12:

Induktionsanfang: n=0

die leere Menge hat offenbar 2^0 = 1 Teilmengen, nämlich nur sich selbst.

Induktionsannahme: die Formel gelte für n = k :

für alle k ∈ gilt: eine k-elementige Menge hat 2k Teilmengen.

Induktionsschluss: wir zeigen, dass die Formel dann auch für n = k+1 gilt:

Sei M’ eine (k+1)-elementige Menge, dann lässt sich M’ als die um {k+1} vergrößerte Menge M = {1,2, …, k} interpretieren. Dann enthält M’ alle Teilmengen, die M enthält, sowie für jede Teilmenge A von M auch die Vereinigung von A mit {k+1}, die Anzahl der Teilmengen verdoppelt sich also.

Damit hat M’ nach Induktionsannahme genau 2⋅2k = 2k+1 Teilmengen.

Lösung 1.13:

(a) Die Aussage gilt nicht: sei etwa A= , R={(1,2),(2,1),(1,1),(2,2)} ist nicht reflexiv

(zB (3,3) ∉ R)

(b) Die Aussage gilt:

Beweis: zu zeigen ist, dass für jedes a ∈ A ein b ∈ A existiert, mit (a,b) ∈ R weil R reflexiv ist, liegen alle Paare (a,a) in R. Für ein Paar (a,b) muss wegen der Symmetrie auch (b,a) in R liegen, dann folgt aber wegen der Antisymmetrie, dass a=b.

Daher gilt: R = { (a,a) | a ∈ A }, diese Relation ist natürlich funktional.

Lösung 1.14:

Die Behauptung gilt nicht: (das Hinzufügen aller Paare, die auf Transitivität „fehlen“ kann wieder neue Paare liefern, sodass R immer noch nicht transitiv ist)

zB.: sei R={(1,1),(2,2),(3,3),(4,4),(1,2),(2,3),(3,4),(2,1),(3,2),(4,3)} auf A={1,2,3,4} dann ist S \ R= {(1,3),(3,1),(2,4),(4,2)} (das sind die Paare, die dazukommen) jetzt ist aber etwa (1,4) nicht in R ∪ S, daher ist R ∪ S nicht transitiv.

Lösung 1.15:

(a) f: → , y² = x²

f ist keine Funktion – zB. für x = 1 gibt es zwei Bildwerte y, nämlich 1 und –1

(b) f: ²→ , (x,y) → x y

f ist eine Funktion, jedes (x,y) hat genau ein Bild in den reellen Zahlen

f ist nicht injektiv: (zB f(1,2) = 2 = f(2,1) )

f ist surjektiv: JA (jedes r ∈ wird z.B. durch (r,1) erreicht)

(c) f: ²→ , (x,y) → –y – x

f ist eine bijektive Funktion (jedes a +  b∈  wird genau einmal durch (–b, –a) ∈² erreicht.)

(d) f: ²→ , (x,y) → x² + y

Funktion: ja, jedes (x,y) hat genau ein Bild in den natürlichen Zahlen

injektiv: NEIN (zB f(2,1) = 5 = f(1,4) )

surjektiv: NEIN (f(x,y) ≥ 2)

(e) f: ²→, (x,y) → x – y

keine Funktion (zB. f(1,2) = –1 ∉ ) )

Lösung 1.16:

(a) Sind f und g surjektiv, so auch g o f :

weil g surjektiv ist gilt: ∀c∈C ∃b∈B : c = g(b)

weil f surjektiv ist gilt: ∀b∈B ∃a∈A : b = f(b)

und somit gilt (b eingesetzt) : ∀c∈C ∃a∈A : c = g(f(a)), genau das war zu zeigen

(b) Sind f und g injektiv, so auch g o f :

∀ a1, a2 ∈ A : a1 ≠ a2 ⇒ f(a1) ≠ f(a2) ⇒ g(f(a1)) ≠ g(f(a2)) was zu zeigen war

f ist injektiv            g ist injektiv

(c) Sind f und g bijektiv, so auch g o f :

folgt aus (a) und (b) (bijektiv = injektiv und surjektiv)

12.2. Elementare Zahlentheorie

Lösung 2.1:

Lösung 2.2:

Lösung 2.3:

Wie oben ergibt sich ggT(26,14) = 2

Wegen ggT(26,14)*kgV(26,14) = 26*14 gilt kgV(26,14) = 26*7 = 182

Lösung 2.4:

Wie oben ergibt sich ggT(60,135) = 15 und kgV(60,135) = 540

60 = 2*30 = 2*2*15 = 2*2*3*5 = 2²*3*5

135 = 3*45 = 3*3*15 = 3*3*3*5 = 3³*5

nun gilt aber:

2max(2,0) *3max(1,3) *5max(1,1) = 22 *33 *5 = 540 = kgV(60,135) sowie:

2min(2,0) *3min(1,3) *5min(1,1) = 20 *31 *5 = 15 = ggT(60,135)

Lösung 2.5:

(a) ist wegen ggT(6,8)=2 nicht lösbar, denn 2 ist kein Teiler von 7

(b) ggT(6,8) = 2 ⁄ 10, also ist die diophantische Gleichung lösbar.

Wir kürzen und erhalten: 3x + 4y = 5

Es gilt (analog zu Übung 2.2):

d = ggT(3,4) = 1 = (–1)*3 + 1*4

c = 5, Multiplikation mit c/d = 5 liefert:

5 = (–5)*3 + 5*4

wir haben also Lösungen x_0 = –5 bzw. y_0 = 5

alle Lösungen ergeben sich jetzt durch:

d.h. die Lösungsmenge  ={ (–5,5), (–1,2),( –9,2), …)

Lösung 2.6:

p(8) = 3*64 + 8 + 1 = 201

p(3) = 3*9 + 3 + 1 = 31

es gilt also p(8) ≡ p(3) mod 5, was wegen 8 ≡ 3 mod 5 aus Satz 1.1 folgt.

Lösung 2.7:

(a) 5 ≡ 0 mod 5

1 ≡ 1 mod 5

2 ≡ 2 mod 5

8 ≡ 3 mod 5

–1 ≡ 4 mod 5

wir erhalten also 5 verschiedene Reste bei Division durch 5 („“)

(b) nein, etwa 2 ≡ 7 mod 5

Lösung 2.8:

(a) b=7 und d=ggT(2,7) = 1 ⁄ b (Satz 1.14), also ist die Gleichung lösbar.

Es muss also gelten: x ≡ y*5 mod 7, wobei y in zu 7 2 invers ist, wegen 2*4 ≡ 1 mod 7 ist 4 so ein y und x = 4*5 = 20 ≡ 6 mod 7 die (wegen Satz 2.15) einzige Lösung.

(b) b=6 und d=ggT(3,6) = 3, also ist die Gleichung nicht lösbar (3 ist kein Teiler von 4)

Lösung 2.9:

(a) 17 ist eine Primzahl, also hat die multiplikative Gruppe genau 17–1 = 16 Elemente.

(b) 12 ist nicht prim. Man könnte die zu 12 teilerfremden Zahlen durch Probieren bestimmen, es sind 1,5,7,11

eleganter geht es mit Definition 2.7:

(man beachte, dass jeder Primfaktor im Produkt maximal einmal vorkommt, auch wenn er in der Primfaktorzerlegung – wie hier „2“eine höhere Potenz besitzt.)

Lösung 2.10:

da 3, 5 und 7 paarweise relativ prim sind, ist das System wegen Satz 2.5.1 lösbar.

es gilt dann:

M = 3 · 5 · 7 = 105 sowie

M_1 = 5 · 7 = 35, M_2 = 3 · 7 = 21, M_3 = 3 · 5 = 15 sowie

c_1 = 2, c_2 = 4, c_3 = 5 laut Angabe

damit gilt:

M_1 y_1 ≡ 1 mod 3, also 35 y_1 ≡ 1 mod 3

M_2 y_2 ≡ 1 mod 5, also 21 y_2 ≡ 1 mod 5

M_3 y_3 ≡ 1 mod 7, also 15 y_3 ≡ 1 mod 7

also:

y_1 ≡ 2 mod 3

y_2 ≡ 1 mod 5

y_3 ≡ 1 mod 7

und für die Lösung gilt:

x = c_1 M_1 y_1 + c_2 M_2 y_2 + c_3 M_3 y_3 = 140 + 84 + 75 = 299, also:

x ≡ 299 mod 105

x ≡ 89 mod 105

12.3. Analytische Geometrie

Lösung 3.1:

Seien A’, B’ und C’ die Punkte, die die drei Schwerlinien im Verhältnis 2:1 schneiden.

Zu zeigen ist dann nur mehr, dass die drei Punkte sich in einem Punkt treffen.

Lösung 3.2:

Lösung 3.3:

Nach obiger Skizze gilt mit dem Strahlensatz:

Lösung 3.4:

Lösung 3.5:

Wir berechnen das entstehende Volumen mittels Spatprodukt

dann gilt für den Seitenvektor Fv der entstehenden Figur (schiefes Prisma):

somit ist das Volumen gleich dem halben Spatprodukt:

Lösung 3.6:

Seien  und s der reflektierte Strahl und n r die Projektion von r auf den

Normalvektor von ε , dann gilt offenbar, dass s +2rn=r, also

Lösung 3.7:

Seien a,b,c die drei Vektoren, die den Tetraeder aufspannen.

Die gesuchten Normalen sind dann mit Satz 3.7:

die Summe dieser vier Vektoren ergibt 0

Lösung 3.8:

Seien  und s der reflektierende Strahl und rn die Projektion von r auf den Normalvektor von ε (vgl. 7.17) , dann gilt offenbar, dass s+ 2rn=r , also

Lösung 3.9:

Schnittpunkt der beiden Geraden: Gleichsetzen liefert λ = 2 ,μ = 3, d.h. S = (2,6,10)

Der Schnittwinkel φ ist gleich 90° minus dem Schnittwinkel zwischen AS und dem Normalvektor der durch ABC bestimmten Ebeneε :

(Diese beiden Geraden schneiden sich in S, nicht in A, um den gesuchten Winkel zu erhalten, muss man daher 90° subtrahieren.)

Lösung 3.10:

Der Durchstoßpunkt N ergibt sich als Schnittpunkt von ε mit der durch S und nε gegebenen Geraden, also N = (−2,7,2) , somit erhalten wir als Lösung :

Lösung 3.11:

Die Ebene hat den gekürzten Normalvektor (-2, 1, 2) die Gewichtskraft ist fg = m⋅a = 3(0,0,-10) (Erdbeschleunigung gerundet auf 10m/s²)

Projektion von fg auf den Normalvektor liefert den Anteil der Gewichtskraft, der auf die Ebene liefert: fn = (40/3, 20/3, -40/3) und | fn | = 20N

12.4. Algebraische Strukturen

Lösung 4.1:

Die Verknüpfungstabelle ist etwa wegen:

b⊗(c⊗d) = b⊗a = b und (b⊗c) ⊗d = a⊗d = d

nicht assoziativ, es handelt sich also um keine Halbgruppe, damit natürlich auch um keine andere algebraische Struktur.

Lösung 4.2:

Wir nehmen an, die Elemente der Gruppe seien g_1, …, gn.

Angenommen, es gebe zum Beispiel in der ersten Zeile kein Element gk dann würde gelten:

g_1 ⊗ gj ≠ gk für alle gj. Jetzt ist aber (g_1)–1⊗ gk ein Element der Gruppe

(Abgeschlossenheit!) und damit würde mit gj = (g_1)–1⊗ gk gelten:

g_1 ⊗ ((g_1)–1 ⊗ gk ) = (g_1 ⊗ (g_1)–1) ⊗ gk = 1 ⊗ gk ≠ gk Widerspruch.

Lösung 4.3:

Lösung 4.4:

Wir müssen natürlich eine nicht-abelsche Gruppe finden:

Lösung 4.5:

Für ein beliebiges n ≥ 3, wir schreiben nur die ersten drei Spalten der Permutation an, gilt (Gegenbeispiel):

man sieht also, dass bereits die ersten drei Spalten der Permutation nicht übereinstimmen, Widerspruch zur Kommutativität.

Lösung 4.6:

(a) nein, 4 ist kein Teiler von 9 (Satz 4.3) oder: 6 + 6 = 3 mod 9, aber 3 ist kein Element von {0,2,4,6}

(b) ja, folgt direkt aus Definition 4.8 man kann freilich auch mit Satz 4.3 alle Kombinationen von Elementen durchprobieren.

ACHTUNG: 4 teilt 8 ist in diesem Fall notwendig, aber nicht hinreichend!

Lösung 4.7:

(a) 4 · 4 · 4 · 4 · 4 = 1 mod 11, also ist ord(4) = 5

(b) hier ist ord(4) = 11, da die Gruppe Primzahlordnung hat und damit keine eigentlichen (nicht-trivialen) Untergruppen besitzt.

Lösung 4.8:

0U = {0+0, 0+3, 0+6, 0+9} = {0,3,6,9} = U

1U = {1,4,7,10}

2U = {2,5,8,11}

0U = 3U = 6U = 9U

1U = 4U = 7U = 10U

2U = 5U = 8U = 11U

0U ∪ 1U ∪ 2U = G, man erhält also eine Partition von G.

Lösung 4.9:

(i) Laut Satz von Lagrange gilt:

ord(G) = |G : U| · ord(U), also 12 = |G : U| · 4, damit ist der Index gleich 3.

(ii) Aus Übung 4.8 folgt, dass es drei verschiedene Nebenklassen bzgl. U gibt.

Lösung 4.10:

(a) L = {(0,1,2)} … eine Lösung

(b) L = { } … keine Lösung

(c) L = {(1+ 4z,2 + z, z) | z ∈5 } = {(1,2,0),(0,3,1),(4,4,2),(3,0,3),(2,1,4)} …

5 Lösungen

(d) L = {(3 + y + 3z, y, z) | y, z ∈5 } … 25 Lösungen

Lösung 4.11:

(a)

das letzte Polynom ist über 2 irreduzibel, daher gilt:

(1+ x^3 + x^4 + x^7) = (1 + x)4 (1 + x + x^2)

Einzige Nullstelle ist 1 (Vielfachheit 4)

(b)

analog zu (a) ergibt sich:

– 24 – 4x – 2x^2 – x^3 + x^4 = (–3 + x) (–2i + x)(2i – x)(2+x)

Lösung 4.12:

Die Behauptung gilt. Beweis:

Sei a erzeugendes Element von G und sei m die kleinste natürliche Zahl mit am ∈ H.

Wir zeigen, dass am erzeugendes Element von H ist:

Jedes h ∈H lässt sich (als Element von G) schreiben als h = ak = asm+r = (am)s o ar mit s∈ und 0 ≤ r < m.

Wegen ar = (am)–s o h ∈ H folgt aber aus der Minimalität von m, dass r = 0 ist und damit h = (am)s ist, was zu zeigen war.

Lösung 4.13:

958003200 = 2 * 479001600 , letzteres ist die Gruppenordnung (12 ! )

Damit gilt: g958003200 = (g479001600)2 = e^2 = e.

Lösung 4.14:

(a) ( 15, +, ⋅ ) ist nicht nullteilerfrei ( 3⋅5 ≡ 0 )

(b) Ja:

(i) Offensichtlich ist (R, +) eine abelsche Gruppe und (R, ⋅) eine Halbgruppe

(ii) Distributivität: λ(u + v) = λ[ (a + b √2 ) + (c + d √2 )] = λ[ (a + c) + √2 (b + d)] = λ(a + c) + λ √2 (b + d) = λa + λ c + λ √2 b + λ √2 d = λa + λ √2 b + λ c +

λ √2 d = λ(a + √2 b) + λ (c + √2 d ) = λ u + λ v

(ii) bleibt zu zeigen, dass (R, ⋅) eine abelsche Gruppe ist:

- neutrales Element ist 1 (= 1 + 0 √2 )

- inverses Element zu a + b √2 ist ein u + v √2 mit (a + b √2 )( u + v √2 ) = 1

Lösen mit Koeffizientenvergleich liefert u =

für a, b ∈ ist der Quotient jeweils wieder rational, damit haben wir das Inverse.

Lösung 4.15:

(a) nein, z.B. 2 = ( { 0, 2, –2, 4, –4, … }, +, ⋅ ) hat kein Einselement

(b) nein, (2,0) etwa ist bzgl. der Multiplikation nicht invertierbar, da 0 nicht invertierbar ist.

oder: (alternative Begründung) es gibt Nullteiler, zB (4,0) ⋅ (0,1) = (0,0)

Lösung 4.16:

∀x, y ∈ K : (x ⋅ y = 0) ∧ (x ≠ 0) ⇒ y = (x−1 ⋅ x) ⋅ y = x−1 ⋅ (x ⋅ y) = x−1 ⋅ 0 = 0

d.h. wenn das Produkt von zwei Elementen Null ist und ein Element ungleich Null ist, dann muss das andere Null sein.

12.5. Vektorräume

Lösung 5.1:

Zum Beweis wird Satz 5.1.g verwendet, für den Beweis von (a) sind aber zu diesem Zeitpunkt nur die Axiome bekannt.

Lösung 5.2:

(a) Nein,  ist kein Körper

(b) Nein, die Multiplikation (K ×V ) →V,(λ ,v)→λ ⋅ v , ist nicht definiert, zB.: 2 ⋅1∉

(c) Ja, abgeschlossen bzgl. der Multiplikation und alle Gesetze aus Satz 5.1 erfüllt

(d) ( { a + b π | a,b ∈ }} ) über

Nein, nicht abgeschlossen bzgl. der Multiplikation mit reellen Zahlen, es gilt etwa:

2 ⋅ (1+ 0π ) = 2 ≠ a + bπ

Lösung 5.3:

(a) ja, Unterraum, Ebene durch den Ursprung

(b) kein Unterraum o ∉ U

Lösung 5.4:

(a)

es gilt etwa: (3,−4,5) ~ (1,−4,3) , weil (3,−4,5) − (1,−4,3) = (2,0,2)∈U , allgemein gilt

also:

(b)

(c)

Beim Faktorraum handelt es sich um alle zur Geraden

parallelen Geraden, also alle Geraden mit diesem Richtungsvektor.

Lösung 5.5:

Lösung 5.6:

(a) Nein! 3(1,2,1) − 2(3,1,5) +1(3,−4,7) = (0,0,0)

(b) Ja! Wir lösen

und erhalten: 0 1 2 3 λ = λ = λ =

Lösung 5.7:

Gilt nicht: Gegenbeispiel: M = { √2,2}

nur in ( ,+) über  gilt mit λ = √2 , μ = −1:

λ ⋅ √2 +μ ⋅ 2 = √2 ⋅ √2 + (−1) ⋅ 2 = 0

Lösung 5.8:

U={(x, y, z)| x + y + z = 0}= {(− y − z, y, z)| y, z ∈  }

damit ist etwa {(−1,0,1),(−1,1,0)} eine Basis und die Dimension ist 2.

Lösung 5.9:

(a) zB B = ({1},{2},{3}) ist l.u. und trivialerweise ist L(B) = V

(b) die Koordinaten von {1,3} bzgl. B sind (1,0,1), weil:

1⋅{1} Δ 0 ⋅{2} Δ 1⋅{3} = {1} Δ { } Δ {3} = {1,3}

Lösung 5.10:

(a) ja, B ist eine Basis – die drei Elemente sind linear unabhängig und dim(V)=3

(b) wir lösen λ_1 (– 1)+ λ_2 x + λ_3(x – x²) = 1 + x²

Und erhalten als Koordinaten: (–1,1,–1)

Lösung 5.11:

(a) ja, die symmetrische Differenz zweier endlicher Mengen ist wieder endlich, „Multiplikation“ mit 0,1 bleibt endlich, damit ist das Unterraumkriterium erfüllt.

(b) nein, etwa Δ ={} ∉ U

oder:

0.M ={}, auch nicht unendlich

Lösung 5.12:

(a) (x1, y1, z1) ~ (x2, y2, z2) ⇔ (x1, y1, z1) – (x2, y2, z2) ∈ U ⇔

⇔ (x1–x2, y1–y2, z1–z2) ∈ U ⇔ x1–x2 + z1–z2 = 0 ⇔ x1 + z1 = x2 + z2

also zwei Elemente stehen dann zueinander in Relation, wenn die Summe der ersten und dritten Koordinate jeweils gleich ist (modulo 5).

(b) [ (1,2,3) ] = { (x,y,z) ∈ V | (x,y,z) – (1,2,3) ∈ U } =

= { (x,y,z) ∈ V | (x+4,y+3,z+2) ∈ U } = { (x,y,z) ∈ V | x+4 + z+2 = 0 } =

= { (x,y,z) ∈ V | x = 4-z } = { (4-z, y, z) | y, z ∈ 5 }

(c) y und z sind frei wählbar, also hat die Klasse 25 Elemente

3 beliebige Elemente: (1,2,3), (1,0,3), (2,1,2), es gilt jeweils v – (1,2,3) ∈ U

Lösung 5.13:

(a) (analog zu Übung 4b ergibt sich):

V/U = { { (x,y,z) ∈ V | x + z = c } | c ∈ 5 } = { { (x,y,z) ∈ V | x = c+4z } | c ∈ 5 } =

= { { (4z,y,z) | y ∈ 5 }, { (1+4z,y,z) | y ∈ 5 } , { (2+4z,y,z) | y ∈ 5 } ,

{ (3+4z,y,z) | y ∈ 5 } , { (4+4z,y,z) | y ∈ 5 } }

(b) der Faktorraum hat also 5 Elemente, nämlich die 5 verschiedenen Äquivalenzklassen

(1,3,2) liegt freilich nicht im Faktorraum, da (1,3,2) keine Menge ist. (1,3,2) ist ein Element eines Elements des Faktorraums, und zwar ein Element von [(1,3,2)].

(c) das neutrale Element ist (immer) die Äquivalenzklasse von (0,0,0), also U. Eine mögliche Teilmenge mit 2 Elementen wäre {(0,0,0), (2,0,3)}, oder auch { (0,2,0), (1,4,4} ), etc.

(die Summe aus erster und dritter Koordinaten ist immer gleich 0)

Lösung 5.14:

(i) linear unabhängig:

zB drei beliebige disjunkte Mengen, zB R = {1,2,3}, S = {4,8} und T = {5,6}

dann gilt natürlich: (λ ⋅ R)Δ(μ ⋅ S )Δ(ν ⋅T ) = { } ⇒ λ = μ =ν = 0

(ii) linear abhängig

zB R = {1,2,3}, S = {1,2} und T = {3}

dann gilt (1⋅ R)Δ(1⋅ S)Δ(1⋅T ) = { } und somit sind die drei Mengen l.a.

12.6. Matrizen

Lösung 6.1:

(a)

(b)

(c) nicht definiert, die Dimensionen stimmen nicht überein.

Lösung 6.2:

analog: d = 3 , weiters: c + b = 0

also:

Lösung 6.3:

Behauptung:

Beweis der Behauptung mit vollständiger Induktion:

Induktionsanfang: n = 1, trivial

Induktionsannahme:

Induktionsschritt:

was zu zeigen war.

Lösung 6.4:

Die Inverse nicht definiert, die Matrix ist singulär über 3.

Lösung 6.5:

Probe:

Lösung 6.6:

(analog zu voriger Übung)

Lösung 6.7:

ist nicht regulär, wir berechnen den Nullraum, dies liefert:

Eine Lösung des Systems ist jetzt etwa  wodurch wir die Lösungsmenge

erhalten.

Lösung 6.8:

12.7. Determinanten

Lösung 7.1:

Lösung 7.2:

Lösung 7.3:

(b) analog (a), Lösung natürlich wieder 3

Lösung 7.4:

da die ersten beiden Spalten identisch sind (Satz 7.3)

(b)

da die zweite Zeile gleich Null ist (Satz 7.3)

Lösung 7.5:

(a) durch Entwicklung nach der 3. Zeile:

(b) durch Entwicklung nach der 2. Spalte:

Lösung 7.6:

Lösung 7.7:

Das charakteristische Polynom ist

damit ergeben sich als Eigenwerte –2 bzw. 4.

Lösung 7.8:

Die Spur ist die Summe der Diagonalelemente, also gleich 0, dies entspricht der Summe der Eigenwerte, gezählt mit Vielfachheit (Satz 7.17).

Die Determinante von A ist gleich dem Produkt der Eigenwerte (Satz 7.16), also gleich 16.

Die Eigenwerte der inversen Matrix (diese existiert, da 0 kein Eigenwert ist) sind – ½ bzw. ¼ .

Lösung 7.9:

Beweis der Formel für die „Vandermonde’sche Determinante“

(i) Induktionsanfang: n=2

(ii) Induktionsschluss n → n +1

(jeder Spalte minus das α_1 -fachen der vorigen Spalte)=

12.8. Graphentheorie

Lösung 8.1:

Nur (4) ist ein spannender Baum.

Man beachte, dass *V(X)* = n = 7 und daher *E(X)* = n-1 = 6 sein muss (notwendige Bedingung). Der Graph (3) erfüllt zwar diese notwendige Bedingung, ist aber nicht zusammenhängend.

Lösung 8.2:

Man sortiert zunächst die Kanten nach ihren Längen:

[S,T,10], [P,R,15], [R,T,35], [P,S,45], [P,T,45], [R,S,45], [Q,R,55], [Q,S,55], [P,Q,65], [Q,T,65].

Mit dem Algorithmus zur Bestimmung eines Minimalgerüsts gilt:

Die ersten drei Kanten [S,T,10], [P,R,15], [R,T,35] bilden noch keinen Kreis und können aufgenommen werden. Jede der folgenden drei n würde zu einem Kreis führen, so sie dass aus der Menge der verfügbaren Kanten ausscheiden. Als nächst kleinere Kanten findet man [Q,R] und [S,T], die beide Gewicht 55 haben.

Beide Kanten können zur Vervollständigung eines Spannenden Baums verwendet werden .Es gibt also zwei minimale Bäume, nämlich:

{ [P,R], [Q,R], [R,T],[S,T] } und { [P,R], [Q,S], [R,T], [S,T] }.

Lösung 8.3:

(Indirekter Beweis:) Angenommen die Kante e läge auf einem Kreis, so könnte man einerseits zu jedem x ∈ V(K_1) und y ∈ V(K_2) einen Weg finden und wegen der Lage auf dem Kreis auch umgekehrt. Dann wären aber weder K_1 noch K_2 maximal und damit keine starken Komponenten.

Lösung 8.4:

Jede sortierte Folge erzeugt als Suchbaum eine lineare Liste.

Lösung 8.5:

Laut Definition kommen zu jedem Knoten maximal (2k+1) Knoten hinzu. Dies bedeutet aber, dass bei Niveau h maximal

Knoten existieren können.

Lösung 8.6:

Lösung 8.7:

Da jeder Knoten zu jedem der anderen Menge adjazent sein muss, ist die Anzahl der Kanten gleich m⋅n.

Lösung 8.8:

Als Graph dargestellt erhält man einen Paaren Graphen: die Knotenmenge H links steht für die Herren und die Knotenmenge D rechts entspricht den Damen. Wer mit wem tanzen will oder kann wird durch eine Kante [h,d] mit h∈ H und d ∈ D dargestellt und da gleichgeschlechtliche Paare in diesem klassischen Problem nicht vorgesehen sind, ist der resultierende Graph ein Paarer Graph.

Eine Lösung erhält man durch Bestimmung eines maximalen Matching. Dieses könnte wie in Kapitel 8.9 erläutert über die Bestimmung eines maximalen Flusses berechnet werden: Man führt zusätzlich eine Quelle q und eine Senke s ein, zeichnet gerichtete Kanten <q,h> mit h ∈ H und <d,s> mit d ∈ D ein, wobei jeweils als Kapazität 1 definiert wird. Für die Kanten [h,d], die jetzt als gerichtete Kanten <h,d> interpretiert werden, nimmt man ebenso eine Kapazität 1 an. Ein maximaler Fluss bestimmt damit implizit, wer mit wem tanzen kann.

Im Beispiel kommt es zu 6 Tanzpaaren . Die Lösung ist nicht eindeutig, es müssen z.B Herr h1 und Dame d5 leider zusehen. Zur Berechnung kann das Applet „gerichtete Graphen“ mit der Option Maximaler Fluss verwendet werden.

Eine weitere Lösung ist: [h1,d3],[h2,d1],[h4,d5],[h5,d4],[h6,d7],[h7,d6].

12.9. Grundkonzepte der Automatentheorie

Lösung 9.1:

Lösung 9.2:

s_1s_21s_2s_3 . Das Wort 101 würde akzeptiert werden, wäre s_2 ein Endzustand, also im Diagramm mit einem doppelten Kreis gezeichnet.

Lösung 9.3:

Der Automat geht von s_0 zunächst nach s_1 und pendelt dann zwischen s_1 und s_3. Der Output ist 1, 0, 1, 0, 1, 0.

Hinweis: simulieren Sie die Situation mit Hilfe des Applets DEA, indem Sie das aus der Tabelle resultierende Zustandsdiagramm zeichnen.

12.10. Codierungstheorie

Lösung 10.1:

Sei H die Kontrollmatrix, wir lösen H ⋅ ct = 0 :

Wir erhalten also: C={(x_5 , x_4 , x_4 x_5 , x_4 , x_5 ) | x_4 , xi ∈ 2 }= {00000,10101,01110,11011}

Lösung 10.2:

11011 + 11011  = 00000

01110 + 11011  = 10101

10101 + 11011  = 01110   (dass 0 +c ∈C ist, dürfte klar sein!)

10101 + 01110  = 11011

10101 + 10101  = 00000

Bemerkung: Eine sinnvollere Probe wäre freilich der Test H ⋅ ct = 0 für alle Codewörter c

Lösung 10.3:

Wir lösen wie im vorigen Beispiel das Gleichungssystem P ⋅ xt = 0 und erhalten:

Lösung 10.4:

drei (vgl. Beispiel drei)

Lösung 10.5:

- rg(P)=2, also dmin(c) = 3  ODER:

- jedes Codewort hat zumindest 3 Einser, also wieder dmin(c) = 3

d.h. dieser Code kann  Fehler korrigieren und 3 −1 = 2 Fehler erkennen.

Lösung 10.6:

Es handelt sich um einen (7,4)-Code, also mit n = 7 , k = 4 , d = 3 ergibt sich: Informationsrate = 4/7, Korrekturrate = 3/7

Lösung 10.7:

Lösung 10.8:

Unser Code hat nur 16 Codewörter, nach obigem Schema bringen wir also das „R“ nicht mehr unter …

Literatur

Allgemeine

W. Dörfler, W. Peschek: Einführung in die Mathematik für Informatiker C. Hanser-Verlag, 1988 ISBN: 34 46 15 11 25

P. Hartmann: Mathematik für Informatiker Vieweg-Verlag, 2006, 4. Auflage ISBN: 38 34 80 09 61

E. Zeidler (Hrsg.): Teubner-Taschenbuch der Mathematik B. G. Teubner-Verlag, 2003, 2. Auflage ISBN: 35 19 20 01 20

Zahlentheorie

H. Hasse: Vorlesungen über Zahlentheorie Grundlehren der Mathematischen Wissenschaften Bd. 59 Springer-Verlag, 1964 ISBN: B 0000 BJ 4K9

G.H. Hardy, E.M. Wright: An Introduction to the Theory of Numbers Clarendon Press Oxford, 1980, 5. Auflage deutsche Übersetzung: Oldenbourg-Verlag, 1958 ISBN: 01 98 53 17 10

R. Remmert, P. Ullrich: Elementare Zahlentheorie Birkhäuser-Verlag, 1995, 2. Auflage ISBN: 37 64 35 19 77

Analytische Geometrie

E. Barth, F. Barth, G. Krumbacher: Anschauliche Analytische Geometrie Oldenbourg, 2000, 4. Auflage ISBN: 34 86 03 02 3X

M. Koecher: Lineare Algebra und Geometrieir nehmen an, dass die Formel für n = k gilt, dass also Springer-Verlag, 1997, 4. Auflage ISBN: 35 40 62 90 33

Algebra

A. Fischer, W. Schirotzek, K. Vetters: Lineare Algebra. Eine Einführung für Ingenieure und Naturwissenschaftler Teubner-Verlag, 2003 ISBN: 35 19 00 37 08

B. Huppert: Lineare Algebra Teubner, 2006 ISBN: 38 35 10 08 90

R. Lidl, G. Pilz: Applied Abstract Algebra Springer, New York, 2nd Edition, 1998 ISBN: 0-387-98290-6

A. V. Mikhalev, G. Pilz: The Concise Handbook of Algebra Kluwer, Dordrecht, 2002 ISBN: 0-7923-7072-4

G. Pilz: Endliche Strukturen Trauner-Verlag, 1988 ISBN: 38 53 20 42 87

K.H. Spindler: Abstract Algebra with Applications (2 Bände) Marcel Dekker, New York, 1994 ISBN: 0-8247-9144-4 ISBN: 0-8247-9159-2

Graphentheorie

M. Aigner: Diskrete Mathematik Vieweg-Verlag, 2004, 5. Auflage ISBN: 35 28 47 26 85

R. Diestel: Graphentheorie Springer-Verlag, 2006, 3. Auflage ISBN: 35 40 21 39 10

W. Dörfler, J. Mühlbacher: Graphentheorie für Informatiker Walter de Gruyter, Göschen Band 6016, 1973 ISBN: 3 11 003946 X

G. Pilz: Endliche Strukturen Trauner-Verlag, 1988 ISBN: 38 53 20 42 87

Spezielle Literatur zu den Anwendungen

R. Bayer, E. McCreight: Organization and Maintenance of Large Ordered Indexes Acta Informatica, 1, 1972, 173-189

S. Brin, L. Page: The Anatomy of a Large-Scale Hypertextual Web Search Engine Computer Networks and ISDN Systems, 30, 107-11, 1998

D.E. Denning: A Lattice Model of Secure Information Flow CACM 19(3), 34-40, 1996

W. Diffie, M.E. Hellman: Multiuser Cryptographic Techniques Proc. of AFIPS National Computer Conference, 1976, 109-112

J. Encarnação, W. Straßer , R. Klein: Graphische Datenverarbeitung I R. Oldenbourg Verlag, 1996 ISBN: 3-486-23223-1

R.W. Floyd: Treesort CACM Vol 7, Nr.12, pg 701, 1964 Z. Galil: Efficient Algorithms for finding Maximum Matching in Graphs ACM Computing Surveya, Vol 18, Nr. 1, 1986

D.A. Huffman: A method for the construction of minimum – redundancy codes Proceedings of the IERE, 40,1098-1101, 1952

R. R. Jueneman, S. M. Matyas, C. H. Meyer: Message Authentication with Manipulation Detection Codes Proc. IEEE Symposium on Research in Security and Privacy, 733-754, 1983

D.E. Knuth: The Art of Computer Programming Vol 2: Seminumerical Algorithms, 3rd Edition, Addison Wesley, Reading, MA, 1997 ISBN: 0-201-89684-2.

J.F. Kurose, K.W. Ross: Computer Networking: A top down Approach featuring the Internet Addison Wesley Longman, 2001, bzw. Computernetze, ein Top Down Ansatz mit Schwerpunkt Internet Pearson Studium 2002 ISBN: 3-8273-7017-5

J.R. Mühlbacher: Full Hash Table Search using Primitive Roots of the Prime Residue Group Z/p; Journal of Universal Computer Science, Vol.10 (2004), Issue 9, pp. 1239-1249

T. Ottmann, P. Widmayer: Algorithmen und Datenstrukturen 4. Auflage, Spektrum Verlag, 2002 ISBN: 3-8274-1029-0

R-L. Rivest, A. Shamir, L.M. Adleman: A Method for Obtaining Digital Signatures and Public-Key Cryptosystems CAMCM, Vol 21, Nr 2, 1978, 120-128

B. Schneier: Angewandte Kryptographie Addison Wesley,1996 ISBN: 3-89319-854-7 bzw. Applied Cryptography, 1996 ISBN: 0-471-11709-9

R. Sedgewick: Algorithms Addison Wesley,1988 ISBN: 0-201-06673-4 bzw. Algorithmen, Pearson Studium ISBN: 3-8273-7032-9

D. R. Stinson: Cryptography, Theorie and Praxis CRC Press LLC, 1995 ISBN: 0-8493-8531-0

A.S. Tanenbaum: Computer Networks 4th Ed., Pearson Education Inc, 2003 ISBN: 0-13-038488-7, bzw. Computernetzwerke, Pearson Studium, 2003 ISBN: 3-8273-7011-6

Index

A

Absorptionsgesetz

Abszisse

Access Control List .

ACL  Siehe Access Control List

Additionsregeln

adjazent

Adjazenzmatrix

Algebraische Strukturen

allgemeine Geradengleichung

Alphabet

alternierender Weg

Analytische Geometrie

antisymmetrisch

Arboreszenzen

array

Artikulation

assoziativ

Assoziativgesetz

Asymmetrische Verschlüsselung

Austauschsatz von Steinitz

Automatentheorie

azyklischer Graph

B

b-adische Darstellung.

Balance

Balanzierte Bäume

Basen

Bäume

B-Bäume

Bertrand Russel

Beschränkter Verband

bewerteten Graphen

Bewertung von Web-Seiten

bijektiv

Bildbereich

binäre Arboreszenz

Binäre Bäume

binäre Codes

binäre Relation

Binet´schen Formel

Binomialkoeffizient

Binomialverteilung

bipartiter Graph

Blatt

Block

Boole´sche Algebra

Boole´sches Normalformentheorem

Boole’sche Algebra

Breitensuche (BSF)

Brücke

BSF-Verfahren

C

cap

Capability Vecto

Carl Adam Petri

Carl Friedrich Gauß

charakteristische Gleichung

charakteristisches Polynom

Chinesischer Restsatz

Cliquenproblem

Code

Codewörter

Codierungs-Algorithmus

Codierungstheorie

Cosinus-Satz

Cramer´schen Regel

Cramer’schen Regel

CRC Codes in der Praxis

cup

cut

Cyclic Redundancy Check

Cyclic Redundancy Code

D

DAC   Siehe Discretionary Access Control

David A. Huffman

De Morgan Gesetz

DEA

Decodierung

Definitionsbereich

DeMorgan

Determinante

deterministischer endlicher Automat

Diagonalisierbarkeit

Diagonalmatrix

Differenz

Diffie-Hellman-Verfahren

Diophantos von Alexandria

Discretionary Access Control

Disjunktion

Disjunktive Normalform

Diskrete Fourier-Transformation

diskreter Logarithmus

Distributiver Verband

Distributivgesetz

dominanter Eigenwert

Doppelfehler

Dreiecksmatrizen

Dreipunktform

Durchschnitt

E

Ebene

Ebengleichungen

EBNF

Eigenvektor

Eigenwerte

Einfachfehler

Einheitsmatrix

Einselement

Einwegfunktion

Elementare Zahlentheorie

Endknoten

Endliche Automaten

endliche Gruppen

Endliche Körper

Endliche Verbände

Ergiebigkeit

erweiternder Weg

erweiterte Koeffizientenmatrix

erzeugendes Element

Erzeugung von Zufallszahlen

Euklid´s erstes Theorem

Euklid´sche Algorithmus

Euler´sche Kriterium

Euler´sche Polyederformel

Euler-Graph

Eulersche φ-Funktion

Eulertour

Euler-Venn-Diagramme

Evariste Galois

Exponentiation

F

Faktorgruppe

Faktorraum

Fakultät

Fano-Bedingung

Fehler-Burst

fehlererkennende Codes

fehlerkorrigierende Codes

Fehlstelle

Fermat´sche Primzahlen

Fibonacci Bäume

Flooding

Flussrelation

Fluten

Ford - Fulkerson

freies Monoid

Fundamentallemma der Zahlentheorie

Fundamentalsatz der Algebra

Funktionen

G

G. Fano

Galois-Feld

Galoisfeld der Ordnung pn

Ganze Zahlen.

Ganzzahlige Potenzen.

ganzzahliger Fluss Φ

Gatter

Gauß’sches Eliminationsverfahren

gemeinsamer Teiler

gemeinsames Vielfaches

Generato

geordnetes Paar

Georg Cantor

Gerade im Raum

Gerade in der Ebene

Gerade und Vektoren

Geradengleichungen

Gerichtete Graphen

gerichtete Wurzelbäume

Gerüst

gesättigter Teilgraph

Gleichungssystem

Lösbarkeit

Graphentheorie

größter gemeinsame Teiler

Gruppen

Gruppenhomomorphismus

Gruppenisomorphismus

Gruppentafel

H

Halbaddierer

Halbgruppe

halboffenes Intervall

Halde

Hamilton, William Rowan

Hamilton´sche Linien

Hamming-Code

Hamming-Distanz

Hamming-Gewicht

Hashfunktionen

Hasse-Diagramm

Hauptdiagonale

Hauptsatz der elementaren Zahlentheorie

Hauptsatz über den ggT

Hauptsatz über simultane Kongruenzen

Hausadresse

Heap

Heap-Sort

Hesse’sche Abstandsformel

Hesse’sche Normalform

Hintereinanderausführung

Höhe eines Baumes

homogen

homogene Koordinaten

Homomorphismus

Hop

Huffman Code

I

Idempotenzgesetz

Idempotenzgesetze

Imaginärteil

Index

Induktion

Infimum

Informationsfluss

Informationsrate

inhomogen

injektiv

Inneres Produkt

Integrität

Integritätsbereich

inverse Matrix

inverse Relation

invertierbar

Invertierbarkeit von Matrizen

Involutionsgesetz

inzident

irrationale Zahl

irreduzibel

isolierter Knoten

isomorph

Isomorphie von Gruppen

J

Joseph-Luis Lagrange

K

kanonische Zerlegung

Kanten

Kantenfolge

Kantenzug

Kapazität

kartesisches Koordinatensystem

kartesisches Produkt

k-Clique

Kettenverbände

Kleinsche Vierergruppe

kleinstes gemeinsame Vielfache

Knotenüberdeckung

Koeffizientenmatrix

Kollisionsstrategie

Kollisionsstrategien

Kombinatorik

kommutativer Ring

Kommutativgesetz

Komplement

komplementärer Graph

komplementärer Teiler

Komplementärer Verband

Komponente

Kongruenzen

Königsberger Brückenproblem

konjugiert komplexe Zahl

Konjunktion

Konkatenation

Konstruktion von endlichen Körpern

Kontrollmatrix

Koordinatenachsen

Koordinatensysteme

Körper

Korrekturrate

Kosten einer Kante

Kreis

Kriterium von Euler

Kronecker-Symbol

Kryptographische Hashfunktionen

Kürzeste Wege

L

Lagrange

Länge einer Kante

Laplace´scher Entwicklungssatz.

laufender Punkt

least significant

Leonhard Euler

Leopold Kronecker

linear

lineare Abhängigkeit

lineare diophantische Gleichungen

lineare Gleichungssysteme

lineare Hülle

lineare Kollisionsstrategie

lineare Kongruenz

lineare Kongruenzmethode

lineare Mannigfaltigkeit

lineare Unabhängigkeit

linearer Code

linearer Raum

Link-Matrix

Linksnebenklasse

Link-State Routing

Link-State-Verfahren

Lösbarkeit von linearen

Gleichungssystemen

M

m Fakultät

MAC   Siehe Mandatory Access Control

Mandatory Access Control

Marin Mersenne

Markierung

Matching

Matching in paaren Graphen

Matrixprodukt

Matrizen

Matrizen in der Computergrafik

Max- Flow-Min-Cut Theorem

Maximaler Fluss in paaren Graphen

maximales Matching

Mehrfachkante

Menge

Mengenverband

Mersenne´schen Primzahlen

Metrik

Minimaldistanz

Minimalgerüst

Minterm

Monoid

Multiplikation von Permutationen

Multiplikationsregeln

N

Nächste-Nachbar-Decodierung

Natürliche Zahlen

Nebenklassen

neutrales Element

neutrales Element in der Gruppe

Neutralitätsgesetz

n-fach Fehler

nicht-regulär

Niveau

Norm

Normalform der Geradengleichung

Normalteiler

Normalvektorform

Normierung

n-ter Potenzrest modulo m

n-Tupel

Nullelement

Nullmatrix

Nullpolynom

Nullraum

Nullstellen

Nullteiler

Nullvektor

O

offenes Hashcoding

offenes Intervall

Ordinate

Ordnung der Gruppe

Ordnungsrelation

owner

P

paarer Graph

PageRank Algorithmus

PageRanks

parallel

Parameterform

Peano’sche Axiome

Peirce-Funktion

Permutation

Petrinetze

Pierre de Fermat

Pierre F.Sarrus

planarer Graph

plättbarer Graph

Polar(koordinaten)darstellung

Polynome

Polynome über einem Körper

Polynomfunktionen

Potenzen von Matrizen

Potenzmenge

Präfixeigenschaft

prime Restklassen mod m

primitives Element mod m

Primitivwurzel

Primzahlen

Priority Queue

Projektion eines Vektors

Protokoll

Pseudozufallszahlen

Punktrichtungsform

Punktrichtungsgleichung

Q

quadratisch

quadratische Matrix

Quadratrest

Quelle

R

Rationale Zahlen

Rechenregeln für Teiler

Rechnen mit Polynomen

Rechtsnebenklasse

reduzibel

Reed-Solomon Code

Reelle Zahlen

reflexiv

Regeln für die Ordnung

Regeln von Sarrus

regulär

Relationen

Restklassensysteme

Ringe

Rotation

Routing-Tabelle

RSA Verfahren

Rückwärtselimination

Rundreiseproblem

S

Satz von Pythagoras

Schaltalgebra

schalten im Petrinetz

Schaltfunktion

Schaltnetze

Schaltungen

schlichter Graph

Schlingen

Schlüsselaustausch

Schnitt (cut)

schwach kollisionsresistent

Sekundärkollisionen

Senke

separabel

Sheffer-Funktion

Sicherheitsklasse

Sicherheitsrichtlinien

Sieb des Eratosthenes von Kyrene

Signatur

Simultane Kongruenzen

Single-Parity-Chec

singulär

Skalar

Skalarprodukt

Skalierung

Spaltenvektoren

spannender Baum

Speicherabbildungsfunktion

Speichern mit Hashfunktionen

Speichern von Passwörtern

Speicherung von Dreiecksmatrizen

Sprache

Square – and – Multiply-Methode

stark kollisionsresistent

stark zusammenhängend

starke Komponente

State Diagram

Suchbaum

Suchen mit Hashfunktionen

Summenformel

Supremum

surjektiv

symmetrisch

symmetrische Differenz

symmetrische Verschlüsselung

T

Teiler des Polynoms p

Teilerverbände

Teilmenge

Token

Transitionen

transitiv

Transitivitätsgesetz

Translationsvektor

transponierte Matrix

Transportnetze

Travelling Salesman Problem

Tripel

U

Übergangsfunktion

Übergangsrelation

unendliche Gruppen

Ungerichtete Graphen

Untergruppen

Untergruppenkriterium

Untergruppenverbände

Unterräume

Ursprung

V

Variation

Vektoren

vektorielles Produkt

Vektorräume

Verband

verbandsgeordnet

Vereinigung

Verschlüsselung

Verschmelzungsgesetze

Vertraulichkeit

Vielfachheit der Nullstelle

Vollständige Induktion

vollständige symmetrische Gruppe

vollständiges Restsystem mod m

Vorrangswarteschlange

Vorwärtselimination

W

Wald

Weg

Wertetabelle

Wort

Wortmonoid

Wurzel

X

x-Achse

Y

y-Achse

Z

Zahlendarstellung in digitalen

Rechenanlagen

Zeilenvektoren

Zentrum

Zerfällungsknoten

Zufallszahlen

Zufallszahlengenerator

zusammenhängend

Zustandsdiagramm

Zustandsgraph

Zustandsgraphen

Zustandstrajektorie

Zweierkomplement

Zweipunktform

Zyklische Gruppe

zyklischer Code

Table of Contents

1. Mengen, Zahlen, Relationen und Funktionen

1.1. Mengen

1.2 Natürliche Zahlen

1.3. Ganze Zahlen

1.4. Rationale Zahlen

1.5. Reelle Zahlen

1.6. Komplexe Zahlen

1.7. Zahlendarstellung in digitalen Rechenanlagen

1.7.1. Darstellung von ganzen Zahlen

1.7.2. Darstellung von rationalen und reellen Zahlen

1.8. Kombinatorik

1.9. Relationen und Funktionen

1.10. Übungsaufgaben

1.11. Applets

2. Elementare Zahlentheorie

2.1. Der größte gemeinsame Teiler

2.2. Primzahlen

2.3. Lineare diophantische Gleichungen

2.4. Kongruenzen und Restklassensysteme

2.4.1. Kongruenzen

2.4.2. Restklassensysteme

2.4.3. Simultane Kongruenzen

2.4.4. Quadratreste

2.5. Übungsaufgaben

2.6. Applets

3. Analytische Geometrie

3.1. Koordinatensysteme und Vektoren

3.2. Vektoren

3.2.1. Addition und Subtraktion

3.2.2. Skalarprodukt

3.3. Die Gerade in der Ebene

3.3.1. Geradengleichungen

3.3.2. Gerade und Vektoren

3.3.3. Hesse’sche Normalform

3.4. Das Vektorprodukt und seine geometrische Deutung im Raum

3.4.1. Eigenschaften

3.4.2. Anwendungen

3.5. Gerade und Ebene im Raum

3.5.1. Geradengleichungen

3.5.2. Ebengleichungen

3.6. Übungsaufgaben

3.7. Applets

4. Algebraische Strukturen

4.1. Vorbemerkungen

4.2. Gruppen

4.2.1. Definitionen

4.2.2. Beispiele

4.3. Untergruppen

4.3.1. Definitionen

4.3.2. Zyklische Gruppen

4.3.3. Nebenklassen und Normalteiler

4.3.4. Isomorphie von Gruppen

4.4. Ringe und Körper

4.4.1. Ringe

4.4.2. Körper

4.5. Polynome

4.5.1. Polynome über einem Körper

4.5.2. Rechnen mit Polynomen

4.5.3. Nullstellen

4.6. Endliche Körper

4.6.1. Vorbemerkungen

4.6.2. Die Konstruktion von endlichen Körpern

4.6.3. Eigenschaften endlicher Körper

4.7. Verbände

4.8. Übungsaufgaben

4.9. Applets

5. Vektorräume

5.1. Grundlagen

5.2. Unterräume

5.3. Lineare Abhängigkeit

5.4. Basen

5.5. Übungsaufgaben

6. Matrizen

6.1. Einführung und Definitionen

6.2. Das Matrixprodukt

6.3. Matrizen und lineare Gleichungssysteme

6.4. Die inverse Matrix

6.5. Invertierbarkeit von Matrizen und Lösbarkeit von linearen Gleichungssystemen

6.6. Das Gauß’sche Eliminationsverfahren

6.7. Übungsaufgaben

6.8. Applets

7. Determinanten

7.1. Einleitung und Definitionen

7.2. Die Cramer’sche Regel

7.3. Eigenwerte

7.4. Übungsaufgaben

7.5. Applets

8. Graphentheorie

8.1. Vorbemerkung

8.2. Ungerichtete Graphen

8.2.1. Elementare Definitionen

8.2.2. Zusammenhang und Komponenten

8.2.3. Artikulationen und Brücken

8.2.4. Bäume

8.3. Gerichtete Graphen

8.3.1. Zusammenhang und Komponenten

8.3.2. Arboreszenzen

8.4. Spannende Bäume

8.4.1. Definitionen und Einführung

8.4.2. Minimalgerüst

8.4.3. Kürzeste Wege

8.5. Wichtige Baumklassen

8.5.1. Binäre Bäume

8.5.2. Suchbäume

8.5.3. Fibonacci Bäume

8.5.4. Balanzierte Bäume

8.5.5. B-Bäume

8.6. Weitere Graphenklassen

8.7. Petrinetze

8.7.1. Einführung

8.7.2. Definitionen

8.8. Transportnetze

8.9. Matching

8.10. Übungsaufgaben

8.11. Applets

9. Grundkonzepte der Automatentheorie

9.1. Alphabete und Sprachen

9.2. Endliche Automaten

9.3. Übungsaufgaben

9.4. Applet

10. Codierungstheorie

10.1. Allgemeines

10.2. Übungsaufgaben

11. Ausgewählte Anwendungen

11.1. Vorbemerkungen

11.2. Speicherung von Dreiecksmatrizen

11.3. Erzeugung von Zufallszahlen

11.4. Speichern und Suchen in Tabellen mittels Hashfunktionen

11.4.1. Aufgabenstellung

11.4.2. Kollisionsstrategien

11.5. Berechnung ganzzahliger Potenzen

11.6. Kryptographische Hashfunktionen

11.6.1. Fragestellung

11.6.2. Beispiele für kryptographische Hashfunktionen

11.6.3. Speichern von Passwörtern

11.6.4. Standardisierte kryptographische Hashfunktionen

11.7. Asymmetrische Verschlüsselung

11.8. Schlüsselaustausch über unsicheren Kanal

11.9. Breitensuche in einem Graphen

11.10. Fluten und Link-State Routing in einem Netzwerk

11.11. Maximaler Fluss und Matching in paaren Graphen

11.12. Huffman Code

11.13. Halden

11.14. Organisation von großen Datenmengen mit B-Bäumen

11.15. CRC Codes in der Praxis

11.16. Eigenwerte und Potenzen von Matrizen

11.17. Bewertung von Web-Seiten

11.18. Anwendung von Matrizen in der Computergrafik

11.19. Verbandsstrukturen

11.19.1. Schaltnetze

12. Lösungen zu den Übungsaufgaben

12.1. Zahlen, Relationen und Funktionen

12.2. Elementare Zahlentheorie

12.3. Analytische Geometrie

12.4. Algebraische Strukturen

12.5. Vektorräume

12.6. Matrizen

12.7. Determinanten

12.8. Graphentheorie

12.9. Grundkonzepte der Automatentheorie

12.10. Codierungstheorie

Literatur

Index