diff --git a/LICENSE b/LICENSE
index e24214aa34de58eba05206c3c1485c1a38a003b3..bd57688ff6a14a0712c65cc0e4bc9d950f4cfe07 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,21 +1,21 @@
-MIT License
-
-Copyright (c) 2021 Patrick Gustav Blaneck
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+MIT License
+
+Copyright (c) 2021 Patrick Gustav Blaneck
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index 14130591cd2baad47d15b08fc327dd8e43ec1af1..ec1fe02ca085b275ab2ee835611904f082ec76c0 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# matse-spicker
+# matse-spicker
diff --git a/algo/algo.bib b/algo/algo.bib
index b05a17637ac25c2fea6c8fa7bef6c46d9cd79af0..fc5587f36708c200d3fa39ddb016e12fbdf9690c 100644
--- a/algo/algo.bib
+++ b/algo/algo.bib
@@ -1,7 +1,7 @@
-@misc{wiki:Landau-Symbole,
-  author       = {Wikipedia},
-  title        = {{Landau-Symbole} --- {W}ikipedia{,} The Free Encyclopedia},
-  year         = {2021},
-  howpublished = {\url{http://de.wikipedia.org/w/index.php?title=Landau-Symbole&oldid=212674123}},
-  note         = {[Online; accessed 05-June-2021]}
+@misc{wiki:Landau-Symbole,
+  author       = {Wikipedia},
+  title        = {{Landau-Symbole} --- {W}ikipedia{,} The Free Encyclopedia},
+  year         = {2021},
+  howpublished = {\url{http://de.wikipedia.org/w/index.php?title=Landau-Symbole&oldid=212674123}},
+  note         = {[Online; accessed 05-June-2021]}
 }
\ No newline at end of file
diff --git a/algo/algo.pdf b/algo/algo.pdf
index b7b3be364da8d0b3b6949573f07dd138eb1a1309..f23478ee370536307c4fffd15698e55bae050ef6 100644
Binary files a/algo/algo.pdf and b/algo/algo.pdf differ
diff --git a/algo/algo.tex b/algo/algo.tex
index b97f80e4425b7cebde710b8cd08e461c4f038697..7cec7ab47bb69ad807217b3ca7ab15eb349dc6b3 100644
--- a/algo/algo.tex
+++ b/algo/algo.tex
@@ -1,289 +1,171 @@
-\documentclass[german]{../spicker}
-
-\usepackage{amsmath}
-
-\usepackage{graphicx}
-\usepackage{tabularx, multirow}
-\usepackage{forest}
-\usepackage{color, colortbl}
-
-\usetikzlibrary{tikzmark,calc,arrows.meta,chains,decorations.pathreplacing,scopes,shapes.misc,shapes.multipart}
-
-\definecolor{javared}{rgb}{0.6,0,0} % for strings
-\definecolor{javagreen}{rgb}{0.25,0.5,0.35} % comments
-\definecolor{javapurple}{rgb}{0.5,0,0.35} % keywords
-\definecolor{javadocblue}{rgb}{0.25,0.35,0.75} % javadoc
- 
-\lstset{language=Java,
-basicstyle=\ttfamily,
-keywordstyle=\color{javapurple}\bfseries,
-stringstyle=\color{javared},
-commentstyle=\color{javagreen},
-morecomment=[s][\color{javadocblue}]{/**}{*/},
-tabsize=4,
-showspaces=false,
-showstringspaces=false}
-
-\tikzset{
-    weight/.style = {
-        scale=0.7,
-        },
-    prim node/.style = {
-        fill = blue!50,
-        text = white,
-        },
-    prim edge/.style = {
-        draw=blue,
-        very thick,
-        },
-    current/.style = {
-        fill = teal!50,
-        },
-    visited/.style = {
-        fill = teal!30,
-        %text=white,
-        opacity = 0.5,
-    },
-}
-
-\forestset{%
-empty node/.style = {
-    dashed,
-    opacity = .2, 
-    fill opacity = 0.2,
-    edge = {opacity=.2},
-    },
-r/.style = {
-    fill = red!50,
-    text=white,
-    draw=red,
-    calign angle=30,
-    calign=fixed edge angles,
-    %fill opacity = 0.5,
-},
-b/.style = {
-    fill = black!50,
-    text=white,
-    draw=black,
-    calign angle=30,
-    calign=fixed edge angles,
-    %fill opacity = 0.5,
-},
-rbn/.style = { %red black not defined
-    fill = blue!50,
-    text=white,
-    draw=black,
-    calign angle=30,
-    calign=fixed edge angles,
-    %fill opacity = 0.5,
-},
-nil/.style = {
-    fill = black!50,
-    minimum size=1em,
-    calign angle=30,
-    calign=fixed edge angles,
-    %fill opacity = 0.5,
-},
-mpn/.style args = {#1/#2/#3/#4}{draw,
-rectangle split, rectangle split horizontal,
-rectangle split parts=4,
-on chain=A,
-draw=black!50,
-node contents={ \nodepart{one}    $#1$
-                \nodepart{two}    $#2$
-                \nodepart{three}  $#3$
-                \nodepart{four}   $#4$}
-                            },
-}
-
-\newcommand\mpnc[4]{\nodepart{one}      $#1$
-                    \nodepart{two}      $#2$                    
-                    \nodepart{three}    $#3$
-                    \nodepart{four}     $#4$
-                    }
-
-\addbibresource{algo.bib}
-
-\title{Algorithmen}
-\author{Patrick Gustav Blaneck}
-\makeindex[intoc]
-\makeindex[intoc, name=Beispiele,title=Beispiele]
-
-\newenvironment{allintypewriter}{\ttfamily}{\par}
-
-\newcommand{\BF}{\operatorname{BF}} 
-\newcommand{\vektor}[1]{\begin{pmatrix*}[c] #1 \end{pmatrix*}}
-
-\pgfmathsetmacro\twopi{2*pi}
-
-\pgfmathdeclarefunction{lngamma}{1}{%
-  \pgfmathsetmacro\lngammatmp{#1*#1*#1}%
-  \pgfmathparse{%
-    #1*ln(#1) - #1 - .5*ln(#1/\twopi)
-    + 1/12/#1 - 1/360/\lngammatmp + 1/1260/\lngammatmp/#1/#1
-  }%
-}  
-
-\pgfmathdeclarefunction{facreal}{1}{%
-  \pgfmathparse{exp(lngamma(#1+1))}% 
-}
-
-\begin{document}
-\maketitle
-\tableofcontents
-\newpage
-
-\include{grundbegriffe.tex}
-
-\include{datenstrukturen.tex}
-
-\include{baeume.tex}
-
-\include{graphen.tex}
-
-\section{Formale Sprachen}
-% Textsuche
-
-% Reguläre Ausdrücke
-
-% PCRE
-
-% Kleene
-
-\section{Sortierverfahren}
-
-\begin{defi}{Heapsort}
-    Der Heap ist Grundlage für das Sortierverfahren \emph{Heapsort}.
-
-    \begin{itemize}
-        \item Zu Beginn: Unsortiertes Feld
-        \item Phase 1:
-              \begin{itemize}
-                  \item Alle Elemente werden nacheinander in einen Heap eingefügt
-                  \item Resultat ist ein Heap, der in ein Feld eingebettet ist
-              \end{itemize}
-        \item Phase 2:
-              \begin{itemize}
-                  \item Die Elemente werden in absteigender Reihenfolge entfernt (Wurzel!)
-                  \item Heap schrumpft immer weiter
-              \end{itemize}
-    \end{itemize}
-
-    \begin{center}
-        \begin{tikzpicture}
-            [
-                start chain,
-                node distance = 0pt,
-                HeapBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=teal!30},
-                SortedBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=blue!30},
-            ]
-
-            { start chain = going right
-                \node [HeapBlock, label=above:\texttt{root}] (1) {$0$};
-                \node [HeapBlock] (2) {$1$};
-                \node [HeapBlock] (3) {$2$};
-                \node [HeapBlock] (dots) {$\ldots$};
-                \node [HeapBlock] (n2) {$n-2$};
-                \node [HeapBlock] (n1) {$n-1$};
-                \node [HeapBlock] (n) {$n$};
-
-                \draw[->, blue] ([yshift=1em] 1.north east) to[bend left=30] ([yshift=.5em] n.north);
-
-                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
-                (1.south west) -- (n.south east) node[midway,yshift=-2em]{Heap};
-                %\draw[->] (val.south) [out=-30, in=-150] to (4.south);
-            }
-        \end{tikzpicture}
-        \hspace{4em}
-        \begin{tikzpicture}
-            [
-                start chain,
-                node distance = 0pt,
-                HeapBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=teal!30},
-                SortedBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=blue!30},
-            ]
-
-            { start chain = going right
-                \node [HeapBlock, label=above:\texttt{root}] (1) {$0$};
-                \node [HeapBlock] (2) {$1$};
-                \node [HeapBlock] (3) {$2$};
-                \node [HeapBlock] (dots) {$\ldots$};
-                \node [HeapBlock] (n2) {$n-2$};
-                \node [HeapBlock] (n1) {$n-1$};
-                \node [SortedBlock] (n) {$n$};
-
-                \draw[->, blue] ([yshift=1em] 1.north east) to[bend left=30] ([yshift=.5em] n1.north);
-
-                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
-                (1.south west) -- (n1.south east) node[midway,yshift=-2em]{Heap};
-
-                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
-                (n.south west) -- (n.south east) node[midway,yshift=-2em]{sortiertes Array};
-                %\draw[->] (val.south) [out=-30, in=-150] to (4.south);
-            }
-        \end{tikzpicture}
-
-        \begin{tikzpicture}
-            [
-                start chain,
-                node distance = 0pt,
-                HeapBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=teal!30},
-                SortedBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=blue!30},
-            ]
-
-            { start chain = going right
-                \node [HeapBlock, label=above:\texttt{root}] (1) {$0$};
-                \node [HeapBlock] (2) {$1$};
-                \node [HeapBlock] (3) {$2$};
-                \node [HeapBlock] (dots) {$\ldots$};
-                \node [HeapBlock] (n2) {$n-2$};
-                \node [SortedBlock] (n1) {$n-1$};
-                \node [SortedBlock] (n) {$n$};
-                \node [xshift=2em, on chain] (dots2) {$\ldots$};
-
-                \draw[->, blue] ([yshift=1em] 1.north east) to[bend left=30] ([yshift=.5em] n2.north);
-
-                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
-                (1.south west) -- (n2.south east) node[midway,yshift=-2em]{Heap};
-
-                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
-                (n1.south west) -- (n.south east) node[midway,yshift=-2em]{sortiertes Array};
-                %\draw[->] (val.south) [out=-30, in=-150] to (4.south);
-            }
-        \end{tikzpicture}
-        \hspace{1em}
-        \begin{tikzpicture}
-            [
-                start chain,
-                node distance = 0pt,
-                HeapBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=teal!30},
-                SortedBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=blue!30},
-            ]
-
-            { start chain = going right
-                \node [SortedBlock] (1) {$0$};
-                \node [SortedBlock] (2) {$1$};
-                \node [SortedBlock] (3) {$2$};
-                \node [SortedBlock] (dots) {$\ldots$};
-                \node [SortedBlock] (n2) {$n-2$};
-                \node [SortedBlock] (n1) {$n-1$};
-                \node [SortedBlock] (n) {$n$};
-
-                %\draw[->, blue] ([yshift=1em] 1.north) to[bend left=30] ([yshift=.5em] n2.north);
-
-                %\draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
-                %(1.south west) -- (n2.south east) node[midway,yshift=-2em]{Heap};
-
-                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
-                (1.south west) -- (n.south east) node[midway,yshift=-2em]{sortiertes Array};
-                %\draw[->] (val.south) [out=-30, in=-150] to (4.south);
-            }
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
-
-\printindex
-\printindex[Beispiele]
-
-\printbibliography
-\end{document}
+\documentclass[german]{../spicker}
+
+\usepackage{amsmath}
+
+\usepackage{graphicx}
+\usepackage{tabularx, multirow}
+\usepackage{forest}
+\usepackage{color, colortbl}
+
+\usetikzlibrary{tikzmark,bbox,calc,automata,arrows.meta,chains,decorations.pathreplacing,scopes,shapes.misc,shapes.multipart}
+
+\definecolor{javared}{rgb}{0.6,0,0} % for strings
+\definecolor{javagreen}{rgb}{0.25,0.5,0.35} % comments
+\definecolor{javapurple}{rgb}{0.5,0,0.35} % keywords
+\definecolor{javadocblue}{rgb}{0.25,0.35,0.75} % javadoc
+ 
+\lstset{language=Java,
+basicstyle=\ttfamily,
+keywordstyle=\color{javapurple}\bfseries,
+stringstyle=\color{javared},
+commentstyle=\color{javagreen},
+morecomment=[s][\color{javadocblue}]{/**}{*/},
+tabsize=4,
+showspaces=false,
+showstringspaces=false}
+
+\tikzset{
+    weight/.style = {
+        scale=0.7,
+        },
+    prim node/.style = {
+        fill = blue!50,
+        text = white,
+        },
+    prim edge/.style = {
+        draw=blue,
+        very thick,
+        },
+    current/.style = {
+        fill = teal!50,
+        },
+    marked/.style = {
+        fill = teal!25,
+        },
+    visited/.style = {
+        fill = teal!30,
+        %text=white,
+        opacity = 0.5,
+    },
+    new/.style = {
+        red,
+    },
+    index small/.style = {
+        minimum width=1.5em,
+        minimum height=0.5em,
+        fill = gray!25,
+    },
+    index/.style = {
+        minimum width=2em,
+        minimum height=0.5em,
+        fill = gray!25,
+    },
+    every state/.style = {
+        minimum size=2em
+    }
+}
+
+\forestset{%
+empty node/.style = {
+    dashed,
+    opacity = .2, 
+    fill opacity = 0.2,
+    edge = {opacity=.2},
+    },
+r/.style = {
+    fill = red!50,
+    text=white,
+    draw=red,
+    calign angle=30,
+    calign=fixed edge angles,
+    %fill opacity = 0.5,
+},
+b/.style = {
+    fill = black!50,
+    text=white,
+    draw=black,
+    calign angle=30,
+    calign=fixed edge angles,
+    %fill opacity = 0.5,
+},
+rbn/.style = { %red black not defined
+    fill = blue!50,
+    text=white,
+    draw=black,
+    calign angle=30,
+    calign=fixed edge angles,
+    %fill opacity = 0.5,
+},
+nil/.style = {
+    fill = black!50,
+    minimum size=1em,
+    calign angle=30,
+    calign=fixed edge angles,
+    %fill opacity = 0.5,
+},
+mpn/.style args = {#1/#2/#3/#4}{draw,
+rectangle split, rectangle split horizontal,
+rectangle split parts=4,
+on chain=A,
+draw=black!50,
+node contents={ \nodepart{one}    $#1$
+                \nodepart{two}    $#2$
+                \nodepart{three}  $#3$
+                \nodepart{four}   $#4$}
+                            },
+}
+
+\newcommand\mpnc[4]{\nodepart{one}      $#1$
+                    \nodepart{two}      $#2$                    
+                    \nodepart{three}    $#3$
+                    \nodepart{four}     $#4$
+                    }
+
+\addbibresource{algo.bib}
+
+\title{Algorithmen}
+\author{Patrick Gustav Blaneck}
+\makeindex[intoc]
+\makeindex[intoc, name=Beispiele,title=Beispiele]
+
+\newenvironment{allintypewriter}{\ttfamily}{\par}
+
+\newcommand{\BF}{\operatorname{BF}} 
+\newcommand{\vektor}[1]{\begin{pmatrix*}[c] #1 \end{pmatrix*}}
+
+\pgfmathsetmacro\twopi{2*pi}
+
+\pgfmathdeclarefunction{lngamma}{1}{%
+  \pgfmathsetmacro\lngammatmp{#1*#1*#1}%
+  \pgfmathparse{%
+    #1*ln(#1) - #1 - .5*ln(#1/\twopi)
+    + 1/12/#1 - 1/360/\lngammatmp + 1/1260/\lngammatmp/#1/#1
+  }%
+}  
+
+\pgfmathdeclarefunction{facreal}{1}{%
+  \pgfmathparse{exp(lngamma(#1+1))}% 
+}
+
+\begin{document}
+\maketitle
+\tableofcontents
+\newpage
+
+\include{grundbegriffe.tex}
+
+\include{datenstrukturen.tex}
+
+\include{baeume.tex}
+
+\include{graphen.tex}
+
+\include{formale_sprachen.tex}
+
+\include{sortierverfahren.tex}
+
+\printindex
+\printindex[Beispiele]
+
+\printbibliography
+\end{document}
diff --git a/algo/baeume.tex b/algo/baeume.tex
index cfb52a062d5b271df79f99c055b3bb1f19589e54..9773757683ad15d9b3cfdd3b7025d35e9fe65363 100644
--- a/algo/baeume.tex
+++ b/algo/baeume.tex
@@ -1,2259 +1,2326 @@
-\section{Bäume}
-
-\begin{defi}{Baum}
-    Ein \emph{Baum} ist eine hierarchische (rekursive) Datenstruktur.
-    Es gilt:
-    \begin{itemize}
-        \item alle Wege gehen von einer \emph{Wurzel} aus
-        \item $A$ heißt \emph{Vorgänger} von $B$ bzw. $B$ \emph{Nachfolger} von $A$, wenn $A$ auf einem Weg von der Wurzel zu $B$ liegt
-        \item $A$ heißt \emph{Elterknoten} von $B$, bzw. $B$ heißt \emph{Kind} von $A$, wenn $(A, B) \in E$
-        \item Knoten ohne Kinder heißen \emph{Blätter}
-        \item Knoten mit Kindern heißen \emph{innere Knoten}
-        \item ein Knoten $S$ mit allen Nachfolgern wird \emph{Teilbaum} eines Baumes $T$ genannt, falls $S$ nicht Wurzel von $T$ ist
-        \item der \emph{Verzweigungsgrad} eines Knotens ist die Anzahl seiner Kinder
-    \end{itemize}
-
-    \vspace{1em}
-
-    \begin{center}
-        \begin{forest}
-            for tree={s sep=5mm, fit=band}
-            [Wurzel, name=root
-            [Blatt, name=blatt1]
-            [Innerer Knoten, name=inner1 [Blatt, name=blatt2]
-            [Innerer Knoten, name=inner2
-            [Blatt, name=blatt3]
-            [Innerer Knoten, name=inner3 [Blatt, name=blatt4]
-            [Blatt, name=blatt5]]]]]
-            \node [draw, label=left:Level 0, dashed, fit={(root) (blatt1.west |- root.center) (inner3.east |- root.center)}] {};
-            \node [draw, label=left:Level 1, dashed, fit={(blatt1) (inner3.east |- blatt1.center)}] {};
-            \node [draw, label=left:Level 2, dashed, fit={(blatt2) (blatt1.west |- blatt2.center) (inner3.east |- blatt2.center)}] {};
-            \node [draw, label=left:Level 3, dashed, fit={(blatt3) (blatt1.west |- blatt3.center) (inner3)}] {};
-            \node [draw, label=left:Level 4, dashed, fit={(blatt4) (blatt1.west |- blatt5.center) (blatt5) (inner3.east |- blatt5.center)}] {};
-            \node [draw, red, fit={(inner2) (inner3) (blatt5) (blatt3)},label=right:{\color{red}Teilbaum}] {};
-        \end{forest}
-    \end{center}
-\end{defi}
-
-% Binärbäume
-
-\begin{defi}{Binärbaum}
-    Die Knoten eines \emph{Binärbaums (binary tree)} haben höchstens den Verzweigungsgrad $2$.
-
-    Bei einem \emph{geordneten Binärbaum} ist die Reihenfolge der Kinder durch die Indizes eindeutig festgelegt:
-    \begin{itemize}
-        \item $T_l$: linkes Kind, linker Teilbaum
-        \item $T_r$: rechtes Kind, rechter Teilbaum
-    \end{itemize}
-
-    Ein Binärbaum heißt \emph{minimal} (bezogen auf die Höhe), wenn kein Binärbaum mit gleicher Knotenzahl aber kleinerer Höhe existiert.
-
-    Ein \emph{links-vollständiger Binärbaum} ist ein minimaler Binärbaum, in dem die Knoten auf dem untersten Level so weit wie möglich links stehen.
-
-    Alle Blätter eines \emph{vollständigen Binärbaums} haben den gleichen Level.
-
-    Ein vollständiger Binärbaum der Höhe $H$ hat
-    $$
-        n = 1 + 2 + 4 + \ldots + 2^H = \frac{2^{H+1}-1}{2-1} = 2^{H+1}-1 \ \text{Knoten}
-    $$
-\end{defi}
-
-\begin{halfboxl}
-    \begin{example}{Linksvollständiger Binärbaum}
-        \centering
-        \begin{forest}
-            for tree={circle, draw,
-            minimum size=1.75em, % <-- added
-            inner sep=1pt}
-            [
-            [
-                    [
-                            []
-                                []
-                        ]
-                        [
-                            []
-                                []
-                        ]
-                ]
-                [
-                    []
-                        []
-                ]
-            ]
-        \end{forest}
-    \end{example}
-\end{halfboxl}
-\begin{halfboxr}
-    \begin{example}{Vollständiger Binärbaum}
-        \centering
-        \begin{forest}
-            for tree={circle, draw,
-            minimum size=1.75em, % <-- added
-            inner sep=1pt}
-            [
-            [
-                    [
-                            []
-                                []
-                        ]
-                        [
-                            []
-                                []
-                        ]
-                ]
-                [
-                    [
-                            []
-                                []
-                        ]
-                        [
-                            []
-                                []
-                        ]
-                ]
-            ]
-        \end{forest}
-    \end{example}
-\end{halfboxr}
-
-\subsection{Binäre Suchbäume}
-% Binäre Suchbäume
-
-\begin{defi}{Binärer Suchbaum}
-    Ein \emph{binärer Suchbaum} ist ein Binärbaum, bei dem für jeden Knoten des Baumes gilt:
-
-    Alle Schlüssel im linken Teilbaum sind kleiner, alle im rechten Teilbaum sind größer oder gleich dem Schlüssel in diesem Knoten.
-\end{defi}
-
-\begin{algo}{Suchen im binären Suchbaum}
-    Suchen ist ohne Probleme durch einfaches Vergleichen ($<$ bzw. $\geq$) möglich.
-
-    Suchen der $50$ in \textcolor{red}{rot} bzw. (erfolgloses) Suchen der $80$ in \textcolor{blue}{blau}.
-
-    \vspace{1em}
-
-    \centering
-    \forestset{%
-        empty node/.style={dashed}
-    }
-    \begin{forest}
-        for tree={circle, draw,
-        minimum size=2em, % <-- added
-        inner sep=1pt}
-        [60
-        [
-        20,edge={->,dashed,red,thick}
-        [10 [,empty node][,empty node]]
-        [30,edge={->,dashed,red,thick}
-        [,empty node]
-        [50,edge={->,dashed,red,thick}, draw=red [,empty node][,empty node]]
-        ]
-        ]
-        [
-        70,edge={->,dashed,blue,thick}
-            [,empty node]
-            [110,edge={->,dashed,blue,thick}
-                    [90,edge={->,dashed,blue,thick}
-                            [,empty node,edge={->,dashed,blue,thick},draw=blue][,empty node]
-                    ]
-                    [,empty node]
-            ]
-        ]
-        ]
-    \end{forest}
-\end{algo}
-
-\begin{algo}{Einfügen im binären Suchbaum}
-    Ein Knoten kann ohne Probleme hinzugefügt werden, indem man solange sucht, bis man auf einen leeren Kindknoten trifft und dort einfügt.
-
-    Einfügen der $40$ in \textcolor{red}{rot}.
-
-    \vspace{1em}
-
-    \centering
-    \begin{forest}
-        for tree={circle, draw,
-        minimum size=2em, % <-- added
-        inner sep=1pt}
-        [60
-            [
-                20,edge={->,dashed,red,thick}
-                    [10 [,empty node][,empty node]]
-                    [30,edge={->,dashed,red,thick}
-                            [,empty node]
-                            [50,edge={->,dashed,red,thick} [
-                                        40,edge={->,dashed,red,thick},draw=red
-                                    ][,empty node]]
-                    ]
-            ]
-            [
-                70
-                    [,empty node]
-                    [110
-                            [90
-                                    [,empty node][,empty node]
-                            ]
-                            [,empty node]
-                    ]
-            ]
-        ]
-    \end{forest}
-\end{algo}
-
-\begin{algo}{Löschen im binären Suchbaum (Blatt)}
-    Ein Blatt kann problemlos gelöscht werden.
-
-    Löschen der $50$ in \textcolor{red}{rot}.
-
-    \vspace{1em}
-
-    \centering
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-        minimum size=2em, % <-- added
-        inner sep=1pt}
-        [20,edge={->,dashed,red,thick}
-        [10
-            [,empty node]
-            [,empty node]
-        ]
-        [30,edge={->,dashed,red,thick}
-        [,empty node]
-        [50,edge={->,dashed,red,thick}, draw=red
-        [,empty node]
-        [,empty node]
-        ]
-        ]
-        ]
-    \end{forest}
-    \hspace{5em}
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-            [20
-                    [10
-                            [,empty node]
-                            [,empty node]
-                    ]
-                    [30
-                            [,empty node]
-                            [,empty node,draw=red]
-                    ]
-            ]
-    \end{forest}
-\end{algo}
-
-\begin{algo}{Löschen im binären Suchbaum (Innerer Knoten mit einem Kind)}
-    Soll ein innerer Knoten mit einem Kind gelöscht werden, rückt das Kind an die Stelle des Elterknotens.
-
-    Löschen der $30$ in \textcolor{red}{rot}.
-
-    \vspace{1em}
-
-    \centering
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-        minimum size=2em, % <-- added
-        inner sep=1pt}
-        [20,edge={->,dashed,red,thick}
-        [10
-            [,empty node]
-            [,empty node]
-        ]
-        [30,edge={->,dashed,red,thick}, draw=red
-        [,empty node]
-        [50,draw=blue
-        [,empty node]
-        [,empty node]
-        ]
-        {\draw[->,blue] () to[bend right=45] node[midway,above right,font=\small]{Vorrücken} (!u.east);}
-        ]
-        ]
-    \end{forest}
-    \hspace{5em}
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-        minimum size=2em, % <-- added
-        inner sep=1pt}
-        [20
-        [10
-            [,empty node]
-            [,empty node]
-        ]
-        [50,draw=blue
-        [,empty node]
-        [,empty node]
-        ]
-        ]
-    \end{forest}
-\end{algo}
-
-\begin{algo}{Löschen im binären Suchbaum (Innerer Knoten mit zwei Kindern)}
-    Soll ein innerer Knoten mit zwei Kindern gelöscht werden, nimmt der nächstgrößere Knoten seinen Platz ein.
-
-    Dieser wird wie folgt ermittelt (in \textcolor{purple}{lila}):
-    \begin{enumerate}
-        \item Gehe einen Schritt nach rechts.
-        \item Gehe solange nach links, bis es kein linkes Kind mehr gibt.
-    \end{enumerate}
-
-    Löschen der $20$ in \textcolor{red}{rot}.
-
-    \vspace{1em}
-
-    \centering
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-        minimum size=2em, % <-- added
-        inner sep=1pt}
-        [20,draw=red
-        [10
-            [,empty node]
-            [,empty node]
-        ]
-        [30,edge={->,dashed,purple,thick},draw=purple
-        [,empty node,edge={->,dashed,purple,thick}]
-        [50
-            [,empty node]
-            [,empty node]
-        ]
-        ]{\draw[->,blue] () to[bend right=45] node[midway,above right,font=\small]{Platz einnehmen} (!u.east);}
-        ]
-    \end{forest}
-    %\hspace{1em}
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-        minimum size=2em, % <-- added
-        inner sep=1pt}
-        [30,draw=purple
-        [10
-            [,empty node]
-            [,empty node]
-        ]
-        [,empty node
-        %[,empty node]
-        [50,draw=blue
-        [,empty node]
-        [,empty node]
-        ]
-        {\draw[->,blue] () to[bend right=45] node[midway,above right,font=\small]{Vorrücken} (!u.east);}
-        ]
-        ]
-    \end{forest}
-    %\hspace{1em}
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-        minimum size=2em, % <-- added
-        inner sep=1pt}
-        [30,draw=purple
-        [10
-            [,empty node]
-            [,empty node]
-        ]
-        [50,draw=blue
-        [,empty node]
-        [,empty node]
-        ]
-        ]
-    \end{forest}
-\end{algo}
-
-\begin{bonus}{Komplexität beim Suchen, Löschen und Einfügen in Binärbäumen}
-    Die Komplexität der Funktionen Suchen, Löschen und Einfügen werden durch die Komplexität des Suchens eines Elements bestimmt.
-
-    Im schlechtesten Fall ist die Anzahl der zu durchsuchenden Elemente gleich der Höhe des Baumes $+1$.
-    Dabei hängt die Höhe stark von der Reihenfolge der Einfügeoperationen ab.
-
-    \vspace{1em}
-
-    \centering
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-            [10
-                    [,empty node]
-                    [
-                        20
-                            [,empty node]
-                            [
-                                30
-                                    [,empty node]
-                                    [
-                                        40
-                                            [,empty node]
-                                            [
-                                                50
-                                                    [,empty node]
-                                                    [
-                                                        60
-                                                            [,empty node]
-                                                            [,empty node]
-                                                    ]
-                                            ]
-                                    ]
-                            ]
-                    ]
-            ]
-    \end{forest}
-    \hspace{5em}
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-            [
-                40
-                    [
-                        20
-                            [
-                                10
-                                    [,empty node]
-                                    [,empty node]
-                            ]
-                            [
-                                30
-                                    [,empty node]
-                                    [,empty node]
-                            ]
-                    ]
-                    [
-                        50
-                            [,empty node]
-                            [
-                                60
-                                    [,empty node]
-                                    [,empty node]
-                            ]
-                    ]
-            ]
-    \end{forest}
-\end{bonus}
-
-% Balancierte Bäume
-
-\begin{defi}{Balanciertheit}
-
-    Ein Binärbaum mit $n$ Knoten hat im besten Fall (\emph{optimal balanciert}) die Höhe
-    $$
-        H = \lceil \log_2(n+1) \rceil - 1 = \lfloor \log_2(n) \rfloor
-    $$
-    Dabei ist Suchen in $\bigo(\log n)$.
-
-    Ein Binärbaum mit $n$ Knoten hat im schlechtesten Fall (\emph{entartet/degeneriert}) die Höhe
-    $$
-        H = n-1
-    $$
-    Dabei ist Suchen in $\bigo(n)$.
-\end{defi}
-
-\begin{defi}{Balance-Kriterien}
-    \begin{enumerate}
-        \item Abgeschwächtes Kriterium für ausgeglichene Höhe
-              \begin{itemize}
-                  \item lokale Umordnungsoperationen reichen aus
-                  \item z.B. \emph{AVL-Bäume} und Rot-Schwarz-Bäume
-              \end{itemize}
-        \item Jeder neue Knoten wandert an die Wurzel des Baumes
-              \begin{itemize}
-                  \item Vorteil: Zuletzt eingefügte Elemente lassen sich schneller finden
-                  \item durch spezielles Einfügeverfahren wird Baum zusätzlich (teilweise) ausgeglichen
-                  \item z.B. Splay-Bäume
-              \end{itemize}
-        \item Unausgeglichener Verzweigungsgrad ermöglicht ausgeglichene Höhe
-              \begin{itemize}
-                  \item z.B. \emph{B-Bäume}
-              \end{itemize}
-    \end{enumerate}
-\end{defi}
-
-\subsection{AVL-Bäume}
-
-% AVL-Bäume
-
-\begin{defi}{AVL-Baum}
-    Bei einem \emph{AVL-Baum} unterscheiden sich die Höhen zweier Teilbäume des gleichen Knotens maximal um $1$.
-
-    Der sogenannte \emph{Balance-Index} (oder Balance-Faktor) $\BF$ eines Knotens $T$ ist die Differenz
-    $$
-        \BF(T) := H(T_r) - H(T_l)
-    $$
-    Dabei gilt:
-    \begin{itemize}
-        \item Jeder Knoten hat einen Balance-Index.
-        \item Er darf nur die Werte $-1$, $0$ oder $1$ annehmen.
-    \end{itemize}
-
-    %\vspace{2em}
-
-    \centering
-    \begin{forest}
-        baseline,anchor=north,
-        for tree={circle, draw,
-        minimum size=2em, % <-- added
-        inner sep=1pt}
-        [
-        J, label=right:{\small\textcolor{blue}{+1}}
-        [
-        F, label=right:{\small\textcolor{blue}{-1}}
-        [
-        D, label=right:{\small\textcolor{blue}{-1}}
-        [
-        C, label=left:{\small\textcolor{blue}{0}}
-        [,empty node]
-        [,empty node]
-        ]
-        [,empty node]
-        ]
-        [
-        G, label=right:{\small\textcolor{blue}{0}}
-        [,empty node]
-        [,empty node]
-        ]
-        ]
-        [
-        P, label=right:{\small\textcolor{blue}{+1}}
-        [
-        L, label=right:{\small\textcolor{blue}{+1}}
-        [,empty node]
-        [
-        N, label=right:{\small\textcolor{blue}{0}}
-        [,empty node]
-        [,empty node]
-        ]
-        ]
-        [
-        V, label=right:{\small\textcolor{blue}{-1}}
-        [
-        S, label=right:{\small\textcolor{blue}{0}}
-        [
-        Q, label=right:{\small\textcolor{blue}{0}}
-        [,empty node]
-        [,empty node]
-        ]
-        [
-        U, label=left:{\small\textcolor{blue}{0}}
-        [,empty node]
-        [,empty node]
-        ]
-        ]
-        [
-        X, label=right:{\small\textcolor{blue}{0}}
-        [,empty node]
-        [,empty node]
-        ]
-        ]
-        ]
-        ]
-    \end{forest}
-\end{defi}
-
-\begin{algo}{Einfügen in einem AVL-Baum}
-    Beim Einfügen in einen AVL-Baum wird zu Beginn analog zu einem regulären Binärbaum eingefügt.
-
-    Anschließend wird sich der unmittelbare Elterknoten $E$ angeschaut und es gibt für den dortigen Balance-Index $\BF(E)$ drei Fälle:
-    \begin{enumerate}
-        \item $\BF(E)$ wird $0$:
-              \begin{itemize}[-]
-                  \item $\BF(E)$ war vorher $-1$
-                  \item man kommt von einem Kindbaum, der vorher niedriger war
-                  \item Höhe des Knotens ändert sich nicht
-                  \item oberhalb bleiben alle Balance-Indizes gleich
-                  \item $\implies$ AVL-Kriterium ist für den ganzen Baum erfüllt
-              \end{itemize}
-        \item $\BF(E)$ wird $\pm 1$:
-              \begin{itemize}[-]
-                  \item $\BF(E)$ war vorher $0$
-                  \item Höhe des Teilbaums erhöht sich um $1$
-                  \item $\implies$ Überprüfung der Balance-Indizes muss beim Elternknoten von $E$ fortgesetzt werden
-              \end{itemize}
-        \item $\BF(E)$ wird $\pm 2$:
-              \begin{itemize}[-]
-                  \item $\BF(E)$ war vorher $\pm 1$
-                  \item $\implies$ Teilbaum muss \emph{rebalanciert} werden
-              \end{itemize}
-    \end{enumerate}
-\end{algo}
-
-\begin{algo}{Löschen in einem AVL-Baum}
-    Beim Löschen in einen AVL-Baum wird zu Beginn analog zu einem regulären Binärbaum gelöscht.
-
-    Anschließend wird sich der unmittelbare Elterknoten $E$ angeschaut und es gibt für den dortigen Balance-Index $\BF(E)$ drei Fälle:
-    \begin{enumerate}
-        \item $\BF(E)$ wird $\pm 1$:
-              \begin{itemize}[-]
-                  \item $\BF(E)$ war vorher $0$
-                  \item Höhe des Knotens ändert sich nicht
-                  \item oberhalb bleiben alle Balance-Indizes gleich
-                  \item $\implies$ AVL-Kriterium ist für den ganzen Baum erfüllt
-              \end{itemize}
-        \item $\BF(E)$ wird $0$:
-              \begin{itemize}[-]
-                  \item $\BF(E)$ war vorher $0$
-                  \item Höhe des Teilbaums verringert sich um $1$
-                  \item $\implies$ Überprüfung der Balance-Indizes muss beim Elternknoten von $E$ fortgesetzt werden
-              \end{itemize}
-        \item $\BF(E)$ wird $\pm 2$:
-              \begin{itemize}[-]
-                  \item $\BF(E)$ war vorher $\pm 1$
-                  \item $\implies$ Teilbaum muss \emph{rebalanciert} werden
-              \end{itemize}
-    \end{enumerate}
-\end{algo}
-
-\begin{algo}{Rebalancierung}
-    Wenn bei einer Opeation ein Höhenunterschied von mehr als $1$ zwischen zwei Geschwister-Teilbäumen entsteht, ist beim Elterknoten das AVL-Kriterium verletzt.
-    Eine entsprechende Korrektur heißt \emph{Rebalancierung}.
-    Als Werkzeuge eignen sich hierfür die sogenannten \emph{Rotationen}.
-\end{algo}
-
-\begin{algo}{Einfachrotation}
-    Wird ein AVL-Baum unbalanciert, wenn ein Knoten in den \emph{rechten Teilbaum des rechten Teilbaums} eingefügt wird (Rechts-Rechts-Situation), dann wird das durch eine \emph{Einfachrotation nach links} gelöst.
-
-    Zuletzt wurde $9$ eingefügt. Linksrotation in \textcolor{purple}{lila}.
-
-    \vspace{1em}
-
-    \begin{center}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [3%, label=right:{\small\textcolor{red}{+2}}
-            [1%, label=below right:{\small\textcolor{blue}{0}}
-                [,empty node]
-                [,empty node]
-            ]
-            [7, label=above:{\small\textcolor{red}{+2}}, draw=teal, name=7
-            [,empty node]
-            [8, label=right:{\small\textcolor{blue}{+1}}, draw=purple, edge={teal,thick}
-            [,empty node, name=8c]
-            [9, label=right:{\small\textcolor{blue}{0}}, edge={purple,thick},draw=purple
-            ]
-            ]
-            {\draw[->,purple] () to[bend right=45] node[midway,above right,font=\small]{Linksrotation} (!u.east);}
-            ]
-            ]
-            \draw[->,teal] (7) to[bend right=45] (8c);
-        \end{forest}
-        \hspace{5em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [3, label=right:{\small\textcolor{blue}{+1}}
-            [1, label=right:{\small\textcolor{blue}{0}}
-            [,empty node]
-            [,empty node]
-            ]
-            [8, label=right:{\small\textcolor{blue}{0}}, draw=purple
-            [7, label=right:{\small\textcolor{blue}{0}}, draw=teal, edge={teal,thick}
-                [,empty node]
-                [,empty node]
-            ]
-            [9, label=right:{\small\textcolor{blue}{0}}, edge={purple,thick},draw=purple
-            [,empty node]
-            [,empty node]
-            ]
-            ]
-            ]
-        \end{forest}
-    \end{center}
-
-    \vspace{1em}
-
-    Wird ein AVL-Baum unbalanciert, wenn ein Knoten in den \emph{linken Teilbaum des linken Teilbaums} eingefügt wird (Links-Links-Situation), dann wird das durch eine \emph{Einfachrotation nach rechts} gelöst.
-
-    Zuletzt wurde $1$ eingefügt. Rechtsrotation in \textcolor{purple}{lila}.
-
-    \vspace{1em}
-
-    \begin{center}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            7
-            [
-            3, label=above:{\small\textcolor{red}{-2}}, draw=teal, name=3
-            [
-            2, label=left:{\small\textcolor{blue}{-1}}, draw=purple, edge={teal,thick},draw=purple
-            [
-            1, label=left:{\small\textcolor{blue}{0}}, draw=purple, edge={purple,thick},draw=purple
-            ]
-            [,empty node, name=2c]
-            ]
-            {\draw[->,purple] () to[bend left=45] node[midway,above left,font=\small]{Rechtsrotation} (!u.west);}
-            [,empty node]
-            ]
-            [
-            8
-                [,empty node]
-                [,empty node]
-            ]
-            ]
-            \draw[->,teal] (3) to[bend left=45] (2c);
-        \end{forest}
-        \hspace{5em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            7, label=left:{\small\textcolor{blue}{-1}}
-            [
-            2, label=left:{\small\textcolor{blue}{0}}, draw=purple,draw=purple
-            [
-            1, label=left:{\small\textcolor{blue}{0}}, draw=purple, edge={purple,thick},draw=purple
-            [,empty node]
-            [,empty node]
-            ]
-            [3, label=left:{\small\textcolor{blue}{0}}, draw=teal, name=3, edge={teal,thick}
-                [,empty node]
-                [,empty node]
-            ]
-            ]
-            [
-            8, label=left:{\small\textcolor{blue}{0}}
-            [,empty node]
-            [,empty node]
-            ]
-            ]
-        \end{forest}
-    \end{center}
-\end{algo}
-
-\begin{algo}{Doppelrotation}
-    Wird ein AVL-Baum unbalanciert, wenn ein Knoten in den \emph{rechten Teilbaum des linken Teilbaums} eingefügt wird, dann wird das durch eine \emph{Doppelrotation} (Linksrotation, gefolgt von Rechtsrotation) gelöst.
-
-    Zuletzt wurde $4$ eingefügt. Rotationen in \textcolor{purple}{lila}.
-
-    \vspace{1em}
-
-    \begin{center}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            7, label=left:{\small\textcolor{red}{-2}}
-            [
-            3, label=left:{\small\textcolor{blue}{+1}}, draw=teal, name=3
-            [,empty node]
-            [4, draw=purple, label=right:{\small\textcolor{blue}{0}}, edge={teal,thick},draw=purple
-            [,empty node, draw=none, edge={draw=none}, name=4c]
-            [,empty node, draw=none, edge={draw=none}]
-            ]
-            {\draw[->,purple] () to[bend right=45] node[midway,above right,font=\small]{Linksrotation} (!u.east);}
-            ]
-            [,empty node]
-            ]
-            \draw[->,teal] (3) to[bend right=45] (4c);
-        \end{forest}
-        \hspace{-2em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            7, draw=teal, name=7, label=right:{\small\textcolor{red}{-2}}
-            [
-            4, draw=purple, edge={teal,thick}, label=left:{\small\textcolor{blue}{-1}}
-            [
-            3, draw=purple, edge={purple,thick}, label=left:{\small\textcolor{blue}{0}}
-            [,empty node]
-            [,empty node]
-            ]
-            [,empty node, name=4c]
-            ]
-            {\draw[->,purple] () to[bend left=45] node[midway,above left,font=\small]{Rechtsrotation} (!u.west);}
-            [,empty node]
-            ]
-            \draw[->,teal] (7) to[bend left=45] (4c);
-        \end{forest}
-        \hspace{3em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            4, draw=purple, label=right:{\small\textcolor{blue}{0}}
-            [
-            3, draw=purple, edge={purple,thick}, label=right:{\small\textcolor{blue}{0}}
-            [,empty node]
-            [,empty node]
-            ]
-            [
-            7, draw=teal, edge={teal,thick}, label=right:{\small\textcolor{blue}{0}}
-            [,empty node]
-            [,empty node]
-            ]
-            ]
-        \end{forest}
-    \end{center}
-
-    \vspace{1em}
-
-    Wird ein AVL-Baum unbalanciert, wenn ein Knoten in den \emph{linken Teilbaum des rechten Teilbaums} eingefügt wird, dann wird das durch eine \emph{Doppelrotation} (Rechtsrotation, gefolgt von Linksrotation) gelöst.
-
-    Zuletzt wurde $3$ eingefügt. Rotationen in \textcolor{purple}{lila}.
-
-    \vspace{1em}
-
-    \begin{center}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            2, label=right:{\small\textcolor{red}{+2}}
-            [,empty node]
-            [
-            5, label=right:{\small\textcolor{blue}{-1}}, draw=teal, name=5
-            [3, draw=purple, label=left:{\small\textcolor{blue}{0}}, edge={teal,thick},draw=purple
-            [,empty node, draw=none, edge={draw=none}]
-            [,empty node, draw=none, edge={draw=none}, name=3c]
-            ]
-            {\draw[->,purple] () to[bend left=45] node[midway,above left,font=\small]{Rechtsrotation} (!u.west);}
-            [,empty node]
-            ]
-            ]
-            \draw[->,teal] (5) to[bend left=45] (3c);
-        \end{forest}
-        \hspace{5em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            2, label=left:{\small\textcolor{red}{+2}}, draw=teal, name=2
-            [,empty node]
-            [
-            3, label=right:{\small\textcolor{blue}{+1}}, draw=purple, edge={teal,thick}
-            [,empty node, name=3c]
-            [5, draw=purple, label=right:{\small\textcolor{blue}{0}}, edge={purple,thick},draw=purple
-            [,empty node]
-            [,empty node]
-            ]
-            ]
-            {\draw[->,purple] () to[bend right=45] node[midway,above right,font=\small]{Linksrotation} (!u.east);}
-            ]
-            \draw[->,teal] (2) to[bend right=45] (3c);
-        \end{forest}
-        \hspace{1em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            3, label=right:{\small\textcolor{blue}{0}},draw=purple
-            [
-            2, label=right:{\small\textcolor{blue}{0}}, edge={teal,thick},draw=teal
-            [,empty node]
-            [,empty node]
-            ]
-            [
-            5, label=right:{\small\textcolor{blue}{0}}, edge={purple,thick},draw=purple
-            [,empty node]
-            [,empty node]
-            ]
-            ]
-        \end{forest}
-    \end{center}
-\end{algo}
-
-
-\begin{defi}{Komplexität von AVL-Bäumen}
-    \begin{itemize}
-        \item Einfügen
-              \begin{itemize}
-                  \item Element muss gesucht werden: $\bigo(\log n)$
-                  \item Element muss angehängt werden: $\bigo(1)$
-                  \item Baum muss ausgeglichen werden: $\bigo(\log n)$
-              \end{itemize}
-        \item Löschen
-              \begin{itemize}
-                  \item Element muss gesucht werden: $\bigo(\log n)$
-                  \item nächstgrößeres Element muss gesucht werden: $\bigo(\log n)$
-                  \item Elemente müssen verschoben werden: $\bigo(1)$
-                  \item Baum muss ausgeglichen werden: $\bigo(\log n)$
-              \end{itemize}
-        \item Prüfen/Auslesen
-              \begin{itemize}
-                  \item Element muss gesucht werden: $\bigo(\log n)$
-              \end{itemize}
-    \end{itemize}
-\end{defi}
-
-\subsection{B-Bäume}
-% B-Bäume
-
-\begin{defi}{B-Baum}
-    Jeder Knoten in einem \emph{B-Baum der Ordnung d} enthält $d$ bis $2d$ Elemente.
-
-    Die Wurzel bildet die einzige Ausnahme, sie kann $1$ bis $2d$ Elemente enthalten.
-
-    Die Elemente in einem Knoten sind aufsteigend sortiert.
-
-    Die Anzahl der Kinder in einem B-Baum ist entweder $0$ (Blatt) oder um eins größer als die Anzahl der Elemente, die der Knoten enthält.
-
-    Alle Blätter liegen auf demselben Level.
-    \begin{itemize}[-]
-        \item garantierte Zugriffszeiten
-        \item bei realistischen Parametern (z.B. Ordnung $1000$) sind sehr wenige ($<5$) Zugriffe auf das externe Medium nötig
-    \end{itemize}
-
-    B-Bäume besitzen ausgeglichene Höhe, lassen aber unausgeglichenen Verzweigungsgrad und Knotenfüllgrad zu.
-
-    Der längste Weg in einem B-Baum der Ordnung $d$ ist in $\bigo(\log_{d+1} n)$.
-
-    B-Baum der Ordnung $2$:
-    \vspace{1em}
-
-    \centering
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=2em,
-        }
-        [{\mpnc{\textcolor{red}{30}}{\textcolor{violet}{38}}{\textcolor{blue}{42}}{\times}}
-            [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                        \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-                    }]
-            [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
-                        \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-                    }]
-            [{\mpnc{40}{41}{\times}{\times}}, name=c3, edge path={
-                        \noexpand\path [draw, \forestoption{edge}] (!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-                    }]
-            [{\mpnc{44}{50}{56}{58}}, name=c4, edge path={
-                        \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-                    }]
-        ]
-        \node[fit=(c1), label=below:{$\in [-\infty, \text{\textcolor{red}{30}}]$}] {};
-        \node[fit=(c2), label=below:{$\in [\text{\textcolor{red}{30}}, \text{\textcolor{purple}{38}}]$}] {};
-        \node[fit=(c3), label=below:{$\in [\text{\textcolor{purple}{38}}, \text{\textcolor{blue}{42}}]$}] {};
-        \node[fit=(c4), label=below:{$\in [\text{\textcolor{blue}{42}}, \infty]$}] {};
-    \end{forest}
-\end{defi}
-
-\begin{algo}{Suchen in einem B-Baum}
-    Ausgehend von der Wurzel:
-    \begin{enumerate}
-        \item Prüfe, ob der gerade betrachtete Knoten den gesuchten Schlüssel $m$ enthält.
-              \subitem (Suche innerhalb eines Knotens entweder linear oder binär.)
-        \item Falls nicht, bestimme den kleinsten Schlüssel $k_i$, der größer als $m$ ist.
-              \begin{itemize}
-                  \item $k_i$ gefunden: Weiter bei Schritt 1 mit linkem Kind von $k_i$ ($p_{i-1}$)
-                  \item $k_i$ nicht gefunden: Weiter mit letztem Kind ($p_{n}$)
-              \end{itemize}
-    \end{enumerate}
-\end{algo}
-
-\begin{algo}{Einfügen in einem B-Baum der Ordnung $d$}
-    \begin{enumerate}
-        \item Suche nach Schlüssel endet in einem Blatt \texttt{node} (in \textcolor{purple}{lila})
-        \item Schlüssel wird in Sortierreihenfolge eingefügt (und neuer leerer Verweis eingefügt)
-        \item Falls \texttt{node} überfüllt ist: \texttt{node} aufteilen
-              \subitem $k$ sei mittlerer Eintrag von \texttt{node}
-              \begin{enumerate}
-                  \item Neuen Knoten \texttt{current} anlegen und mit den $d$ größeren Schlüsseln (rechts von $k$) belegen.
-                  \item Die $d$ kleineren Schlüssel (links von $k$) bleiben in \texttt{node}.
-                  \item $k$ in Elterknoten \texttt{parent} von \texttt{node} verschieben.
-                  \item Verweis rechts von $k$ in \texttt{parent} mit \texttt{current} verbinden.
-              \end{enumerate}
-        \item Falls \texttt{parent} nun überfüllt ist: \texttt{parent} aufteilen (Siehe Schritt 3)
-    \end{enumerate}
-
-    Einfügen der 60 in \textcolor{red}{rot}.
-
-    \vspace{1em}
-
-    \centering
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{38}{42}{\times}}
-            [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                        \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-                    }]
-            [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
-                        \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-                    }]
-            [{\mpnc{40}{41}{\times}{\times}}, name=c3, edge path={
-                        \noexpand\path [draw, \forestoption{edge}] (!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-                    }]
-            [{\mpnc{44}{50}{56}{58}}, name=c4, edge={dashed,purple,thick}, draw=purple, edge path={
-                        \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-                    }]
-        ]
-        \node[draw, above of=c4, rectangle, red, node distance=5em] (60) {60};
-        \draw[->, red] (60) to (c4);
-    \end{forest}
-
-    \vspace{1em}
-
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{38}{42}{\times}}, name=r
-        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{40}{41}{\times}{\times}}, name=c3]
-        [{\mpnc{44}{50}{\times}{\times}}, name=c4, draw=red, edge={draw=none}]
-        [{\mpnc{58}{\textcolor{red}{60}}{\times}{\times}}, name=c5, draw=red, edge={draw=none}]
-        ]
-        \node[draw, above right of=c4, rectangle, blue, node distance=sqrt(2)*4em] (56) {56};
-        \draw[->, blue, bend right=15] (56) to (r);
-    \end{forest}
-
-    \vspace{1em}
-
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{38}{42}{\textcolor{blue}{56}}}, name=r
-        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{40}{41}{\times}{\times}}, name=c3]
-        [{\mpnc{44}{50}{\times}{\times}}, name=c4, draw=red, edge={red}, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{58}{\textcolor{red}{60}}{\times}{\times}}, name=c5, draw=red, edge={red}, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        ]
-    \end{forest}
-\end{algo}
-
-\begin{algo}{Löschen in einem B-Baum der Ordnung $d$ (Blatt)}
-    In einem Blatt mit Struktur
-    \begin{center}
-        \texttt{(null, $k_1$, null, $\ldots$, $k_i$, null, $\ldots$, $k_n$, null)}
-    \end{center}
-    (\texttt{null} sind hier die Kinder an der jeweiligen Stelle)
-    wird der Wert $x = k_i$ zusammen mit der darauf folgenden \texttt{null}-Referenz gelöscht.
-
-    Ein \emph{Underflow} tritt auf, falls $n=d$ war.
-\end{algo}
-
-\begin{algo}{Löschen in einem B-Baum der Ordnung $d$ (Innerer Knoten)}
-    In einem inneren Knoten mit Struktur
-
-    \begin{center}
-        \texttt{($p_0$, $k_1$, $p_1$, $\ldots$, $k_i$, $p_i$, $\ldots$, $k_n$, $p_n$)}
-    \end{center}
-
-    ($p_j$ sind hier die Kinder an der jeweiligen Stelle)
-    haben alle Referenzen einen Wert ungleich \texttt{null}.
-
-    Das Löschen eines Wertes $x = k_i$ funktioniert analog zum Löschen aus einem binären Suchbaum:
-    \begin{enumerate}
-        \item Finde kleinsten Schlüssel $s$ im durch $p_i$ referenzierten Teilbaum (in einem Blatt)
-        \item Ersetze $k_i$ durch $s$ und lösche $s$ aus dem Blatt
-    \end{enumerate}
-
-    Löschen der 38 in \textcolor{red}{rot}.
-
-    \centering
-    \vspace{1em}
-
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{\textcolor{red}{38}}{42}{56}}, name=r
-        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{40}{41}{\times}{\times}}, name=c3]
-        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        ]
-    \end{forest}
-
-    \vspace{1em}
-
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{\phantom{38}}{42}{56}}, name=r
-        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{\textcolor{blue}{40}}{41}{\times}{\times}}, name=c3]
-        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        ]
-        \draw[->, blue] ([xshift=-2.55em] c3.north) to[bend left=15] ([xshift=-0.75em]r.south);
-    \end{forest}
-
-    \vspace{1em}
-
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{\textcolor{blue}{40}}{42}{56}}, name=r
-        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{41}{\times}{\times}{\times}}, name=c3, draw=purple, label=below:\textcolor{purple}{Underflow!}]
-        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        ]
-    \end{forest}
-\end{algo}
-
-\begin{defi}{Underflow}
-    Ein \emph{Underflow} tritt in einem B-Baum genau dann auf, wenn zu wenig ($<d$) Schlüssel im Knoten sind.
-\end{defi}
-
-\begin{algo}{Ausgleich zwischen Geschwisterknoten}
-    Voraussetzung: Knoten $q$ mit Underflow hat einen Geschwisterknoten $p$ mit $>d$ Schlüsseln.
-
-    Annahme:
-    \begin{itemize}
-        \item $p$ ist linker Geschwisterknoten von $q$ (analog mit rechtem Geschwisterknoten)
-        \item im Elterknoten \texttt{parent} (von $p$ und $q$) trennt der Schlüssel $t$ die Verweise auf $p$ und $q$
-    \end{itemize}
-
-    Idee: $p$ schenkt $q$ ein Element (\glqq Umweg\grqq über Elterknoten)
-
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{\textcolor{blue}{40}}{42}{56}}, name=r
-        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{32}{34}{\textcolor{blue}{35}}{\times}}, name=c2, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{41}{\times}{\times}{\times}}, name=c3, draw=purple]
-        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        ]
-        \draw[->, blue] ([xshift=0.75em] c2.north) to[bend left=90] ([xshift=2.25em] r.north west);
-        \draw[<-, blue] ([xshift=-3.4em] c3.north) to[bend right=10] ([xshift=-0.75em] r.south);
-    \end{forest}
-
-    \vspace{1em}
-
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{\textcolor{blue}{35}}{42}{56}}, name=r
-        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{32}{34}{\times}{\times}}, name=c2, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{\textcolor{blue}{40}}{41}{\times}{\times}}, name=c3]
-        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        ]
-    \end{forest}
-\end{algo}
-
-\begin{algo}{Verschmelzen von Geschwisterknoten}
-    Voraussetzung: Knoten $q$ hat Geschwisterknoten mit $d$ Schlüsseln
-
-    Annahme:
-    \begin{itemize}
-        \item $p$ ist linker Geschwisterknoten von $q$ (analog mit rechtem Geschwisterknoten)
-        \item im Elterknoten \texttt{parent} (von $p$ und $q$) trennt der Schlüssel $t$ die Verweise auf $p$ und $q$
-    \end{itemize}
-
-    Idee: $p$ und $q$ mit dem trennenden Element aus \texttt{parent} verschmelzen.
-
-    Beachte:
-    \begin{itemize}
-        \item Eventueller Underflow in \texttt{parent} muss behandelt werden (rekursiv)
-        \item Falls letzter Schlüssel der Wurzel gelöscht wird, wird der einzige Nachfolger der Wurzel die neue Wurzel (Höhe des B-Baums wird um 1 verringert).
-    \end{itemize}
-
-    \vspace{1em}
-
-    \centering
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{40}{\textcolor{blue}{42}}{56}}, name=r
-        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{41}{\times}{\times}{\times}}, name=c3, draw=purple]
-        [{\mpnc{44}{50}{\times}{\times}}, name=c4, draw=blue, edge={blue}, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        ]
-        \draw[<-, blue] ([xshift=-0.75em] c3.north) to[bend left=10] ([xshift=0.75em] r.south);
-        \draw[<-, blue] ([xshift=0.75em] c3.north) to[bend left=45] ([xshift=-3.4em] c4.north);
-    \end{forest}
-
-    \vspace{1em}
-
-    \begin{forest}
-        for tree = {
-        draw,
-        rectangle split, rectangle split horizontal,
-        rectangle split parts=4,
-        %on chain=A,
-        parent anchor=south,
-        child anchor=north,
-        text width=1em,
-        text centered,
-        %edge = {->},
-        l sep=12mm,
-        s sep=1em,
-        }
-        [{\mpnc{30}{40}{56}{\times}}, name=r
-        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        [{\mpnc{41}{\textcolor{blue}{42}}{\textcolor{blue}{44}}{\textcolor{blue}{50}}}, name=c3]
-        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
-                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
-            }]
-        ]
-    \end{forest}
-\end{algo}
-
-\begin{defi}{B+-Baum}
-    Im Unterschied zu B-Bäumen speichern \emph{B+-Bäume} ihre Datensätze ausschließlich in den Blättern.
-
-    Dies ist bei der Anwendung für Datenbanken naheliegend und sinnvoll.
-\end{defi}
-
-\subsection{Rot-Schwarz-Bäume}
-
-\begin{defi}{Rot-Schwarz-Baum}
-    Ein \emph{Rot-Schwarz-Baum} ist ein balancierter binärer Suchbaum, in dem jeder innere Knoten zwei Kinder hat.
-
-    Jeder innere Knoten hat eine Farbe, so dass gilt:
-    \begin{itemize}
-        \item Die Wurzel ist schwarz.
-        \item Alle Blätter (\text{null}-Knoten) sind schwarz.
-        \item Für jeden Knoten gilt, dass jeder Pfad zu den Blättern die gleiche Anzahl an schwarzen Knoten hat. (Schwarz-Tiefe)
-        \item Beide Kinder eines roten Knotens sind schwarz.
-    \end{itemize}
-\end{defi}
-
-\begin{algo}{Einfügen in einen Rot-Schwarz-Baum}
-    Zuerst wird wie in einem normalen Binärbaum eingefügt, danach werden die Rot-Schwarz-Bedingungen repariert.
-
-    Annahmen:
-    \begin{itemize}
-        \item eingefügter Knoten $v$ ist rot
-        \item Elterknoten $u$ von $v$ ist rot (sonst fertig)
-        \item $v$ ist linkes Kind von $u$ (anderer Fall symmetrisch)
-        \item Geschwisterknoten $w$ (rechtes Kind von $u$) ist schwarz
-        \item Alle roten Knoten außer $u$ haben 2 schwarze Kinder
-    \end{itemize}
-
-
-    \begin{center}
-
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    p, b
-                        [
-                            u, r
-                                [
-                                    v, r
-                                ]
-                                [
-                                    w, b, name=w
-                                ]
-                        ]
-                        [
-                            q, rbn
-                        ]
-                ]
-        \end{forest}
-        \hspace{7em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    p, b
-                        [
-                            q, rbn
-                        ]
-                        [
-                            u, r
-                                [
-                                    v, r
-                                ]
-                                [
-                                    w, b, name=w
-                                ]
-                        ]
-                ]
-        \end{forest}
-    \end{center}
-\end{algo}
-
-\begin{algo}{Einfügen in einen Rot-Schwarz-Baum (Fall 1)}
-
-    \textbf{Fall 1: Onkelknoten $q$ von $v$ ist schwarz}\\
-    Fall 1a: $u$ ist linkes Kind von $p$ ($v$-$u$-$p$ bilden eine Linie)
-    \vspace{1em}
-
-    \begin{center}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    p, b
-                        [
-                            u, r
-                                [
-                                    v, r
-                                ]
-                                [
-                                    w, b, name=w
-                                ]
-                            %{\draw[->,blue, dashed] () to[bend left=30] (!u.south);}
-                        ]
-                        {\draw[->,blue] () to[bend left=45] node[midway,above left,font=\small]{Rechtsrotation} (!u.west);}
-                        [
-                            q, b
-                        ]
-                ]
-            %{\draw[->,blue, dashed] () to[bend left=45] (w.north east);}
-        \end{forest}
-        \hspace{3em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    u, r
-                        [
-                            v, r
-                        ]
-                        [
-                            p, b
-                                [
-                                    w, b
-                                ]
-                                [
-                                    q, b
-                                ]
-                        ]
-                        {\draw[<->,blue] () to[bend right=45] node[midway,above right,font=\small]{Umfärben} (!u.east);}
-                ]
-            %{\draw[->,blue, dashed] () to[bend left=45] (w.north east);}
-        \end{forest}
-        \hspace{1em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    u, b
-                        [
-                            v, r
-                        ]
-                        [
-                            p, r
-                                [
-                                    w, b
-                                ]
-                                [
-                                    q, b
-                                ]
-                        ]
-                    %{\draw[<->,blue] () to[bend right=45] node[midway,above right,font=\small]{Umfärben} (!u.east);}
-                ]
-            %{\draw[->,blue, dashed] () to[bend left=45] (w.north east);}
-        \end{forest}
-    \end{center}
-
-    \vspace{1em}
-    Fall 1b: $u$ ist rechtes Kind von $p$ ($v$-$u$-$p$ bilden ein Dreieck)
-
-    \begin{center}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    p, b
-                        [
-                            q, b
-                        ]
-                        [
-                            u, r
-                                [
-                                    v, r
-                                ]
-                                {\draw[->,blue] () to[bend left=45] node[midway,below left=1em,font=\small]{Rechtsrotation} (!u.west);}
-                                [
-                                    w, b, name=w
-                                ]
-                            %{\draw[->,blue, dashed] () to[bend left=30] (!u.south);}
-                        ]
-                ]
-            %{\draw[->,blue, dashed] () to[bend left=45] (w.north east);}
-        \end{forest}
-        \hspace{5em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    p, b
-                        [
-                            q, b
-                        ]
-                        [
-                            v, r
-                                [,nil]
-                                [
-                                    u, r
-                                        [,nil]
-                                        [
-                                            w, b
-                                        ]
-                                ]
-                        ]
-                        {\draw[->,blue] () to[bend right=45] node[midway,above right,font=\small]{Linksrotation} (!u.east);}
-                ]
-        \end{forest}
-
-        \vspace{1em}
-
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    v, r
-                        [
-                            p, b
-                                [
-                                    q, b
-                                ]
-                                [, nil]
-                        ]
-                        {\draw[<->,blue] () to[bend left=45] node[midway,above left,font=\small]{Umfärben} (!u.west);}
-                        [
-                            u, r
-                                [, nil]
-                                [
-                                    w, b
-                                ]
-                        ]
-                ]
-        \end{forest}
-        \hspace{2em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    v, b
-                        [
-                            p, r
-                                [
-                                    q, b
-                                ]
-                                [, nil]
-                        ]
-                        [
-                            u, r
-                                [, nil]
-                                [
-                                    w, b
-                                ]
-                        ]
-                ]
-        \end{forest}
-    \end{center}
-\end{algo}
-
-\begin{algo}{Einfügen in einen Rot-Schwarz-Baum (Fall 2)}
-    \textbf{Fall 2: Geschwisterknoten $q$ von $u$ ist rot}
-
-    \begin{center}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            p, b, name=p
-            [
-            u, r, name=u
-            [
-            v, r
-            ]
-            [
-            w, b, name=w
-            ]
-            ]
-            [
-            q, r, name=q
-            ]
-            ]
-            \node [draw, fit={(p)(u)(q)}, blue, label=above:\textcolor{blue}{Umfärben}] () {};
-        \end{forest}
-        \hspace{7em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    p, r
-                        [
-                            u, b
-                                [
-                                    v, r
-                                ]
-                                [
-                                    w, b, name=w
-                                ]
-                        ]
-                        [
-                            q, b
-                        ]
-                ]
-        \end{forest}
-    \end{center}
-
-    \vspace{1em}
-
-    beziehungsweise
-
-    \vspace{1em}
-
-    \begin{center}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-            minimum size=2em, % <-- added
-            inner sep=1pt}
-            [
-            p, b, name=p
-            [
-            q, r, name=q
-            ]
-            [
-            u, r, name=u
-            [
-            v, r
-            ]
-            [
-            w, b, name=w
-            ]
-            ]
-            ]
-            \node [draw, fit={(p)(u)(q)}, blue, label=above:\textcolor{blue}{Umfärben}] () {};
-        \end{forest}
-        \hspace{7em}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    p, r
-                        [
-                            q, b
-                        ]
-                        [
-                            u, b
-                                [
-                                    v, r
-                                ]
-                                [
-                                    w, b, name=w
-                                ]
-                        ]
-                ]
-        \end{forest}
-    \end{center}
-
-    \vspace{1em}
-
-    \begin{itemize}
-        \item Falls der Elterknoten von $p$ schwarz ist, sind wir fertig
-        \item Falls $p$ die Wurzel ist, färbe $p$ schwarz
-        \item Sonst behandle $p$ wie $v$ und wiederhole
-    \end{itemize}
-\end{algo}
-
-\begin{algo}{Löschen in einem Rot-Schwarz-Baum}
-    Das Löschen in einem Rot-Schwarz-Baum kann schnell sehr schwierig zu visualisieren werden.
-
-    Ich will hier gern einmal folgende Videos empfehlen:
-    \begin{itemize}
-        \item \url{https://youtu.be/eO3GzpCCUSg} (ausführliche Beispiele, englisch)
-        \item \url{https://youtu.be/bDT1woMULVw} (ausführliche Erklärung, Pseudocode, deutsch)
-    \end{itemize}
-\end{algo}
-
-\subsection{Heaps}
-
-\begin{bonus}{Heap (Wortbedeutungen)}
-    Das Wort \emph{Heap} hat zwei Bedeutungen:
-    \begin{itemize}
-        \item Besonderer Speicherbereich, in dem Objekte und Klassen gespeichert werden.
-        \item Datenstruktur zur effizienten Implementierung einer Prioritätswarteschlange.
-    \end{itemize}
-\end{bonus}
-
-\begin{defi}{Heap}
-    Ein \emph{Heap} ist ein Binärbaum mit folgenden Eigenschaften:
-    \begin{itemize}
-        \item linksvollständig
-        \item Kinder eines Knotens höchstens so groß wie der Knoten selbst (Max-Heap)
-        \item größtes Element befindet sich an der Wurzel (Max-Heap)
-        \item entlang jedes Pfades von einem Knoten zur Wurzel sind Knoteninhalte aufsteigend sortiert
-    \end{itemize}
-\end{defi}
-
-\begin{algo}{Einfügen in einem Heap}
-    Das Einfügen eines Elements in den Heap erfolgt, indem das neue Element an das Ende des Heaps gesetzt wird.
-
-    Weil das neu eingesetzte Element  die Eigenschaften des Heaps verzerren kann, wird die Operation \emph{Up-Heapify} durchgeführt, um die Eigenschaften des Heaps in einem Bottom-up-Ansatz zu erhalten.
-\end{algo}
-
-\begin{algo}{Löschen in einem Heap}
-    Das Entfernen eines Elements erfolgt, indem das gelöscht Element durch das letzte Element im Heap ersetzt wird. Dann wird das letzte Element aus dem Heap gelöscht. Nun wird das letzte Element an einer Stelle im Heap platziert.
-
-    Es kann die Heap-Bedingung nicht erfüllen, sodass die Operation \emph{Down-Heapify} durchgeführt wird, um die Eigenschaften des Heaps aufrechtzuerhalten.
-\end{algo}
-
-\begin{defi}{Heapify}
-    Heapify ist eine Operation, um die Elemente des Heaps neu anzuordnen, um die Heap-Bedingung aufrechtzuerhalten.
-
-    Die Heapify kann in zwei Methoden erfolgen:
-    \begin{itemize}
-        \item Up-Heapify (erfolgt beim Einfügen)
-        \item Down-Heapify (erfolgt beim Löschen)
-    \end{itemize}
-
-\end{defi}
-
-\begin{algo}{Up-Heapify (Einfügen)}
-    Einfügen der $90$ in \textcolor{red}{rot}.
-
-    \vspace{1em}
-    \begin{center}
-        \scalebox{0.9}{
-            \begin{forest}
-                baseline,anchor=north,
-                for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-                [
-                90
-                [
-                36
-                [
-                25
-                    [
-                        2
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                    [
-                        3
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                ]
-                [
-                26,draw=blue
-                [
-                19
-                %[,empty node]
-                %[,empty node]
-                ]
-                [45 ,edge={red,thick}, draw=red]
-                {\draw[<->,blue] () to[bend right=45] node[midway,below right,font=\small]{Vertauschen} (!u.east);}
-                ]
-                ]
-                [
-                17
-                    [
-                        7
-                            [,empty node]
-                            [,empty node]
-                    ]
-                    [
-                        1
-                            [,empty node]
-                            [,empty node]
-                    ]
-                ]
-                ]
-            \end{forest}
-        }
-        \hspace{1em}
-        \scalebox{0.9}{
-            \begin{forest}
-                baseline,anchor=north,
-                for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-                [
-                90
-                [
-                36,draw=blue
-                [
-                25
-                    [
-                        2
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                    [
-                        3
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                ]
-                [
-                45,edge={red,thick}, draw=red
-                [
-                19
-                %[,empty node]
-                %[,empty node]
-                ]
-                [26,edge={teal,thick}, draw=teal]
-                ]
-                {\draw[<->,blue] () to[bend right=45] node[midway,above right,font=\small]{Vertauschen} (!u.east);}
-                ]
-                [
-                17
-                    [
-                        7
-                            [,empty node]
-                            [,empty node]
-                    ]
-                    [
-                        1
-                            [,empty node]
-                            [,empty node]
-                    ]
-                ]
-                ]
-            \end{forest}
-        }
-
-        \vspace{1em}
-
-        \scalebox{0.9}{
-            \begin{forest}
-                baseline,anchor=north,
-                for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-                [
-                90,draw=teal
-                [
-                45,edge={teal,thick}, draw=teal
-                [
-                25
-                    [
-                        2
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                    [
-                        3
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                ]
-                [
-                36,edge={teal,thick}, draw=teal
-                [
-                19
-                %[,empty node]
-                %[,empty node]
-                ]
-                [26,edge={teal,thick}, draw=teal]
-                ]
-                ]
-                [
-                17
-                    [
-                        7
-                            [,empty node]
-                            [,empty node]
-                    ]
-                    [
-                        1
-                            [,empty node]
-                            [,empty node]
-                    ]
-                ]
-                ]
-            \end{forest}
-        }
-    \end{center}
-\end{algo}
-
-\begin{algo}{Down-Heapify (Löschen)}
-    Löschen der $90$ in \textcolor{red}{rot}.
-
-    \vspace{1em}
-    \begin{center}
-
-        \scalebox{0.9}{
-            \begin{forest}
-                baseline,anchor=north,
-                for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-                [
-                90,draw=red
-                [
-                45
-                    [
-                        25
-                            [
-                                2
-                                %[,empty node]
-                                %[,empty node]
-                            ]
-                            [
-                                3
-                                %[,empty node]
-                                %[,empty node]
-                            ]
-                    ]
-                    [
-                        36
-                            [
-                                19
-                                %[,empty node]
-                                %[,empty node]
-                            ]
-                            [26
-                            ]
-                    ]
-                ]
-                [
-                17
-                    [
-                        7
-                            [,empty node]
-                            [,empty node]
-                    ]
-                    [
-                        1
-                            [,empty node]
-                            [,empty node]
-                    ]
-                ]
-                ]
-            \end{forest}
-        }
-        \hspace{1em}
-        \scalebox{0.9}{
-            \begin{forest}
-                baseline,anchor=north,
-                for tree={circle, draw,
-                        minimum size=2em, % <-- added
-                        inner sep=1pt}
-                    [
-                        ,empty node, name=90
-                            [
-                                45
-                                    [
-                                        25
-                                            [
-                                                2
-                                                %[,empty node]
-                                                %[,empty node]
-                                            ]
-                                            [
-                                                3
-                                                %[,empty node]
-                                                %[,empty node]
-                                            ]
-                                    ]
-                                    [
-                                        36
-                                            [
-                                                19
-                                                %[,empty node]
-                                                %[,empty node]
-                                            ]
-                                            [26, draw=blue, name=26
-                                            ]
-                                    ]
-                            ]
-                            [
-                                17
-                                    [
-                                        7
-                                            [,empty node]
-                                            [,empty node]
-                                    ]
-                                    [
-                                        1
-                                            [,empty node]
-                                            [,empty node]
-                                    ]
-                            ]
-                    ]
-                \draw[->, blue] (26) to[bend right=45] node[midway,above left,font=\small]{Nachrücken} (90);
-            \end{forest}
-        }
-
-        \vspace{1em}
-
-        \scalebox{0.9}{
-            \begin{forest}
-                baseline,anchor=north,
-                for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-                [
-                26, draw=red
-                [
-                45, edge={draw=red},draw=blue
-                [
-                25
-                    [
-                        2
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                    [
-                        3
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                ]
-                [
-                36
-                    [
-                        19
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                    [,empty node]
-                ]
-                ]
-                {\draw[<->,blue] () to[bend left=45] node[midway,above left,font=\small]{Vertauschen} (!u.west);}
-                [
-                17
-                    [
-                        7
-                            [,empty node]
-                            [,empty node]
-                    ]
-                    [
-                        1
-                            [,empty node]
-                            [,empty node]
-                    ]
-                ]
-                ]
-            \end{forest}
-        }
-        \hspace{1em}
-        \scalebox{0.9}{
-            \begin{forest}
-                baseline,anchor=north,
-                for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-                [
-                45,draw=teal
-                [
-                26, draw=red, edge={draw=teal}
-                [
-                25
-                    [
-                        2
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                    [
-                        3
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                ]
-                [
-                36, edge={draw=red},draw=blue
-                [
-                19
-                %[,empty node]
-                %[,empty node]
-                ]
-                [,empty node]
-                ]
-                {\draw[<->,blue] () to[bend right=45] node[midway,above right,font=\small]{Vertauschen} (!u.east);}
-                ]
-                [
-                17
-                    [
-                        7
-                            [,empty node]
-                            [,empty node]
-                    ]
-                    [
-                        1
-                            [,empty node]
-                            [,empty node]
-                    ]
-                ]
-                ]
-            \end{forest}
-        }
-
-        \vspace{1em}
-
-        \scalebox{0.9}{
-            \begin{forest}
-                baseline,anchor=north,
-                for tree={circle, draw,
-                minimum size=2em, % <-- added
-                inner sep=1pt}
-                [
-                45,draw=teal
-                [
-                36, draw=teal, edge={draw=teal}
-                [
-                25
-                    [
-                        2
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                    [
-                        3
-                        %[,empty node]
-                        %[,empty node]
-                    ]
-                ]
-                [
-                26, edge={draw=teal},draw=teal
-                [
-                19, edge={draw=teal},draw=teal
-                %[,empty node]
-                %[,empty node]
-                ]
-                [,empty node]
-                ]
-                ]
-                [
-                17
-                    [
-                        7
-                            [,empty node]
-                            [,empty node]
-                    ]
-                    [
-                        1
-                            [,empty node]
-                            [,empty node]
-                    ]
-                ]
-                ]
-            \end{forest}
-        }
-    \end{center}
-\end{algo}
-
-% Baumdurchlauf
+\section{Bäume}
+
+\begin{defi}{Baum}
+    Ein \emph{Baum} ist eine hierarchische (rekursive) Datenstruktur.
+    Es gilt:
+    \begin{itemize}
+        \item alle Wege gehen von einer \emph{Wurzel} aus
+        \item $A$ heißt \emph{Vorgänger} von $B$ bzw. $B$ \emph{Nachfolger} von $A$, wenn $A$ auf einem Weg von der Wurzel zu $B$ liegt
+        \item $A$ heißt \emph{Elterknoten} von $B$, bzw. $B$ heißt \emph{Kind} von $A$, wenn $(A, B) \in E$
+        \item Knoten ohne Kinder heißen \emph{Blätter}
+        \item Knoten mit Kindern heißen \emph{innere Knoten}
+        \item ein Knoten $S$ mit allen Nachfolgern wird \emph{Teilbaum} eines Baumes $T$ genannt, falls $S$ nicht Wurzel von $T$ ist
+        \item der \emph{Verzweigungsgrad} eines Knotens ist die Anzahl seiner Kinder
+    \end{itemize}
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{forest}
+            for tree={s sep=5mm, fit=band}
+            [Wurzel, name=root
+            [Blatt, name=blatt1]
+            [Innerer Knoten, name=inner1 [Blatt, name=blatt2]
+            [Innerer Knoten, name=inner2
+            [Blatt, name=blatt3]
+            [Innerer Knoten, name=inner3 [Blatt, name=blatt4]
+            [Blatt, name=blatt5]]]]]
+            \node [draw, label=left:Level 0, dashed, fit={(root) (blatt1.west |- root.center) (inner3.east |- root.center)}] {};
+            \node [draw, label=left:Level 1, dashed, fit={(blatt1) (inner3.east |- blatt1.center)}] {};
+            \node [draw, label=left:Level 2, dashed, fit={(blatt2) (blatt1.west |- blatt2.center) (inner3.east |- blatt2.center)}] {};
+            \node [draw, label=left:Level 3, dashed, fit={(blatt3) (blatt1.west |- blatt3.center) (inner3)}] {};
+            \node [draw, label=left:Level 4, dashed, fit={(blatt4) (blatt1.west |- blatt5.center) (blatt5) (inner3.east |- blatt5.center)}] {};
+            \node [draw, red, fit={(inner2) (inner3) (blatt5) (blatt3)},label=right:{\color{red}Teilbaum}] {};
+        \end{forest}
+    \end{center}
+\end{defi}
+
+% Binärbäume
+
+\begin{defi}{Binärbaum}
+    Die Knoten eines \emph{Binärbaums (binary tree)} haben höchstens den Verzweigungsgrad $2$.
+
+    Bei einem \emph{geordneten Binärbaum} ist die Reihenfolge der Kinder durch die Indizes eindeutig festgelegt:
+    \begin{itemize}
+        \item $T_l$: linkes Kind, linker Teilbaum
+        \item $T_r$: rechtes Kind, rechter Teilbaum
+    \end{itemize}
+
+    Ein Binärbaum heißt \emph{minimal} (bezogen auf die Höhe), wenn kein Binärbaum mit gleicher Knotenzahl aber kleinerer Höhe existiert.
+
+    Ein \emph{links-vollständiger Binärbaum} ist ein minimaler Binärbaum, in dem die Knoten auf dem untersten Level so weit wie möglich links stehen.
+
+    Alle Blätter eines \emph{vollständigen Binärbaums} haben den gleichen Level und dieser ist vollbesetzt.
+
+    Ein vollständiger Binärbaum der Höhe $H$ hat
+    $$
+        n = 1 + 2 + 4 + \ldots + 2^H = \frac{2^{H+1}-1}{2-1} = 2^{H+1}-1 \ \text{Knoten}
+    $$
+\end{defi}
+
+\begin{halfboxl}
+    \begin{example}{Linksvollständiger Binärbaum}
+        \centering
+        \begin{forest}
+            for tree={circle, draw,
+            minimum size=1.75em, % <-- added
+            inner sep=1pt}
+            [
+            [
+                    [
+                            []
+                                []
+                        ]
+                        [
+                            []
+                                []
+                        ]
+                ]
+                [
+                    []
+                        []
+                ]
+            ]
+        \end{forest}
+    \end{example}
+\end{halfboxl}
+\begin{halfboxr}
+    \begin{example}{Vollständiger Binärbaum}
+        \centering
+        \begin{forest}
+            for tree={circle, draw,
+            minimum size=1.75em, % <-- added
+            inner sep=1pt}
+            [
+            [
+                    [
+                            []
+                                []
+                        ]
+                        [
+                            []
+                                []
+                        ]
+                ]
+                [
+                    [
+                            []
+                                []
+                        ]
+                        [
+                            []
+                                []
+                        ]
+                ]
+            ]
+        \end{forest}
+    \end{example}
+\end{halfboxr}
+
+\subsection{Binäre Suchbäume}
+% Binäre Suchbäume
+
+\begin{defi}{Binärer Suchbaum}
+    Ein \emph{binärer Suchbaum} ist ein Binärbaum, bei dem für jeden Knoten des Baumes gilt:
+
+    Alle Schlüssel im linken Teilbaum sind kleiner, alle im rechten Teilbaum sind größer oder gleich dem Schlüssel in diesem Knoten.
+\end{defi}
+
+\begin{algo}{Suchen im binären Suchbaum}
+    Suchen ist ohne Probleme durch einfaches Vergleichen ($<$ bzw. $\geq$) möglich.
+
+    Suchen der $50$ in \textcolor{red}{rot} bzw. (erfolgloses) Suchen der $80$ in \textcolor{blue}{blau}.
+
+    \vspace{1em}
+
+    \centering
+    \forestset{%
+        empty node/.style={dashed}
+    }
+    \begin{forest}
+        for tree={circle, draw,
+        minimum size=2em, % <-- added
+        inner sep=1pt}
+        [60
+        [
+        20,edge={->,dashed,red,thick}
+        [10 [,empty node][,empty node]]
+        [30,edge={->,dashed,red,thick}
+        [,empty node]
+        [50,edge={->,dashed,red,thick}, draw=red [,empty node][,empty node]]
+        ]
+        ]
+        [
+        70,edge={->,dashed,blue,thick}
+            [,empty node]
+            [110,edge={->,dashed,blue,thick}
+                    [90,edge={->,dashed,blue,thick}
+                            [,empty node,edge={->,dashed,blue,thick},draw=blue][,empty node]
+                    ]
+                    [,empty node]
+            ]
+        ]
+        ]
+    \end{forest}
+\end{algo}
+
+\begin{algo}{Einfügen im binären Suchbaum}
+    Ein Knoten kann ohne Probleme hinzugefügt werden, indem man solange sucht, bis man auf einen leeren Kindknoten trifft und dort einfügt.
+
+    Einfügen der $40$ in \textcolor{red}{rot}.
+
+    \vspace{1em}
+
+    \centering
+    \begin{forest}
+        for tree={circle, draw,
+        minimum size=2em, % <-- added
+        inner sep=1pt}
+        [60
+            [
+                20,edge={->,dashed,red,thick}
+                    [10 [,empty node][,empty node]]
+                    [30,edge={->,dashed,red,thick}
+                            [,empty node]
+                            [50,edge={->,dashed,red,thick} [
+                                        40,edge={->,dashed,red,thick},draw=red
+                                    ][,empty node]]
+                    ]
+            ]
+            [
+                70
+                    [,empty node]
+                    [110
+                            [90
+                                    [,empty node][,empty node]
+                            ]
+                            [,empty node]
+                    ]
+            ]
+        ]
+    \end{forest}
+\end{algo}
+
+\begin{algo}{Löschen im binären Suchbaum (Blatt)}
+    Ein Blatt kann problemlos gelöscht werden.
+
+    Löschen der $50$ in \textcolor{red}{rot}.
+
+    \vspace{1em}
+
+    \centering
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+        minimum size=2em, % <-- added
+        inner sep=1pt}
+        [20,edge={->,dashed,red,thick}
+        [10
+            [,empty node]
+            [,empty node]
+        ]
+        [30,edge={->,dashed,red,thick}
+        [,empty node]
+        [50,edge={->,dashed,red,thick}, draw=red
+        [,empty node]
+        [,empty node]
+        ]
+        ]
+        ]
+    \end{forest}
+    \hspace{5em}
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+            [20
+                    [10
+                            [,empty node]
+                            [,empty node]
+                    ]
+                    [30
+                            [,empty node]
+                            [,empty node,draw=red]
+                    ]
+            ]
+    \end{forest}
+\end{algo}
+
+\begin{algo}{Löschen im binären Suchbaum (Innerer Knoten mit einem Kind)}
+    Soll ein innerer Knoten mit einem Kind gelöscht werden, rückt das Kind an die Stelle des Elterknotens.
+
+    Löschen der $30$ in \textcolor{red}{rot}.
+
+    \vspace{1em}
+
+    \centering
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+        minimum size=2em, % <-- added
+        inner sep=1pt}
+        [20,edge={->,dashed,red,thick}
+        [10
+            [,empty node]
+            [,empty node]
+        ]
+        [30,edge={->,dashed,red,thick}, draw=red
+        [,empty node]
+        [50,draw=blue
+        [,empty node]
+        [,empty node]
+        ]
+        {\draw[->,blue] () to[bend right=45] node[midway,above right,font=\small]{Vorrücken} (!u.east);}
+        ]
+        ]
+    \end{forest}
+    \hspace{5em}
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+        minimum size=2em, % <-- added
+        inner sep=1pt}
+        [20
+        [10
+            [,empty node]
+            [,empty node]
+        ]
+        [50,draw=blue
+        [,empty node]
+        [,empty node]
+        ]
+        ]
+    \end{forest}
+\end{algo}
+
+\begin{algo}{Löschen im binären Suchbaum (Innerer Knoten mit zwei Kindern)}
+    Soll ein innerer Knoten mit zwei Kindern gelöscht werden, nimmt der nächstgrößere Knoten seinen Platz ein.
+
+    Dieser wird wie folgt ermittelt (in \textcolor{purple}{lila}):
+    \begin{enumerate}
+        \item Gehe einen Schritt nach rechts.
+        \item Gehe solange nach links, bis es kein linkes Kind mehr gibt.
+    \end{enumerate}
+
+    Löschen der $20$ in \textcolor{red}{rot}.
+
+    \vspace{1em}
+
+    \centering
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+        minimum size=2em, % <-- added
+        inner sep=1pt}
+        [20,draw=red
+        [10
+            [,empty node]
+            [,empty node]
+        ]
+        [30,edge={->,dashed,purple,thick},draw=purple
+        [,empty node,edge={->,dashed,purple,thick}]
+        [50
+            [,empty node]
+            [,empty node]
+        ]
+        ]{\draw[->,blue] () to[bend right=45] node[midway,above right,font=\small]{Platz einnehmen} (!u.east);}
+        ]
+    \end{forest}
+    %\hspace{1em}
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+        minimum size=2em, % <-- added
+        inner sep=1pt}
+        [30,draw=purple
+        [10
+            [,empty node]
+            [,empty node]
+        ]
+        [,empty node
+        %[,empty node]
+        [50,draw=blue
+        [,empty node]
+        [,empty node]
+        ]
+        {\draw[->,blue] () to[bend right=45] node[midway,above right,font=\small]{Vorrücken} (!u.east);}
+        ]
+        ]
+    \end{forest}
+    %\hspace{1em}
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+        minimum size=2em, % <-- added
+        inner sep=1pt}
+        [30,draw=purple
+        [10
+            [,empty node]
+            [,empty node]
+        ]
+        [50,draw=blue
+        [,empty node]
+        [,empty node]
+        ]
+        ]
+    \end{forest}
+\end{algo}
+
+\begin{bonus}{Komplexität beim Suchen, Löschen und Einfügen in Binärbäumen}
+    Die Komplexität der Funktionen Suchen, Löschen und Einfügen werden durch die Komplexität des Suchens eines Elements bestimmt.
+
+    Im schlechtesten Fall ist die Anzahl der zu durchsuchenden Elemente gleich der Höhe des Baumes $+1$.
+    Dabei hängt die Höhe stark von der Reihenfolge der Einfügeoperationen ab.
+
+    \vspace{1em}
+
+    \centering
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+            [10
+                    [,empty node]
+                    [
+                        20
+                            [,empty node]
+                            [
+                                30
+                                    [,empty node]
+                                    [
+                                        40
+                                            [,empty node]
+                                            [
+                                                50
+                                                    [,empty node]
+                                                    [
+                                                        60
+                                                            [,empty node]
+                                                            [,empty node]
+                                                    ]
+                                            ]
+                                    ]
+                            ]
+                    ]
+            ]
+    \end{forest}
+    \hspace{5em}
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+            [
+                40
+                    [
+                        20
+                            [
+                                10
+                                    [,empty node]
+                                    [,empty node]
+                            ]
+                            [
+                                30
+                                    [,empty node]
+                                    [,empty node]
+                            ]
+                    ]
+                    [
+                        50
+                            [,empty node]
+                            [
+                                60
+                                    [,empty node]
+                                    [,empty node]
+                            ]
+                    ]
+            ]
+    \end{forest}
+\end{bonus}
+
+% Balancierte Bäume
+
+\begin{defi}{Balanciertheit}
+
+    Ein Binärbaum mit $n$ Knoten hat im besten Fall (\emph{optimal balanciert}) die Höhe
+    $$
+        H = \lceil \log_2(n+1) \rceil - 1 = \lfloor \log_2(n) \rfloor
+    $$
+    Dabei ist Suchen in $\bigo(\log n)$.
+
+    Ein Binärbaum mit $n$ Knoten hat im schlechtesten Fall (\emph{entartet/degeneriert}) die Höhe
+    $$
+        H = n-1
+    $$
+    Dabei ist Suchen in $\bigo(n)$.
+\end{defi}
+
+\begin{defi}{Balance-Kriterien}
+    \begin{enumerate}
+        \item Abgeschwächtes Kriterium für ausgeglichene Höhe
+              \begin{itemize}
+                  \item lokale Umordnungsoperationen reichen aus
+                  \item z.B. \emph{AVL-Bäume} und Rot-Schwarz-Bäume
+              \end{itemize}
+        \item Jeder neue Knoten wandert an die Wurzel des Baumes
+              \begin{itemize}
+                  \item Vorteil: Zuletzt eingefügte Elemente lassen sich schneller finden
+                  \item durch spezielles Einfügeverfahren wird Baum zusätzlich (teilweise) ausgeglichen
+                  \item z.B. Splay-Bäume
+              \end{itemize}
+        \item Unausgeglichener Verzweigungsgrad ermöglicht ausgeglichene Höhe
+              \begin{itemize}
+                  \item z.B. \emph{B-Bäume}
+              \end{itemize}
+    \end{enumerate}
+\end{defi}
+
+\subsection{AVL-Bäume}
+
+% AVL-Bäume
+
+\begin{defi}{AVL-Baum}
+    Bei einem \emph{AVL-Baum} unterscheiden sich die Höhen zweier Teilbäume des gleichen Knotens maximal um $1$.
+
+    Der sogenannte \emph{Balance-Index} (oder Balance-Faktor) $\BF$ eines Knotens $T$ ist die Differenz
+    $$
+        \BF(T) := H(T_r) - H(T_l)
+    $$
+    Dabei gilt:
+    \begin{itemize}
+        \item Jeder Knoten hat einen Balance-Index.
+        \item Er darf nur die Werte $-1$, $0$ oder $1$ annehmen.
+    \end{itemize}
+
+    %\vspace{2em}
+
+    \centering
+    \begin{forest}
+        baseline,anchor=north,
+        for tree={circle, draw,
+        minimum size=2em, % <-- added
+        inner sep=1pt}
+        [
+        J, label=right:{\small\textcolor{blue}{+1}}
+        [
+        F, label=right:{\small\textcolor{blue}{-1}}
+        [
+        D, label=right:{\small\textcolor{blue}{-1}}
+        [
+        C, label=left:{\small\textcolor{blue}{0}}
+        [,empty node]
+        [,empty node]
+        ]
+        [,empty node]
+        ]
+        [
+        G, label=right:{\small\textcolor{blue}{0}}
+        [,empty node]
+        [,empty node]
+        ]
+        ]
+        [
+        P, label=right:{\small\textcolor{blue}{+1}}
+        [
+        L, label=right:{\small\textcolor{blue}{+1}}
+        [,empty node]
+        [
+        N, label=right:{\small\textcolor{blue}{0}}
+        [,empty node]
+        [,empty node]
+        ]
+        ]
+        [
+        V, label=right:{\small\textcolor{blue}{-1}}
+        [
+        S, label=right:{\small\textcolor{blue}{0}}
+        [
+        Q, label=right:{\small\textcolor{blue}{0}}
+        [,empty node]
+        [,empty node]
+        ]
+        [
+        U, label=left:{\small\textcolor{blue}{0}}
+        [,empty node]
+        [,empty node]
+        ]
+        ]
+        [
+        X, label=right:{\small\textcolor{blue}{0}}
+        [,empty node]
+        [,empty node]
+        ]
+        ]
+        ]
+        ]
+    \end{forest}
+\end{defi}
+
+\begin{algo}{Einfügen in einem AVL-Baum}
+    Beim Einfügen in einen AVL-Baum wird zu Beginn analog zu einem regulären Binärbaum eingefügt.
+
+    Anschließend wird sich der unmittelbare Elterknoten $E$ angeschaut und es gibt für den dortigen Balance-Index $\BF(E)$ drei Fälle:
+    \begin{enumerate}
+        \item $\BF(E)$ wird $0$:
+              \begin{itemize}[-]
+                  \item $\BF(E)$ war vorher $-1$
+                  \item man kommt von einem Kindbaum, der vorher niedriger war
+                  \item Höhe des Knotens ändert sich nicht
+                  \item oberhalb bleiben alle Balance-Indizes gleich
+                  \item $\implies$ AVL-Kriterium ist für den ganzen Baum erfüllt
+              \end{itemize}
+        \item $\BF(E)$ wird $\pm 1$:
+              \begin{itemize}[-]
+                  \item $\BF(E)$ war vorher $0$
+                  \item Höhe des Teilbaums erhöht sich um $1$
+                  \item $\implies$ Überprüfung der Balance-Indizes muss beim Elternknoten von $E$ fortgesetzt werden
+              \end{itemize}
+        \item $\BF(E)$ wird $\pm 2$:
+              \begin{itemize}[-]
+                  \item $\BF(E)$ war vorher $\pm 1$
+                  \item $\implies$ Teilbaum muss \emph{rebalanciert} werden
+              \end{itemize}
+    \end{enumerate}
+\end{algo}
+
+\begin{algo}{Löschen in einem AVL-Baum}
+    Beim Löschen in einen AVL-Baum wird zu Beginn analog zu einem regulären Binärbaum gelöscht.
+
+    Anschließend wird sich der unmittelbare Elterknoten $E$ angeschaut und es gibt für den dortigen Balance-Index $\BF(E)$ drei Fälle:
+    \begin{enumerate}
+        \item $\BF(E)$ wird $\pm 1$:
+              \begin{itemize}[-]
+                  \item $\BF(E)$ war vorher $0$
+                  \item Höhe des Knotens ändert sich nicht
+                  \item oberhalb bleiben alle Balance-Indizes gleich
+                  \item $\implies$ AVL-Kriterium ist für den ganzen Baum erfüllt
+              \end{itemize}
+        \item $\BF(E)$ wird $0$:
+              \begin{itemize}[-]
+                  \item $\BF(E)$ war vorher $0$
+                  \item Höhe des Teilbaums verringert sich um $1$
+                  \item $\implies$ Überprüfung der Balance-Indizes muss beim Elternknoten von $E$ fortgesetzt werden
+              \end{itemize}
+        \item $\BF(E)$ wird $\pm 2$:
+              \begin{itemize}[-]
+                  \item $\BF(E)$ war vorher $\pm 1$
+                  \item $\implies$ Teilbaum muss \emph{rebalanciert} werden
+              \end{itemize}
+    \end{enumerate}
+\end{algo}
+
+\begin{algo}{Rebalancierung}
+    Wenn bei einer Opeation ein Höhenunterschied von mehr als $1$ zwischen zwei Geschwister-Teilbäumen entsteht, ist beim Elterknoten das AVL-Kriterium verletzt.
+    Eine entsprechende Korrektur heißt \emph{Rebalancierung}.
+    Als Werkzeuge eignen sich hierfür die sogenannten \emph{Rotationen}.
+\end{algo}
+
+\begin{algo}{Einfachrotation}
+    Wird ein AVL-Baum unbalanciert, wenn ein Knoten in den \emph{rechten Teilbaum des rechten Teilbaums} eingefügt wird (Rechts-Rechts-Situation), dann wird das durch eine \emph{Einfachrotation nach links} gelöst.
+
+    Zuletzt wurde $9$ eingefügt. Linksrotation in \textcolor{purple}{lila}.
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [3%, label=right:{\small\textcolor{red}{+2}}
+            [1%, label=below right:{\small\textcolor{blue}{0}}
+                [,empty node]
+                [,empty node]
+            ]
+            [7, label=above:{\small\textcolor{red}{+2}}, draw=teal, name=7
+            [,empty node]
+            [8, label=right:{\small\textcolor{blue}{+1}}, draw=purple, edge={teal,thick}
+            [,empty node, name=8c]
+            [9, label=right:{\small\textcolor{blue}{0}}, edge={purple,thick},draw=purple
+            ]
+            ]
+            {\draw[->,purple] () to[bend right=45] node[midway,above right,font=\small]{Linksrotation} (!u.east);}
+            ]
+            ]
+            \draw[->,teal] (7) to[bend right=45] (8c);
+        \end{forest}
+        \hspace{5em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [3, label=right:{\small\textcolor{blue}{+1}}
+            [1, label=right:{\small\textcolor{blue}{0}}
+            [,empty node]
+            [,empty node]
+            ]
+            [8, label=right:{\small\textcolor{blue}{0}}, draw=purple
+            [7, label=right:{\small\textcolor{blue}{0}}, draw=teal, edge={teal,thick}
+                [,empty node]
+                [,empty node]
+            ]
+            [9, label=right:{\small\textcolor{blue}{0}}, edge={purple,thick},draw=purple
+            [,empty node]
+            [,empty node]
+            ]
+            ]
+            ]
+        \end{forest}
+    \end{center}
+
+    \vspace{1em}
+
+    Wird ein AVL-Baum unbalanciert, wenn ein Knoten in den \emph{linken Teilbaum des linken Teilbaums} eingefügt wird (Links-Links-Situation), dann wird das durch eine \emph{Einfachrotation nach rechts} gelöst.
+
+    Zuletzt wurde $1$ eingefügt. Rechtsrotation in \textcolor{purple}{lila}.
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            7
+            [
+            3, label=above:{\small\textcolor{red}{-2}}, draw=teal, name=3
+            [
+            2, label=left:{\small\textcolor{blue}{-1}}, draw=purple, edge={teal,thick},draw=purple
+            [
+            1, label=left:{\small\textcolor{blue}{0}}, draw=purple, edge={purple,thick},draw=purple
+            ]
+            [,empty node, name=2c]
+            ]
+            {\draw[->,purple] () to[bend left=45] node[midway,above left,font=\small]{Rechtsrotation} (!u.west);}
+            [,empty node]
+            ]
+            [
+            8
+                [,empty node]
+                [,empty node]
+            ]
+            ]
+            \draw[->,teal] (3) to[bend left=45] (2c);
+        \end{forest}
+        \hspace{5em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            7, label=left:{\small\textcolor{blue}{-1}}
+            [
+            2, label=left:{\small\textcolor{blue}{0}}, draw=purple,draw=purple
+            [
+            1, label=left:{\small\textcolor{blue}{0}}, draw=purple, edge={purple,thick},draw=purple
+            [,empty node]
+            [,empty node]
+            ]
+            [3, label=left:{\small\textcolor{blue}{0}}, draw=teal, name=3, edge={teal,thick}
+                [,empty node]
+                [,empty node]
+            ]
+            ]
+            [
+            8, label=left:{\small\textcolor{blue}{0}}
+            [,empty node]
+            [,empty node]
+            ]
+            ]
+        \end{forest}
+    \end{center}
+\end{algo}
+
+\begin{algo}{Doppelrotation}
+    Wird ein AVL-Baum unbalanciert, wenn ein Knoten in den \emph{rechten Teilbaum des linken Teilbaums} eingefügt wird, dann wird das durch eine \emph{Doppelrotation} (Linksrotation, gefolgt von Rechtsrotation) gelöst.
+
+    Zuletzt wurde $4$ eingefügt. Rotationen in \textcolor{purple}{lila}.
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            7, label=left:{\small\textcolor{red}{-2}}
+            [
+            3, label=left:{\small\textcolor{blue}{+1}}, draw=teal, name=3
+            [,empty node]
+            [4, draw=purple, label=right:{\small\textcolor{blue}{0}}, edge={teal,thick},draw=purple
+            [,empty node, draw=none, edge={draw=none}, name=4c]
+            [,empty node, draw=none, edge={draw=none}]
+            ]
+            {\draw[->,purple] () to[bend right=45] node[midway,above right,font=\small]{Linksrotation} (!u.east);}
+            ]
+            [,empty node]
+            ]
+            \draw[->,teal] (3) to[bend right=45] (4c);
+        \end{forest}
+        \hspace{-2em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            7, draw=teal, name=7, label=right:{\small\textcolor{red}{-2}}
+            [
+            4, draw=purple, edge={teal,thick}, label=left:{\small\textcolor{blue}{-1}}
+            [
+            3, draw=purple, edge={purple,thick}, label=left:{\small\textcolor{blue}{0}}
+            [,empty node]
+            [,empty node]
+            ]
+            [,empty node, name=4c]
+            ]
+            {\draw[->,purple] () to[bend left=45] node[midway,above left,font=\small]{Rechtsrotation} (!u.west);}
+            [,empty node]
+            ]
+            \draw[->,teal] (7) to[bend left=45] (4c);
+        \end{forest}
+        \hspace{3em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            4, draw=purple, label=right:{\small\textcolor{blue}{0}}
+            [
+            3, draw=purple, edge={purple,thick}, label=right:{\small\textcolor{blue}{0}}
+            [,empty node]
+            [,empty node]
+            ]
+            [
+            7, draw=teal, edge={teal,thick}, label=right:{\small\textcolor{blue}{0}}
+            [,empty node]
+            [,empty node]
+            ]
+            ]
+        \end{forest}
+    \end{center}
+
+    \vspace{1em}
+
+    Wird ein AVL-Baum unbalanciert, wenn ein Knoten in den \emph{linken Teilbaum des rechten Teilbaums} eingefügt wird, dann wird das durch eine \emph{Doppelrotation} (Rechtsrotation, gefolgt von Linksrotation) gelöst.
+
+    Zuletzt wurde $3$ eingefügt. Rotationen in \textcolor{purple}{lila}.
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            2, label=right:{\small\textcolor{red}{+2}}
+            [,empty node]
+            [
+            5, label=right:{\small\textcolor{blue}{-1}}, draw=teal, name=5
+            [3, draw=purple, label=left:{\small\textcolor{blue}{0}}, edge={teal,thick},draw=purple
+            [,empty node, draw=none, edge={draw=none}]
+            [,empty node, draw=none, edge={draw=none}, name=3c]
+            ]
+            {\draw[->,purple] () to[bend left=45] node[midway,above left,font=\small]{Rechtsrotation} (!u.west);}
+            [,empty node]
+            ]
+            ]
+            \draw[->,teal] (5) to[bend left=45] (3c);
+        \end{forest}
+        \hspace{5em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            2, label=left:{\small\textcolor{red}{+2}}, draw=teal, name=2
+            [,empty node]
+            [
+            3, label=right:{\small\textcolor{blue}{+1}}, draw=purple, edge={teal,thick}
+            [,empty node, name=3c]
+            [5, draw=purple, label=right:{\small\textcolor{blue}{0}}, edge={purple,thick},draw=purple
+            [,empty node]
+            [,empty node]
+            ]
+            ]
+            {\draw[->,purple] () to[bend right=45] node[midway,above right,font=\small]{Linksrotation} (!u.east);}
+            ]
+            \draw[->,teal] (2) to[bend right=45] (3c);
+        \end{forest}
+        \hspace{1em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            3, label=right:{\small\textcolor{blue}{0}},draw=purple
+            [
+            2, label=right:{\small\textcolor{blue}{0}}, edge={teal,thick},draw=teal
+            [,empty node]
+            [,empty node]
+            ]
+            [
+            5, label=right:{\small\textcolor{blue}{0}}, edge={purple,thick},draw=purple
+            [,empty node]
+            [,empty node]
+            ]
+            ]
+        \end{forest}
+    \end{center}
+\end{algo}
+
+
+\begin{defi}{Komplexität von AVL-Bäumen}
+    \begin{itemize}
+        \item Einfügen
+              \begin{itemize}
+                  \item Element muss gesucht werden: $\bigo(\log n)$
+                  \item Element muss angehängt werden: $\bigo(1)$
+                  \item Baum muss ausgeglichen werden: $\bigo(\log n)$
+              \end{itemize}
+        \item Löschen
+              \begin{itemize}
+                  \item Element muss gesucht werden: $\bigo(\log n)$
+                  \item nächstgrößeres Element muss gesucht werden: $\bigo(\log n)$
+                  \item Elemente müssen verschoben werden: $\bigo(1)$
+                  \item Baum muss ausgeglichen werden: $\bigo(\log n)$\footnote{Im Worst-Case muss für jede Ebene eine Doppelrotation durchgeführt werden $\implies \bigo(\log n)$}
+              \end{itemize}
+        \item Prüfen/Auslesen
+              \begin{itemize}
+                  \item Element muss gesucht werden: $\bigo(\log n)$
+              \end{itemize}
+    \end{itemize}
+\end{defi}
+
+\subsection{B-Bäume}
+% B-Bäume
+
+\begin{defi}{B-Baum}
+    Jeder Knoten in einem \emph{B-Baum der Ordnung d} enthält $d$ bis $2d$ Elemente.
+
+    Die Wurzel bildet die einzige Ausnahme, sie kann $1$ bis $2d$ Elemente enthalten.
+
+    Die Elemente in einem Knoten sind aufsteigend sortiert.
+
+    Die Anzahl der Kinder in einem B-Baum ist entweder $0$ (Blatt) oder um eins größer als die Anzahl der Elemente, die der Knoten enthält.
+
+    Alle Blätter liegen auf demselben Level.
+    \begin{itemize}[-]
+        \item garantierte Zugriffszeiten
+        \item bei realistischen Parametern (z.B. Ordnung $1000$) sind sehr wenige ($<5$) Zugriffe auf das externe Medium nötig
+    \end{itemize}
+
+    B-Bäume besitzen ausgeglichene Höhe, lassen aber unausgeglichenen Verzweigungsgrad und Knotenfüllgrad zu.
+
+    Der längste Weg in einem B-Baum der Ordnung $d$ ist in $\bigo(\log_{d+1} n)$.
+
+    B-Baum der Ordnung $2$:
+    \vspace{1em}
+
+    \centering
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=2em,
+        }
+        [{\mpnc{\textcolor{red}{30}}{\textcolor{violet}{38}}{\textcolor{blue}{42}}{\times}}
+            [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                        \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+                    }]
+            [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
+                        \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+                    }]
+            [{\mpnc{40}{41}{\times}{\times}}, name=c3, edge path={
+                        \noexpand\path [draw, \forestoption{edge}] (!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+                    }]
+            [{\mpnc{44}{50}{56}{58}}, name=c4, edge path={
+                        \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+                    }]
+        ]
+        \node[fit=(c1), label=below:{$\in [-\infty, \text{\textcolor{red}{30}}]$}] {};
+        \node[fit=(c2), label=below:{$\in [\text{\textcolor{red}{30}}, \text{\textcolor{purple}{38}}]$}] {};
+        \node[fit=(c3), label=below:{$\in [\text{\textcolor{purple}{38}}, \text{\textcolor{blue}{42}}]$}] {};
+        \node[fit=(c4), label=below:{$\in [\text{\textcolor{blue}{42}}, \infty]$}] {};
+    \end{forest}
+\end{defi}
+
+\begin{algo}{Suchen in einem B-Baum}
+    Ausgehend von der Wurzel:
+    \begin{enumerate}
+        \item Prüfe, ob der gerade betrachtete Knoten den gesuchten Schlüssel $m$ enthält.
+              \subitem (Suche innerhalb eines Knotens entweder linear oder binär.)
+        \item Falls nicht, bestimme den kleinsten Schlüssel $k_i$, der größer als $m$ ist.
+              \begin{itemize}
+                  \item $k_i$ gefunden: Weiter bei Schritt 1 mit linkem Kind von $k_i$ ($p_{i-1}$)
+                  \item $k_i$ nicht gefunden: Weiter mit letztem Kind ($p_{n}$)
+              \end{itemize}
+    \end{enumerate}
+\end{algo}
+
+\begin{algo}{Einfügen in einem B-Baum der Ordnung $d$}
+    \begin{enumerate}
+        \item Suche nach Schlüssel endet in einem Blatt \texttt{node} (in \textcolor{purple}{lila})
+        \item Schlüssel wird in Sortierreihenfolge eingefügt (und neuer leerer Verweis eingefügt)
+        \item Falls \texttt{node} überfüllt ist: \texttt{node} aufteilen
+              \subitem $k$ sei mittlerer Eintrag von \texttt{node}
+              \begin{enumerate}
+                  \item Neuen Knoten \texttt{current} anlegen und mit den $d$ größeren Schlüsseln (rechts von $k$) belegen.
+                  \item Die $d$ kleineren Schlüssel (links von $k$) bleiben in \texttt{node}.
+                  \item $k$ in Elterknoten \texttt{parent} von \texttt{node} verschieben.
+                  \item Verweis rechts von $k$ in \texttt{parent} mit \texttt{current} verbinden.
+              \end{enumerate}
+        \item Falls \texttt{parent} nun überfüllt ist: \texttt{parent} aufteilen (Siehe Schritt 3)
+    \end{enumerate}
+
+    Einfügen der 60 in \textcolor{red}{rot}.
+
+    \vspace{1em}
+
+    \centering
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{38}{42}{\times}}
+            [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                        \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+                    }]
+            [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
+                        \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+                    }]
+            [{\mpnc{40}{41}{\times}{\times}}, name=c3, edge path={
+                        \noexpand\path [draw, \forestoption{edge}] (!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+                    }]
+            [{\mpnc{44}{50}{56}{58}}, name=c4, edge={dashed,purple,thick}, draw=purple, edge path={
+                        \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+                    }]
+        ]
+        \node[draw, above of=c4, rectangle, red, node distance=5em] (60) {60};
+        \draw[->, red] (60) to (c4);
+    \end{forest}
+
+    \vspace{1em}
+
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{38}{42}{\times}}, name=r
+        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{40}{41}{\times}{\times}}, name=c3]
+        [{\mpnc{44}{50}{\times}{\times}}, name=c4, draw=red, edge={draw=none}]
+        [{\mpnc{58}{\textcolor{red}{60}}{\times}{\times}}, name=c5, draw=red, edge={draw=none}]
+        ]
+        \node[draw, above right of=c4, rectangle, blue, node distance=sqrt(2)*4em] (56) {56};
+        \draw[->, blue, bend right=15] (56) to (r);
+    \end{forest}
+
+    \vspace{1em}
+
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{38}{42}{\textcolor{blue}{56}}}, name=r
+        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{40}{41}{\times}{\times}}, name=c3]
+        [{\mpnc{44}{50}{\times}{\times}}, name=c4, draw=red, edge={red}, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{58}{\textcolor{red}{60}}{\times}{\times}}, name=c5, draw=red, edge={red}, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        ]
+    \end{forest}
+\end{algo}
+
+\begin{algo}{Löschen in einem B-Baum der Ordnung $d$ (Blatt)}
+    In einem Blatt mit Struktur
+    \begin{center}
+        \texttt{(null, $k_1$, null, $\ldots$, $k_i$, null, $\ldots$, $k_n$, null)}
+    \end{center}
+    (\texttt{null} sind hier die Kinder an der jeweiligen Stelle)
+    wird der Wert $x = k_i$ zusammen mit der darauf folgenden \texttt{null}-Referenz gelöscht.
+
+    Ein \emph{Underflow} tritt auf, falls $n=d$ war.
+\end{algo}
+
+\begin{algo}{Löschen in einem B-Baum der Ordnung $d$ (Innerer Knoten)}
+    In einem inneren Knoten mit Struktur
+
+    \begin{center}
+        \texttt{($p_0$, $k_1$, $p_1$, $\ldots$, $k_i$, $p_i$, $\ldots$, $k_n$, $p_n$)}
+    \end{center}
+
+    ($p_j$ sind hier die Kinder an der jeweiligen Stelle)
+    haben alle Referenzen einen Wert ungleich \texttt{null}.
+
+    Das Löschen eines Wertes $x = k_i$ funktioniert analog zum Löschen aus einem binären Suchbaum:
+    \begin{enumerate}
+        \item Finde kleinsten Schlüssel $s$ im durch $p_i$ referenzierten Teilbaum (in einem Blatt)
+        \item Ersetze $k_i$ durch $s$ und lösche $s$ aus dem Blatt
+    \end{enumerate}
+
+    Löschen der 38 in \textcolor{red}{rot}.
+
+    \centering
+    \vspace{1em}
+
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{\textcolor{red}{38}}{42}{56}}, name=r
+        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{40}{41}{\times}{\times}}, name=c3]
+        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        ]
+    \end{forest}
+
+    \vspace{1em}
+
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{\phantom{38}}{42}{56}}, name=r
+        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{\textcolor{blue}{40}}{41}{\times}{\times}}, name=c3]
+        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        ]
+        \draw[->, blue] ([xshift=-2.55em] c3.north) to[bend left=15] ([xshift=-0.75em]r.south);
+    \end{forest}
+
+    \vspace{1em}
+
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{\textcolor{blue}{40}}{42}{56}}, name=r
+        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{41}{\times}{\times}{\times}}, name=c3, draw=purple, label=below:\textcolor{purple}{Underflow!}]
+        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        ]
+    \end{forest}
+\end{algo}
+
+\begin{defi}{Underflow}
+    Ein \emph{Underflow} tritt in einem B-Baum genau dann auf, wenn zu wenig ($<d$) Schlüssel im Knoten sind.
+\end{defi}
+
+\begin{algo}{Ausgleich zwischen Geschwisterknoten}
+    Voraussetzung:
+    Knoten $q$ mit Underflow hat \emph{benachbarten} Geschwisterknoten $p$ mit $>d$ Schlüsseln.
+
+    Annahme:
+    \begin{itemize}
+        \item $p$ ist linker Geschwisterknoten von $q$ (analog mit rechtem Geschwisterknoten)
+        \item im Elterknoten \texttt{parent} (von $p$ und $q$) trennt der Schlüssel $t$ die Verweise auf $p$ und $q$
+    \end{itemize}
+
+    Idee: $p$ schenkt $q$ ein Element (\glqq Umweg\grqq über Elterknoten)
+
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{\textcolor{blue}{40}}{42}{56}}, name=r
+        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{32}{34}{\textcolor{blue}{35}}{\times}}, name=c2, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{41}{\times}{\times}{\times}}, name=c3, draw=purple]
+        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        ]
+        \draw[->, blue] ([xshift=0.75em] c2.north) to[bend left=90] ([xshift=2.25em] r.north west);
+        \draw[<-, blue] ([xshift=-3.4em] c3.north) to[bend right=10] ([xshift=-0.75em] r.south);
+    \end{forest}
+
+    \vspace{1em}
+
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{\textcolor{blue}{35}}{42}{56}}, name=r
+        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{32}{34}{\times}{\times}}, name=c2, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{\textcolor{blue}{40}}{41}{\times}{\times}}, name=c3]
+        [{\mpnc{44}{50}{\times}{\times}}, name=c4, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        ]
+    \end{forest}
+\end{algo}
+
+\begin{algo}{Verschmelzen von Geschwisterknoten}
+    Voraussetzung:
+    Knoten $q$ hat \emph{benachbarten} Geschwisterknoten mit $d$ Schlüsseln.
+
+    Annahme:
+    \begin{itemize}
+        \item $p$ ist linker Geschwisterknoten von $q$ (analog mit rechtem Geschwisterknoten)
+        \item im Elterknoten \texttt{parent} (von $p$ und $q$) trennt der Schlüssel $t$ die Verweise auf $p$ und $q$
+    \end{itemize}
+
+    Idee: $p$ und $q$ mit dem trennenden Element aus \texttt{parent} verschmelzen.
+
+    Beachte:
+    \begin{itemize}
+        \item Eventueller Underflow in \texttt{parent} muss behandelt werden (rekursiv)
+        \item Falls letzter Schlüssel der Wurzel gelöscht wird, wird der einzige Nachfolger der Wurzel die neue Wurzel (Höhe des B-Baums wird um 1 verringert).
+    \end{itemize}
+
+    \vspace{1em}
+
+    \centering
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{40}{\textcolor{blue}{42}}{56}}, name=r
+        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{41}{\times}{\times}{\times}}, name=c3, draw=purple]
+        [{\mpnc{44}{50}{\times}{\times}}, name=c4, draw=blue, edge={blue}, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        ]
+        \draw[<-, blue] ([xshift=-0.75em] c3.north) to[bend left=10] ([xshift=0.75em] r.south);
+        \draw[<-, blue] ([xshift=0.75em] c3.north) to[bend left=45] ([xshift=-3.4em] c4.north);
+    \end{forest}
+
+    \vspace{1em}
+
+    \begin{forest}
+        for tree = {
+        draw,
+        rectangle split, rectangle split horizontal,
+        rectangle split parts=4,
+        %on chain=A,
+        parent anchor=south,
+        child anchor=north,
+        text width=1em,
+        text centered,
+        %edge = {->},
+        l sep=12mm,
+        s sep=1em,
+        }
+        [{\mpnc{30}{40}{56}{\times}}, name=r
+        [{\mpnc{10}{20}{25}{\times}}, name=c1, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-3.4em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{32}{34}{35}{\times}}, name=c2, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=-1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        [{\mpnc{41}{\textcolor{blue}{42}}{\textcolor{blue}{44}}{\textcolor{blue}{50}}}, name=c3]
+        [{\mpnc{58}{60}{\times}{\times}}, name=c5, edge path={
+                \noexpand\path [draw, \forestoption{edge}] ([xshift=1.7em]!u.parent anchor) -- (.child anchor)\forestoption{edge label};
+            }]
+        ]
+    \end{forest}
+\end{algo}
+
+\begin{defi}{B+-Baum}
+    Im Unterschied zu B-Bäumen speichern \emph{B+-Bäume} ihre Datensätze ausschließlich in den Blättern.
+
+    Dies ist bei der Anwendung für Datenbanken naheliegend und sinnvoll.
+\end{defi}
+
+\subsection{Rot-Schwarz-Bäume}
+
+\begin{defi}{Rot-Schwarz-Baum}
+    Ein \emph{Rot-Schwarz-Baum} ist ein balancierter binärer Suchbaum, in dem jeder innere Knoten zwei Kinder hat.
+
+    Jeder innere Knoten hat eine Farbe, so dass gilt:
+    \begin{itemize}
+        \item Die Wurzel ist schwarz.
+        \item Alle Blätter (\text{null}-Knoten) sind schwarz.
+        \item Für jeden Knoten gilt, dass jeder Pfad zu den Blättern die gleiche Anzahl an schwarzen Knoten hat. (Schwarz-Tiefe)
+        \item Beide Kinder eines roten Knotens sind schwarz.
+    \end{itemize}
+
+    Rot-Schwarz-Bäume sind eine gängige Alternative zu AVL-Bäumen.
+\end{defi}
+
+\begin{algo}{Einfügen in einen Rot-Schwarz-Baum}
+    Zuerst wird wie in einem normalen Binärbaum eingefügt, danach werden die Rot-Schwarz-Bedingungen repariert.
+
+    Annahmen:
+    \begin{itemize}
+        \item eingefügter Knoten $v$ ist rot
+        \item Elterknoten $u$ von $v$ ist rot (sonst fertig)
+        \item $v$ ist linkes Kind von $u$ (anderer Fall symmetrisch)
+        \item Geschwisterknoten $w$ (rechtes Kind von $u$) ist schwarz
+        \item Alle roten Knoten außer $u$ haben 2 schwarze Kinder
+    \end{itemize}
+
+
+    \begin{center}
+
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    p, b
+                        [
+                            u, r
+                                [
+                                    v, r
+                                ]
+                                [
+                                    w, b, name=w
+                                ]
+                        ]
+                        [
+                            q, rbn
+                        ]
+                ]
+        \end{forest}
+        \hspace{7em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    p, b
+                        [
+                            q, rbn
+                        ]
+                        [
+                            u, r
+                                [
+                                    v, r
+                                ]
+                                [
+                                    w, b, name=w
+                                ]
+                        ]
+                ]
+        \end{forest}
+    \end{center}
+\end{algo}
+
+\begin{algo}{Einfügen in einen Rot-Schwarz-Baum (Fall 1)}
+
+    \textbf{Fall 1: Onkelknoten $q$ von $v$ ist schwarz}\\
+    Fall 1a: $u$ ist linkes Kind von $p$ ($v$-$u$-$p$ bilden eine Linie)
+    \vspace{1em}
+
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    p, b
+                        [
+                            u, r
+                                [
+                                    v, r
+                                ]
+                                [
+                                    w, b, name=w
+                                ]
+                            %{\draw[->,blue, dashed] () to[bend left=30] (!u.south);}
+                        ]
+                        {\draw[->,blue] () to[bend left=45] node[midway,above left,font=\small]{Rechtsrotation} (!u.west);}
+                        [
+                            q, b
+                        ]
+                ]
+            %{\draw[->,blue, dashed] () to[bend left=45] (w.north east);}
+        \end{forest}
+        \hspace{3em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    u, r
+                        [
+                            v, r
+                        ]
+                        [
+                            p, b
+                                [
+                                    w, b
+                                ]
+                                [
+                                    q, b
+                                ]
+                        ]
+                        {\draw[<->,blue] () to[bend right=45] node[midway,above right,font=\small]{Umfärben} (!u.east);}
+                ]
+            %{\draw[->,blue, dashed] () to[bend left=45] (w.north east);}
+        \end{forest}
+        \hspace{1em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    u, b
+                        [
+                            v, r
+                        ]
+                        [
+                            p, r
+                                [
+                                    w, b
+                                ]
+                                [
+                                    q, b
+                                ]
+                        ]
+                    %{\draw[<->,blue] () to[bend right=45] node[midway,above right,font=\small]{Umfärben} (!u.east);}
+                ]
+            %{\draw[->,blue, dashed] () to[bend left=45] (w.north east);}
+        \end{forest}
+    \end{center}
+
+    \vspace{1em}
+    Fall 1b: $u$ ist rechtes Kind von $p$ ($v$-$u$-$p$ bilden ein Dreieck)
+
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    p, b
+                        [
+                            q, b
+                        ]
+                        [
+                            u, r
+                                [
+                                    v, r
+                                ]
+                                {\draw[->,blue] () to[bend left=45] node[midway,below left=1em,font=\small]{Rechtsrotation} (!u.west);}
+                                [
+                                    w, b, name=w
+                                ]
+                            %{\draw[->,blue, dashed] () to[bend left=30] (!u.south);}
+                        ]
+                ]
+            %{\draw[->,blue, dashed] () to[bend left=45] (w.north east);}
+        \end{forest}
+        \hspace{5em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    p, b
+                        [
+                            q, b
+                        ]
+                        [
+                            v, r
+                                [,nil]
+                                [
+                                    u, r
+                                        [,nil]
+                                        [
+                                            w, b
+                                        ]
+                                ]
+                        ]
+                        {\draw[->,blue] () to[bend right=45] node[midway,above right,font=\small]{Linksrotation} (!u.east);}
+                ]
+        \end{forest}
+
+        \vspace{1em}
+
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    v, r
+                        [
+                            p, b
+                                [
+                                    q, b
+                                ]
+                                [, nil]
+                        ]
+                        {\draw[<->,blue] () to[bend left=45] node[midway,above left,font=\small]{Umfärben} (!u.west);}
+                        [
+                            u, r
+                                [, nil]
+                                [
+                                    w, b
+                                ]
+                        ]
+                ]
+        \end{forest}
+        \hspace{2em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    v, b
+                        [
+                            p, r
+                                [
+                                    q, b
+                                ]
+                                [, nil]
+                        ]
+                        [
+                            u, r
+                                [, nil]
+                                [
+                                    w, b
+                                ]
+                        ]
+                ]
+        \end{forest}
+    \end{center}
+\end{algo}
+
+\begin{algo}{Einfügen in einen Rot-Schwarz-Baum (Fall 2)}
+    \textbf{Fall 2: Geschwisterknoten $q$ von $u$ ist rot}
+
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            p, b, name=p
+            [
+            u, r, name=u
+            [
+            v, r
+            ]
+            [
+            w, b, name=w
+            ]
+            ]
+            [
+            q, r, name=q
+            ]
+            ]
+            \node [draw, fit={(p)(u)(q)}, blue, label=above:\textcolor{blue}{Umfärben}] () {};
+        \end{forest}
+        \hspace{7em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    p, r
+                        [
+                            u, b
+                                [
+                                    v, r
+                                ]
+                                [
+                                    w, b, name=w
+                                ]
+                        ]
+                        [
+                            q, b
+                        ]
+                ]
+        \end{forest}
+    \end{center}
+
+    \vspace{1em}
+
+    beziehungsweise
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+            minimum size=2em, % <-- added
+            inner sep=1pt}
+            [
+            p, b, name=p
+            [
+            q, r, name=q
+            ]
+            [
+            u, r, name=u
+            [
+            v, r
+            ]
+            [
+            w, b, name=w
+            ]
+            ]
+            ]
+            \node [draw, fit={(p)(u)(q)}, blue, label=above:\textcolor{blue}{Umfärben}] () {};
+        \end{forest}
+        \hspace{7em}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    p, r
+                        [
+                            q, b
+                        ]
+                        [
+                            u, b
+                                [
+                                    v, r
+                                ]
+                                [
+                                    w, b, name=w
+                                ]
+                        ]
+                ]
+        \end{forest}
+    \end{center}
+
+    \vspace{1em}
+
+    \begin{itemize}
+        \item Falls der Elterknoten von $p$ schwarz ist, sind wir fertig
+        \item Falls $p$ die Wurzel ist, färbe $p$ schwarz
+        \item Sonst behandle $p$ wie $v$ und wiederhole
+    \end{itemize}
+\end{algo}
+
+\begin{algo}{Löschen in einem Rot-Schwarz-Baum}
+    Das Löschen in einem Rot-Schwarz-Baum kann schnell sehr schwierig zu visualisieren werden.
+
+    Ich will hier gern einmal folgende Videos empfehlen:
+    \begin{itemize}
+        \item \url{https://youtu.be/eO3GzpCCUSg} (ausführliche Beispiele, englisch)
+        \item \url{https://youtu.be/bDT1woMULVw} (ausführliche Erklärung, Pseudocode, deutsch)
+    \end{itemize}
+\end{algo}
+
+\subsection{Heaps}
+
+\begin{bonus}{Heap (Wortbedeutungen)}
+    Das Wort \emph{Heap} hat zwei Bedeutungen:
+    \begin{itemize}
+        \item Besonderer Speicherbereich, in dem Objekte und Klassen gespeichert werden.
+        \item Datenstruktur zur effizienten Implementierung einer Prioritätswarteschlange.
+    \end{itemize}
+\end{bonus}
+
+\begin{defi}{Heap}
+    Ein \emph{Heap} ist ein Binärbaum mit folgenden Eigenschaften:
+    \begin{itemize}
+        \item linksvollständig
+        \item Kinder eines Knotens höchstens so groß wie der Knoten selbst (Max-Heap)
+        \item größtes Element befindet sich an der Wurzel (Max-Heap)
+        \item entlang jedes Pfades von einem Knoten zur Wurzel sind Knoteninhalte aufsteigend sortiert
+    \end{itemize}
+
+    Ein Heap lässt sich insbesondere als Array sehr leicht speichern.
+    Dabei gilt:
+    \begin{itemize}
+        \item \texttt{heap[0]} ist die Wurzel
+        \item \texttt{heap[(i-1)/2]} ist der Elterknoten des Knoten $i$
+        \item \texttt{heap[(2*i)+1]} ist das linke Kind des Knoten $i$
+        \item \texttt{heap[(2*i)+2]} ist das rechte Kind des Knoten $i$
+    \end{itemize}
+
+    Das enstpricht einem Level-Order-Baumdurchlauf.
+\end{defi}
+
+\begin{example}{Heap als Array}
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    90
+                        [
+                            45
+                                [
+                                    27
+                                        [
+                                            2
+                                        ]
+                                        [
+                                            3
+                                        ]
+                                ]
+                                [
+                                    36
+                                        [
+                                            19
+                                        ]
+                                        [26]
+                                ]
+                        ]
+                        [
+                            17
+                                [
+                                    7
+                                        [,empty node]
+                                        [,empty node]
+                                ]
+                                [
+                                    1
+                                        [,empty node]
+                                        [,empty node]
+                                ]
+                        ]
+                ]
+        \end{forest}
+    \end{center}
+
+    \vspace{1em}
+
+    Für den Heap oben gilt die Array-Darstellung:
+    \begin{center}
+        \texttt{[90,45,17,27,36,7,1,2,3,19,26]}
+    \end{center}
+\end{example}
+
+\begin{algo}{Einfügen in einem Heap}
+    Das Einfügen eines Elements in den Heap erfolgt, indem das neue Element an das Ende des Heaps gesetzt wird.
+
+    Weil das neu eingesetzte Element  die Eigenschaften des Heaps verzerren kann, wird die Operation \emph{Up-Heapify} durchgeführt, um die Eigenschaften des Heaps in einem Bottom-up-Ansatz zu erhalten.
+\end{algo}
+
+\begin{algo}{Löschen in einem Heap}
+    Das Entfernen eines Elements erfolgt, indem das gelöscht Element durch das letzte Element im Heap ersetzt wird. Dann wird das letzte Element aus dem Heap gelöscht. Nun wird das letzte Element an einer Stelle im Heap platziert.
+
+    Es kann die Heap-Bedingung nicht erfüllen, sodass die Operation \emph{Down-Heapify} durchgeführt wird, um die Eigenschaften des Heaps aufrechtzuerhalten.
+\end{algo}
+
+\begin{defi}{Heapify}
+    Heapify ist eine Operation, um die Elemente des Heaps neu anzuordnen, um die Heap-Bedingung aufrechtzuerhalten.
+
+    Die Heapify kann in zwei Methoden erfolgen:
+    \begin{itemize}
+        \item Up-Heapify (erfolgt beim Einfügen)
+        \item Down-Heapify (erfolgt beim Löschen)
+    \end{itemize}
+\end{defi}
+
+\begin{algo}{Up-Heapify (Einfügen)}
+    Einfügen der $45$ in \textcolor{red}{rot}.
+
+    \vspace{1em}
+    \begin{center}
+        \scalebox{0.9}{
+            \begin{forest}
+                baseline,anchor=north,
+                for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+                [
+                90
+                [
+                36
+                [
+                27
+                    [
+                        2
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                    [
+                        3
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                ]
+                [
+                26,draw=blue
+                [
+                19
+                %[,empty node]
+                %[,empty node]
+                ]
+                [45 ,edge={red,thick}, draw=red]
+                {\draw[<->,blue] () to[bend right=45] node[midway,below right,font=\small]{Vertauschen} (!u.east);}
+                ]
+                ]
+                [
+                17
+                    [
+                        7
+                            [,empty node]
+                            [,empty node]
+                    ]
+                    [
+                        1
+                            [,empty node]
+                            [,empty node]
+                    ]
+                ]
+                ]
+            \end{forest}
+        }
+        \hspace{1em}
+        \scalebox{0.9}{
+            \begin{forest}
+                baseline,anchor=north,
+                for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+                [
+                90
+                [
+                36,draw=blue
+                [
+                27
+                    [
+                        2
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                    [
+                        3
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                ]
+                [
+                45,edge={red,thick}, draw=red
+                [
+                19
+                %[,empty node]
+                %[,empty node]
+                ]
+                [26,edge={teal,thick}, draw=teal]
+                ]
+                {\draw[<->,blue] () to[bend right=45] node[midway,above right,font=\small]{Vertauschen} (!u.east);}
+                ]
+                [
+                17
+                    [
+                        7
+                            [,empty node]
+                            [,empty node]
+                    ]
+                    [
+                        1
+                            [,empty node]
+                            [,empty node]
+                    ]
+                ]
+                ]
+            \end{forest}
+        }
+
+        \vspace{1em}
+
+        \scalebox{0.9}{
+            \begin{forest}
+                baseline,anchor=north,
+                for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+                [
+                90,draw=teal
+                [
+                45,edge={teal,thick}, draw=teal
+                [
+                27
+                    [
+                        2
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                    [
+                        3
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                ]
+                [
+                36,edge={teal,thick}, draw=teal
+                [
+                19
+                %[,empty node]
+                %[,empty node]
+                ]
+                [26,edge={teal,thick}, draw=teal]
+                ]
+                ]
+                [
+                17
+                    [
+                        7
+                            [,empty node]
+                            [,empty node]
+                    ]
+                    [
+                        1
+                            [,empty node]
+                            [,empty node]
+                    ]
+                ]
+                ]
+            \end{forest}
+        }
+    \end{center}
+\end{algo}
+
+\begin{algo}{Down-Heapify (Löschen)}
+    Löschen der $90$ in \textcolor{red}{rot}.
+
+    \vspace{1em}
+    \begin{center}
+
+        \scalebox{0.9}{
+            \begin{forest}
+                baseline,anchor=north,
+                for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+                [
+                90,draw=red
+                [
+                45
+                    [
+                        27
+                            [
+                                2
+                                %[,empty node]
+                                %[,empty node]
+                            ]
+                            [
+                                3
+                                %[,empty node]
+                                %[,empty node]
+                            ]
+                    ]
+                    [
+                        36
+                            [
+                                19
+                                %[,empty node]
+                                %[,empty node]
+                            ]
+                            [26
+                            ]
+                    ]
+                ]
+                [
+                17
+                    [
+                        7
+                            [,empty node]
+                            [,empty node]
+                    ]
+                    [
+                        1
+                            [,empty node]
+                            [,empty node]
+                    ]
+                ]
+                ]
+            \end{forest}
+        }
+        \hspace{1em}
+        \scalebox{0.9}{
+            \begin{forest}
+                baseline,anchor=north,
+                for tree={circle, draw,
+                        minimum size=2em, % <-- added
+                        inner sep=1pt}
+                    [
+                        ,empty node, name=90
+                            [
+                                45
+                                    [
+                                        27
+                                            [
+                                                2
+                                                %[,empty node]
+                                                %[,empty node]
+                                            ]
+                                            [
+                                                3
+                                                %[,empty node]
+                                                %[,empty node]
+                                            ]
+                                    ]
+                                    [
+                                        36
+                                            [
+                                                19
+                                                %[,empty node]
+                                                %[,empty node]
+                                            ]
+                                            [26, draw=blue, name=26
+                                            ]
+                                    ]
+                            ]
+                            [
+                                17
+                                    [
+                                        7
+                                            [,empty node]
+                                            [,empty node]
+                                    ]
+                                    [
+                                        1
+                                            [,empty node]
+                                            [,empty node]
+                                    ]
+                            ]
+                    ]
+                \draw[->, blue] (26) to[bend right=45] node[midway,above left,font=\small]{Nachrücken} (90);
+            \end{forest}
+        }
+
+        \vspace{1em}
+
+        \scalebox{0.9}{
+            \begin{forest}
+                baseline,anchor=north,
+                for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+                [
+                26, draw=red
+                [
+                45, edge={draw=red},draw=blue
+                [
+                27
+                    [
+                        2
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                    [
+                        3
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                ]
+                [
+                36
+                    [
+                        19
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                    [,empty node]
+                ]
+                ]
+                {\draw[<->,blue] () to[bend left=45] node[midway,above left,font=\small]{Vertauschen} (!u.west);}
+                [
+                17
+                    [
+                        7
+                            [,empty node]
+                            [,empty node]
+                    ]
+                    [
+                        1
+                            [,empty node]
+                            [,empty node]
+                    ]
+                ]
+                ]
+            \end{forest}
+        }
+        \hspace{1em}
+        \scalebox{0.9}{
+            \begin{forest}
+                baseline,anchor=north,
+                for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+                [
+                45,draw=teal
+                [
+                26, draw=red, edge={draw=teal}
+                [
+                27
+                    [
+                        2
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                    [
+                        3
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                ]
+                [
+                36, edge={draw=red},draw=blue
+                [
+                19
+                %[,empty node]
+                %[,empty node]
+                ]
+                [,empty node]
+                ]
+                {\draw[<->,blue] () to[bend right=45] node[midway,above right,font=\small]{Vertauschen} (!u.east);}
+                ]
+                [
+                17
+                    [
+                        7
+                            [,empty node]
+                            [,empty node]
+                    ]
+                    [
+                        1
+                            [,empty node]
+                            [,empty node]
+                    ]
+                ]
+                ]
+            \end{forest}
+        }
+
+        \vspace{1em}
+
+        \scalebox{0.9}{
+            \begin{forest}
+                baseline,anchor=north,
+                for tree={circle, draw,
+                minimum size=2em, % <-- added
+                inner sep=1pt}
+                [
+                45,draw=teal
+                [
+                36, draw=teal, edge={draw=teal}
+                [
+                27
+                    [
+                        2
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                    [
+                        3
+                        %[,empty node]
+                        %[,empty node]
+                    ]
+                ]
+                [
+                26, edge={draw=teal},draw=teal
+                [
+                19, edge={draw=teal},draw=teal
+                %[,empty node]
+                %[,empty node]
+                ]
+                [,empty node]
+                ]
+                ]
+                [
+                17
+                    [
+                        7
+                            [,empty node]
+                            [,empty node]
+                    ]
+                    [
+                        1
+                            [,empty node]
+                            [,empty node]
+                    ]
+                ]
+                ]
+            \end{forest}
+        }
+    \end{center}
+\end{algo}
+
+% Baumdurchlauf
diff --git a/algo/btreevis.sty b/algo/btreevis.sty
index 5dc1b7ba535317f36e44df07e2e143ab47478367..c7a7273305dbc4fc4f297cde0f7792cff1d3bf8b 100644
--- a/algo/btreevis.sty
+++ b/algo/btreevis.sty
@@ -1,408 +1,408 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Author:       Daniel Kocher
-% Email:        Daniel.Kocher@stud.sbg.ac.at
-% Github:       www.github.com/danielkocher
-% Institute:    University of Salzburg
-%               Department of Computer Sciences
-%               Database Research Group (dbresearch.uni-salzburg.at)
-%
-% Project:      www.github.com/danielkocher/btreevis
-% License:      MIT license
-% Description:  Drawing B+ trees is a usual task when teaching and/or working on
-%               database index structures (and other algorithms and data
-%               structure stuff). The default TikZ features do not provide a
-%               good and uncomplicated way to draw such a B+ tree. Furthermore
-%               they do not look 'good'. 'Good' in the sense that they do not
-%               look like real B+ tree. This package tackles this problem.
-%
-%               It provides macros to simplify and beautify the drawing of a B+
-%               tree in LaTeX using TikZ. To keep drawing the trees simple, the
-%               standard tree environment of TikZ is used. So, all the nodes
-%               are placed by this environment in a tree-like way. The content
-%               of the nodes is a matrix of nodes, generated by a macro, which
-%               generates key and pointer nodes alternating (starting with a
-%               pointer node) - see \CreateBTreeNode[4] for further details.
-%               The TikZ tree environment connects the nodes of tree by default.
-%               This feature is disabled by a default style (BTreeDefault)
-%               because these connections do not correspond to the connections
-%               we want for a realistic B+ tree visualization. To accomplish
-%               such a realistic B+ tree visualization, this package provides
-%               two macros: one to draw connections between inner nodes
-%               (vertically) and one to draw connections between leaf nodes
-%               (horizontally). See \ConnectBTreeNodes[5] and
-%               \ConnectBTreeLeaves[2] for further information. To simplify the
-%               macros, a global number of pointers per node is used. This is
-%               necessary because the \Connect* macros need to know how many
-%               keys can be stored in a B+ tree node at most in order to allow
-%               proper arrow drawing (the source of every arrow has to be an
-%               an arrow field of the B+ tree node and the destination of every
-%               arrow has to be in the middle of the .north of a B+ tree node.
-%               The package also provides two default tikzstyles, one for the
-%               B+ tree node and one for the whole tikzpicture of the B+ tree.
-%               Those styles also contain useful information when creating own
-%               tikzstyles (see tikzstyles BTreeDefault and BTreeNodeDefault for
-%               further information).
-%
-%               There are two macros for internal usage which may be used
-%               outside this package but at your own risk.
-%
-%               Please contact me using the email at the top of this header for
-%               bugs, criticism and comments.
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{btreevis}[2015/06/24 B+ Tree Visualization Package]
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% PACKAGES
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\RequirePackage{tikz}
-\RequirePackage{ifthen}
-\RequirePackage{etoolbox}
-%\RequirePackage{calc}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% LIBRARIES
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% TikZ
-\usetikzlibrary{arrows, matrix, calc}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% COUNTERS (GLOBAL)
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% The number of pointers per node (often referred to as m in B+ tree context)
-\newcount\noOfPointersPerNode%
-
-% Used to number pointers and keys consecutively inside a B+ tree node
-\newcount\pointerCounter%
-
-% Used in the connect macros to know where the arrows have to start
-\newcount\pointerNumber%
-
-% Used in the connect macros to hold the number of the current (source) node to
-% connect to
-\newcount\nodeNumber%
-
-% Used in the connect macros to hold the number of the next (destination) node
-% to connect to
-\newcount\nextNodeNumber%
-
-% Used temporarily in the connect macros
-\newcount\tempCounter%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% DEFAULT STYLES (GLOBAL)
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% Default style of a B+ tree node. Provides all important properties a B+ tree
-% node should have such that the resulting B^+ tree looks beautiful.
-% May be overridden by an own style.
-\tikzstyle{BTreeNodeDefault} = [
-  draw,
-  matrix,
-  matrix of nodes,
-  % must be used; otherwise the matrix content generation does not work
-  ampersand replacement=\&,
-  % if inner sep != 0, there is a border around the matrix of nodes
-  inner sep = 0,
-  nodes = {
-    draw,
-    rectangle,
-    % better readability; otherwise node border and content do overlay
-    inner sep = 1mm,
-    % workaround to make nodes look better;
-    % better in the sense that all nodes in the matrix of nodes have the same
-    % height and depth independent of their content
-    text height = height("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz0123456789"),
-    text depth = depth("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz0123456789"),
-    % scaling factor of nodes; nodes have to be scaled independently from the
-    % whole tikzpicture (at least in some cases)
-    scale = 1
-  }
-]
-
-% Default style of a B+ tree.
-% May be overriden by own styles but has all important properties.
-\tikzstyle{BTreeDefault} = [
-  % scaling factor of the whole picture
-  scale = 1,
-  % must be used; otherwise the tree environment draws its own connecting arrows
-  edge from parent/.style = {}
-]
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% MACROS (PACKAGE INTERNAL)
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%
-% Helper macro (only for package internal usage).
-% Creates the content for two nodes (to be used in a matrix of nodes).
-% One with a given content (a key node) and one corresponding pointer node
-% (left of the key node). The naming of both key and pointer nodes is done
-% automatically. This macro is used to generate the content of the matrix of
-% nodes for a B+ tree node in the macro \CreateBTreeNode[4].
-%
-% Be careful when modifying this macros: Because the content just generates a
-% part of a matrix no blank lines should be inserted in this macros (this may
-% causes strange errors when compiling).
-%
-% Naming schema: l#3-n#4-k#2 for search keys and l#3-n#4-p#2 for pointers.
-%
-% Arguments:
-%   #1 ...  The value to be inserted into the node. If empty an empty node is
-%           generated.
-%   #2 ...	The pointer/key number, e.g. if #2 is 2, the pointer nodes third
-%           part of the name is '-p2' and the value nodes third part of the name
-%           is '-k2'
-%   #3 ...	The level number, e.g. if #3 is 3, the nodes first part of the name
-%           is 'l3'
-%   #4 ...	The node number, e.g. if #4 is 4, the nodes second part of the name
-%           is '-n4'
-%
-% Example of the usage:
-%   \@create@key@matrix@node{3}{1}{2}{1}
-%
-%   (Never needed because it is more of an internal macro to draw the B+ tree).
-%   Generates two nodes: the left (pointer) node named 'l2-n1-p1' containing no
-%   value and a node right of it named 'l2-n1-k1' containing the value '3'. So
-%   if the initial matrix was an empty matrix of nodes [], the subsequent matrix
-%   contains two nodes [| 3].
-%%
-\newcommand{\@create@key@matrix@node}[4] {%
-  % empty pointer node (left)
-  |(l#3-n#4-p#2) [fill=blue!20]| {\vphantom{1}} \&%
-  % check presence of argument #1
-  \ifx&#1&%
-    % empty key node (right)
-    |(l#3-n#4-k#2)| {\hphantom{1}} \&%
-  \else%
-    % key node with value (right)
-    |(l#3-n#4-k#2)| {#1} \&%
-  \fi%
-}%
-
-%%
-% Helper macro (only for package internal usage).
-% Creates the content for an empty node (to be used in a matrix of nodes).
-% The naming of this node is done automatically. This macro is used to generate
-% the content of the matrix of nodes for a B+ tree node in the macro
-% \CreateBTreeNode[4].
-%
-% Naming schema: l#2-n#3-p#1
-%
-% Arguments:
-%   #1 ...  The pointer number, e.g. if #1 is 2, the pointer nodes third part of
-%           the name is '-p2'
-%   #2 ...  The level number, e.g. if #2 is 3, the nodes first part of the name
-%           is 'l3'
-%   #3 ...  The node number, e.g. if #3 is 4, the nodes second part of the name
-%           is '-n4'
-%
-% Example of the usage:
-%   \@create@key@matrix@node{5}{2}{1}
-%
-%   (Never needed because it is more of an internal macro to draw the B+ tree).
-%   Generates a single empty node named 'l2-n1-p5' (which is in most cases is
-%   the rightmost part of a B+ tree node). So if the initial matrix is
-%   [| 3 | 5], the subsequent matrix is [| 3 | 5 |].
-%%
-\newcommand{\@create@pointer@matrix@node}[3] {%
-  % empty pointer node
-  |(l#2-n#3-p#1) [fill=blue!20]| {\vphantom{1}} \&%
-}%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% MACROS (GLOBAL)
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%
-% Just a setter to set the \noOfPointersPerNode variable.
-%
-% Arguments:
-%   #1 ...  The value to be assigned to \noOfPointersPerNode
-%
-% Example of the usage:
-%   \setNoOfPoinersPerNode{4}
-%
-%   Sets \noOfPointersPerNode to 4.
-%%
-\newcommand{\SetNoOfPoinersPerNode}[1]{%
-  \noOfPointersPerNode = #1%
-}%
-
-%%
-% Generates the content of a complete B+ tree node (matrix of nodes) for given
-% values supplied as comma-separated list. This generated content is stored into
-% a variable supplied as argument. If the comma-separated list contains less
-% than (\noOfPointersPerNode - 1) elements, the remaining nodes are left empty
-% but are generated to be visualized. Hence, if \noOfPointersPerNode is set to 4
-% and only a list of 2 elements is supplied as key list, the node contains of
-% the two keys and two empty nodes ([| key1 | key2 |  |  |]).
-% The other way round, if the comma-separated list contains more than
-% \noOfPointersPerNode elements, the oversupplied elements are simply ignored
-% and thus are not contained in the matrix of nodes.
-% The generated matrix of nodes is not named because this is not needed to
-% connect the nodes. However, the nodes inside this matrix of nodes are named
-% (see macros \@create@key@matrix@node and \@create@key@matrix@node).
-%
-% Todo: Encapsulate the part inside the \whiledo and \ifthenelse, respectively,
-%       into an own macros (if possible; may not be possible because of the
-%       expanding of the arguments/counters). By now this is more or less
-%       duplicated code.
-%
-% Arguments:
-%   #1 ...  The level of the node (used for naming in called macros)
-%   #2 ...  Number of the node of level #1
-%   #3 ...  Values as comma-separated list
-%   #4 ...  Name of the variable the B+ tree node content is stored to
-%
-% Example of the usage:
-%   \SetNoOfPoinersPerNode{4}
-%   \CreateBTreeNode{0}{1}{{5}}{\levelZeroNodeOne}
-%   \node[BTreeNodeDefault] {\levelZeroNodeOne};
-%
-%   The first line set the number of pointers per node to a maximum of 4. The
-%   second line generates the content of the matrix of nodes, stored in
-%   \levelZeroNodeOne. \levelZeroNodeOne afterwards contains of a matrix of
-%   nodes [| 5 | | |]. So \levelZeroNodeOne can be used as content for the
-%   subsequent call of node, which then has to be a matrix of nodes
-%   (\levelZeroNodeOne is a matrix content separated by & and \\).
-%%
-\newcommand{\CreateBTreeNode}[4] {%
-  % initialize pointer counter (is then incremented for each pointer generated)
-  \pointerCounter = 1%
-
-  % initialize variable the node content is stored into (set it empty)
-  \let#4\empty%
-
-  % for each value of the comma-separated list
-  \foreach \x in #3 {%
-    % only insert until the maximum number of pointers per node is reached
-    \ifthenelse{\not{\the\pointerCounter < \noOfPointersPerNode}}{\breakforeach}{%
-      % expand first two arguments upfront (necessary)
-      \edef\tmpexpand{{\x}{\the\pointerCounter}}%
-      % the \@create@key@matrix@node macros generates a part of the whole node
-      % matrix and this content is then appended here
-      % also the arguments are expanded accordingly
-      \expandafter\gappto\expandafter#4\expandafter{%
-        \expandafter\@create@key@matrix@node\tmpexpand{#1}{#2}%
-      }%
-      % increment pointer counter
-      \global\advance\pointerCounter by 1%
-    }%
-  }%
-
-  % here the remaining empty key nodes of the matrix are produced (if there are
-  % less keys than (number of pointers per node - 1) supplied)
-  \whiledo{\the\pointerCounter < \noOfPointersPerNode}{%
-    % expand first two arguments upfront (necessary)
-    \edef\tmpexpand{{}{\the\pointerCounter}}%
-    % the \@create@key@matrix@node macros generates a part of the whole node
-    % matrix and this content is then appended here (in essence, here the empty
-    % nodes are generated and appended).
-    % also the arguments are expanded accordingly
-    \expandafter\gappto\expandafter#4\expandafter{%
-      \expandafter\@create@key@matrix@node\tmpexpand{#1}{#2}%
-    }%
-    % increment pointer counter
-    \global\advance\pointerCounter by 1%
-  }%
-
-  % here the last pointer node is appended to the matrix
-  \expandafter\gappto\expandafter#4\expandafter{%
-    \expandafter\@create@pointer@matrix@node%
-    \expandafter{\the\pointerCounter}{#1}{#2}%
-  }%
-
-  % append the line of the matrix of nodes is finished (with \\)
-  \gappto#4{\\}%
-}%
-
-%%
-% Connects all pointers of a given node on a given (source) level to all its
-% children of a given (destination level) with an arrow (solid). This only works
-% if the nodes of the B+ tree are named like mentioned in the
-% \@create@key@matrix@node and \@create@pointer@matrix@node, respectively.
-%
-% Arguments:
-%   #1 ...  Number of source (tree) level
-%   #2 ...  Number of source node (parent node)
-%   #3 ...  Number of destination (tree) level
-%   #4 ...  Number of (child) nodes to be connected with parent
-%   #5 ...  Number of the first (child) node to be connected with parent
-%
-% Example of the usage:
-%   \ConnectBTreeNodes{0}{1}{1}{2}{1}
-%
-%		Generates arrows from node 1 of the top level (0) to 2 child nodes of the
-%   subsequent level (1) of the tree. We have 2 children on the subsequent level
-%   and the first node to be connect (on the subsequent level) is node 1. A node
-%   contains 3 search keys, hence it has 4 pointers. The incoming arrows on any
-%   node on the subsequent level arrives at the north center of the node.
-%%
-\newcommand{\ConnectBTreeNodes}[5] {%
-  % initialize temporary counter (just used to iterate)
-  \tempCounter = 0%
-
-  % draw a vertical arrow (connect) from the source node to each child node
-  \whiledo{\the\tempCounter < #4} {%
-    % compute current node number:
-    % temporary counter + the number of the node to start with
-    \nodeNumber = \the\tempCounter%
-    \advance\nodeNumber by #5%
-
-    % compute current pointer number: temporary counter + 1
-    \pointerNumber = \the\tempCounter%
-    \advance\pointerNumber by 1%
-
-    % draw an arrow from south of the computed pointer number to middle of the
-    % north of the node with the previously computed number
-    \draw[->, >=stealth] (l#1-n#2-p\the\pointerNumber.south) --
-      ($(l#3-n\the\nodeNumber-p1.north)!0.5!(l#3-n\the\nodeNumber-p\the\noOfPointersPerNode.north)$);%
-
-    % increment temporary counter
-    \global\advance\tempCounter by 1%
-  }%
-}%
-
-%%
-%	Connects all leaf nodes of a given (leaf) level with a dotted arrow. The arrow
-% starts at .east of the rightmost node inside the leaf and ends at .west
-% of the leftmost node inside the next leaf. This only works if the nodes of the
-% B+ tree are named	like mentioned in in the \@create@key@matrix@node and
-% \@create@pointer@matrix@node, respectively.
-%
-% Arguments:
-%   #1 ... Number of the (tree) level of the leaves
-%   #2 ... Number of leaf nodes to be connected
-%
-% Example of the usage:
-%   \ConnectBTreeLeaves{2}{5}
-%
-%   Generates arrows between 5 nodes of the leaf level (here 2).
-%%
-\newcommand{\ConnectBTreeLeaves}[2] {%
-  % initialize node number (used to iterate)
-  \nodeNumber = 1%
-
-  % draw horizontal, dotted arrows (connect) between all leaf nodes
-  % arrows are drawn from left to right
-  \whiledo{\the\nodeNumber < #2} {%
-    % compute next node number: current node number + 1
-    \nextNodeNumber = \nodeNumber%
-    \advance\nextNodeNumber by 1%
-
-    % draw a dotted arrow between two leaf nodes (from left to right)
-    \draw[->, >=stealth, dotted]
-      (l#1-n\the\nodeNumber-p\the\noOfPointersPerNode.east) --
-      (l#1-n\the\nextNodeNumber-p1.west);%
-
-    % increment node number
-    \global\advance\nodeNumber by 1%
-  }%
-}%
-
-\endinput
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Author:       Daniel Kocher
+% Email:        Daniel.Kocher@stud.sbg.ac.at
+% Github:       www.github.com/danielkocher
+% Institute:    University of Salzburg
+%               Department of Computer Sciences
+%               Database Research Group (dbresearch.uni-salzburg.at)
+%
+% Project:      www.github.com/danielkocher/btreevis
+% License:      MIT license
+% Description:  Drawing B+ trees is a usual task when teaching and/or working on
+%               database index structures (and other algorithms and data
+%               structure stuff). The default TikZ features do not provide a
+%               good and uncomplicated way to draw such a B+ tree. Furthermore
+%               they do not look 'good'. 'Good' in the sense that they do not
+%               look like real B+ tree. This package tackles this problem.
+%
+%               It provides macros to simplify and beautify the drawing of a B+
+%               tree in LaTeX using TikZ. To keep drawing the trees simple, the
+%               standard tree environment of TikZ is used. So, all the nodes
+%               are placed by this environment in a tree-like way. The content
+%               of the nodes is a matrix of nodes, generated by a macro, which
+%               generates key and pointer nodes alternating (starting with a
+%               pointer node) - see \CreateBTreeNode[4] for further details.
+%               The TikZ tree environment connects the nodes of tree by default.
+%               This feature is disabled by a default style (BTreeDefault)
+%               because these connections do not correspond to the connections
+%               we want for a realistic B+ tree visualization. To accomplish
+%               such a realistic B+ tree visualization, this package provides
+%               two macros: one to draw connections between inner nodes
+%               (vertically) and one to draw connections between leaf nodes
+%               (horizontally). See \ConnectBTreeNodes[5] and
+%               \ConnectBTreeLeaves[2] for further information. To simplify the
+%               macros, a global number of pointers per node is used. This is
+%               necessary because the \Connect* macros need to know how many
+%               keys can be stored in a B+ tree node at most in order to allow
+%               proper arrow drawing (the source of every arrow has to be an
+%               an arrow field of the B+ tree node and the destination of every
+%               arrow has to be in the middle of the .north of a B+ tree node.
+%               The package also provides two default tikzstyles, one for the
+%               B+ tree node and one for the whole tikzpicture of the B+ tree.
+%               Those styles also contain useful information when creating own
+%               tikzstyles (see tikzstyles BTreeDefault and BTreeNodeDefault for
+%               further information).
+%
+%               There are two macros for internal usage which may be used
+%               outside this package but at your own risk.
+%
+%               Please contact me using the email at the top of this header for
+%               bugs, criticism and comments.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{btreevis}[2015/06/24 B+ Tree Visualization Package]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% PACKAGES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\RequirePackage{tikz}
+\RequirePackage{ifthen}
+\RequirePackage{etoolbox}
+%\RequirePackage{calc}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LIBRARIES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% TikZ
+\usetikzlibrary{arrows, matrix, calc}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% COUNTERS (GLOBAL)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% The number of pointers per node (often referred to as m in B+ tree context)
+\newcount\noOfPointersPerNode%
+
+% Used to number pointers and keys consecutively inside a B+ tree node
+\newcount\pointerCounter%
+
+% Used in the connect macros to know where the arrows have to start
+\newcount\pointerNumber%
+
+% Used in the connect macros to hold the number of the current (source) node to
+% connect to
+\newcount\nodeNumber%
+
+% Used in the connect macros to hold the number of the next (destination) node
+% to connect to
+\newcount\nextNodeNumber%
+
+% Used temporarily in the connect macros
+\newcount\tempCounter%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% DEFAULT STYLES (GLOBAL)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Default style of a B+ tree node. Provides all important properties a B+ tree
+% node should have such that the resulting B^+ tree looks beautiful.
+% May be overridden by an own style.
+\tikzstyle{BTreeNodeDefault} = [
+  draw,
+  matrix,
+  matrix of nodes,
+  % must be used; otherwise the matrix content generation does not work
+  ampersand replacement=\&,
+  % if inner sep != 0, there is a border around the matrix of nodes
+  inner sep = 0,
+  nodes = {
+    draw,
+    rectangle,
+    % better readability; otherwise node border and content do overlay
+    inner sep = 1mm,
+    % workaround to make nodes look better;
+    % better in the sense that all nodes in the matrix of nodes have the same
+    % height and depth independent of their content
+    text height = height("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz0123456789"),
+    text depth = depth("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz0123456789"),
+    % scaling factor of nodes; nodes have to be scaled independently from the
+    % whole tikzpicture (at least in some cases)
+    scale = 1
+  }
+]
+
+% Default style of a B+ tree.
+% May be overriden by own styles but has all important properties.
+\tikzstyle{BTreeDefault} = [
+  % scaling factor of the whole picture
+  scale = 1,
+  % must be used; otherwise the tree environment draws its own connecting arrows
+  edge from parent/.style = {}
+]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% MACROS (PACKAGE INTERNAL)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%
+% Helper macro (only for package internal usage).
+% Creates the content for two nodes (to be used in a matrix of nodes).
+% One with a given content (a key node) and one corresponding pointer node
+% (left of the key node). The naming of both key and pointer nodes is done
+% automatically. This macro is used to generate the content of the matrix of
+% nodes for a B+ tree node in the macro \CreateBTreeNode[4].
+%
+% Be careful when modifying this macros: Because the content just generates a
+% part of a matrix no blank lines should be inserted in this macros (this may
+% causes strange errors when compiling).
+%
+% Naming schema: l#3-n#4-k#2 for search keys and l#3-n#4-p#2 for pointers.
+%
+% Arguments:
+%   #1 ...  The value to be inserted into the node. If empty an empty node is
+%           generated.
+%   #2 ...	The pointer/key number, e.g. if #2 is 2, the pointer nodes third
+%           part of the name is '-p2' and the value nodes third part of the name
+%           is '-k2'
+%   #3 ...	The level number, e.g. if #3 is 3, the nodes first part of the name
+%           is 'l3'
+%   #4 ...	The node number, e.g. if #4 is 4, the nodes second part of the name
+%           is '-n4'
+%
+% Example of the usage:
+%   \@create@key@matrix@node{3}{1}{2}{1}
+%
+%   (Never needed because it is more of an internal macro to draw the B+ tree).
+%   Generates two nodes: the left (pointer) node named 'l2-n1-p1' containing no
+%   value and a node right of it named 'l2-n1-k1' containing the value '3'. So
+%   if the initial matrix was an empty matrix of nodes [], the subsequent matrix
+%   contains two nodes [| 3].
+%%
+\newcommand{\@create@key@matrix@node}[4] {%
+  % empty pointer node (left)
+  |(l#3-n#4-p#2) [fill=blue!20]| {\vphantom{1}} \&%
+  % check presence of argument #1
+  \ifx&#1&%
+    % empty key node (right)
+    |(l#3-n#4-k#2)| {\hphantom{1}} \&%
+  \else%
+    % key node with value (right)
+    |(l#3-n#4-k#2)| {#1} \&%
+  \fi%
+}%
+
+%%
+% Helper macro (only for package internal usage).
+% Creates the content for an empty node (to be used in a matrix of nodes).
+% The naming of this node is done automatically. This macro is used to generate
+% the content of the matrix of nodes for a B+ tree node in the macro
+% \CreateBTreeNode[4].
+%
+% Naming schema: l#2-n#3-p#1
+%
+% Arguments:
+%   #1 ...  The pointer number, e.g. if #1 is 2, the pointer nodes third part of
+%           the name is '-p2'
+%   #2 ...  The level number, e.g. if #2 is 3, the nodes first part of the name
+%           is 'l3'
+%   #3 ...  The node number, e.g. if #3 is 4, the nodes second part of the name
+%           is '-n4'
+%
+% Example of the usage:
+%   \@create@key@matrix@node{5}{2}{1}
+%
+%   (Never needed because it is more of an internal macro to draw the B+ tree).
+%   Generates a single empty node named 'l2-n1-p5' (which is in most cases is
+%   the rightmost part of a B+ tree node). So if the initial matrix is
+%   [| 3 | 5], the subsequent matrix is [| 3 | 5 |].
+%%
+\newcommand{\@create@pointer@matrix@node}[3] {%
+  % empty pointer node
+  |(l#2-n#3-p#1) [fill=blue!20]| {\vphantom{1}} \&%
+}%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% MACROS (GLOBAL)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%
+% Just a setter to set the \noOfPointersPerNode variable.
+%
+% Arguments:
+%   #1 ...  The value to be assigned to \noOfPointersPerNode
+%
+% Example of the usage:
+%   \setNoOfPoinersPerNode{4}
+%
+%   Sets \noOfPointersPerNode to 4.
+%%
+\newcommand{\SetNoOfPoinersPerNode}[1]{%
+  \noOfPointersPerNode = #1%
+}%
+
+%%
+% Generates the content of a complete B+ tree node (matrix of nodes) for given
+% values supplied as comma-separated list. This generated content is stored into
+% a variable supplied as argument. If the comma-separated list contains less
+% than (\noOfPointersPerNode - 1) elements, the remaining nodes are left empty
+% but are generated to be visualized. Hence, if \noOfPointersPerNode is set to 4
+% and only a list of 2 elements is supplied as key list, the node contains of
+% the two keys and two empty nodes ([| key1 | key2 |  |  |]).
+% The other way round, if the comma-separated list contains more than
+% \noOfPointersPerNode elements, the oversupplied elements are simply ignored
+% and thus are not contained in the matrix of nodes.
+% The generated matrix of nodes is not named because this is not needed to
+% connect the nodes. However, the nodes inside this matrix of nodes are named
+% (see macros \@create@key@matrix@node and \@create@key@matrix@node).
+%
+% Todo: Encapsulate the part inside the \whiledo and \ifthenelse, respectively,
+%       into an own macros (if possible; may not be possible because of the
+%       expanding of the arguments/counters). By now this is more or less
+%       duplicated code.
+%
+% Arguments:
+%   #1 ...  The level of the node (used for naming in called macros)
+%   #2 ...  Number of the node of level #1
+%   #3 ...  Values as comma-separated list
+%   #4 ...  Name of the variable the B+ tree node content is stored to
+%
+% Example of the usage:
+%   \SetNoOfPoinersPerNode{4}
+%   \CreateBTreeNode{0}{1}{{5}}{\levelZeroNodeOne}
+%   \node[BTreeNodeDefault] {\levelZeroNodeOne};
+%
+%   The first line set the number of pointers per node to a maximum of 4. The
+%   second line generates the content of the matrix of nodes, stored in
+%   \levelZeroNodeOne. \levelZeroNodeOne afterwards contains of a matrix of
+%   nodes [| 5 | | |]. So \levelZeroNodeOne can be used as content for the
+%   subsequent call of node, which then has to be a matrix of nodes
+%   (\levelZeroNodeOne is a matrix content separated by & and \\).
+%%
+\newcommand{\CreateBTreeNode}[4] {%
+  % initialize pointer counter (is then incremented for each pointer generated)
+  \pointerCounter = 1%
+
+  % initialize variable the node content is stored into (set it empty)
+  \let#4\empty%
+
+  % for each value of the comma-separated list
+  \foreach \x in #3 {%
+    % only insert until the maximum number of pointers per node is reached
+    \ifthenelse{\not{\the\pointerCounter < \noOfPointersPerNode}}{\breakforeach}{%
+      % expand first two arguments upfront (necessary)
+      \edef\tmpexpand{{\x}{\the\pointerCounter}}%
+      % the \@create@key@matrix@node macros generates a part of the whole node
+      % matrix and this content is then appended here
+      % also the arguments are expanded accordingly
+      \expandafter\gappto\expandafter#4\expandafter{%
+        \expandafter\@create@key@matrix@node\tmpexpand{#1}{#2}%
+      }%
+      % increment pointer counter
+      \global\advance\pointerCounter by 1%
+    }%
+  }%
+
+  % here the remaining empty key nodes of the matrix are produced (if there are
+  % less keys than (number of pointers per node - 1) supplied)
+  \whiledo{\the\pointerCounter < \noOfPointersPerNode}{%
+    % expand first two arguments upfront (necessary)
+    \edef\tmpexpand{{}{\the\pointerCounter}}%
+    % the \@create@key@matrix@node macros generates a part of the whole node
+    % matrix and this content is then appended here (in essence, here the empty
+    % nodes are generated and appended).
+    % also the arguments are expanded accordingly
+    \expandafter\gappto\expandafter#4\expandafter{%
+      \expandafter\@create@key@matrix@node\tmpexpand{#1}{#2}%
+    }%
+    % increment pointer counter
+    \global\advance\pointerCounter by 1%
+  }%
+
+  % here the last pointer node is appended to the matrix
+  \expandafter\gappto\expandafter#4\expandafter{%
+    \expandafter\@create@pointer@matrix@node%
+    \expandafter{\the\pointerCounter}{#1}{#2}%
+  }%
+
+  % append the line of the matrix of nodes is finished (with \\)
+  \gappto#4{\\}%
+}%
+
+%%
+% Connects all pointers of a given node on a given (source) level to all its
+% children of a given (destination level) with an arrow (solid). This only works
+% if the nodes of the B+ tree are named like mentioned in the
+% \@create@key@matrix@node and \@create@pointer@matrix@node, respectively.
+%
+% Arguments:
+%   #1 ...  Number of source (tree) level
+%   #2 ...  Number of source node (parent node)
+%   #3 ...  Number of destination (tree) level
+%   #4 ...  Number of (child) nodes to be connected with parent
+%   #5 ...  Number of the first (child) node to be connected with parent
+%
+% Example of the usage:
+%   \ConnectBTreeNodes{0}{1}{1}{2}{1}
+%
+%		Generates arrows from node 1 of the top level (0) to 2 child nodes of the
+%   subsequent level (1) of the tree. We have 2 children on the subsequent level
+%   and the first node to be connect (on the subsequent level) is node 1. A node
+%   contains 3 search keys, hence it has 4 pointers. The incoming arrows on any
+%   node on the subsequent level arrives at the north center of the node.
+%%
+\newcommand{\ConnectBTreeNodes}[5] {%
+  % initialize temporary counter (just used to iterate)
+  \tempCounter = 0%
+
+  % draw a vertical arrow (connect) from the source node to each child node
+  \whiledo{\the\tempCounter < #4} {%
+    % compute current node number:
+    % temporary counter + the number of the node to start with
+    \nodeNumber = \the\tempCounter%
+    \advance\nodeNumber by #5%
+
+    % compute current pointer number: temporary counter + 1
+    \pointerNumber = \the\tempCounter%
+    \advance\pointerNumber by 1%
+
+    % draw an arrow from south of the computed pointer number to middle of the
+    % north of the node with the previously computed number
+    \draw[->, >=stealth] (l#1-n#2-p\the\pointerNumber.south) --
+      ($(l#3-n\the\nodeNumber-p1.north)!0.5!(l#3-n\the\nodeNumber-p\the\noOfPointersPerNode.north)$);%
+
+    % increment temporary counter
+    \global\advance\tempCounter by 1%
+  }%
+}%
+
+%%
+%	Connects all leaf nodes of a given (leaf) level with a dotted arrow. The arrow
+% starts at .east of the rightmost node inside the leaf and ends at .west
+% of the leftmost node inside the next leaf. This only works if the nodes of the
+% B+ tree are named	like mentioned in in the \@create@key@matrix@node and
+% \@create@pointer@matrix@node, respectively.
+%
+% Arguments:
+%   #1 ... Number of the (tree) level of the leaves
+%   #2 ... Number of leaf nodes to be connected
+%
+% Example of the usage:
+%   \ConnectBTreeLeaves{2}{5}
+%
+%   Generates arrows between 5 nodes of the leaf level (here 2).
+%%
+\newcommand{\ConnectBTreeLeaves}[2] {%
+  % initialize node number (used to iterate)
+  \nodeNumber = 1%
+
+  % draw horizontal, dotted arrows (connect) between all leaf nodes
+  % arrows are drawn from left to right
+  \whiledo{\the\nodeNumber < #2} {%
+    % compute next node number: current node number + 1
+    \nextNodeNumber = \nodeNumber%
+    \advance\nextNodeNumber by 1%
+
+    % draw a dotted arrow between two leaf nodes (from left to right)
+    \draw[->, >=stealth, dotted]
+      (l#1-n\the\nodeNumber-p\the\noOfPointersPerNode.east) --
+      (l#1-n\the\nextNodeNumber-p1.west);%
+
+    % increment node number
+    \global\advance\nodeNumber by 1%
+  }%
+}%
+
+\endinput
diff --git a/algo/datenstrukturen.tex b/algo/datenstrukturen.tex
index 7a231203928159c1900d69b3118f56adb8999a37..a9ac65430235e79651f33cc2a5069396fd35c55e 100644
--- a/algo/datenstrukturen.tex
+++ b/algo/datenstrukturen.tex
@@ -1,799 +1,806 @@
-\section{Elementare Datenstrukturen}
-
-\begin{defi}{Homogene Datenstruktur}
-    In einer \emph{homogenen Datenstruktur} haben alle Komponenten den \emph{gleichen} Datentyp.
-\end{defi}
-
-\begin{defi}{Heterogene Datenstruktur}
-    In einer \emph{heterogenen Datenstruktur} haben die Komponenten \emph{unterschiedliche} Datentypen.
-\end{defi}
-
-% ADTs
-\begin{defi}{Abstrakte Datentypen (ADTs)}
-    Anforderungen an die Definition eines Datentyps:
-    \begin{itemize}
-        \item \emph{Spezifikation} eines Datentyps unabhängig von der Implementierung
-        \item Reduzierung der von außen sichtbaren Aspekte auf die \emph{Schnittstelle} des Datentyps
-    \end{itemize}
-
-    Daraus entstehen \textbf{zwei Prinzipien}:
-    \begin{itemize}
-        \item \emph{Kapselung:}
-              \subitem Zu einem ADT gehört eine Schnittstelle.
-              \subitem Zugriffe auf den ADT erfolgen ausschließlich über die Schnittstelle.
-        \item \emph{Geheimnisprinzip:}
-              \subitem Interne Realisierung eines ADT-Moduls bleibt verborgen.
-    \end{itemize}
-\end{defi}
-
-\begin{bonus}{ADTs in Java}
-    Viele wichtige abstrakte Datentypen werden in Java durch \emph{Interfaces} beschrieben.
-
-    Es gibt ein oder mehrere Implementierungen dieser Interfaces mit unterschiedlichen dahinter stehenden Konzepten.
-
-    In Java: Package \texttt{java.util}
-
-    Wichtig in der Vorlesung:
-
-    \begin{tabular}{l|l|l}
-        ADT                     & Grund-ADT/Interface & Java-Klassen                      \\
-        \hline
-        Feld                    &                     & (Felder), HashMap                 \\
-        Liste                   & List                & ArrayList, LinkedList             \\
-        Menge                   & Set                 & HashSet, TreeSet                  \\
-        Prioritätswarteschlange &                     & PriorityQueue                     \\
-        Stack                   & List                &                                   \\
-        Queue                   & List                &                                   \\
-        Deque                   & List                & Deque (Interface), ArrayDeque     \\
-        Map                     & Set                 & Map (Interface), HashMap, TreeMap \\
-        BidiMap                 & Map                 & BidiMap, BiMap (Interface)        \\
-        MultiSet, Bag           & Map                 & Bag, Multiset (Interface)
-    \end{tabular}
-\end{bonus}
-
-\subsection{Felder und abstrakte Datenstrukturen}
-
-\begin{defi}{Array}
-    Ein \emph{Array} hat folgende spezielle Eigenschaften:
-    \begin{itemize}
-        \item Feste Anzahl an Datenobjekten
-        \item Auf jedes Objekt kann direkt lesend oder schreibend zugegriffen werden
-    \end{itemize}
-
-    \begin{center}
-        \begin{tikzpicture}[
-                %  -{Stealth[length = 2.5pt]},
-                start chain,
-                node distance = 0pt,
-                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-            { start chain = going right
-                \node [StackBlock, label=$0$] (0) {};
-                \node [StackBlock, label=$1$] (1) {};
-                \node [StackBlock, label=$2$] (2) {};
-                \node [StackBlock, label=$3$] (3) {};
-                \node [StackBlock, label=$\ldots$] (d1) {};
-                \node [StackBlock, label=$k$] (k) {};
-                \node [StackBlock, label=$\ldots$] (d2) {};
-                \node [StackBlock, label=$n-1$] (n1) {};
-                \node [StackBlock, label=$n$] (n) {};
-            }
-        \end{tikzpicture}
-    \end{center}
-
-    \textbf{Performance:}
-
-    \begin{center}
-        \begin{tabular}{c|c|c|c|c}
-            Zugriff     & Suche       & Einf./Lösch. (Anfang) & Einf./Lösch. (Ende) & Einf./Lösch. (Mitte) \\
-            \hline
-            $\Theta(1)$ & $\Theta(n)$ & -                     & -                   & -                    \\
-        \end{tabular}
-    \end{center}
-\end{defi}
-
-
-\begin{defi}{Stack}
-    \begin{itemize}
-        \item Daten können an einem Ende hinzugefügt oder entnommen werden.
-    \end{itemize}
-
-    \begin{center}
-        \begin{tikzpicture}[
-                %  -{Stealth[length = 2.5pt]},
-                start chain,
-                node distance = 0pt,
-                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-            { start chain = going right
-                \node [StackBlock,draw=none] (0) {};
-
-                \node [StackBlock,xshift=4em] (1) {};
-                \node [StackBlock] (2) {};
-                \node [StackBlock] (3) {};
-                \node [StackBlock] (4) {};
-                \node [StackBlock] (5) {};
-
-                \node [StackBlock,xshift=4em,draw=none] (6) {};
-
-                \draw[->] ([yshift=0.5em, xshift=0.25em] 5.east) [out=0, in=180] to ([yshift=0.5em, xshift=-0.25em] 6.west);
-                \draw[->] ([yshift=-0.5em, xshift=-0.25em] 6.west) [out=180, in=0] to ([yshift=-0.5em, xshift=0.25em] 5.east);
-            }
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
-
-\begin{defi}{Queue}
-    \begin{itemize}
-        \item Daten können an einem Ende hinzugefügt und am anderen Ende entnommen werden.
-    \end{itemize}
-
-    \begin{center}
-        \begin{tikzpicture}[
-                %  -{Stealth[length = 2.5pt]},
-                start chain,
-                node distance = 0pt,
-                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-            { start chain = going right
-                \node [StackBlock,draw=none] (0) {};
-
-                \node [StackBlock,xshift=4em] (1) {};
-                \node [StackBlock] (2) {};
-                \node [StackBlock] (3) {};
-                \node [StackBlock] (4) {};
-                \node [StackBlock] (5) {};
-
-                \node [StackBlock,xshift=4em,draw=none] (6) {};
-
-                \draw[<-] ([xshift=0.25em] 0.east) [out=0, in=180] to ([xshift=-0.25em] 1.west);
-                \draw[->] ([xshift=-0.25em] 6.west) [out=180, in=0] to ([xshift=0.25em] 5.east);
-            }
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
-
-\begin{defi}{Deque (\glqq Double ended queue\grqq)}
-    \begin{itemize}
-        \item Daten können an beiden Enden hinzugefügt und entnommen werden.
-    \end{itemize}
-
-    \begin{center}
-        \begin{tikzpicture}[
-                %  -{Stealth[length = 2.5pt]},
-                start chain,
-                node distance = 0pt,
-                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-            { start chain = going right
-                \node [StackBlock,draw=none] (0) {};
-
-                \node [StackBlock,xshift=4em] (1) {};
-                \node [StackBlock] (2) {};
-                \node [StackBlock] (3) {};
-                \node [StackBlock] (4) {};
-                \node [StackBlock] (5) {};
-
-                \node [StackBlock,xshift=4em,draw=none] (6) {};
-
-                \draw[->] ([yshift=0.5em, xshift=0.25em] 5.east) [out=0, in=180] to ([yshift=0.5em, xshift=-0.25em] 6.west);
-                \draw[->] ([yshift=-0.5em, xshift=-0.25em] 6.west) [out=180, in=0] to ([yshift=-0.5em, xshift=0.25em] 5.east);
-
-                \draw[<-] ([yshift=0.5em, xshift=0.25em] 0.east) [out=0, in=180] to ([yshift=0.5em, xshift=-0.25em] 1.west);
-                \draw[<-] ([yshift=-0.5em, xshift=-0.25em] 1.west) [out=180, in=0] to ([yshift=-0.5em, xshift=0.25em] 0.east);
-            }
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
-
-% Dynamische Felder
-\begin{defi}{Dynamisches Feld}
-    Ein \emph{dynamisches Feld} besteht aus:
-    \begin{itemize}
-        \item Einem normalen Feld, das nicht vollständig gefüllt ist.
-        \item Einem Zeiger, der anzeigt, welches das erste unbesetzte Element ist.
-    \end{itemize}
-
-    \begin{center}
-        \begin{tikzpicture}[
-            %  -{Stealth[length = 2.5pt]},
-            start chain,
-            node distance = 0pt,
-            StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-            { start chain = going right
-            \node [StackBlock, fill=red!50, label=$0$] (0) {};
-            \node [StackBlock, fill=red!50, label=$1$] (1) {};
-            \node [StackBlock, fill=red!50, label=$2$] (2) {};
-            \node [StackBlock, fill=red!50, label=$3$] (3) {};
-            \node [StackBlock, fill=red!50, label=$\ldots$] (d1) {};
-            \node [StackBlock, label=$k$] (k) {};
-            \node [StackBlock, label=$\ldots$] (d2) {};
-            \node [StackBlock, label=$n-1$] (n1) {};
-            \node [StackBlock, label=$n$] (n) {};
-
-            { [continue chain = going below]
-            \chainin (k);
-            \node[StackBlock,yshift=-1em] (pointer) {$k$};
-            \draw[->] (pointer.north) [out=90, in=-90] to (k.south);
-            }
-
-            }
-            %\begin{scope}[-{Stealth[length = 2.5pt]}]
-            %\draw (1.north) [out=25, in=155] to (2.north);
-            %\draw (1.north) [out=30, in=155] to (3.north);
-            %\draw (1.north) [out=35, in=155] to (4.north);
-            %\draw (6.north) [out=40, in=155] to (6.north);
-            %\end{scope}
-            %\draw[decorate,decoration={brace, amplitude=10pt, raise=5pt, mirror}]
-            %(2.south west) to node[black,midway,below= 15pt] {$k$-elements} (7.south east);%
-
-        \end{tikzpicture}
-    \end{center}
-
-    \textbf{Performance:}
-
-    \begin{center}
-        \begin{tabular}{c|c|c|c|c}
-            Zugriff     & Suche       & Einf./Lösch. (Anfang) & Einf./Lösch. (Ende)                                                                                     & Einf./Lösch. (Mitte) \\
-            \hline
-            $\Theta(1)$ & $\Theta(n)$ & $\Theta(n)$           & $\Theta(1)/\Theta(n)$\footnote{Wenn das Feld schon voll ist, muss der komplette Inhalt kopiert werden.} & $\Theta(n)$          \\
-        \end{tabular}
-    \end{center}
-
-    Damit ist ein dynamisches Feld gut für einen \emph{Stack} geeignet!
-\end{defi}
-
-% Zirkuläre dynamische Felder
-\begin{defi}{Zirkuläres (dynamisches) Feld}
-    Ein \emph{zirkuläres Feld} besitzt einen Speicher fester Größe.
-    Dabei speichern zwei Zeiger jeweils den Anfang (\texttt{head}) des Speichers, bzw. auf die nächste freie Speicheradresse (\texttt{tail}) im Speicher.
-
-    Wird ein Element am Anfang \glqq abgearbeitet\grqq, bewegt sich \texttt{head} eine Position weiter.
-    Wird ein Element am Ende eingefügt, bewegt sich \texttt{tail} eine Position weiter.
-    \begin{center}
-        \begin{tikzpicture}[
-            %  -{Stealth[length = 2.5pt]},
-            start chain,
-            node distance = 0pt,
-            StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-            { start chain = going right
-            \node [StackBlock,label=above:$15$] (15) {};
-            \node [StackBlock,label=above:$0$, fill=red!50] (0) {};
-            \node [StackBlock,label=above:$1$, fill=red!50] (1) {};
-            \node [StackBlock,label=above:$2$, fill=red!50] (2) {};
-            \node [StackBlock,label=above:$3$, fill=red!50] (3) {};
-
-            { [continue chain = going below]
-            \chainin (3);
-            \node [StackBlock,label=right:$4$, fill=red!50] (4) {};
-            \node [StackBlock,label=right:$5$] (5) {};
-            \node [StackBlock,label=below:$6$] (6) {};
-            }
-
-            { [continue chain = going left]
-            \chainin (6);
-            \node [StackBlock,label=below:$7$] (7) {};
-            \node [StackBlock,label=below:$8$] (8) {};
-            \node [StackBlock,label=below:$9$] (9) {};
-            \node [StackBlock,label=below:$10$] (10) {};
-            \node [StackBlock,label=below:$11$] (11) {};
-            }
-
-            { [continue chain = going above]
-            \chainin (11);
-            \node [StackBlock,label=left:$12$] (12) {};
-            \node [StackBlock,label=left:$13$] (13) {};
-            \node [StackBlock,label=above:$14$] (14) {};
-            }
-
-
-            { [continue chain = going above]
-            \chainin (0);
-            \node[StackBlock,yshift=2em,xshift=-0.5em,label=\texttt{head}] (head) {$0$};
-            \draw[->] (head.south) [out=-90, in=90] to (0.north west);
-            }
-
-            { [continue chain = going right]
-            \chainin (5);
-            \node[StackBlock,yshift=0.5em,xshift=2em,label=above:\texttt{tail}] (tail) {$9$};
-            \draw[->] (tail.west) [out=180, in=0] to (5.north east);
-            }
-            }
-            %\begin{scope}[-{Stealth[length = 2.5pt]}]
-            %\draw (1.north) [out=25, in=155] to (2.north);
-            %\draw (1.north) [out=30, in=155] to (3.north);
-            %\draw (1.north) [out=35, in=155] to (4.north);
-            %\draw (6.north) [out=40, in=155] to (6.north);
-            %\end{scope}
-            %\draw[decorate,decoration={brace, amplitude=10pt, raise=5pt, mirror}]
-            %(2.south west) to node[black,midway,below= 15pt] {$k$-elements} (7.south east);%
-
-        \end{tikzpicture}
-    \end{center}
-
-    \textbf{Performance:} (dynamisch, bei unterliegender Datenstruktur Array)
-
-    \begin{center}
-        \begin{tabular}{c|c|c|c|c}
-            Zugriff     & Suche       & Einf./Lösch. (Anfang)                                                                                   & Einf./Lösch. (Ende)                              & Einf./Lösch. (Mitte) \\
-            \hline
-            $\Theta(1)$ & $\Theta(n)$ & $\Theta(1)/\Theta(n)$\footnote{Wenn das Feld schon voll ist, muss der komplette Inhalt kopiert werden.} & $\Theta(1)/\Theta(n)$\footnote{Siehe Fußnote a.} & $\Theta(n)$          \\
-        \end{tabular}
-    \end{center}
-
-    Damit ist ein zirkuläres (dynamisches) Feld gut für eine \emph{Queue/Deque} geeignet!
-\end{defi}
-
-\begin{bonus}{Prioritätswarteschlange}
-    Eine \emph{Prioritätswarteschlange} ist eine Warteschlange, deren Elemente einen Schlüssel (\emph{Priorität}) besitzen.
-
-    \textbf{Implementierung:}
-
-    In Java dient zur Implementierung die Klasse \texttt{PriorityQueue}, alternativ auch \texttt{TreeSet}.
-\end{bonus}
-
-% Mengen
-\begin{defi}{Menge}
-    Eine \emph{Menge (Set)} ist eine Sammlung von Elementen des gleichen Datentyps.
-    Innerhalb der Menge sind die Elemente ungeordnet.
-    Jedes Element kann nur einmal in der Menge vorkommen.
-
-    \textbf{Implementierung:}
-
-    In Java ist \emph{Set} ein Interface, das unter anderem folgende Klassen implementiert:
-    \begin{itemize}
-        \item \texttt{TreeSet}: Basiert auf der Datenstruktur Rot-Schwarz-Baum, implementiert Erweiterung \texttt{SortedMap}.
-        \item \texttt{HashSet}: Basiert auf der Datenstruktur Hashtabelle.
-    \end{itemize}
-\end{defi}
-
-% Listen
-\begin{defi}{Liste}
-    Im Vergleich zu einem Array kann eine \emph{Liste} schrumpfen und wachsen.
-
-    \begin{center}
-        \begin{tikzpicture}[
-                %  -{Stealth[length = 2.5pt]},
-                start chain,
-                node distance = 0pt,
-                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-            { start chain = going right
-                \node [StackBlock, label=$0$] (0) {};
-                \node [StackBlock, label=\texttt{next}] (0p) {};
-                \node [StackBlock, label=$1$,xshift=2em] (1) {};
-                \node [StackBlock, label=\texttt{next}] (1p) {};
-                \node [StackBlock, label=$2$,xshift=2em] (2) {};
-                \node [StackBlock, label=\texttt{next}] (2p) {};
-                \node [StackBlock, label=$\ldots$,xshift=2em] (dots) {};
-                \node [StackBlock] (dotsp) {};
-                \node [StackBlock, label=$n$,xshift=2em] (n) {};
-                \node [StackBlock, label=\texttt{next}] (np) {};
-                \node [StackBlock, label=\texttt{null}, xshift=2em] (null) {};
-
-
-                \draw[->] (0p.center) [out=0, in=180] to (1.west);
-                \draw[->] (1p.center) [out=0, in=180] to (2.west);
-                \draw[->] (2p.center) [out=0, in=180] to (dots.west);
-                \draw[->] (dotsp.center) [out=0, in=180] to (n.west);
-                \draw[->] (np.center) [out=0, in=180] to (null.west);
-            }
-        \end{tikzpicture}
-    \end{center}
-
-    \textbf{Performance:}
-
-    \begin{center}
-        \begin{tabular}{c|c|c|c|c}
-            Zugriff     & Suche       & Einf./Lösch. (Anfang) & Einf./Lösch. (Ende)                                                                                 & Einf./Lösch. (Mitte)   \\
-            \hline
-            $\Theta(n)$ & $\Theta(n)$ & $\Theta(1)$           & $\Theta(1)/\Theta(n)$\footnote{$\Theta(1)$, wenn das letzte Element bekannt ist, $\Theta(n)$ sonst} & Suchzeit + $\Theta(1)$ \\
-        \end{tabular}
-    \end{center}
-\end{defi}
-
-
-\begin{defi}{Doppelt verkettete Liste}
-    Im Vergleich zu einer einfach verketteten Liste besitzt die \emph{doppelt verkettete Liste} zusätzlich einen Verweis auf den Vorgänger.
-
-    \begin{center}
-        \begin{tikzpicture}[
-                %  -{Stealth[length = 2.5pt]},
-                start chain,
-                node distance = 0pt,
-                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-            { start chain = going right
-                \node [StackBlock,label=\texttt{null}] (nulll) {};
-
-                \node [StackBlock,label={[label distance=-.35ex]above:\texttt{prev}}, xshift=2em] (0p) {};
-                \node [StackBlock,label=$0$] (0) {};
-                \node [StackBlock,label=\texttt{next}] (0n) {};
-                \node [StackBlock,label={[label distance=-.35ex]above:\texttt{prev}},xshift=2em] (1p) {};
-                \node [StackBlock,label=$1$] (1) {};
-                \node [StackBlock,label=\texttt{next}] (1n) {};
-                \node [StackBlock,xshift=2em] (dotsp) {};
-                \node [StackBlock,label=$\ldots$] (dots) {};
-                \node [StackBlock] (dotsn) {};
-                \node [StackBlock,label={[label distance=-.35ex]above:\texttt{prev}},xshift=2em] (np) {};
-                \node [StackBlock,label=$n$] (n) {};
-                \node [StackBlock,label=\texttt{next}] (nn) {};
-
-                \node [StackBlock,label=\texttt{null}, xshift=2em] (nullr) {};
-
-                %\draw[->] ([yshift=0.5em, xshift=0.25em] 5.east) [out=0, in=180] to ([yshift=0.5em, xshift=-0.25em] 6.west);
-
-                % next arrows
-                \draw[->] ([yshift=0.5em] 0n.center) [out=0, in=180] to ([yshift=0.5em] 1p.west);
-                \draw[->] ([yshift=0.5em] 1n.center) [out=0, in=180] to ([yshift=0.5em] dotsp.west);
-                \draw[->] ([yshift=0.5em] dotsn.center) [out=0, in=180] to ([yshift=0.5em] np.west);
-
-                \draw[->] (nn.center) [out=0, in=180] to (nullr.west);
-
-                % prev arrows
-                \draw[<-] ([yshift=-0.5em] 0n.east) [out=0, in=180] to ([yshift=-0.5em] 1p.center);
-                \draw[<-] ([yshift=-0.5em] 1n.east) [out=0, in=180] to ([yshift=-0.5em] dotsp.center);
-                \draw[<-] ([yshift=-0.5em] dotsn.east) [out=0, in=180] to ([yshift=-0.5em] np.center);
-
-                \draw[->] (0p.center) [out=180, in=0] to (nulll.east);
-            }
-        \end{tikzpicture}
-    \end{center}
-
-    \textbf{Performance:}
-
-    \begin{center}
-        \begin{tabular}{c|c|c|c|c}
-            Zugriff     & Suche       & Einf./Lösch. (Anfang) & Einf./Lösch. (Ende) & Einf./Lösch. (Mitte)   \\
-            \hline
-            $\Theta(n)$ & $\Theta(n)$ & $\Theta(1)$           & $\Theta(1)$         & Suchzeit + $\Theta(1)$ \\
-        \end{tabular}
-    \end{center}
-\end{defi}
-
-% Assoziative Felder
-\begin{defi}{Assoziatives Feld}
-    Ein \emph{assoziatives Feld} ist eine Sonderform des Feldes:
-    \begin{itemize}
-        \item Verwendet keinen numerischen Index zur Adressierung eines Elements.
-        \item Verwendet zur Adressierung einen Schlüssel (z.B. \texttt{a["Meier"]}).
-    \end{itemize}
-
-    Assoziative Felder eignen sich dazu, Datenelemente in einer großen Datenmenge aufzufinden.
-    Jedes Datenelement wird durch einen \emph{eindeutigen Schlüssel} identifiziert.
-
-    \textbf{Implementierung:}
-
-    In Java entspricht ein \emph{assoziatives Feld} dem Interface \texttt{java.util.Map}, das folgende Klassen implementiert:
-    \begin{itemize}
-        \item \texttt{TreeMap}: Basiert auf der Datenstruktur Rot-Schwarz-Baum, implementiert Erweiterung \texttt{SortedMap}.
-        \item \texttt{HashMap}: Basiert auf der Datenstruktur Hashtabelle.
-    \end{itemize}
-\end{defi}
-
-% Verkettete Listen
-
-\subsection{Hashing}
-
-% Hashtabellen
-
-\begin{defi}{Hashfunktion}
-    Eine Hashfunktion oder Streuwertfunktion ist eine Abbildung $h : S \to I$, die eine große Eingabemenge, die Schlüssel $S$, auf eine kleinere Zielmenge, die Hashwerte $I$, abbildet.\footnote{Eine Hashfunktion ist daher im Allgemeinen nicht injektiv, aber surjektiv.}
-
-    Die Bildmenge $h(S) \subseteq I$ bezeichnet die Menge der \emph{Hash-Indizes}.
-
-
-    \begin{center}
-        \begin{tikzpicture}[
-            %  -{Stealth[length = 2.5pt]},
-            start chain = going {right=of \tikzchainprevious.north east},
-            KeyBlock/.style={minimum width=4em, minimum height=2em, outer sep=0pt, on chain},
-            HashBlock/.style={minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            FunctionBlock/.style={minimum width=10em, minimum height=26em, outer sep=0pt, on chain, very thick,fill=blue!20},
-            every node/.style={draw, label distance=0.5em},
-            every on chain/.style={anchor=north west},
-            node distance=4em
-            ]
-            {
-            \node [KeyBlock, label=above:Schlüssel] (k0) {Jürgen};
-            \node [FunctionBlock, label=above:Hashfunktion] (fun) {};
-            \node [HashBlock, label=above:Hashwerte] (h00) {00};
-
-            { [continue chain = going {below=of \tikzchainprevious.south west}, node distance=2em]
-            \chainin (k0);
-            \node [KeyBlock] (k1) {Felix};
-            \node [KeyBlock] (k2) {Finn};
-            \node [KeyBlock] (k3) {Tim};
-            \node [KeyBlock] (k4) {Benno};
-            \node [KeyBlock] (k5) {Lukas};
-            \node [KeyBlock] (k6) {Julia};
-            }
-
-            { [continue chain = going {below=of \tikzchainprevious.south west}, node distance=0pt]
-            \chainin (h00);
-            \node [HashBlock] (h01) {01};
-            \node [HashBlock] (h02) {02};
-            \node [HashBlock] (h03) {03};
-            \node [HashBlock] (h04) {04};
-            \node [HashBlock] (h05) {05};
-            \node [HashBlock] (h06) {06};
-            \node [HashBlock] (h07) {07};
-            \node [HashBlock] (h08) {08};
-            \node [HashBlock] (h09) {09};
-            \node [HashBlock] (h10) {10};
-            \node [HashBlock] (hdots) {$\ldots$};
-            \node [HashBlock] (h15) {15};
-            }
-
-            \draw[->] (k0.east) -- ++(2, 0) -- ($(h05.west)-(2,0)$) -- (h05.west);
-            \draw[->] (k1.east) -- ++(2, 0) -- ($(h09.west)-(2,0)$) -- (h09.west);
-            \draw[->] (k2.east) -- ++(2, 0) -- ($(h00.west)-(2,0)$) -- (h00.west);
-            \draw[->] (k3.east) -- ++(2, 0) -- ($(h15.west)-(2,0)$) -- (h15.west);
-            \draw[->] (k4.east) -- ++(2, 0) -- ($(h02.west)-(2,0)$) -- (h02.west);
-            \draw[->] (k5.east) -- ++(2, 0) -- ($(h10.west)-(2,0)$) -- (h10.west);
-            \draw[->] (k6.east) -- ++(2, 0) -- ($(h03.west)-(2,0)$) -- (h03.west);
-            }
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
-
-\begin{example}{Divisions-Hash}
-    Die \emph{Divisionsrest-Methode (Divisions-Hash)} um Integer zu hashen wird definiert durch:
-    $$
-        h(x) = x \operatorname{mod} N
-    $$
-
-    Sie wird bevorzugt, wenn die Schlüsselverteilung nicht bekannt ist.
-    Etwaige Regelmäßigkeiten in der Schlüsselverteilung sollte sich nicht in der Adressverteilung auswirken. Daher sollte $N$ eine Primzahl sein.
-\end{example}
-
-\begin{example}{Hashfunktionen für verschiedene Datentypen}
-    \begin{itemize}
-        \item Alle Datenypen: Verwenden der Speicheradresse
-        \item Strings: ASCII/Unicode-Werte addieren (evtl. von einigen Buchstaben, evtl. gewichtet)
-    \end{itemize}
-\end{example}
-
-\begin{defi}{Kollision}
-    Sei $S$ eine Schlüsselmenge und $h$ eine Hashfunktion.
-    Ist
-    $$
-        s_1, s_2 \in S, \ s_1 \neq s_2 : h(s_1) = h(s_2)
-    $$
-    so spricht man von einer \emph{Kollision}.
-
-    Die Wahrscheinlichkeit von Kollisionen ist abhängig von der gewählten Hashfunktion.
-    Hashfunktionen sollten also möglichst gut \emph{streuen}, aber dennoch effizient berechenbar sein.
-
-    \begin{center}
-        \begin{tikzpicture}[
-            %  -{Stealth[length = 2.5pt]},
-            start chain = going {right=of \tikzchainprevious.north east},
-            KeyBlock/.style={minimum width=4em, minimum height=2em, outer sep=0pt, on chain},
-            HashBlock/.style={minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            FunctionBlock/.style={minimum width=10em, minimum height=26em, outer sep=0pt, on chain,fill=blue!20},
-            every node/.style={draw, label distance=0.5em},
-            every on chain/.style={anchor=north west},
-            node distance=4em
-            ]
-            {
-            \node [KeyBlock, label=above:Schlüssel, very thick] (k0) {Jürgen};
-            \node [FunctionBlock, label=above:Hashfunktion] (fun) {};
-            \node [HashBlock, label=above:Hashwerte] (h00) {00};
-
-            { [continue chain = going {below=of \tikzchainprevious.south west}, node distance=2em]
-            \chainin (k0);
-            \node [KeyBlock] (k1) {Felix};
-            \node [KeyBlock] (k2) {Finn};
-            \node [KeyBlock] (k3) {Tim};
-            \node [KeyBlock] (k4) {Benno};
-            \node [KeyBlock] (k5) {Lukas};
-            \node [KeyBlock, very thick] (k6) {Julia};
-            }
-
-            { [continue chain = going {below=of \tikzchainprevious.south west}, node distance=0pt]
-            \chainin (h00);
-            \node [HashBlock] (h01) {01};
-            \node [HashBlock] (h02) {02};
-            \node [HashBlock] (h03) {03};
-            \node [HashBlock] (h04) {04};
-            \node [HashBlock, very thick] (h05) {05};
-            \node [HashBlock] (h06) {06};
-            \node [HashBlock] (h07) {07};
-            \node [HashBlock] (h08) {08};
-            \node [HashBlock] (h09) {09};
-            \node [HashBlock] (h10) {10};
-            \node [HashBlock] (hdots) {$\ldots$};
-            \node [HashBlock] (h15) {15};
-            }
-
-            \draw[->, very thick, color=red] (k0.east) -- ++(2, 0) -- ($(h05.west)-(2,0)$) -- (h05.west);
-            \draw[->] (k1.east) -- ++(2, 0) -- ($(h09.west)-(2,0)$) -- (h09.west);
-            \draw[->] (k2.east) -- ++(2, 0) -- ($(h00.west)-(2,0)$) -- (h00.west);
-            \draw[->] (k3.east) -- ++(2, 0) -- ($(h15.west)-(2,0)$) -- (h15.west);
-            \draw[->] (k4.east) -- ++(2, 0) -- ($(h02.west)-(2,0)$) -- (h02.west);
-            \draw[->] (k5.east) -- ++(2, 0) -- ($(h10.west)-(2,0)$) -- (h10.west);
-            \draw[->, very thick, color=red] (k6.east) -- ++(2, 0) -- ($(h05.west)-(2,0)$) -- (h05.west);
-            }
-        \end{tikzpicture}
-    \end{center}
-
-\end{defi}
-
-\begin{defi}{Kollisionsbehandlung}
-    Um Kollisionen zu handhaben, existieren verschiedene Strategien:
-    \begin{itemize}
-        \item \emph{Hashing mit Verkettung}
-              \begin{itemize}
-                  \item Hashtabelle besteht aus $N$ linearen Listen
-                  \item $h(s)$ gibt dann an, in welche Teilliste der Datensatz gehört
-                  \item Daten werden innerhalb der Teillisten sequentiell gespeichert
-              \end{itemize}
-        \item \emph{Hashing mit offener Adressierung}
-              \begin{itemize}
-                  \item Suchen einer alternativen Position innerhalb des Feldes
-                        \begin{enumerate}
-                            \item Lineares Sondieren (Verschiebung um konstantes Intervall)
-                            \item Doppeltes Hashing (Intervall wird quadriert)
-                            \item Quadratisches Sondieren (Nutzen einer weiteren Hashfunktion)
-                        \end{enumerate}
-              \end{itemize}
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Schrittzahl}
-    Die \emph{Schrittzahl} $S(s)$, die nötig ist, um den Datensatz mit Schlüssel $s$ zu speichern bzw. wiederzufinden, setzt sich z.B. beim Hashing mit Verkettung zusammen aus:
-    \begin{itemize}
-        \item der Berechnung der Hash-Funktion und
-        \item dem Aufwand für die Suche bzw. Speicherung innerhalb der Teilliste.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Füllgrad}
-    Der \emph{Füllgrad} einer Hashtabelle ist der Quotient
-    $$
-        \alpha = \frac{n}{N}
-    $$
-    mit
-    \begin{itemize}
-        \item $N$ als Größe der Hashtabelle
-        \item $n$ als Anzahl der gespeicherten Datensätze
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Schrittzahl beim Suchen in Teillisten}
-    Bei idealer Speicherung entfallen $\alpha$ Elemente auf jede Teilliste.
-    Dabei gilt:
-    \begin{itemize}
-        \item erfolgreiche Suche: $c_1 + c_2 \cdot \frac{\alpha}{2}$
-        \item erfolglose Suche: $c_1 + c_2 \cdot \alpha$
-    \end{itemize}
-    Damit ist der Suchaufwand in $\bigo(\alpha) = \bigo(\frac{n}{N})$.
-
-    Wird der Füllgrad $\alpha$ zu groß, sollte die Hashtabelle vergrößert werden.
-\end{example}
-
-\begin{defi}{Dynamisches Hashing}
-    Um viele Kollisionen zu vermeiden, muss die Hashtabelle ab einem gewissen Füllgrad vergrößert werden.\footnote{nach Sedgewick sollte stets $\alpha < 0.5$ gelten}
-
-    Als Folge muss die gesamte Hashtabelle aber auch neu aufgebaut werden.
-\end{defi}
-
-\begin{defi}{Offene Adressierung (Sondieren)}
-    Beim Speichern wird bei \emph{Hashing mit offener Adressieren (Sondierung)} so lang ein neuer Hashindex berechnet, bis dort ein freier Speicherplatz vorhanden ist.
-
-    Das Suchen funktioniert analog, allerdings ist das Löschen sehr aufwändig.
-
-    \begin{itemize}
-        \item Lineares Sondieren
-              \begin{itemize}
-                  \item Wird die Ersatzadresse bei jeder Kollision durch Erhöhen der alten Adresse um 1 berechnet, so spricht man von \emph{linearem Sondieren (linear probing)}.
-                  \item Die $i$-te Ersatzadresse für einen Schlüssel $s$ mit Hashindex $h(s)$ wird also wie folgt berechnet:
-                        $$
-                            h_i(s) = (h(s) + i) \operatorname{mod} N
-                        $$
-              \end{itemize}
-        \item Doppeltes Hashing
-              \begin{itemize}
-                  \item Schlüssel wird nicht um $1$ erhöht, sondern der Inkrement wird mit einer zweiten Hashfunktion berechnet.
-                  \item Beseitigt praktisch die Probleme der primären und sekundären Häufung.
-                  \item Nicht alle Felder werden durchprobiert. Im ungünstigsten Fall kann eine neues Element nicht eingefügt werden, auch wenn noch Felder frei sind.
-              \end{itemize}
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Primäre und sekundäre Häufung}
-    Bei der \emph{primären Häufung (primary clustering)} ist die Wahrscheinlichkeit, dass Plätze in einem dichtbelegten Bereich eher besetzt werden, deutlich höher.
-    Es kommt also zu Kettenbildung.
-
-    Besonders häufig tritt primäre Häufung z.B. beim linearen Sondieren auf.
-
-    \begin{center}
-        \begin{tikzpicture}
-            [
-                %  -{Stealth[length = 2.5pt]},
-                start chain,
-                node distance = 0pt,
-                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-
-            \node [draw, minimum width=2em, minimum height=2em] (val) {$s$};
-
-            { start chain = going right
-            \node [StackBlock,right=2cm of val,fill=red!30] (0) {};
-            \node [StackBlock] (1) {};
-            \node [StackBlock] (2) {};
-            \node [StackBlock,fill=red!30] (3) {};
-            \node [StackBlock,fill=red!30] (4) {};
-            \node [StackBlock,fill=red!30] (5) {};
-            \node [StackBlock,fill=red!30] (6) {};
-            \node [StackBlock,fill=red!30] (7) {};
-            \node [StackBlock] (8) {$s$};
-            \node [StackBlock] (9) {};
-
-            \draw[->] (val.south) [out=-30, in=-150] to (4.south);
-            \draw[->] (4.south) [out=-45, in=-135] to (5.south);
-            \draw[->] (5.south) [out=-45, in=-135] to (6.south);
-            \draw[->] (6.south) [out=-45, in=-135] to (7.south);
-            \draw[->] (7.south) [out=-45, in=-135] to (8.south);
-            }
-        \end{tikzpicture}
-    \end{center}
-
-
-    Die \emph{sekundäre Häufung (secondary clustering)} hängt von der Hashfunktion ab.
-    Dabei durchlaufen zwei Schlüssel $h(s)$ und $h(s')$ stets dieselbe Sondierungsfolge.
-    Sie behindern sich also auf den Ausweichplätzen.
-
-    Besonders häufig tritt sekundäre Häufung z.B. beim quadratischen Sondieren auf.
-
-
-    \begin{center}
-        \begin{tikzpicture}
-            [
-                %  -{Stealth[length = 2.5pt]},
-                start chain,
-                node distance = 0pt,
-                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            ]
-
-            \node [minimum width=2em, minimum height=2em] (val) {};
-
-            { start chain = going right
-            \node [StackBlock,right=2cm of val] (0) {};
-            \node [StackBlock,fill=red!30] (1) {};
-            \node [StackBlock,fill=red!30] (2) {};
-            \node [StackBlock,fill=red!30] (3) {};
-            \node [StackBlock] (4) {};
-            \node [StackBlock,fill=red!30] (5) {};
-            \node [StackBlock] (6) {};
-            \node [StackBlock] (7) {};
-            \node [StackBlock] (8) {$s$};
-            \node [StackBlock] (9) {$s'$};
-
-            { [continue chain = going above]
-            \chainin (val);
-            \node [StackBlock] (val1) {$s$};
-            }
-
-            { [continue chain = going below]
-            \chainin (val);
-            \node [StackBlock] (val2) {$s'$};
-            }
-
-            \draw[->] (val1.east) [out=0, in=150] to (2.north);
-            \draw[->] (2.north) [out=45, in=135] to (3.north);
-            \draw[->] (3.north) [out=45, in=135] to (5.north);
-            \draw[->] (5.north) [out=45, in=135] to (8.north);
-
-            \draw[->] (val2.east) [out=0, in=-150] to (2.south);
-            \draw[->] (2.south) [out=-45, in=-135] to (3.south);
-            \draw[->] (3.south) [out=-45, in=-135] to (5.south);
-            \draw[->] (5.south) [out=-45, in=-135] to (8.south);
-            \draw[->] (8.south) [out=-45, in=-135] to (9.south);
-            }
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
+\section{Elementare Datenstrukturen}
+
+% ADTs
+\begin{defi}{Abstrakte Datentypen (ADTs)}
+    Anforderungen an die Definition eines Datentyps:
+    \begin{itemize}
+        \item \emph{Spezifikation} eines Datentyps unabhängig von der Implementierung
+        \item Reduzierung der von außen sichtbaren Aspekte auf die \emph{Schnittstelle} des Datentyps
+    \end{itemize}
+
+    Daraus entstehen \textbf{zwei Prinzipien}:
+    \begin{itemize}
+        \item \emph{Kapselung:}
+              \subitem Zu einem ADT gehört eine Schnittstelle.
+              \subitem Zugriffe auf den ADT erfolgen ausschließlich über die Schnittstelle.
+        \item \emph{Geheimnisprinzip:}
+              \subitem Interne Realisierung eines ADT-Moduls bleibt verborgen.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Homogene Datenstruktur}
+    In einer \emph{homogenen Datenstruktur} haben alle Komponenten den \emph{gleichen} Datentyp.
+\end{defi}
+
+\begin{defi}{Heterogene Datenstruktur}
+    In einer \emph{heterogenen Datenstruktur} haben die Komponenten \emph{unterschiedliche} Datentypen.
+\end{defi}
+
+\begin{bonus}{ADTs in Java}
+    Viele wichtige abstrakte Datentypen werden in Java durch \emph{Interfaces} beschrieben.
+
+    Es gibt ein oder mehrere Implementierungen dieser Interfaces mit unterschiedlichen dahinter stehenden Konzepten.
+
+    In Java: Package \texttt{java.util}
+
+    Wichtig in der Vorlesung:
+
+    \begin{tabular}{l|l|l}
+        ADT                     & Grund-ADT/Interface & Java-Klassen                      \\
+        \hline
+        Feld                    &                     & (Felder), HashMap                 \\
+        Liste                   & List                & ArrayList, LinkedList             \\
+        Menge                   & Set                 & HashSet, TreeSet                  \\
+        Prioritätswarteschlange &                     & PriorityQueue                     \\
+        Stack                   & List                &                                   \\
+        Queue                   & List                &                                   \\
+        Deque                   & List                & Deque (Interface), ArrayDeque     \\
+        Map                     & Set                 & Map (Interface), HashMap, TreeMap \\
+        BidiMap                 & Map                 & BidiMap, BiMap (Interface)        \\
+        MultiSet, Bag           & Map                 & Bag, Multiset (Interface)
+    \end{tabular}
+\end{bonus}
+
+\subsection{Abstrakte Datentypen}
+
+\begin{defi}{Array}
+    Ein \emph{Array} hat folgende spezielle Eigenschaften:
+    \begin{itemize}
+        \item Feste Anzahl an Datenobjekten
+        \item Auf jedes Objekt kann direkt lesend oder schreibend zugegriffen werden
+    \end{itemize}
+
+    \begin{center}
+        \begin{tikzpicture}[
+                %  -{Stealth[length = 2.5pt]},
+                start chain,
+                node distance = 0pt,
+                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+                \node [StackBlock, label=$0$] (0) {};
+                \node [StackBlock, label=$1$] (1) {};
+                \node [StackBlock, label=$2$] (2) {};
+                \node [StackBlock, label=$3$] (3) {};
+                \node [StackBlock, label=$\ldots$] (d1) {};
+                \node [StackBlock, label=$k$] (k) {};
+                \node [StackBlock, label=$\ldots$] (d2) {};
+                \node [StackBlock, label=$n-1$] (n1) {};
+                \node [StackBlock, label=$n$] (n) {};
+            }
+        \end{tikzpicture}
+    \end{center}
+
+    \textbf{Performance:}
+
+    \begin{center}
+        \begin{tabular}{c|c|c|c|c}
+            Zugriff     & Suche       & Einf./Lösch. (Anfang) & Einf./Lösch. (Ende) & Einf./Lösch. (Mitte) \\
+            \hline
+            $\Theta(1)$ & $\Theta(n)$ & -                     & -                   & -                    \\
+        \end{tabular}
+    \end{center}
+\end{defi}
+
+\begin{defi}{Liste}
+    Eine Liste besteht aus Elementen, die wie in einem Array linear angeordnet sind.
+    Auf die Elemente einer Liste muss nicht wahlfrei zugegriffen werden können\footnote{Eine Ausnahme stellt der Listenanfang dar.}.
+
+    Die Größe einer Liste ist nicht von Anfang an bekannt und sie kann beliebig verlängert bzw. verkürzt werden.
+\end{defi}
+
+\begin{defi}{Stack}
+    \begin{itemize}
+        \item Daten können an einem Ende hinzugefügt oder entnommen werden.
+    \end{itemize}
+
+    \begin{center}
+        \begin{tikzpicture}[
+                %  -{Stealth[length = 2.5pt]},
+                start chain,
+                node distance = 0pt,
+                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+                \node [StackBlock,draw=none] (0) {};
+
+                \node [StackBlock,xshift=4em] (1) {};
+                \node [StackBlock] (2) {};
+                \node [StackBlock] (3) {};
+                \node [StackBlock] (4) {};
+                \node [StackBlock] (5) {};
+
+                \node [StackBlock,xshift=4em,draw=none] (6) {};
+
+                \draw[->] ([yshift=0.5em, xshift=0.25em] 5.east) [out=0, in=180] to ([yshift=0.5em, xshift=-0.25em] 6.west);
+                \draw[->] ([yshift=-0.5em, xshift=-0.25em] 6.west) [out=180, in=0] to ([yshift=-0.5em, xshift=0.25em] 5.east);
+            }
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
+
+\begin{defi}{Queue}
+    \begin{itemize}
+        \item Daten können an einem Ende hinzugefügt und am anderen Ende entnommen werden.
+    \end{itemize}
+
+    \begin{center}
+        \begin{tikzpicture}[
+                %  -{Stealth[length = 2.5pt]},
+                start chain,
+                node distance = 0pt,
+                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+                \node [StackBlock,draw=none] (0) {};
+
+                \node [StackBlock,xshift=4em] (1) {};
+                \node [StackBlock] (2) {};
+                \node [StackBlock] (3) {};
+                \node [StackBlock] (4) {};
+                \node [StackBlock] (5) {};
+
+                \node [StackBlock,xshift=4em,draw=none] (6) {};
+
+                \draw[<-] ([xshift=0.25em] 0.east) [out=0, in=180] to ([xshift=-0.25em] 1.west);
+                \draw[->] ([xshift=-0.25em] 6.west) [out=180, in=0] to ([xshift=0.25em] 5.east);
+            }
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
+
+\begin{defi}{Deque (\glqq Double ended queue\grqq)}
+    \begin{itemize}
+        \item Daten können an beiden Enden hinzugefügt und entnommen werden.
+    \end{itemize}
+
+    \begin{center}
+        \begin{tikzpicture}[
+                %  -{Stealth[length = 2.5pt]},
+                start chain,
+                node distance = 0pt,
+                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+                \node [StackBlock,draw=none] (0) {};
+
+                \node [StackBlock,xshift=4em] (1) {};
+                \node [StackBlock] (2) {};
+                \node [StackBlock] (3) {};
+                \node [StackBlock] (4) {};
+                \node [StackBlock] (5) {};
+
+                \node [StackBlock,xshift=4em,draw=none] (6) {};
+
+                \draw[->] ([yshift=0.5em, xshift=0.25em] 5.east) [out=0, in=180] to ([yshift=0.5em, xshift=-0.25em] 6.west);
+                \draw[->] ([yshift=-0.5em, xshift=-0.25em] 6.west) [out=180, in=0] to ([yshift=-0.5em, xshift=0.25em] 5.east);
+
+                \draw[<-] ([yshift=0.5em, xshift=0.25em] 0.east) [out=0, in=180] to ([yshift=0.5em, xshift=-0.25em] 1.west);
+                \draw[<-] ([yshift=-0.5em, xshift=-0.25em] 1.west) [out=180, in=0] to ([yshift=-0.5em, xshift=0.25em] 0.east);
+            }
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
+
+\begin{bonus}{Prioritätswarteschlange}
+    Eine \emph{Prioritätswarteschlange} ist eine Warteschlange, deren Elemente einen Schlüssel (\emph{Priorität}) besitzen.
+
+    \textbf{Implementierung:}
+
+    In Java dient zur Implementierung die Klasse \texttt{PriorityQueue}, alternativ auch \texttt{TreeSet}.
+\end{bonus}
+
+% Mengen
+\begin{defi}{Menge}
+    Eine \emph{Menge (Set)} ist eine Sammlung von Elementen des gleichen Datentyps.
+    Innerhalb der Menge sind die Elemente ungeordnet.
+    Jedes Element kann nur einmal in der Menge vorkommen.
+
+    \textbf{Implementierung:}
+
+    In Java ist \emph{Set} ein Interface, das unter anderem folgende Klassen implementiert:
+    \begin{itemize}
+        \item \texttt{TreeSet}: Basiert auf der Datenstruktur Rot-Schwarz-Baum, implementiert Erweiterung \texttt{SortedMap}.
+        \item \texttt{HashSet}: Basiert auf der Datenstruktur Hashtabelle.
+    \end{itemize}
+\end{defi}
+
+% Assoziative Felder
+\begin{defi}{Assoziatives Feld}
+    Ein \emph{assoziatives Feld} ist eine Sonderform des Feldes:
+    \begin{itemize}
+        \item Verwendet keinen numerischen Index zur Adressierung eines Elements.
+        \item Verwendet zur Adressierung einen Schlüssel (z.B. \texttt{a["Meier"]}).
+    \end{itemize}
+
+    Assoziative Felder eignen sich dazu, Datenelemente in einer großen Datenmenge aufzufinden.
+    Jedes Datenelement wird durch einen \emph{eindeutigen Schlüssel} identifiziert.
+
+    \textbf{Implementierung:}
+
+    In Java entspricht ein \emph{assoziatives Feld} dem Interface \texttt{java.util.Map}, das folgende Klassen implementiert:
+    \begin{itemize}
+        \item \texttt{TreeMap}: Basiert auf der Datenstruktur Rot-Schwarz-Baum, implementiert Erweiterung \texttt{SortedMap}.
+        \item \texttt{HashMap}: Basiert auf der Datenstruktur Hashtabelle.
+    \end{itemize}
+\end{defi}
+
+\subsection{Datenstrukturen}
+% Listen
+\begin{defi}{Einfach verkettete Liste}
+    Im Vergleich zu einem Array kann eine \emph{Liste} schrumpfen und wachsen.
+
+    \begin{center}
+        \begin{tikzpicture}[
+                %  -{Stealth[length = 2.5pt]},
+                start chain,
+                node distance = 0pt,
+                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+                \node [StackBlock, label=$0$] (0) {};
+                \node [StackBlock, label=\texttt{next}] (0p) {};
+                \node [StackBlock, label=$1$,xshift=2em] (1) {};
+                \node [StackBlock, label=\texttt{next}] (1p) {};
+                \node [StackBlock, label=$2$,xshift=2em] (2) {};
+                \node [StackBlock, label=\texttt{next}] (2p) {};
+                \node [StackBlock, label=$\ldots$,xshift=2em] (dots) {};
+                \node [StackBlock] (dotsp) {};
+                \node [StackBlock, label=$n$,xshift=2em] (n) {};
+                \node [StackBlock, label=\texttt{next}] (np) {};
+                \node [StackBlock, label=\texttt{null}, xshift=2em] (null) {};
+
+
+                \draw[->] (0p.center) [out=0, in=180] to (1.west);
+                \draw[->] (1p.center) [out=0, in=180] to (2.west);
+                \draw[->] (2p.center) [out=0, in=180] to (dots.west);
+                \draw[->] (dotsp.center) [out=0, in=180] to (n.west);
+                \draw[->] (np.center) [out=0, in=180] to (null.west);
+            }
+        \end{tikzpicture}
+    \end{center}
+
+    \textbf{Performance:}
+
+    \begin{center}
+        \begin{tabular}{c|c|c|c|c}
+            Zugriff     & Suche       & Einf./Lösch. (Anfang) & Einf./Lösch. (Ende)                                                                                 & Einf./Lösch. (Mitte)   \\
+            \hline
+            $\Theta(n)$ & $\Theta(n)$ & $\Theta(1)$           & $\Theta(1)/\Theta(n)$\footnote{$\Theta(1)$, wenn das letzte Element bekannt ist, $\Theta(n)$ sonst} & Suchzeit + $\Theta(1)$ \\
+        \end{tabular}
+    \end{center}
+\end{defi}
+
+
+\begin{defi}{Doppelt verkettete Liste}
+    Im Vergleich zu einer einfach verketteten Liste besitzt die \emph{doppelt verkettete Liste} zusätzlich einen Verweis auf den Vorgänger.
+
+    \begin{center}
+        \begin{tikzpicture}[
+                %  -{Stealth[length = 2.5pt]},
+                start chain,
+                node distance = 0pt,
+                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+                \node [StackBlock,label=\texttt{null}] (nulll) {};
+
+                \node [StackBlock,label={[label distance=-.35ex]above:\texttt{prev}}, xshift=2em] (0p) {};
+                \node [StackBlock,label=$0$] (0) {};
+                \node [StackBlock,label=\texttt{next}] (0n) {};
+                \node [StackBlock,label={[label distance=-.35ex]above:\texttt{prev}},xshift=2em] (1p) {};
+                \node [StackBlock,label=$1$] (1) {};
+                \node [StackBlock,label=\texttt{next}] (1n) {};
+                \node [StackBlock,xshift=2em] (dotsp) {};
+                \node [StackBlock,label=$\ldots$] (dots) {};
+                \node [StackBlock] (dotsn) {};
+                \node [StackBlock,label={[label distance=-.35ex]above:\texttt{prev}},xshift=2em] (np) {};
+                \node [StackBlock,label=$n$] (n) {};
+                \node [StackBlock,label=\texttt{next}] (nn) {};
+
+                \node [StackBlock,label=\texttt{null}, xshift=2em] (nullr) {};
+
+                %\draw[->] ([yshift=0.5em, xshift=0.25em] 5.east) [out=0, in=180] to ([yshift=0.5em, xshift=-0.25em] 6.west);
+
+                % next arrows
+                \draw[->] ([yshift=0.5em] 0n.center) [out=0, in=180] to ([yshift=0.5em] 1p.west);
+                \draw[->] ([yshift=0.5em] 1n.center) [out=0, in=180] to ([yshift=0.5em] dotsp.west);
+                \draw[->] ([yshift=0.5em] dotsn.center) [out=0, in=180] to ([yshift=0.5em] np.west);
+
+                \draw[->] (nn.center) [out=0, in=180] to (nullr.west);
+
+                % prev arrows
+                \draw[<-] ([yshift=-0.5em] 0n.east) [out=0, in=180] to ([yshift=-0.5em] 1p.center);
+                \draw[<-] ([yshift=-0.5em] 1n.east) [out=0, in=180] to ([yshift=-0.5em] dotsp.center);
+                \draw[<-] ([yshift=-0.5em] dotsn.east) [out=0, in=180] to ([yshift=-0.5em] np.center);
+
+                \draw[->] (0p.center) [out=180, in=0] to (nulll.east);
+            }
+        \end{tikzpicture}
+    \end{center}
+
+    \textbf{Performance:}
+
+    \begin{center}
+        \begin{tabular}{c|c|c|c|c}
+            Zugriff     & Suche       & Einf./Lösch. (Anfang) & Einf./Lösch. (Ende) & Einf./Lösch. (Mitte)   \\
+            \hline
+            $\Theta(n)$ & $\Theta(n)$ & $\Theta(1)$           & $\Theta(1)$         & Suchzeit + $\Theta(1)$ \\
+        \end{tabular}
+    \end{center}
+\end{defi}
+
+% Dynamische Felder
+\begin{defi}{Dynamisches Feld}
+    Ein \emph{dynamisches Feld} besteht aus:
+    \begin{itemize}
+        \item Einem normalen Feld, das nicht vollständig gefüllt ist.
+        \item Einem Zeiger, der anzeigt, welches das erste unbesetzte Element ist.
+    \end{itemize}
+
+    \begin{center}
+        \begin{tikzpicture}[
+            %  -{Stealth[length = 2.5pt]},
+            start chain,
+            node distance = 0pt,
+            StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+            \node [StackBlock, fill=red!50, label=$0$] (0) {};
+            \node [StackBlock, fill=red!50, label=$1$] (1) {};
+            \node [StackBlock, fill=red!50, label=$2$] (2) {};
+            \node [StackBlock, fill=red!50, label=$3$] (3) {};
+            \node [StackBlock, fill=red!50, label=$\ldots$] (d1) {};
+            \node [StackBlock, label=$k$] (k) {};
+            \node [StackBlock, label=$\ldots$] (d2) {};
+            \node [StackBlock, label=$n-1$] (n1) {};
+            \node [StackBlock, label=$n$] (n) {};
+
+            { [continue chain = going below]
+            \chainin (k);
+            \node[StackBlock,yshift=-1em] (pointer) {$k$};
+            \draw[->] (pointer.north) [out=90, in=-90] to (k.south);
+            }
+
+            }
+            %\begin{scope}[-{Stealth[length = 2.5pt]}]
+            %\draw (1.north) [out=25, in=155] to (2.north);
+            %\draw (1.north) [out=30, in=155] to (3.north);
+            %\draw (1.north) [out=35, in=155] to (4.north);
+            %\draw (6.north) [out=40, in=155] to (6.north);
+            %\end{scope}
+            %\draw[decorate,decoration={brace, amplitude=10pt, raise=5pt, mirror}]
+            %(2.south west) to node[black,midway,below= 15pt] {$k$-elements} (7.south east);%
+
+        \end{tikzpicture}
+    \end{center}
+
+    \textbf{Performance:}
+
+    \begin{center}
+        \begin{tabular}{c|c|c|c|c}
+            Zugriff     & Suche       & Einf./Lösch. (Anfang) & Einf./Lösch. (Ende)                                                                                     & Einf./Lösch. (Mitte) \\
+            \hline
+            $\Theta(1)$ & $\Theta(n)$ & $\Theta(n)$           & $\Theta(1)/\Theta(n)$\footnote{Wenn das Feld schon voll ist, muss der komplette Inhalt kopiert werden.} & $\Theta(n)$          \\
+        \end{tabular}
+    \end{center}
+
+    Damit ist ein dynamisches Feld gut für einen \emph{Stack} geeignet!
+\end{defi}
+
+% Zirkuläre dynamische Felder
+\begin{defi}{Zirkuläres (dynamisches) Feld}
+    Ein \emph{zirkuläres Feld} besitzt einen Speicher fester Größe.
+    Dabei speichern zwei Zeiger jeweils den Anfang (\texttt{head}) des Speichers, bzw. auf die nächste freie Speicheradresse (\texttt{tail}) im Speicher.
+
+    Wird ein Element am Anfang \glqq abgearbeitet\grqq, bewegt sich \texttt{head} eine Position weiter.
+    Wird ein Element am Ende eingefügt, bewegt sich \texttt{tail} eine Position weiter.
+    \begin{center}
+        \begin{tikzpicture}[
+            %  -{Stealth[length = 2.5pt]},
+            start chain,
+            node distance = 0pt,
+            StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+            \node [StackBlock,label=above:$15$] (15) {};
+            \node [StackBlock,label=above:$0$, fill=red!50] (0) {};
+            \node [StackBlock,label=above:$1$, fill=red!50] (1) {};
+            \node [StackBlock,label=above:$2$, fill=red!50] (2) {};
+            \node [StackBlock,label=above:$3$, fill=red!50] (3) {};
+
+            { [continue chain = going below]
+            \chainin (3);
+            \node [StackBlock,label=right:$4$, fill=red!50] (4) {};
+            \node [StackBlock,label=right:$5$] (5) {};
+            \node [StackBlock,label=below:$6$] (6) {};
+            }
+
+            { [continue chain = going left]
+            \chainin (6);
+            \node [StackBlock,label=below:$7$] (7) {};
+            \node [StackBlock,label=below:$8$] (8) {};
+            \node [StackBlock,label=below:$9$] (9) {};
+            \node [StackBlock,label=below:$10$] (10) {};
+            \node [StackBlock,label=below:$11$] (11) {};
+            }
+
+            { [continue chain = going above]
+            \chainin (11);
+            \node [StackBlock,label=left:$12$] (12) {};
+            \node [StackBlock,label=left:$13$] (13) {};
+            \node [StackBlock,label=above:$14$] (14) {};
+            }
+
+
+            { [continue chain = going above]
+            \chainin (0);
+            \node[StackBlock,yshift=2em,xshift=-0.5em,label=\texttt{head}] (head) {$0$};
+            \draw[->] (head.south) [out=-90, in=90] to (0.north west);
+            }
+
+            { [continue chain = going right]
+            \chainin (5);
+            \node[StackBlock,yshift=0.5em,xshift=2em,label=above:\texttt{tail}] (tail) {$9$};
+            \draw[->] (tail.west) [out=180, in=0] to (5.north east);
+            }
+            }
+            %\begin{scope}[-{Stealth[length = 2.5pt]}]
+            %\draw (1.north) [out=25, in=155] to (2.north);
+            %\draw (1.north) [out=30, in=155] to (3.north);
+            %\draw (1.north) [out=35, in=155] to (4.north);
+            %\draw (6.north) [out=40, in=155] to (6.north);
+            %\end{scope}
+            %\draw[decorate,decoration={brace, amplitude=10pt, raise=5pt, mirror}]
+            %(2.south west) to node[black,midway,below= 15pt] {$k$-elements} (7.south east);%
+
+        \end{tikzpicture}
+    \end{center}
+
+    \textbf{Performance:} (dynamisch, bei unterliegender Datenstruktur Array)
+
+    \begin{center}
+        \begin{tabular}{c|c|c|c|c}
+            Zugriff     & Suche       & Einf./Lösch. (Anfang)                                                                                   & Einf./Lösch. (Ende)                              & Einf./Lösch. (Mitte) \\
+            \hline
+            $\Theta(1)$ & $\Theta(n)$ & $\Theta(1)/\Theta(n)$\footnote{Wenn das Feld schon voll ist, muss der komplette Inhalt kopiert werden.} & $\Theta(1)/\Theta(n)$\footnote{Siehe Fußnote a.} & $\Theta(n)$          \\
+        \end{tabular}
+    \end{center}
+
+    Damit ist ein zirkuläres (dynamisches) Feld gut für eine \emph{Queue/Deque} geeignet!
+\end{defi}
+
+% Verkettete Listen
+
+\subsection{Hashing}
+
+% Hashtabellen
+
+\begin{defi}{Hashfunktion}
+    Eine Hashfunktion oder Streuwertfunktion ist eine Abbildung $h : S \to I$, die eine große Eingabemenge, die Schlüssel $S$, auf eine kleinere Zielmenge, die Hashwerte $I$, abbildet.\footnote{Eine Hashfunktion ist daher im Allgemeinen nicht injektiv, aber surjektiv.}
+
+    Die Bildmenge $h(S) \subseteq I$ bezeichnet die Menge der \emph{Hash-Indizes}.
+
+
+    \begin{center}
+        \begin{tikzpicture}[
+            %  -{Stealth[length = 2.5pt]},
+            start chain = going {right=of \tikzchainprevious.north east},
+            KeyBlock/.style={minimum width=4em, minimum height=2em, outer sep=0pt, on chain},
+            HashBlock/.style={minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            FunctionBlock/.style={minimum width=10em, minimum height=26em, outer sep=0pt, on chain, very thick,fill=blue!20},
+            every node/.style={draw, label distance=0.5em},
+            every on chain/.style={anchor=north west},
+            node distance=4em
+            ]
+            {
+            \node [KeyBlock, label=above:Schlüssel] (k0) {Jürgen};
+            \node [FunctionBlock, label=above:Hashfunktion] (fun) {};
+            \node [HashBlock, label=above:Hashwerte] (h00) {00};
+
+            { [continue chain = going {below=of \tikzchainprevious.south west}, node distance=2em]
+            \chainin (k0);
+            \node [KeyBlock] (k1) {Felix};
+            \node [KeyBlock] (k2) {Finn};
+            \node [KeyBlock] (k3) {Tim};
+            \node [KeyBlock] (k4) {Benno};
+            \node [KeyBlock] (k5) {Lukas};
+            \node [KeyBlock] (k6) {Julia};
+            }
+
+            { [continue chain = going {below=of \tikzchainprevious.south west}, node distance=0pt]
+            \chainin (h00);
+            \node [HashBlock] (h01) {01};
+            \node [HashBlock] (h02) {02};
+            \node [HashBlock] (h03) {03};
+            \node [HashBlock] (h04) {04};
+            \node [HashBlock] (h05) {05};
+            \node [HashBlock] (h06) {06};
+            \node [HashBlock] (h07) {07};
+            \node [HashBlock] (h08) {08};
+            \node [HashBlock] (h09) {09};
+            \node [HashBlock] (h10) {10};
+            \node [HashBlock] (hdots) {$\ldots$};
+            \node [HashBlock] (h15) {15};
+            }
+
+            \draw[->] (k0.east) -- ++(2, 0) -- ($(h05.west)-(2,0)$) -- (h05.west);
+            \draw[->] (k1.east) -- ++(2, 0) -- ($(h09.west)-(2,0)$) -- (h09.west);
+            \draw[->] (k2.east) -- ++(2, 0) -- ($(h00.west)-(2,0)$) -- (h00.west);
+            \draw[->] (k3.east) -- ++(2, 0) -- ($(h15.west)-(2,0)$) -- (h15.west);
+            \draw[->] (k4.east) -- ++(2, 0) -- ($(h02.west)-(2,0)$) -- (h02.west);
+            \draw[->] (k5.east) -- ++(2, 0) -- ($(h10.west)-(2,0)$) -- (h10.west);
+            \draw[->] (k6.east) -- ++(2, 0) -- ($(h03.west)-(2,0)$) -- (h03.west);
+            }
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
+
+\begin{example}{Divisions-Hash}
+    Die \emph{Divisionsrest-Methode (Divisions-Hash)} um Integer zu hashen wird definiert durch:
+    $$
+        h(x) = x \operatorname{mod} N
+    $$
+
+    Sie wird bevorzugt, wenn die Schlüsselverteilung nicht bekannt ist.
+    Etwaige Regelmäßigkeiten in der Schlüsselverteilung sollte sich nicht in der Adressverteilung auswirken. Daher sollte $N$ eine Primzahl sein.
+\end{example}
+
+\begin{example}{Hashfunktionen für verschiedene Datentypen}
+    \begin{itemize}
+        \item Alle Datenypen: Verwenden der Speicheradresse
+        \item Strings: ASCII/Unicode-Werte addieren (evtl. von einigen Buchstaben, evtl. gewichtet)
+    \end{itemize}
+\end{example}
+
+\begin{defi}{Kollision}
+    Sei $S$ eine Schlüsselmenge und $h$ eine Hashfunktion.
+    Ist
+    $$
+        s_1, s_2 \in S, \ s_1 \neq s_2 : h(s_1) = h(s_2)
+    $$
+    so spricht man von einer \emph{Kollision}.
+
+    Die Wahrscheinlichkeit von Kollisionen ist abhängig von der gewählten Hashfunktion.
+    Hashfunktionen sollten also möglichst gut \emph{streuen}, aber dennoch effizient berechenbar sein.
+
+    \begin{center}
+        \begin{tikzpicture}[
+            %  -{Stealth[length = 2.5pt]},
+            start chain = going {right=of \tikzchainprevious.north east},
+            KeyBlock/.style={minimum width=4em, minimum height=2em, outer sep=0pt, on chain},
+            HashBlock/.style={minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            FunctionBlock/.style={minimum width=10em, minimum height=26em, outer sep=0pt, on chain,fill=blue!20},
+            every node/.style={draw, label distance=0.5em},
+            every on chain/.style={anchor=north west},
+            node distance=4em
+            ]
+            {
+            \node [KeyBlock, label=above:Schlüssel, very thick] (k0) {Jürgen};
+            \node [FunctionBlock, label=above:Hashfunktion] (fun) {};
+            \node [HashBlock, label=above:Hashwerte] (h00) {00};
+
+            { [continue chain = going {below=of \tikzchainprevious.south west}, node distance=2em]
+            \chainin (k0);
+            \node [KeyBlock] (k1) {Felix};
+            \node [KeyBlock] (k2) {Finn};
+            \node [KeyBlock] (k3) {Tim};
+            \node [KeyBlock] (k4) {Benno};
+            \node [KeyBlock] (k5) {Lukas};
+            \node [KeyBlock, very thick] (k6) {Julia};
+            }
+
+            { [continue chain = going {below=of \tikzchainprevious.south west}, node distance=0pt]
+            \chainin (h00);
+            \node [HashBlock] (h01) {01};
+            \node [HashBlock] (h02) {02};
+            \node [HashBlock] (h03) {03};
+            \node [HashBlock] (h04) {04};
+            \node [HashBlock, very thick] (h05) {05};
+            \node [HashBlock] (h06) {06};
+            \node [HashBlock] (h07) {07};
+            \node [HashBlock] (h08) {08};
+            \node [HashBlock] (h09) {09};
+            \node [HashBlock] (h10) {10};
+            \node [HashBlock] (hdots) {$\ldots$};
+            \node [HashBlock] (h15) {15};
+            }
+
+            \draw[->, very thick, color=red] (k0.east) -- ++(2, 0) -- ($(h05.west)-(2,0)$) -- (h05.west);
+            \draw[->] (k1.east) -- ++(2, 0) -- ($(h09.west)-(2,0)$) -- (h09.west);
+            \draw[->] (k2.east) -- ++(2, 0) -- ($(h00.west)-(2,0)$) -- (h00.west);
+            \draw[->] (k3.east) -- ++(2, 0) -- ($(h15.west)-(2,0)$) -- (h15.west);
+            \draw[->] (k4.east) -- ++(2, 0) -- ($(h02.west)-(2,0)$) -- (h02.west);
+            \draw[->] (k5.east) -- ++(2, 0) -- ($(h10.west)-(2,0)$) -- (h10.west);
+            \draw[->, very thick, color=red] (k6.east) -- ++(2, 0) -- ($(h05.west)-(2,0)$) -- (h05.west);
+            }
+        \end{tikzpicture}
+    \end{center}
+
+\end{defi}
+
+\begin{defi}{Kollisionsbehandlung}
+    Um Kollisionen zu handhaben, existieren verschiedene Strategien:
+    \begin{itemize}
+        \item \emph{Hashing mit Verkettung}
+              \begin{itemize}
+                  \item Hashtabelle besteht aus $N$ linearen Listen
+                  \item $h(s)$ gibt dann an, in welche Teilliste der Datensatz gehört
+                  \item Daten werden innerhalb der Teillisten sequentiell gespeichert
+              \end{itemize}
+        \item \emph{Hashing mit offener Adressierung}
+              \begin{itemize}
+                  \item Suchen einer alternativen Position innerhalb des Feldes
+                        \begin{enumerate}
+                            \item Lineares Sondieren (Verschiebung um konstantes Intervall)
+                            \item Doppeltes Hashing (Nutzen einer weiteren Hashfunktion)
+                            \item Quadratisches Sondieren (Intervall wird quadriert)
+                        \end{enumerate}
+              \end{itemize}
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Schrittzahl}
+    Die \emph{Schrittzahl} $S(s)$, die nötig ist, um den Datensatz mit Schlüssel $s$ zu speichern bzw. wiederzufinden, setzt sich z.B. beim Hashing mit Verkettung zusammen aus:
+    \begin{itemize}
+        \item der Berechnung der Hash-Funktion und
+        \item dem Aufwand für die Suche bzw. Speicherung innerhalb der Teilliste.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Füllgrad}
+    Der \emph{Füllgrad} einer Hashtabelle ist der Quotient
+    $$
+        \alpha = \frac{n}{N}
+    $$
+    mit
+    \begin{itemize}
+        \item $N$ als Größe der Hashtabelle
+        \item $n$ als Anzahl der gespeicherten Datensätze
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Schrittzahl beim Suchen in Teillisten}
+    Bei idealer Speicherung entfallen $\alpha$ Elemente auf jede Teilliste.
+    Dabei gilt:
+    \begin{itemize}
+        \item erfolgreiche Suche: $c_1 + c_2 \cdot \frac{\alpha}{2}$
+        \item erfolglose Suche: $c_1 + c_2 \cdot \alpha$
+    \end{itemize}
+    Damit ist der Suchaufwand in $\bigo(\alpha) = \bigo(\frac{n}{N})$.
+
+    Wird der Füllgrad $\alpha$ zu groß, sollte die Hashtabelle vergrößert werden.
+\end{example}
+
+\begin{defi}{Dynamisches Hashing}
+    Um viele Kollisionen zu vermeiden, muss die Hashtabelle ab einem gewissen Füllgrad vergrößert werden.\footnote{nach Sedgewick sollte stets $\alpha < 0.5$ gelten}
+
+    Als Folge muss die gesamte Hashtabelle aber auch neu aufgebaut werden.
+\end{defi}
+
+\begin{defi}{Offene Adressierung (Sondieren)}
+    Beim Speichern wird bei \emph{Hashing mit offener Adressieren (Sondierung)} so lang ein neuer Hashindex berechnet, bis dort ein freier Speicherplatz vorhanden ist.
+
+    Das Suchen funktioniert analog, allerdings ist das Löschen sehr aufwändig.
+
+    \begin{itemize}
+        \item Lineares Sondieren
+              \begin{itemize}
+                  \item Wird die Ersatzadresse bei jeder Kollision durch Erhöhen der alten Adresse um 1 berechnet, so spricht man von \emph{linearem Sondieren (linear probing)}.
+                  \item Die $i$-te Ersatzadresse für einen Schlüssel $s$ mit Hashindex $h(s)$ wird also wie folgt berechnet:
+                        $$
+                            h_i(s) = (h(s) + i) \operatorname{mod} N
+                        $$
+              \end{itemize}
+        \item Doppeltes Hashing
+              \begin{itemize}
+                  \item Schlüssel wird nicht um $1$ erhöht, sondern der Inkrement wird mit einer zweiten Hashfunktion berechnet.
+                  \item Beseitigt praktisch die Probleme der primären und sekundären Häufung.
+                  \item Nicht alle Felder werden durchprobiert. Im ungünstigsten Fall kann eine neues Element nicht eingefügt werden, auch wenn noch Felder frei sind.
+              \end{itemize}
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Primäre und sekundäre Häufung}
+    Bei der \emph{primären Häufung (primary clustering)} ist die Wahrscheinlichkeit, dass Plätze in einem dichtbelegten Bereich eher besetzt werden, deutlich höher.
+    Es kommt also zu Kettenbildung.
+
+    Besonders häufig tritt primäre Häufung z.B. beim linearen Sondieren auf.
+
+    \begin{center}
+        \begin{tikzpicture}
+            [
+                %  -{Stealth[length = 2.5pt]},
+                start chain,
+                node distance = 0pt,
+                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+
+            \node [draw, minimum width=2em, minimum height=2em] (val) {$s$};
+
+            { start chain = going right
+            \node [StackBlock,right=2cm of val,fill=red!30] (0) {};
+            \node [StackBlock] (1) {};
+            \node [StackBlock] (2) {};
+            \node [StackBlock,fill=red!30] (3) {};
+            \node [StackBlock,fill=red!30] (4) {};
+            \node [StackBlock,fill=red!30] (5) {};
+            \node [StackBlock,fill=red!30] (6) {};
+            \node [StackBlock,fill=red!30] (7) {};
+            \node [StackBlock] (8) {$s$};
+            \node [StackBlock] (9) {};
+
+            \draw[->] (val.south) [out=-30, in=-150] to (4.south);
+            \draw[->] (4.south) [out=-45, in=-135] to (5.south);
+            \draw[->] (5.south) [out=-45, in=-135] to (6.south);
+            \draw[->] (6.south) [out=-45, in=-135] to (7.south);
+            \draw[->] (7.south) [out=-45, in=-135] to (8.south);
+            }
+        \end{tikzpicture}
+    \end{center}
+
+
+    Die \emph{sekundäre Häufung (secondary clustering)} hängt von der Hashfunktion ab.
+    Dabei durchlaufen zwei Schlüssel $h(s)$ und $h(s')$ stets dieselbe Sondierungsfolge.
+    Sie behindern sich also auf den Ausweichplätzen.
+
+    Besonders häufig tritt sekundäre Häufung z.B. beim quadratischen Sondieren auf.
+
+
+    \begin{center}
+        \begin{tikzpicture}
+            [
+                %  -{Stealth[length = 2.5pt]},
+                start chain,
+                node distance = 0pt,
+                StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+
+            \node [minimum width=2em, minimum height=2em] (val) {};
+
+            { start chain = going right
+            \node [StackBlock,right=2cm of val] (0) {};
+            \node [StackBlock,fill=red!30] (1) {};
+            \node [StackBlock,fill=red!30] (2) {};
+            \node [StackBlock,fill=red!30] (3) {};
+            \node [StackBlock] (4) {};
+            \node [StackBlock,fill=red!30] (5) {};
+            \node [StackBlock] (6) {};
+            \node [StackBlock] (7) {};
+            \node [StackBlock] (8) {$s$};
+            \node [StackBlock] (9) {$s'$};
+
+            { [continue chain = going above]
+            \chainin (val);
+            \node [StackBlock] (val1) {$s$};
+            }
+
+            { [continue chain = going below]
+            \chainin (val);
+            \node [StackBlock] (val2) {$s'$};
+            }
+
+            \draw[->] (val1.east) [out=0, in=150] to (2.north);
+            \draw[->] (2.north) [out=45, in=135] to (3.north);
+            \draw[->] (3.north) [out=45, in=135] to (5.north);
+            \draw[->] (5.north) [out=45, in=135] to (8.north);
+
+            \draw[->] (val2.east) [out=0, in=-150] to (2.south);
+            \draw[->] (2.south) [out=-45, in=-135] to (3.south);
+            \draw[->] (3.south) [out=-45, in=-135] to (5.south);
+            \draw[->] (5.south) [out=-45, in=-135] to (8.south);
+            \draw[->] (8.south) [out=-45, in=-135] to (9.south);
+            }
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
diff --git a/algo/floyd.java b/algo/floyd.java
index 94f55c9eccd832d656c2d6cd55ba0a4ffbcd08ef..65cf43eb043b684851b4c3dd3a342260d6196a0a 100644
--- a/algo/floyd.java
+++ b/algo/floyd.java
@@ -1,9 +1,9 @@
-for(int i = 0; i < a.length; i++) {
-    for(int j = 0; j < a.length; j++) {
-        for(int k = 0; k < a.length; k++) {
-            if(a[j][k] > a[j][i] + a[i][k]) {
-                a[j][k] = a[j][i] + a[i][k];
-            }
-        }
-    }
+for(int i = 0; i < a.length; i++) {
+    for(int j = 0; j < a.length; j++) {
+        for(int k = 0; k < a.length; k++) {
+            if(a[j][k] > a[j][i] + a[i][k]) {
+                a[j][k] = a[j][i] + a[i][k];
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/algo/formale_sprachen.tex b/algo/formale_sprachen.tex
new file mode 100644
index 0000000000000000000000000000000000000000..d1026b17f6ed8e03e9ff9d4f5ba2cb55fc35b194
--- /dev/null
+++ b/algo/formale_sprachen.tex
@@ -0,0 +1,1313 @@
+\section{Formale Sprachen}
+% Textsuche
+\subsection{Textsuche}
+
+\begin{bonus}{Textsucheverfahren}
+    \begin{itemize}
+        \item Naiver, grober, oder brute-force-Algorithmus $\in \bigo(n \cdot m)$
+              \begin{itemize}
+                  \item für kleine Texte am schnellsten
+              \end{itemize}
+        \item Knuth-Morris-Pratt, Rabin-Karp $\in \Theta(n + m)$
+        \item Boyer-Moore, (Boyer-Moore)-Sunday, (Boyer-Moore)-Horsepool $\in \bigo(n + m)$
+              \begin{itemize}
+                  \item für große Texte am schnellsten
+              \end{itemize}
+    \end{itemize}
+\end{bonus}
+
+\begin{algo}{Naive Textsuche}
+    Bei der \emph{naiven Textsuche} wird an allen Positionen $i$ des Textes nach dem Muster geprüft.
+
+    Die möglichen Positionen reichen von $i=0$ (Muster linksbündig mit dem Text) bis $i = n-m$ (Muster rechtsbündig mit dem Text).
+
+    Das Muster wird an der jeweiligen Position zeichenweise von links nach rechts mit dem Text verglichen.
+
+    Bei einem \emph{Mismatch} oder bei vollständiger Übereinstimmung (\emph{Match}) wird das Muster um eine Position weitergeschoben und an dieser Position verglichen.
+\end{algo}
+
+\begin{example}{Naive Textsuche}
+    \textbf{Aufgabe:} Finde das Muster \texttt{SINN} im Text \texttt{DASISTSINNLOSERTEXT} mithilfe naiver Textsuche.
+
+    \centering
+
+    \vspace{1em}
+
+    \begin{tikzpicture}[
+        start chain,
+        node distance = 0pt,
+        TextBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+        ]
+        { start chain = going right
+        %\node [TextBlock, fill=red!50, label=$0$] (0) {};
+        \node [TextBlock] (00) {D};
+        \node [TextBlock] (01) {A};
+        \node [TextBlock] (02) {S};
+        \node [TextBlock] (03) {I};
+        \node [TextBlock] (04) {S};
+        \node [TextBlock] (05) {T};
+        \node [TextBlock] (06) {S};
+        \node [TextBlock] (07) {I};
+        \node [TextBlock] (08) {N};
+        \node [TextBlock] (09) {N};
+        \node [TextBlock] (10) {L};
+        \node [TextBlock] (11) {O};
+        \node [TextBlock] (12) {S};
+        \node [TextBlock] (13) {E};
+        \node [TextBlock] (14) {R};
+        \node [TextBlock] (15) {T};
+        \node [TextBlock] (16) {E};
+        \node [TextBlock] (17) {X};
+        \node [TextBlock] (18) {T};
+
+
+        { [continue chain = going right]
+        \chainin (00);
+
+        \node[TextBlock, xshift=-2em, yshift=2em, index] () {\tiny 0};
+        \node [TextBlock, index] () {\tiny 1};
+        \node [TextBlock, index] () {\tiny 2};
+        \node [TextBlock, index] () {\tiny 3};
+        \node [TextBlock, index] () {\tiny 4};
+        \node [TextBlock, index] () {\tiny 5};
+        \node [TextBlock, index] () {\tiny 6};
+        \node [TextBlock, index] () {\tiny 7};
+        \node [TextBlock, index] () {\tiny 8};
+        \node [TextBlock, index] () {\tiny 9};
+        \node [TextBlock, index] () {\tiny 10};
+        \node [TextBlock, index] () {\tiny 11};
+        \node [TextBlock, index] () {\tiny 12};
+        \node [TextBlock, index] () {\tiny 13};
+        \node [TextBlock, index] () {\tiny 14};
+        \node [TextBlock, index] () {\tiny 15};
+        \node [TextBlock, index] () {\tiny 16};
+        \node [TextBlock, index] () {\tiny 17};
+        \node [TextBlock, index] () {\tiny 18};
+        }
+
+        { [continue chain = going right]
+        \chainin (00);
+        \node[TextBlock, xshift=-2em, yshift=-2em, fill=red!50] (1_0) {S};
+        \node[TextBlock] (1_1) {I};
+        \node[TextBlock] (1_2) {N};
+        \node[TextBlock] (1_3) {N};
+        %
+        \node[on chain, xshift=2em] (1_info) {\texttt{i=0; j=0} $\implies$ Mismatch!};
+        }
+
+        { [continue chain = going right]
+        \chainin (01);
+        \node[TextBlock, xshift=-2em, yshift=-4em, fill=red!50] (1_0) {S};
+        \node[TextBlock] (2_1) {I};
+        \node[TextBlock] (2_2) {N};
+        \node[TextBlock] (2_3) {N};
+        %
+        \node[on chain, xshift=2em] (1_info) {\texttt{i=1; j=0} $\implies$ Mismatch!};
+        }
+
+        { [continue chain = going right]
+        \chainin (02);
+        \node[TextBlock, xshift=-2em, yshift=-6em, fill=teal!50] (1_0) {S};
+        \node[TextBlock, fill=teal!50] (3_1) {I};
+        \node[TextBlock, fill=red!50] (3_2) {N};
+        \node[TextBlock] (3_3) {N};
+        %
+        \node[on chain, xshift=2em] (1_info) {\texttt{i=2; j=2} $\implies$ Mismatch!};
+        }
+
+        { [continue chain = going right]
+        \chainin (03);
+        \node[TextBlock, xshift=-2em, yshift=-8em, fill=red!50] (1_0) {S};
+        \node[TextBlock] (4_1) {I};
+        \node[TextBlock] (4_2) {N};
+        \node[TextBlock] (4_3) {N};
+        %
+        \node[on chain, xshift=2em] (1_info) {\texttt{i=3; j=0} $\implies$ Mismatch!};
+        }
+
+        { [continue chain = going right]
+        \chainin (04);
+        \node[TextBlock, xshift=-2em, yshift=-10em, fill=teal!50] (1_0) {S};
+        \node[TextBlock, fill=red!50] (5_1) {I};
+        \node[TextBlock] (5_2) {N};
+        \node[TextBlock] (5_3) {N};
+        %
+        \node[on chain, xshift=2em] (1_info) {\texttt{i=4; j=1} $\implies$ Mismatch!};
+        }
+
+        { [continue chain = going right]
+        \chainin (05);
+        \node[TextBlock, xshift=-2em, yshift=-12em, fill=red!50] (1_0) {S};
+        \node[TextBlock] (5_1) {I};
+        \node[TextBlock] (5_2) {N};
+        \node[TextBlock] (5_3) {N};
+        %
+        \node[on chain, xshift=2em] (1_info) {\texttt{i=5; j=0} $\implies$ Mismatch!};
+        }
+
+        { [continue chain = going right]
+        \chainin (06);
+        \node[TextBlock, xshift=-2em, yshift=-14em, fill=teal!50] (1_0) {S};
+        \node[TextBlock, fill=teal!50] (5_1) {I};
+        \node[TextBlock, fill=teal!50] (5_2) {N};
+        \node[TextBlock, fill=teal!50] (5_3) {N};
+        %
+        \node[on chain, xshift=2em] (1_info) {\textcolor{teal}{\texttt{i=6; j=4} $\implies$ Match!}};
+        }
+        }
+    \end{tikzpicture}
+\end{example}
+
+\begin{algo}{Knuth-Morris-Pratt-Algorithmus}
+    Der \emph{Knuth-Morris-Pratt-Algorithmus} baut auf der naiven Textsuche auf.
+
+    Der Unterschied liegt darin, dass bei einem Mismatch das Muster nicht nur um eine Position verschoben werden kann, sondern um mehrere gleichzeitig.
+    Dabei gilt:
+    \begin{itemize}
+        \item \textbf{Fall 1:} Wenn die letzten überprüften Buchstaben gleich dem Anfang des Patterns sind, verschiebt man das Muster entsprechend und macht beim anschließenden Zeichen weiter.
+        \item \textbf{Fall 2:} Wenn die letzten überprüften Buchstaben nicht gleich dem Anfang des Musters sind, verschiebt man das Muster so, dass das erste Zeichen auf dem Mismatch zu liegen kommt.
+    \end{itemize}
+\end{algo}
+
+\begin{example}{Knuth-Morris-Pratt-Algorithmus}
+    \textbf{Aufgabe:} Finde das Muster \texttt{UNGLEICHUNGEN} im Text \texttt{UNGLEICHUNGSTEIL...} mithilfe des Knuth-Morris-Pratt-Algorithmus.
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            TextBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+            \node [TextBlock] (00) {U};
+            \node [TextBlock] (01) {N};
+            \node [TextBlock] (02) {G};
+            \node [TextBlock] (03) {L};
+            \node [TextBlock] (04) {E};
+            \node [TextBlock] (05) {I};
+            \node [TextBlock] (06) {C};
+            \node [TextBlock] (07) {H};
+            \node [TextBlock] (08) {U};
+            \node [TextBlock] (09) {N};
+            \node [TextBlock] (10) {G};
+            \node [TextBlock] (11) {S};
+            \node [TextBlock] (12) {T};
+            \node [TextBlock] (13) {E};
+            \node [TextBlock] (14) {I};
+            \node [TextBlock] (15) {L};
+            \node [TextBlock] (16) {$\ldots$};
+
+            { [continue chain = going right]
+            \chainin (00);
+
+            \node[TextBlock, xshift=-2em, yshift=2em, index] () {\tiny 0};
+            \node [TextBlock, index] () {\tiny 1};
+            \node [TextBlock, index] () {\tiny 2};
+            \node [TextBlock, index] () {\tiny 3};
+            \node [TextBlock, index] () {\tiny 4};
+            \node [TextBlock, index] () {\tiny 5};
+            \node [TextBlock, index] () {\tiny 6};
+            \node [TextBlock, index] () {\tiny 7};
+            \node [TextBlock, index] () {\tiny 8};
+            \node [TextBlock, index] () {\tiny 9};
+            \node [TextBlock, index] () {\tiny 10};
+            \node [TextBlock, index] () {\tiny 11};
+            \node [TextBlock, index] () {\tiny 12};
+            \node [TextBlock, index] () {\tiny 13};
+            \node [TextBlock, index] () {\tiny 14};
+            \node [TextBlock, index] () {\tiny 15};
+            \node [TextBlock, index] () {\tiny 16};
+            }
+
+
+            { [continue chain = going right]
+            \chainin (00);
+            \node[TextBlock, xshift=-2em, yshift=-2em, fill=teal!50] (1_00)  {U};
+            \node [TextBlock, fill=teal!50] (1_01) {N};
+            \node [TextBlock, fill=teal!50] (1_02) {G};
+            \node [TextBlock, fill=teal!50] (1_03) {L};
+            \node [TextBlock, fill=teal!50] (1_04) {E};
+            \node [TextBlock, fill=teal!50] (1_05) {I};
+            \node [TextBlock, fill=teal!50] (1_06) {C};
+            \node [TextBlock, fill=teal!50] (1_07) {H};
+            \node [TextBlock, fill=teal!50] (1_08) {U};
+            \node [TextBlock, fill=teal!50] (1_09) {N};
+            \node [TextBlock, fill=teal!50] (1_10) {G};
+            \node [TextBlock, fill=red!50] (1_11) {E};
+            \node [TextBlock] (1_12) {N};
+            %
+            \node[on chain, xshift=2em] (1_info) {$\implies$ Fall 1};
+            }
+
+            { [continue chain = going right]
+            \chainin (08);
+            \node[TextBlock, xshift=-2em, yshift=-4em, fill=teal!50] (2_00)  {U};
+            \node [TextBlock, fill=teal!50] (2_01) {N};
+            \node [TextBlock, fill=teal!50] (2_02) {G};
+            \node [TextBlock, fill=red!50] (2_03) {L};
+            \node [TextBlock] (2_04) {E};
+            \node [TextBlock] (2_05) {I};
+            \node [TextBlock] (2_06) {C};
+            \node [TextBlock] (2_07) {H};
+            \node [TextBlock] (2_08) {$\ldots$};
+            }
+
+            { [continue chain = going below]
+            \chainin (2_00);
+            \node [on chain, minimum width=2em, minimum height=2em] (usw) {usw.};
+            }
+            }
+            \node [draw, dashed, fit={(00) (01) (02) (1_00) (1_01) (1_02)}] {};
+            \node [draw, dashed, fit={(08) (09) (10) (1_08) (1_09) (1_10)}] {};
+        \end{tikzpicture}
+    \end{center}
+
+    \textbf{Aufgabe:} Finde das Muster \texttt{UNGLEICHER} im Text \texttt{UNGLEICHUNGSTEIL...} mithilfe des Knuth-Morris-Pratt-Algorithmus.
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            TextBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            ]
+            { start chain = going right
+            \node [TextBlock] (00) {U};
+            \node [TextBlock] (01) {N};
+            \node [TextBlock] (02) {G};
+            \node [TextBlock] (03) {L};
+            \node [TextBlock] (04) {E};
+            \node [TextBlock] (05) {I};
+            \node [TextBlock] (06) {C};
+            \node [TextBlock] (07) {H};
+            \node [TextBlock] (08) {U};
+            \node [TextBlock] (09) {N};
+            \node [TextBlock] (10) {G};
+            \node [TextBlock] (11) {S};
+            \node [TextBlock] (12) {T};
+            \node [TextBlock] (13) {E};
+            \node [TextBlock] (14) {I};
+            \node [TextBlock] (15) {L};
+            \node [TextBlock] (16) {$\ldots$};
+
+            { [continue chain = going right]
+            \chainin (00);
+
+            \node[TextBlock, xshift=-2em, yshift=2em, index] () {\tiny 0};
+            \node [TextBlock, index] () {\tiny 1};
+            \node [TextBlock, index] () {\tiny 2};
+            \node [TextBlock, index] () {\tiny 3};
+            \node [TextBlock, index] () {\tiny 4};
+            \node [TextBlock, index] () {\tiny 5};
+            \node [TextBlock, index] () {\tiny 6};
+            \node [TextBlock, index] () {\tiny 7};
+            \node [TextBlock, index] () {\tiny 8};
+            \node [TextBlock, index] () {\tiny 9};
+            \node [TextBlock, index] () {\tiny 10};
+            \node [TextBlock, index] () {\tiny 11};
+            \node [TextBlock, index] () {\tiny 12};
+            \node [TextBlock, index] () {\tiny 13};
+            \node [TextBlock, index] () {\tiny 14};
+            \node [TextBlock, index] () {\tiny 15};
+            \node [TextBlock, index] () {\tiny 16};
+            }
+
+            { [continue chain = going right]
+            \chainin (00);
+            \node[TextBlock, xshift=-2em, yshift=-2em, fill=teal!50] (1_00)  {U};
+            \node [TextBlock, fill=teal!50] (1_01) {N};
+            \node [TextBlock, fill=teal!50] (1_02) {G};
+            \node [TextBlock, fill=teal!50] (1_03) {L};
+            \node [TextBlock, fill=teal!50] (1_04) {E};
+            \node [TextBlock, fill=teal!50] (1_05) {I};
+            \node [TextBlock, fill=teal!50] (1_06) {C};
+            \node [TextBlock, fill=teal!50] (1_07) {H};
+            \node [TextBlock, fill=red!50] (1_08) {E};
+            \node [TextBlock] (1_09) {R};
+            %
+            \node[on chain, xshift=2em] (1_info) {$\implies$ Fall 2};
+            }
+
+            { [continue chain = going right]
+            \chainin (08);
+            \node[TextBlock, xshift=-2em, yshift=-4em, fill=teal!50] (2_00)  {U};
+            \node [TextBlock, fill=teal!50] (2_01) {N};
+            \node [TextBlock, fill=teal!50] (2_02) {G};
+            \node [TextBlock, fill=red!50] (2_03) {L};
+            \node [TextBlock] (2_04) {E};
+            \node [TextBlock] (2_05) {I};
+            \node [TextBlock] (2_06) {C};
+            \node [TextBlock] (2_07) {H};
+            \node [TextBlock] (2_08) {$\ldots$};
+            }
+
+            { [continue chain = going below]
+            \chainin (2_00);
+            \node [on chain, minimum width=2em, minimum height=2em] (usw) {usw.};
+            }
+            }
+        \end{tikzpicture}
+    \end{center}
+\end{example}
+
+\begin{algo}{Boyer-Moore-Sunday-Algorithmus}
+    Beim \emph{Boyer-Moore-Sunday-Algorithmus} wird nach einem Mismatch das Zeichen betrachtet, das hinter dem Muster liegt.
+
+    Dabei kann das Muster so weit nach vorne geschoben werden, bis ein Buchstabe des Musters mit diesem Buchstaben übereinstimmt.\footnote{Taucht der Buchstabe mehrfach im Wort auf, wird um die geringste Distanz nach vorne geschoben - also an den Buchstaben, der im Muster am weitesten hinten liegt.}
+
+    Kommt der folgende Buchstabe im Muster nicht vor, wird das Muster über den Buchstaben hinweggeschoben, da alle Positionen vorher sowieso zwecklos sind.
+\end{algo}
+
+\begin{example}{Boyer-Moore-Sunday-Algorithmus}
+    \textbf{Aufgabe:} Finde das Muster \texttt{ACBABCBA} im Text \texttt{AABBACCBACDACBABCBA} mithilfe des Boyer-Moore-Sunday-Algorithmus.
+
+    \centering
+
+    \vspace{1em}
+
+    \begin{tikzpicture}[
+        start chain,
+        node distance = 0pt,
+        TextBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+        hit/.style={fill=teal!50},
+        miss/.style={fill=red!50},
+        next/.style={fill=blue!25},
+        ]
+        { start chain = going right
+        %\node [TextBlock, fill=red!50, label=$0$] (0) {};
+        \node [TextBlock] (00) {A};
+        \node [TextBlock] (01) {A};
+        \node [TextBlock] (02) {B};
+        \node [TextBlock] (03) {B};
+        \node [TextBlock] (04) {A};
+        \node [TextBlock] (05) {C};
+        \node [TextBlock] (06) {C};
+        \node [TextBlock] (07) {B};
+        \node [TextBlock] (08) {A};
+        \node [TextBlock] (09) {C};
+        \node [TextBlock] (10) {D};
+        \node [TextBlock] (11) {A};
+        \node [TextBlock] (12) {C};
+        \node [TextBlock] (13) {B};
+        \node [TextBlock] (14) {A};
+        \node [TextBlock] (15) {B};
+        \node [TextBlock] (16) {C};
+        \node [TextBlock] (17) {B};
+        \node [TextBlock] (18) {A};
+
+        { [continue chain = going right]
+        \chainin (00);
+
+        \node[TextBlock, xshift=-2em, yshift=2em, index] () {\tiny 0};
+        \node [TextBlock, index] () {\tiny 1};
+        \node [TextBlock, index] () {\tiny 2};
+        \node [TextBlock, index] () {\tiny 3};
+        \node [TextBlock, index] () {\tiny 4};
+        \node [TextBlock, index] () {\tiny 5};
+        \node [TextBlock, index] () {\tiny 6};
+        \node [TextBlock, index] () {\tiny 7};
+        \node [TextBlock, index] () {\tiny 8};
+        \node [TextBlock, index] () {\tiny 9};
+        \node [TextBlock, index] () {\tiny 10};
+        \node [TextBlock, index] () {\tiny 11};
+        \node [TextBlock, index] () {\tiny 12};
+        \node [TextBlock, index] () {\tiny 13};
+        \node [TextBlock, index] () {\tiny 14};
+        \node [TextBlock, index] () {\tiny 15};
+        \node [TextBlock, index] () {\tiny 16};
+        \node [TextBlock, index] () {\tiny 17};
+        \node [TextBlock, index] () {\tiny 18};
+        }
+
+        { [continue chain = going right]
+        \chainin (00);
+
+        \node[TextBlock, xshift=-2em, yshift=-2em, hit] (1_00) {A};
+        \node [TextBlock, miss] (1_01) {C};
+        \node [TextBlock] (1_02) {B};
+        \node [TextBlock] (1_03) {A};
+        \node [TextBlock] (1_04) {B};
+        \node [TextBlock] (1_05) {C};
+        \node [TextBlock] (1_06) {B};
+        \node [TextBlock] (1_07) {A};
+        }
+
+        { [continue chain = going right]
+        \chainin (01);
+
+        \node[TextBlock, xshift=-2em, yshift=-4em, hit] (2_00) {A};
+        \node [TextBlock, miss] (2_01) {C};
+        \node [TextBlock] (2_02) {B};
+        \node [TextBlock] (2_03) {A};
+        \node [TextBlock] (2_04) {B};
+        \node [TextBlock] (2_05) {C};
+        \node [TextBlock] (2_06) {B};
+        \node [TextBlock, next] (2_07) {A};
+        }
+
+        { [continue chain = going right]
+        \chainin (04);
+
+        \node[TextBlock, xshift=-2em, yshift=-6em, hit] (3_00) {A};
+        \node [TextBlock, hit] (3_01) {C};
+        \node [TextBlock, miss] (3_02) {B};
+        \node [TextBlock] (3_03) {A};
+        \node [TextBlock] (3_04) {B};
+        \node [TextBlock, next] (3_05) {C};
+        \node [TextBlock] (3_06) {B};
+        \node [TextBlock] (3_07) {A};
+        }
+
+        { [continue chain = going right]
+        \chainin (07);
+
+        \node[TextBlock, xshift=-2em, yshift=-8em, miss] (4_00) {A};
+        \node [TextBlock] (4_01) {C};
+        \node [TextBlock] (4_02) {B};
+        \node [TextBlock] (4_03) {A};
+        \node [TextBlock] (4_04) {B};
+        \node [TextBlock, next] (4_05) {C};
+        \node [TextBlock] (4_06) {B};
+        \node [TextBlock] (4_07) {A};
+        }
+
+        { [continue chain = going right]
+        \chainin (09);
+
+        \node[TextBlock, xshift=-2em, yshift=-10em, miss] (5_00) {A};
+        \node [TextBlock] (5_01) {C};
+        \node [TextBlock] (5_02) {B};
+        \node [TextBlock] (5_03) {A};
+        \node [TextBlock] (5_04) {B};
+        \node [TextBlock] (5_05) {C};
+        \node [TextBlock, next] (5_06) {B};
+        \node [TextBlock] (5_07) {A};
+        }
+
+        { [continue chain = going right]
+        \chainin (11);
+
+        \node[TextBlock, xshift=-2em, yshift=-12em, hit] (6_00) {A};
+        \node [TextBlock, hit] (6_01) {C};
+        \node [TextBlock, hit] (6_02) {B};
+        \node [TextBlock, hit] (6_03) {A};
+        \node [TextBlock, hit] (6_04) {B};
+        \node [TextBlock, hit] (6_05) {C};
+        \node [TextBlock, next] (6_06) {B};
+        \node [TextBlock, hit] (6_07) {A};
+        }
+        }
+        \draw[->] (08) to (2_07);
+        \draw[->] (09) to (3_05);
+        \draw[->] (12) to (4_05);
+        \draw[->] (15) to (5_06);
+        \draw[->] (17) to (6_06);
+    \end{tikzpicture}
+\end{example}
+
+\begin{defi}{\texttt{last}-Tabelle}
+    Die \texttt{last}\emph{-Tabelle} enthält zu jedem Zeichen des Zeichensatzes die Position des letzten Vorkommens im Muster (oder $-1$, falls es nicht vorkommt).
+
+    Die Implementierung erfolgt z.B. als Array indiziert mit (Unicode-)Zeichensatz:
+    \begin{itemize}
+        \item \texttt{A} auf Index $65$
+        \item \texttt{B} auf Index $66$
+        \item $\ldots$
+        \item \texttt{a} auf Index $97$
+        \item \texttt{b} auf Index $98$
+        \item $\ldots$
+    \end{itemize}
+
+    Dabei gilt:
+    \begin{itemize}
+        \item Alte Position des Patterns: \texttt{i} (das Pattern reicht bis \texttt{i + m - 1})
+        \item Verschiebedistanz: \texttt{v = m - last[text[i+m]]}
+        \item Neue Position des Patterns: \texttt{i + v} (das Pattern reicht bis \texttt{i + v +  m - 1})
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Boyer-Moore-Sunday-Algorithmus mit \texttt{last}-Tabelle}
+    \textbf{Aufgabe:} Finde das Muster \texttt{BANANAS} im Text \texttt{ORANGES, ANANANAS AND BANANANAS} mithilfe des Boyer-Moore-Sunday-Algorithmus und einer \texttt{last}-Tabelle.
+
+    \centering
+
+    \vspace{1em}
+
+    \begin{tabular}{|l||cccc|c|}
+        \hline
+        Pattern            & B & A & N & S & sonst \\
+        \hline
+        \texttt{last}-Wert & 0 & 5 & 4 & 6 & -1    \\
+        \hline
+    \end{tabular}
+
+    \vspace{1em}
+
+    \begin{tikzpicture}[
+        start chain,
+        node distance = 0pt,
+        TextBlock/.style={draw, minimum width=1.5em, minimum height=1.5em, outer sep=0pt, on chain},
+        hit/.style={fill=teal!50},
+        miss/.style={fill=red!50},
+        next/.style={fill=blue!25},
+        ]
+        { start chain = going right
+        %\node [TextBlock, fill=red!50, label=$0$] (0) {};
+        \node [TextBlock] (00) {O};
+        \node [TextBlock] (01) {R};
+        \node [TextBlock] (02) {A};
+        \node [TextBlock] (03) {N};
+        \node [TextBlock] (04) {G};
+        \node [TextBlock] (05) {E};
+        \node [TextBlock] (06) {S};
+        \node [TextBlock] (07) {,};
+        \node [TextBlock] (08) {};
+        \node [TextBlock] (09) {A};
+        \node [TextBlock] (10) {N};
+        \node [TextBlock] (11) {A};
+        \node [TextBlock] (12) {N};
+        \node [TextBlock] (13) {A};
+        \node [TextBlock] (14) {S};
+        \node [TextBlock] (15) {};
+        \node [TextBlock] (16) {A};
+        \node [TextBlock] (17) {N};
+        \node [TextBlock] (18) {D};
+        \node [TextBlock] (19) {};
+        \node [TextBlock] (20) {B};
+        \node [TextBlock] (21) {A};
+        \node [TextBlock] (22) {N};
+        \node [TextBlock] (23) {A};
+        \node [TextBlock] (24) {N};
+        \node [TextBlock] (25) {A};
+        \node [TextBlock] (26) {S};
+
+        { [continue chain = going right]
+        \chainin (00);
+
+        \node[TextBlock, xshift=-1.5em, yshift=1.5em, index small] () {\tiny 0};
+        \node [TextBlock, index small] () {\tiny 1};
+        \node [TextBlock, index small] () {\tiny 2};
+        \node [TextBlock, index small] () {\tiny 3};
+        \node [TextBlock, index small] () {\tiny 4};
+        \node [TextBlock, index small] () {\tiny 5};
+        \node [TextBlock, index small] () {\tiny 6};
+        \node [TextBlock, index small] () {\tiny 7};
+        \node [TextBlock, index small] () {\tiny 8};
+        \node [TextBlock, index small] () {\tiny 9};
+        \node [TextBlock, index small] () {\tiny 10};
+        \node [TextBlock, index small] () {\tiny 11};
+        \node [TextBlock, index small] () {\tiny 12};
+        \node [TextBlock, index small] () {\tiny 13};
+        \node [TextBlock, index small] () {\tiny 14};
+        \node [TextBlock, index small] () {\tiny 15};
+        \node [TextBlock, index small] () {\tiny 16};
+        \node [TextBlock, index small] () {\tiny 17};
+        \node [TextBlock, index small] () {\tiny 18};
+        \node [TextBlock, index small] () {\tiny 19};
+        \node [TextBlock, index small] () {\tiny 20};
+        \node [TextBlock, index small] () {\tiny 21};
+        \node [TextBlock, index small] () {\tiny 22};
+        \node [TextBlock, index small] () {\tiny 23};
+        \node [TextBlock, index small] () {\tiny 24};
+        \node [TextBlock, index small] () {\tiny 25};
+        \node [TextBlock, index small] () {\tiny 26};
+        }
+
+        { [continue chain = going right]
+        \chainin (00);
+
+        \node[TextBlock, xshift=-1.5em, yshift=-1.5em, miss] (1_00) {B};
+        \node [TextBlock] (1_01) {A};
+        \node [TextBlock] (1_02) {N};
+        \node [TextBlock] (1_03) {A};
+        \node [TextBlock] (1_04) {N};
+        \node [TextBlock] (1_05) {A};
+        \node [TextBlock] (1_06) {S};
+        }
+
+        { [continue chain = going right]
+        \chainin (08);
+
+        \node [TextBlock, xshift=-3em, yshift=-3em, dashed, blue] (2_left) {};
+        \node [TextBlock, miss] (2_00) {B};
+        \node [TextBlock] (2_01) {A};
+        \node [TextBlock] (2_02) {N};
+        \node [TextBlock] (2_03) {A};
+        \node [TextBlock] (2_04) {N};
+        \node [TextBlock] (2_05) {A};
+        \node [TextBlock] (2_06) {S};
+        }
+
+        { [continue chain = going right]
+        \chainin (16);
+
+        \node [TextBlock, xshift=-3em, yshift=-4.5em, dashed, blue] (3_left) {};
+        \node [TextBlock, miss] (3_00) {B};
+        \node [TextBlock] (3_01) {A};
+        \node [TextBlock] (3_02) {N};
+        \node [TextBlock] (3_03) {A};
+        \node [TextBlock] (3_04) {N};
+        \node [TextBlock] (3_05) {A};
+        \node [TextBlock] (3_06) {S};
+        }
+
+        { [continue chain = going right]
+        \chainin (18);
+
+        \node [TextBlock, xshift=-1.5em, yshift=-6em, miss] (4_00) {B};
+        \node [TextBlock] (4_01) {A};
+        \node [TextBlock] (4_02) {N};
+        \node [TextBlock] (4_03) {A};
+        \node [TextBlock] (4_04) {N};
+        \node [TextBlock, next] (4_05) {A};
+        \node [TextBlock] (4_06) {S};
+        }
+
+        { [continue chain = going right]
+        \chainin (20);
+
+        \node [TextBlock, xshift=-1.5em, yshift=-7.5em, hit] (5_00) {B};
+        \node [TextBlock, hit] (5_01) {A};
+        \node [TextBlock, hit] (5_02) {N};
+        \node [TextBlock, hit] (5_03) {A};
+        \node [TextBlock, hit] (5_04) {N};
+        \node [TextBlock, next] (5_05) {A};
+        \node [TextBlock, hit] (5_06) {S};
+        }
+        }
+        \draw[->] (07) to node [midway, right] () {\small \color{blue} \texttt{v = 8}} (2_left);
+        \draw[->] (15) to node [midway, right] () {\small \color{blue} \texttt{v = 8}} (3_left);
+        \draw[->] (23) to node [midway, right] () {\small \color{blue} \texttt{v = 2}} (4_05);
+        \draw[->] (25) to node [midway, right] () {\small \color{blue} \texttt{v = 2}} (5_05);
+    \end{tikzpicture}
+\end{example}
+
+\begin{algo}{Rabin-Karp-Algorithmus}
+    Der \emph{Rabin-Karp-Algorithmus} funktioniert sehr ähnlich zur naiver Textsuche.
+    Im Gegensatz wird hier aber der Hashwert des jeweiligen Textfensters mit dem Hashwert des Musters verglichen.
+
+    Nur wenn beide Hashwerte gleich sind, werden die beiden zeichenweise verglichen.
+
+    Sind die Hashwerte verschieden, rückt das Textfenster einen Schritt weiter nach rechts.
+\end{algo}
+
+\begin{example}{Rabin-Karp-Algorithmus}
+    \textbf{Aufgabe:} Finde das Muster \texttt{ANE} im Text \texttt{BENANE} mithilfe des Rabin-Karp-Algorithmus.
+
+    Die Hashfunktion $h(x)$ sei gegeben durch die jeweile Position des Buchstaben $x$ im Alphabet.
+
+    \vspace{1em}
+
+    \centering
+
+    \begin{tabular}{|c|cccccc|c|c|c|}
+        \hline
+        \rowcolor{gray!25} \texttt{i} & \multicolumn{6}{c|}{Textfenster} & Hashwerte  & Überprüfung? & Ergebnis                                                                                                         \\
+        \hline
+        \multirow{2}{*}{0}            & \textbf{B}                       & \textbf{E} & \textbf{N}   & A          & N          & E          & $h(BEN) = 21$ & \multirow{2}{*}{$\lightning$} & \multirow{2}{*}{}         \\
+                                      & \textbf{A}                       & \textbf{N} & \textbf{E}   &            &            &            & $h(ANE) = 20$ &                               &                           \\
+        \hline
+        \multirow{2}{*}{1}            & B                                & \textbf{E} & \textbf{N}   & \textbf{A} & N          & E          & $h(ENA) = 20$ & \multirow{2}{*}{$\checkmark$} & \multirow{2}{*}{Mismatch} \\
+                                      &                                  & \textbf{A} & \textbf{N}   & \textbf{E} &            &            & $h(ANE) = 20$ &                               &                           \\
+        \hline
+        \multirow{2}{*}{2}            & B                                & E          & \textbf{N}   & \textbf{A} & \textbf{N} & E          & $h(NAN) = 29$ & \multirow{2}{*}{$\lightning$} & \multirow{2}{*}{}         \\
+                                      &                                  &            & \textbf{A}   & \textbf{N} & \textbf{E} &            & $h(ANE) = 20$ &                               &                           \\
+        \hline
+        \multirow{2}{*}{3}            & B                                & E          & N            & \textbf{A} & \textbf{N} & \textbf{E} & $h(ANE) = 20$ & \multirow{2}{*}{$\checkmark$} & \multirow{2}{*}{Match}    \\
+                                      &                                  &            &              & \textbf{A} & \textbf{N} & \textbf{E} & $h(ANE) = 20$ &                               &                           \\
+        \hline
+    \end{tabular}
+\end{example}
+
+% Reguläre Ausdrücke
+
+\subsection{Reguläre Ausdrücke}
+
+\begin{bonus}{Regulärer Ausdruck (Begriffe)}
+    \begin{itemize}
+        \item Zeichen
+              \begin{itemize}
+                  \item z.B. Buchstabe, Ziffer
+              \end{itemize}
+        \item Alphabet
+              \begin{itemize}
+                  \item endliche Menge von Zeichen
+                  \item z.B. $\Sigma = \{a, b, c\}$
+              \end{itemize}
+        \item Wort über Alphabet $\Sigma$
+              \begin{itemize}
+                  \item endliche Folge von Zeichen aus $\Sigma$
+                  \item z.B. $abcb$
+                  \item Spezialfall: leeres Wort $\varepsilon$
+              \end{itemize}
+        \item $\Sigma^*$
+              \begin{itemize}
+                  \item Menge aller Wörter über $\Sigma^*$
+                  \item z.B. $\Sigma = \{a, b\} \implies \Sigma^* = \{\varepsilon, a, b, aa, ab, ba, bb, aaa, \ldots\}$
+              \end{itemize}
+        \item Sprache $L$ über Alphabet $\Sigma$
+              \begin{itemize}
+                  \item Teilmenge $L \subseteq \Sigma^*$
+              \end{itemize}
+    \end{itemize}
+\end{bonus}
+
+\begin{defi}{Regulärer Ausdruck}
+    Ein \emph{regulärer Ausdruck} ist eine Formel, die eine Sprache beschreibt, d.h. eine Teilmenge aller möglichen Worte definiert.
+\end{defi}
+
+\begin{defi}{Verkettung}
+    Bei der \emph{Verkettung} (Concatenation) werden zwei oder mehrere Buchstaben durch diese Operation aneinandergehängt, z.B. $ab$.
+
+    Der Operator wird nicht mitgeschrieben.
+\end{defi}
+
+\begin{defi}{Alternative}
+    Die \emph{Alternative} erlaubt die Angabe alternativer Zeichen im Muster.
+
+    Schreibweise:
+    \begin{itemize}
+        \item $L((A \mid B)(A \mid B)) = \{AA, AB, BA, BB\}$
+        \item $L((A \mid C)((B \mid C)D)) = \{ABD, CBD, ACD, CCD\}$
+        \item $L(C(AC\mid B)D) = \{CACD, CBD\}$
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Hüllenbildung}
+    Die \emph{Hüllenbildung} (Closure) erlaubt es, Teile des Musters beliebig oft zu wiederholen.
+
+    Schreibweise: Hinter den zu wiederholenden Buchstaben wird ein Stern $^*$ gesetzt.
+    Sind mehrere Buchstaben zu wiederholen, müssen sie in Klammern gesetzt werden.
+    \begin{itemize}
+        \item $L(A^*) = \{\varepsilon, A, AA, AAA, \ldots\}$
+        \item $L((ABC)^*) = \{\varepsilon, ABC, ABCABC, ABCABCABC, \ldots\}$
+        \item $L(DA^*B) = \{DB, DAB, DAAB, DAAAB, \ldots\}$
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Perl Compatible Regular Expressions}
+    \emph{Perl Compatible Regular Expressions} (PCRE) ist eine Bibliothek zur Auswertung und Anwendung von regulären Ausdrücken.
+
+    Sie beinhaltet standardisierte Regeln zur Erzeugung regulärer Ausdrückt für die Textsuche.
+
+    Wichtige Regeln in PCRE sind:
+
+    \centering
+
+    \begin{tabular}{|>{\ttfamily}c|l|}
+        \hline
+        \rowcolor{gray!25} \multicolumn{2}{|c|}{Verknüpfungen}                                      \\
+        \hline
+        AB                               & Zeichenfolge $AB$                                        \\
+        A|B                              & $A$ oder $B$                                             \\
+        {[}AB{]}                         & Zeichenklasse $A$ oder $B$                               \\
+        \hline
+        \rowcolor{gray!25} \multicolumn{2}{|c|}{Quantoren}                                          \\
+        \hline
+        A\{n\}                           & $A$ kommt genau $n$-mal vor                              \\
+        A\{min,\}                        & $A$ kommt mindestent $\min$-mal vor                      \\
+        A\{min,max\}                     & $A$ kommt mindestens $\min$ und höchstens $\max$-mal vor \\
+        \hline
+        \rowcolor{gray!25} \multicolumn{2}{|c|}{Abkürzungen für Quantoren}                          \\
+        \hline
+        A?                               & entspricht \texttt{A\{0,1\}}                             \\
+        A*                               & entspricht \texttt{A\{0,\}}                              \\
+        A+                               & entspricht \texttt{A\{1,\}}                              \\
+        A                                & entspricht \texttt{A\{1\}}                               \\
+        \hline
+        \rowcolor{gray!25} \multicolumn{2}{|c|}{Zeichenklassen}                                     \\
+        \hline
+        \textbackslash w                 & Buchstaben (word)                                        \\
+        \textbackslash d                 & Zahlen (digit)                                           \\
+        .                                & Alles außer Zeilenvorschub                               \\
+        \hline
+        \rowcolor{gray!25} \multicolumn{2}{|c|}{Referenzen}                                         \\
+        \hline
+        ()                               & Gruppierung                                              \\
+        \textbackslash x \text{oder} \$x & $x$-te Rückwärtsreferenz                                 \\
+        \hline
+        \rowcolor{gray!25} \multicolumn{2}{|c|}{Greedy}                                             \\
+        \hline
+        (default)                        & Greedy                                                   \\
+        ?                                & Reluctant, non-greedy                                    \\
+        \hline
+    \end{tabular}
+\end{defi}
+
+\begin{defi}{Endlicher Automat}
+    Ein \emph{endlicher Automat} ist ein abstraktes Maschinenmodell.
+
+    Seine Aufgabe ist zu entscheiden, ob ein Wort zu einer Sprache gehört, die durch einen regulären Ausdruck beschrieben ist (Akzeptoren).
+
+    Am Anfang ist der Automat im \emph{Anfangszustand}.
+
+    In jedem Schritt wird eine \emph{Eingabesymbol} $\sigma$ gelesen und abhängig von $\sigma$ geht die Maschine von einem \emph{Zustand} in einen bestimmten anderen über.
+
+    Wenn nach Leses des letzten Zeichens ein \emph{Endzustand} erreicht ist, ist das Muster \emph{erkannt} und gehört damit zur Sprache.
+\end{defi}
+
+\begin{defi}{Konstruktionsverfahren nach Kleene}
+    Das \emph{Konstruktionsverfahren nach Kleene} erzeugt aus einer gegeben regulären Sprache einen \emph{nichtdeterministischen endlichen Automaten} (NEA).\footnote{Es existiert zu jedem NEA ein DEA.}
+
+    Die Grundlage ist das Zustands-Übergangs-Diagramm mit folgenden Elementen:
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=4em, auto, label distance=1em]
+            \node[initial,state,label=right:Anfangszustand] (start) {};
+            \node[state,label=right:(Zwischen-)Zustand] (middle) [below of=start] {};
+            \node[state,accepting,label=right:Endzustand] (end) [below of=middle] {};
+
+            \node[state, draw=none,label=right:{Zustandsübergang bei einem gegebenen Symbol}] (transition_right) [below of=end] {};
+            \node[state, draw=none] (transition_left) [left of=transition_right] {};
+
+            \node[state, draw=none,label=right:{$\varepsilon$-Übergang}] (eps_right) [below of=transition_right] {};
+            \node[state, draw=none] (eps_left) [left of=eps_right] {};
+
+            \path[->]
+            (transition_left) edge node {$a$} (transition_right)
+            (eps_left) edge node {$\varepsilon$} (eps_right) ;
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
+
+\begin{algo}{Konstruktion eines Automaten nach Kleene}
+    Einzelnes Symbol: Regulärer Ausdruck \texttt{a}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=4em, auto]
+            \node[initial, state] (start) {};
+            \node[state, accepting] (end) [right of=start] {};
+
+            \path[->]
+            (start) edge node {$a$} (end) ;
+        \end{tikzpicture}
+    \end{center}
+
+    Verkettung: Regulärer Ausdruck \texttt{ab}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=4em, auto]
+            \node[initial, state] (start) {};
+            \node[state] (q1) [right of=start] {};
+            \node[state, accepting] (end) [right of=q1] {};
+
+            \path[->]
+            (start) edge node {$a$} (q1)
+            (q1) edge node {$b$} (end) ;
+        \end{tikzpicture}
+    \end{center}
+
+    Alternative: Regulärer Ausdruck \texttt{a|b}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=4em, auto]
+            \node[initial, state] (start) {};
+            \node[state] (q1) [above right of=start] {};
+            \node[state] (q2) [below right of=start] {};
+            \node[state] (q3) [right of=q1] {};
+            \node[state] (q4) [right of=q2] {};
+            \node[state, accepting] (end) [below right of=q3] {};
+
+            \path[->]
+            (start) edge node {$\varepsilon$} (q1)
+            (start) edge node {$\varepsilon$} (q2)
+            (q1) edge node {$a$} (q3)
+            (q2) edge node {$b$} (q4)
+            (q3) edge node {$\varepsilon$} (end)
+            (q4) edge node {$\varepsilon$} (end) ;
+        \end{tikzpicture}
+    \end{center}
+
+    Hüllenbildung: Regulärer Ausdruck \texttt{a*}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=4em, auto]
+            \node[initial, state] (start) {};
+            \node[state] (q1) [right of=start] {};
+            \node[state] (q2) [right of=q1] {};
+            \node[state, accepting] (end) [right of=q2] {};
+
+            \path[->]
+            (start) edge node {$\varepsilon$} (q1)
+            (q1) edge node {$a$} (q2)
+            (q2) edge [bend right=90] node[above] {$\varepsilon$} (q1)
+            (q2) edge node {$\varepsilon$} (end)
+            (start) edge [bend right=45] node {$\varepsilon$} (end) ;
+        \end{tikzpicture}
+    \end{center}
+\end{algo}
+
+\begin{example}{Konstruktion eines Automaten nach Kleene}
+    Aufbau des Automaten für den regulären Ausdruck \texttt{a|a(a|b)*a}
+
+    1. Schritt: \texttt{\textcolor{red}{a|b}}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=4em, auto, red]
+            \node[state] (start) {};
+            \node[state] (q1) [above right of=start] {};
+            \node[state] (q2) [below right of=start] {};
+            \node[state] (q3) [right of=q1] {};
+            \node[state] (q4) [right of=q2] {};
+            \node[state, accepting] (end) [below right of=q3] {};
+
+            \path[->]
+            (start) edge node {$\varepsilon$} (q1)
+            (start) edge node {$\varepsilon$} (q2)
+            (q1) edge node {$a$} (q3)
+            (q2) edge node {$b$} (q4)
+            (q3) edge node {$\varepsilon$} (end)
+            (q4) edge node {$\varepsilon$} (end) ;
+        \end{tikzpicture}
+    \end{center}
+
+    2. Schritt: \texttt{\textcolor{red}{(}a|b\textcolor{red}{)*}}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=2em,auto]
+
+            \node[state, new] (q3) {};
+            \node[state] (q4) [right=of q3] {};
+            \node[state] (q5) [above right=of q4] {};
+            \node[state] (q6) [below right=of q4] {};
+            \node[state] (q7) [right=of q5] {};
+            \node[state] (q8) [right=of q6] {};
+            \node[state] (q9) [below right=of q7] {};
+            \node[state, new] (q10) [right=of q9] {};
+
+            \path[->]
+            (q3) edge [new] node [new] {$\varepsilon$} (q4)
+            (q4) edge node {$\varepsilon$} (q5)
+            (q4) edge node {$\varepsilon$} (q6)
+            (q5) edge node {$a$} (q7)
+            (q6) edge node {$b$} (q8)
+            (q7) edge node {$\varepsilon$} (q9)
+            (q8) edge node {$\varepsilon$} (q9)
+            (q9) edge [new] node [new] {$\varepsilon$} (q10)
+
+            (q9) edge [new, bend left=90,min distance=6em] node [new, above] {$\varepsilon$} (q4)
+            (q3) edge [new, bend right=90,min distance=8em] node [new] {$\varepsilon$} (q10)
+            ;
+        \end{tikzpicture}
+    \end{center}
+
+    3. Schritt: \texttt{\textcolor{red}{a}(a|b)*\textcolor{red}{a}}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=2em, auto]
+            \node[state, new] (q2) [below right=of start] {};
+
+            \node[state] (q3) [right=of q2] {};
+            \node[state] (q4) [right=of q3] {};
+            \node[state] (q5) [above right=of q4] {};
+            \node[state] (q6) [below right=of q4] {};
+            \node[state] (q7) [right=of q5] {};
+            \node[state] (q8) [right=of q6] {};
+            \node[state] (q9) [below right=of q7] {};
+            \node[state] (q10) [right=of q9] {};
+            \node[state, new] (q11) [right=of q10] {};
+
+            \path[->]
+            (q2) edge [new] node [new] {$a$} (q3)
+            (q3) edge node {$\varepsilon$} (q4)
+            (q4) edge node {$\varepsilon$} (q5)
+            (q4) edge node {$\varepsilon$} (q6)
+            (q5) edge node {$a$} (q7)
+            (q6) edge node {$b$} (q8)
+            (q7) edge node {$\varepsilon$} (q9)
+            (q8) edge node {$\varepsilon$} (q9)
+            (q9) edge node {$\varepsilon$} (q10)
+            (q10) edge [new] node [new] {$a$} (q11)
+
+            (q9) edge [bend left=90,min distance=6em] node [above] {$\varepsilon$} (q4)
+            (q3) edge [bend right=90,min distance=8em] node {$\varepsilon$} (q10)
+            ;
+        \end{tikzpicture}
+    \end{center}
+
+    4. Schritt: \texttt{\textcolor{red}{a|}(a|b)*a}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=2em, auto, every initial by arrow/.style={red}]
+            \node[initial, state, new] (start) {};
+            \node[state, new] (q1) [above right=of start] {};
+            \node[state] (q2) [below right=of start] {};
+
+            \node[state] (q3) [right=of q2] {};
+            \node[state] (q4) [right=of q3] {};
+            \node[state] (q5) [above right=of q4] {};
+            \node[state] (q6) [below right=of q4] {};
+            \node[state] (q7) [right=of q5] {};
+            \node[state] (q8) [right=of q6] {};
+            \node[state] (q9) [below right=of q7] {};
+            \node[state] (q10) [right=of q9] {};
+            \node[state] (q11) [right=of q10] {};
+            \node[state, accepting, new] (end) [above right=of q11] {};
+            \node[state, new] (q12) [above left=of end] {};
+
+            \path[->]
+            (start) edge [new] node [new] {$\varepsilon$} (q1)
+            (start) edge [new] node [new] {$\varepsilon$} (q2)
+            (q2) edge node {$a$} (q3)
+            (q3) edge node {$\varepsilon$} (q4)
+            (q4) edge node {$\varepsilon$} (q5)
+            (q4) edge node {$\varepsilon$} (q6)
+            (q5) edge node {$a$} (q7)
+            (q6) edge node {$b$} (q8)
+            (q7) edge node {$\varepsilon$} (q9)
+            (q8) edge node {$\varepsilon$} (q9)
+            (q9) edge node {$\varepsilon$} (q10)
+            (q10) edge node {$a$} (q11)
+            (q11) edge [new] node [new] {$\varepsilon$} (end)
+            (q12) edge [new] node [new] {$\varepsilon$} (end)
+            (q1) edge [new] node [new] {$a$} (q12)
+
+            (q9) edge [bend left=90,min distance=6em] node [above] {$\varepsilon$} (q4)
+            (q3) edge [bend right=90,min distance=8em] node {$\varepsilon$} (q10)
+            ;
+        \end{tikzpicture}
+    \end{center}
+\end{example}
+
+\begin{algo}{Ablaufregeln der Simulation nach Kleene}
+    \begin{enumerate}
+        \item Initialisierung
+              \begin{enumerate}
+                  \item Markiere den Anfangszustand
+                  \item Markiere alle Zustande, die durch $\varepsilon$-Übergänge erreichbar sind.
+              \end{enumerate}
+        \item Für jedes gelesene Eingabesymbol
+              \begin{enumerate}
+                  \item Markiere alle Zustände, die durch dieses Eingabeymbol erreichbar sind.
+                  \item Lösche alle anderen Zustände.
+                  \item Markiere alle Zustände, die jetzt durch $\varepsilon$-Übergänge erreichbar sind.
+              \end{enumerate}
+    \end{enumerate}
+\end{algo}
+
+\begin{example}{Ablauf der Simulation nach Kleene}
+    \textbf{Aufgabe:} Prüfen Sie, ob das Wort \texttt{abba} von dem Automaten der regulären Sprache \texttt{a|a(a|b)*a} akzeptiert wird.
+
+    Anfangszustand:
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=2em, auto, every initial by arrow/.style={teal}]
+            \node[initial, state, current] (start) {};
+            \node[state, marked] (q1) [above right=of start] {};
+            \node[state, marked] (q2) [below right=of start] {};
+
+            \node[state] (q3) [right=of q2] {};
+            \node[state] (q4) [right=of q3] {};
+            \node[state] (q5) [above right=of q4] {};
+            \node[state] (q6) [below right=of q4] {};
+            \node[state] (q7) [right=of q5] {};
+            \node[state] (q8) [right=of q6] {};
+            \node[state] (q9) [below right=of q7] {};
+            \node[state] (q10) [right=of q9] {};
+            \node[state] (q11) [right=of q10] {};
+            \node[state, accepting] (end) [above right=of q11] {};
+            \node[state] (q12) [above left=of end] {};
+
+            \path[->]
+            (start) edge [teal] node [teal] {$\varepsilon$} (q1)
+            (start) edge [teal] node [teal] {$\varepsilon$} (q2)
+            (q2) edge node {$a$} (q3)
+            (q3) edge node {$\varepsilon$} (q4)
+            (q4) edge node {$\varepsilon$} (q5)
+            (q4) edge node {$\varepsilon$} (q6)
+            (q5) edge node {$a$} (q7)
+            (q6) edge node {$b$} (q8)
+            (q7) edge node {$\varepsilon$} (q9)
+            (q8) edge node {$\varepsilon$} (q9)
+            (q9) edge node {$\varepsilon$} (q10)
+            (q10) edge node {$a$} (q11)
+            (q11) edge node {$\varepsilon$} (end)
+            (q12) edge node {$\varepsilon$} (end)
+            (q1) edge node {$a$} (q12)
+
+            (q9) edge [bend left=90,min distance=6em] node [above] {$\varepsilon$} (q4)
+            (q3) edge [bend right=90,min distance=8em] node {$\varepsilon$} (q10)
+            ;
+        \end{tikzpicture}
+    \end{center}
+
+    1. Buchstabe: \texttt{a}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=2em, auto]
+            \node[initial, state] (start) {};
+            \node[state] (q1) [above right=of start] {};
+            \node[state] (q2) [below right=of start] {};
+
+            \node[state, current] (q3) [right=of q2] {};
+            \node[state, marked] (q4) [right=of q3] {};
+            \node[state, marked] (q5) [above right=of q4] {};
+            \node[state, marked] (q6) [below right=of q4] {};
+            \node[state] (q7) [right=of q5] {};
+            \node[state] (q8) [right=of q6] {};
+            \node[state] (q9) [below right=of q7] {};
+            \node[state, marked] (q10) [right=of q9] {};
+            \node[state] (q11) [right=of q10] {};
+            \node[state, accepting, marked] (end) [above right=of q11] {};
+            \node[state, current] (q12) [above left=of end] {};
+
+            \path[->]
+            (start) edge node {$\varepsilon$} (q1)
+            (start) edge node {$\varepsilon$} (q2)
+            (q2) edge [blue] node [blue] {$a$} (q3)
+            (q3) edge [teal] node [teal] {$\varepsilon$} (q4)
+            (q4) edge [teal] node [teal] {$\varepsilon$} (q5)
+            (q4) edge [teal] node [teal] {$\varepsilon$} (q6)
+            (q5) edge node {$a$} (q7)
+            (q6) edge node {$b$} (q8)
+            (q7) edge node {$\varepsilon$} (q9)
+            (q8) edge node {$\varepsilon$} (q9)
+            (q9) edge node {$\varepsilon$} (q10)
+            (q10) edge node {$a$} (q11)
+            (q11) edge node {$\varepsilon$} (end)
+            (q12) edge node {$\varepsilon$} (end)
+            (q1) edge [blue] node [blue] {$a$} (q12)
+
+            (q9) edge [bend left=90,min distance=6em] node [above] {$\varepsilon$} (q4)
+            (q3) edge [teal] [bend right=90,min distance=8em] node [teal] {$\varepsilon$} (q10)
+            ;
+        \end{tikzpicture}
+    \end{center}
+\end{example}
+
+\begin{example}{Ablauf der Simulation nach Kleene (Fortsetzung)}
+
+    2. Buchstabe: \texttt{b}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=2em, auto]
+            \node[initial, state] (start) {};
+            \node[state] (q1) [above right=of start] {};
+            \node[state] (q2) [below right=of start] {};
+
+            \node[state] (q3) [right=of q2] {};
+            \node[state, marked] (q4) [right=of q3] {};
+            \node[state, marked] (q5) [above right=of q4] {};
+            \node[state, marked] (q6) [below right=of q4] {};
+            \node[state] (q7) [right=of q5] {};
+            \node[state, current] (q8) [right=of q6] {};
+            \node[state, marked] (q9) [below right=of q7] {};
+            \node[state, marked] (q10) [right=of q9] {};
+            \node[state] (q11) [right=of q10] {};
+            \node[state, accepting] (end) [above right=of q11] {};
+            \node[state] (q12) [above left=of end] {};
+
+            \path[->]
+            (start) edge node {$\varepsilon$} (q1)
+            (start) edge node {$\varepsilon$} (q2)
+            (q2) edge node {$a$} (q3)
+            (q3) edge node {$\varepsilon$} (q4)
+            (q4) edge [teal] node [teal] {$\varepsilon$} (q5)
+            (q4) edge [teal] node [teal] {$\varepsilon$} (q6)
+            (q5) edge node {$a$} (q7)
+            (q6) edge [blue] node [blue] {$b$} (q8)
+            (q7) edge node {$\varepsilon$} (q9)
+            (q8) edge [teal] node [teal] {$\varepsilon$} (q9)
+            (q9) edge [teal] node [teal] {$\varepsilon$} (q10)
+            (q10) edge node {$a$} (q11)
+            (q11) edge node {$\varepsilon$} (end)
+            (q12) edge node {$\varepsilon$} (end)
+            (q1) edge node {$a$} (q12)
+
+            (q9) edge [teal] [bend left=90,min distance=6em] node [teal] [above] {$\varepsilon$} (q4)
+            (q3) edge [bend right=90,min distance=8em] node {$\varepsilon$} (q10)
+            ;
+        \end{tikzpicture}
+    \end{center}
+
+    3. Buchstabe: \texttt{b}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=2em, auto]
+            \node[initial, state] (start) {};
+            \node[state] (q1) [above right=of start] {};
+            \node[state] (q2) [below right=of start] {};
+
+            \node[state] (q3) [right=of q2] {};
+            \node[state, marked] (q4) [right=of q3] {};
+            \node[state, marked] (q5) [above right=of q4] {};
+            \node[state, marked] (q6) [below right=of q4] {};
+            \node[state] (q7) [right=of q5] {};
+            \node[state, current] (q8) [right=of q6] {};
+            \node[state, marked] (q9) [below right=of q7] {};
+            \node[state, marked] (q10) [right=of q9] {};
+            \node[state] (q11) [right=of q10] {};
+            \node[state, accepting] (end) [above right=of q11] {};
+            \node[state] (q12) [above left=of end] {};
+
+            \path[->]
+            (start) edge node {$\varepsilon$} (q1)
+            (start) edge node {$\varepsilon$} (q2)
+            (q2) edge node {$a$} (q3)
+            (q3) edge node {$\varepsilon$} (q4)
+            (q4) edge [teal] node [teal] {$\varepsilon$} (q5)
+            (q4) edge [teal] node [teal] {$\varepsilon$} (q6)
+            (q5) edge node {$a$} (q7)
+            (q6) edge [blue] node [blue] {$b$} (q8)
+            (q7) edge node {$\varepsilon$} (q9)
+            (q8) edge [teal] node [teal] {$\varepsilon$} (q9)
+            (q9) edge [teal] node [teal] {$\varepsilon$} (q10)
+            (q10) edge node {$a$} (q11)
+            (q11) edge node {$\varepsilon$} (end)
+            (q12) edge node {$\varepsilon$} (end)
+            (q1) edge node {$a$} (q12)
+
+            (q9) edge [teal] [bend left=90,min distance=6em] node [teal] [above] {$\varepsilon$} (q4)
+            (q3) edge [bend right=90,min distance=8em] node {$\varepsilon$} (q10)
+            ;
+        \end{tikzpicture}
+    \end{center}
+
+    4. Buchstabe: \texttt{a}
+
+    \begin{center}
+        \begin{tikzpicture}[node distance=2em, auto]
+            \node[initial, state] (start) {};
+            \node[state] (q1) [above right=of start] {};
+            \node[state] (q2) [below right=of start] {};
+
+            \node[state] (q3) [right=of q2] {};
+            \node[state, marked] (q4) [right=of q3] {};
+            \node[state, marked] (q5) [above right=of q4] {};
+            \node[state, marked] (q6) [below right=of q4] {};
+            \node[state, current] (q7) [right=of q5] {};
+            \node[state] (q8) [right=of q6] {};
+            \node[state, marked] (q9) [below right=of q7] {};
+            \node[state, marked] (q10) [right=of q9] {};
+            \node[state, current] (q11) [right=of q10] {};
+            \node[state, accepting, marked] (end) [above right=of q11] {};
+            \node[state] (q12) [above left=of end] {};
+
+            \path[->]
+            (start) edge node {$\varepsilon$} (q1)
+            (start) edge node {$\varepsilon$} (q2)
+            (q2) edge node {$a$} (q3)
+            (q3) edge node {$\varepsilon$} (q4)
+            (q4) edge [teal] node [teal] {$\varepsilon$} (q5)
+            (q4) edge [teal] node [teal] {$\varepsilon$} (q6)
+            (q5) edge [blue] node [blue] {$a$} (q7)
+            (q6) edge node {$b$} (q8)
+            (q7) edge [teal] node [teal] {$\varepsilon$} (q9)
+            (q8) edge node {$\varepsilon$} (q9)
+            (q9) edge [teal] node [teal] {$\varepsilon$} (q10)
+            (q10) edge [blue] node [blue] {$a$} (q11)
+            (q11) edge [teal] node [teal] {$\varepsilon$} (end)
+            (q12) edge node {$\varepsilon$} (end)
+            (q1) edge node {$a$} (q12)
+
+            (q9) edge [teal] [bend left=90,min distance=6em] node [teal] [above] {$\varepsilon$} (q4)
+            (q3) edge [bend right=90,min distance=8em] node {$\varepsilon$} (q10)
+            ;
+        \end{tikzpicture}
+    \end{center}
+
+    Damit wird \texttt{abba} durch den regulären Ausdruck \texttt{a|a(a|b)*a} beschrieben.
+\end{example}
\ No newline at end of file
diff --git a/algo/graphen.tex b/algo/graphen.tex
index 529608732f071bd78f6d4df0234db3556437897f..57288673d14c5f91ce4c91ace14c421a68029e03 100644
--- a/algo/graphen.tex
+++ b/algo/graphen.tex
@@ -1,1525 +1,1640 @@
-\section{Graphen}
-
-\begin{defi}{Gerichteter Graph}
-    Ein \emph{gerichteter Graph} $G = (V, E)$ besteht aus
-    \begin{itemize}
-        \item einer endlichen, nicht leeren Menge $V = \{v_1, \ldots, v_n\}$ von \emph{Knoten (vertices)} und
-        \item einer Relation $E \subseteq V \times V$ von geordneten Paaren $e = (u, v)$ den \emph{Kanten (edges)}.
-    \end{itemize}
-
-    Jede Kante $(u,v) \in E$ hat einen Anfangsknoten $u$ und einen Enknoten $v$ und damit eine Richtung von $u$ nach $v$ ($u=v$ ist möglich).
-
-    \begin{center}
-        \begin{tikzpicture}[->]
-            \node[draw, circle] (1) {1};
-            \node[draw, circle, below=of 1] (2) {2};
-            \node[draw, circle, right=of 2] (3) {3};
-            \node[draw, circle, above=of 3] (4) {4};
-            \node[draw, circle, right=of 4] (5) {5};
-
-            %\draw[->] (1) to[bend left=15] (4);
-            %\draw[->] (4) to[bend left=15] (1);
-            %\draw[->] (1) to (2);
-            %\draw[->] (2) to (3);
-            %\draw[->] (3) to (4);
-            %\draw[->] (4) to (5);
-
-            \path (1) edge[bend left=15] (4);
-            \path (4) edge[bend left=15] (1);
-            \path (1) edge (2);
-            \path (2) edge (3);
-            \path (3) edge (4);
-            \path (4) edge (5);
-            \path (5) edge[loop above] (5);
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
-
-\begin{defi}{Ungerichteter Graph}
-    Ein \emph{ungerichteter Graph} $G = (V, E)$ besteht aus
-    \begin{itemize}
-        \item einer endlichen, nicht leeren Menge $V = \{v_1, \ldots, v_n\}$ von \emph{Knoten (vertices)} und
-        \item einer symmetrischen Relation $E \subseteq V \times V$ von geordneten Paaren $e = (u, v) \iff (v, u)$ den \emph{Kanten (edges)}.
-    \end{itemize}
-
-    Jede Kante $(u,v) \in E$ hat einen Anfangsknoten $u$ und einen Enknoten $v$ und damit eine Richtung von $u$ nach $v$ ($u=v$ ist möglich).
-
-    \vspace{1em}
-    \begin{center}
-        \begin{tikzpicture}
-            \node[draw, circle] (1) {1};
-            \node[draw, circle, below=of 1] (2) {2};
-            \node[draw, circle, right=of 2] (3) {3};
-            \node[draw, circle, above=of 3] (4) {4};
-            \node[draw, circle, right=of 4] (5) {5};
-
-            %\draw[->] (1) to[bend left=15] (4);
-            %\draw[->] (4) to[bend left=15] (1);
-            %\draw[->] (1) to (2);
-            %\draw[->] (2) to (3);
-            %\draw[->] (3) to (4);
-            %\draw[->] (4) to (5);
-
-            \path (1) edge (4);
-            \path (1) edge (2);
-            \path (2) edge (3);
-            \path (3) edge (4);
-            \path (4) edge (5);
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
-
-\begin{defi}{Gewichteter Graph}
-    Ein Graph heißt \emph{gewichtet}, wenn jeder Kante ein Wert als \emph{Gewicht} zugeordnet ist (z.B. Transportkosten, Entfernung).
-
-    \begin{center}
-        \begin{tikzpicture}[->]
-            \node[draw, circle] (1) {1};
-            \node[draw, circle, below=of 1] (2) {2};
-            \node[draw, circle, right=of 2] (3) {3};
-            \node[draw, circle, above=of 3] (4) {4};
-            \node[draw, circle, right=of 4] (5) {5};
-
-            %\draw[->] (1) to[bend left=15] (4);
-            %\draw[->] (4) to[bend left=15] (1);
-            %\draw[->] (1) to (2);
-            %\draw[->] (2) to (3);
-            %\draw[->] (3) to (4);
-            %\draw[->] (4) to (5);
-
-            \path (1) edge[bend left=15] node[above,scale=0.7] {2} (4);
-            \path (4) edge[bend left=15] node[below,scale=0.7] {1} (1);
-            \path (1) edge node[left,scale=0.7] {2} (2);
-            \path (2) edge node[above,scale=0.7] {1} (3);
-            \path (3) edge node[right,scale=0.7] {8} (4);
-            \path (4) edge node[above,scale=0.7] {1} (5);
-            \path (5) edge[loop above] node[above,scale=0.7] {2} (5);
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
-
-\begin{defi}{Teilgraph}
-    $G' = (V', E')$ heißt \emph{Teilgraph} von $G=(V, E)$, wenn gilt:
-    $$
-        V' \subseteq V \quad \text{und} \quad E' \subseteq E
-    $$
-\end{defi}
-
-\begin{defi}{Weg}
-    Sei $G = (V, E)$ ein Graph.
-
-    Eine Folge von Knoten
-    $$
-        W := (v_1, v_2, \ldots, v_n)
-    $$
-    heißt \emph{Weg} oder \emph{Pfad} in $G$, falls gilt:
-    $$
-        \forall 1 \leq i \leq n-1 : (v_i, v_{i+1}) \in E
-    $$
-    (also eine Folge von zusammenhängenden Kanten)
-
-    $\alpha(W) := v_1$ heißt \emph{Anfangsknoten} des Weges $W$.
-
-    $\omega(W) := v_n$ heißt \emph{Endknoten} des Weges $W$.
-
-    $\forall v_i \in V : (v_i)$ heißt \emph{trivialer Weg} und ist stets ein Weg in $G$.
-
-    Die \emph{Länge eines Weges} ist $l(W) := n-1$, falls $n$ Knoten auf diesem Weg besucht werden.
-
-    Ein Weg heißt \emph{einfacher Weg}, wenn kein Knoten (ausgenommen Start- und Endknoten) mehr als einmal vorkommt.
-
-    Ein \emph{Zykel} oder \emph{Kreis} ist ein nicht-trivialer einfacher Weg mit der Bedingung $\alpha(W) = \omega(W)$.
-\end{defi}
-
-\begin{defi}{Adjazenz}
-    Zwei Knoten heißen \emph{adjazent (benachbart)}, wenn sie eine Kante verbindet.
-\end{defi}
-
-\begin{bonus}{Speicherung von Graphen}
-    \begin{itemize}
-        \item Kantenorientiert
-              \begin{itemize}
-                  \item Index für Kanten
-                  \item für jede Kante speichern: Vorgänger-, Nachfolgerknoten (Markierung, Gewicht)
-                  \item meist statische Darstellung, z.B. Kantenliste
-              \end{itemize}
-        \item Knotenorientiert
-              \begin{itemize}
-                  \item gebräuchlicher als kantenorientiert
-                  \item in vielen Ausprägungen, z.B. Knotenliste, Adjazenzmatrix, Adjazenzliste
-                  \item für Adjazenzmatrix gilt:
-                        $$
-                            A_{ij} = \begin{cases}
-                                1 & \text{, falls} \ (i, j) \in E \\
-                                0 & \text{, sonst}
-                            \end{cases}
-                        $$
-              \end{itemize}
-    \end{itemize}
-\end{bonus}
-
-\begin{example}{Adjazenzmatrix}
-    \begin{center}
-        \begin{tikzpicture}[->]
-            \node[draw, circle] (1) {1};
-            \node[draw, circle, below left=of 1] (3) {3};
-            \node[draw, circle, below right=of 1] (4) {4};
-            \node[draw, circle, above right=of 4] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-    \end{center}
-
-    Für den Graphen $G$ oben gilt die Adjazenzmatrix:
-    $$
-        A(G) = \vektor{
-            0 & 1 & 1 & 0 & 0 & 0 \\
-            0 & 0 & 0 & 0 & 0 & 0 \\
-            1 & 0 & 0 & 1 & 0 & 1 \\
-            1 & 0 & 0 & 0 & 0 & 0 \\
-            0 & 0 & 1 & 0 & 1 & 0 \\
-            0 & 1 & 0 & 1 & 1 & 0
-        }
-    $$
-\end{example}
-
-\begin{example}{Adjazenzliste}
-    \begin{center}
-        \begin{tikzpicture}[->]
-            \node[draw, circle] (1) {1};
-            \node[draw, circle, below left=of 1] (3) {3};
-            \node[draw, circle, below right=of 1] (4) {4};
-            \node[draw, circle, above right=of 4] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-    \end{center}
-
-    Für den Graphen $G$ oben gilt die Adjazenzliste:
-
-    \vspace{1em}
-
-    \begin{center}
-        \begin{tikzpicture}[
-            start chain = going below,
-            StackBlock/.style={minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-            every node/.style={draw, label distance=0.5em},
-            node distance=0em
-            ]
-            {
-            \node [StackBlock] (k1) {$1$};
-            \node [StackBlock,yshift=-0.5em] (k2) {$2$};
-            \node [StackBlock,yshift=-0.5em] (k3) {$3$};
-            \node [StackBlock,yshift=-0.5em] (k4) {$4$};
-            \node [StackBlock,yshift=-0.5em] (k5) {$5$};
-            \node [StackBlock,yshift=-0.5em] (k6) {$6$};
-
-            % Chain 1
-            { [continue chain = going right]
-            \chainin (k1);
-
-            \node [StackBlock, xshift=2em] (12) {$2$};
-            \node [StackBlock] (12p) {};
-            \node [StackBlock, xshift=2em] (13) {$3$};
-            \node [StackBlock] (13p) {};
-            }
-
-            % Chain 3
-            { [continue chain = going right]
-            \chainin (k3);
-
-            \node [StackBlock, xshift=2em] (31) {$1$};
-            \node [StackBlock] (31p) {};
-            \node [StackBlock, xshift=2em] (34) {$4$};
-            \node [StackBlock] (34p) {};
-            \node [StackBlock, xshift=2em] (36) {$6$};
-            \node [StackBlock] (36p) {};
-            }
-
-            % Chain 4
-            { [continue chain = going right]
-            \chainin (k4);
-
-            \node [StackBlock, xshift=2em] (41) {$1$};
-            \node [StackBlock] (41p) {};
-            }
-
-            % Chain 5
-            { [continue chain = going right]
-            \chainin (k5);
-
-            \node [StackBlock, xshift=2em] (53) {$3$};
-            \node [StackBlock] (53p) {};
-            \node [StackBlock, xshift=2em] (55) {$5$};
-            \node [StackBlock] (55p) {};
-            }
-
-            % Chain 6
-            { [continue chain = going right]
-            \chainin (k6);
-
-            \node [StackBlock, xshift=2em] (62) {$2$};
-            \node [StackBlock] (62p) {};
-            \node [StackBlock, xshift=2em] (64) {$4$};
-            \node [StackBlock] (64p) {};
-            \node [StackBlock, xshift=2em] (65) {$5$};
-            \node [StackBlock] (65p) {};
-            }
-
-            \draw[->] (k1.east) [out=0, in=180] to (12.west);
-            \draw[->] (k3.east) [out=0, in=180] to (31.west);
-            \draw[->] (k4.east) [out=0, in=180] to (41.west);
-            \draw[->] (k5.east) [out=0, in=180] to (53.west);
-            \draw[->] (k6.east) [out=0, in=180] to (62.west);
-
-            \draw[->] (12p.center) [out=0, in=180] to (13.west);
-
-            \draw[->] (31p.center) [out=0, in=180] to (34.west);
-            \draw[->] (34p.center) [out=0, in=180] to (36.west);
-
-            \draw[->] (53p.center) [out=0, in=180] to (55.west);
-
-            \draw[->] (62p.center) [out=0, in=180] to (64.west);
-            \draw[->] (64p.center) [out=0, in=180] to (65.west);
-            }
-        \end{tikzpicture}
-    \end{center}
-\end{example}
-
-\subsection{Suche}
-
-\begin{algo}{Breitensuche}
-    \begin{enumerate}
-        \item Zunächst werden alle Knoten als \glqq noch nicht besucht\grqq markiert.
-        \item Startpunkt $v$ wählen und als \glqq besucht\grqq markieren.
-        \item Jetzt:
-              \begin{enumerate}
-                  \item alle von $v$ aus direkt erreichbaren (nicht besuchten) Knoten \glqq besuchen\grqq
-                  \item alle von $v$ über zwei Kanten erreichbaren (nicht besuchten) Knoten \glqq besuchen\grqq
-                  \item $\ldots$
-              \end{enumerate}
-        \item Wenn noch nicht alle Knoten besucht worden sind, wähle einen neuen unbesuchten Startpunkt $v$ und beginne bei Schritt 3
-    \end{enumerate}
-
-    Start bei Knoten 1.
-
-    \begin{center}
-        \begin{tikzpicture}[->]
-            \node[draw, circle, current] (1) {1};
-            \node[draw, circle, below left=of 1] (3) {3};
-            \node[draw, circle, below right=of 1] (4) {4};
-            \node[draw, circle, above right=of 4] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1, current] (3) {3};
-            \node[draw, circle, below right=of 1] (4) {4};
-            \node[draw, circle, above right=of 4, current] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        %\hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1, visited] (3) {3};
-            \node[draw, circle, below right=of 1, current] (4) {4};
-            \node[draw, circle, above right=of 4, visited] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4, current] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1, visited] (3) {3};
-            \node[draw, circle, below right=of 1, visited] (4) {4};
-            \node[draw, circle, above right=of 4, visited] (2) {2};
-            \node[draw, circle, below=of 3, current] (5) {5};
-            \node[draw, circle, below=of 4, visited] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        %\hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1, visited] (3) {3};
-            \node[draw, circle, below right=of 1, visited] (4) {4};
-            \node[draw, circle, above right=of 4, visited] (2) {2};
-            \node[draw, circle, below=of 3, visited] (5) {5};
-            \node[draw, circle, below=of 4, visited] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-    \end{center}
-\end{algo}
-
-\begin{algo}{Tiefensuche}
-    \begin{enumerate}
-        \item Zunächst alle Knoten als \glqq noch nicht besucht\grqq markieren.
-        \item Startpunkt $v$ wählen und als \glqq besucht\grqq markieren.
-        \item Von dort aus möglichst langen Pfad entlang gehen; dabei nur bisher nicht besuchte Knoten \glqq besuchen\grqq
-        \item Wenn dann noch nicht alle Knoten besucht worden sind, wähle einen neuen unbesuchten Startpunkt $v$ und beginne bei Schritt 3
-    \end{enumerate}
-
-    Start bei Knoten 1.
-
-    \begin{center}
-        \begin{tikzpicture}[->]
-            \node[draw, circle, current] (1) {1};
-            \node[draw, circle, below left=of 1] (3) {3};
-            \node[draw, circle, below right=of 1] (4) {4};
-            \node[draw, circle, above right=of 4] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1] (3) {3};
-            \node[draw, circle, below right=of 1] (4) {4};
-            \node[draw, circle, above right=of 4, current] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        %\hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1, current] (3) {3};
-            \node[draw, circle, below right=of 1] (4) {4};
-            \node[draw, circle, above right=of 4, visited] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1, visited] (3) {3};
-            \node[draw, circle, below right=of 1, current] (4) {4};
-            \node[draw, circle, above right=of 4, visited] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        %\hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1, visited] (3) {3};
-            \node[draw, circle, below right=of 1, visited] (4) {4};
-            \node[draw, circle, above right=of 4, visited] (2) {2};
-            \node[draw, circle, below=of 3] (5) {5};
-            \node[draw, circle, below=of 4, current] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1, visited] (3) {3};
-            \node[draw, circle, below right=of 1, visited] (4) {4};
-            \node[draw, circle, above right=of 4, visited] (2) {2};
-            \node[draw, circle, below=of 3, current] (5) {5};
-            \node[draw, circle, below=of 4, visited] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-        %
-        %\hspace{5em}
-        %
-        \begin{tikzpicture}[->]
-            \node[draw, circle, visited] (1) {1};
-            \node[draw, circle, below left=of 1, visited] (3) {3};
-            \node[draw, circle, below right=of 1, visited] (4) {4};
-            \node[draw, circle, above right=of 4, visited] (2) {2};
-            \node[draw, circle, below=of 3, visited] (5) {5};
-            \node[draw, circle, below=of 4, visited] (6) {6};
-
-            \path (5) edge[loop below] (5);
-            \path (1) edge[bend left=15] (3);
-            \path (3) edge[bend left=15] (1);
-            \path (4) edge (1);
-            \path (1) edge (2);
-            \path (3) edge (4);
-            \path (5) edge (3);
-            \path (3) edge (6);
-            \path (6) edge (4);
-            \path (6) edge (5);
-            \path (6) edge (2);
-        \end{tikzpicture}
-    \end{center}
-\end{algo}
-
-\begin{defi}{Level-Order-Baumdurchlauf}
-    Führt man eine Breitensuche bei Bäumen aus, stellt man fest:
-    \begin{itemize}
-        \item Es ist nicht nötig, die Knoten zu markieren.
-        \item Der Baum wird Ebene für Ebene durchlaufen,
-    \end{itemize}
-
-    Diesen Durchlauf nennt man \emph{Level-Order-Durchlauf}.
-\end{defi}
-
-\begin{defi}{Pre-Order-Baumdurchlauf}
-    Führt man eine Tiefensuche bei Bäumen aus, nennt man diesen Durchlauf \emph{Pre-Order-Durchlauf}.
-
-    Dabei wird stets der linke Teilbaum zuerst durchlaufen.
-\end{defi}
-
-\begin{defi}{Post-Order-Baumdurchlauf}
-    \begin{enumerate}
-        \item Durchlaufe linken Teilbaum
-        \item Durchlaufe rechten Teilbaum
-        \item Betrachte die Wurzel
-    \end{enumerate}
-\end{defi}
-
-\begin{defi}{In-Order-Baumdurchlauf}
-    \begin{enumerate}
-        \item Durchlaufe linken Teilbaum
-        \item Betrachte die Wurzel
-        \item Durchlaufe rechten Teilbaum
-    \end{enumerate}
-\end{defi}
-
-\begin{example}{Baumdurchläufe}
-    \begin{center}
-        \begin{forest}
-            baseline,anchor=north,
-            for tree={circle, draw,
-                    minimum size=2em, % <-- added
-                    inner sep=1pt}
-                [
-                    45
-                        [
-                            36
-                                [
-                                    25
-                                        [
-                                            2
-                                        ]
-                                        [
-                                            3
-                                        ]
-                                ]
-                                [
-                                    26
-                                        [
-                                            19
-                                        ]
-                                ]
-                        ]
-                        [
-                            17
-                                [
-                                    7
-                                ]
-                                [
-                                    1
-                                ]
-                        ]
-                ]
-        \end{forest}
-    \end{center}
-
-    Für den gegebenen Baum gelten folgende Baumdurchläufe:
-
-    \centering
-    \begin{tabular}{|l|cccccccccc|}
-        \hline
-        Pre-Order   & 45 & 36 & 25 & 2  & 3  & 26 & 19 & 17 & 7  & 1  \\
-        \hline
-        In-Order    & 2  & 25 & 3  & 19 & 26 & 36 & 45 & 7  & 17 & 1  \\
-        \hline
-        Post-Order  & 2  & 3  & 25 & 19 & 26 & 36 & 7  & 1  & 17 & 45 \\
-        \hline
-        Level-Order & 45 & 36 & 17 & 25 & 26 & 7  & 1  & 2  & 3  & 19 \\
-        \hline
-    \end{tabular}
-\end{example}
-
-
-\subsection{Entwurfsprinzipien}
-
-\begin{defi}{Traveling-Salesman-Problem}
-    Das \emph{Traveling-Salesman-Problem} ist ein Optimierungsproblem.
-    Die Aufgabe besteht darin, eine Reihenfolge für den Besuch mehrerer Orte so zu wählen, dass:
-    \begin{itemize}
-        \item kein Ort doppelt besucht wird und
-        \item die Reisestrecke minimal ist.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Greedy}
-    Wähle immer den Schritt, desse unmittelbarer Folgezustand das beste Ergebnis liefert.
-    Denke nicht an die weiteren Schritte (greedy = gierig).
-
-    Ob ein Greedy-Algorithmus die optimale Lösung liefert oder nicht, ist vom konkreten Problem abhängig.
-
-    Für das Traveling-Salesman-Problem ist eine Greedy-Lösung z.B. die \emph{Nearest-Neighbour-Lösung}:
-    \begin{itemize}
-        \item Gehe in jedem Schritt zur nächstliegenden Stadt, die noch nicht besucht ist.
-        \item $\bigo(n^2)$
-        \item liefert nicht die optimale Lösung (kann sogar beliebig schlecht werden)
-        \item arbeitet meistens einigermaßen gut
-    \end{itemize}
-\end{defi}
-
-\begin{bonus}{Random Insertion}
-    Wähle immer einen zufälligen Knoten.
-
-    \begin{itemize}
-        \item $\bigo(n^2)$
-        \item keine Garantie, dass die Lösung irgendeinem Gütekriterium genügt
-        \item im Allgmeinen ist Lösung ziemlich gut
-        \item Vorteil: Durch den Zufallsfaktor kann man das Verfahren beliebig oft wiederholen und sich die beste Lösung heraussuchen.
-    \end{itemize}
-\end{bonus}
-
-\begin{bonus}{Lösung mit minimalem Spannbaum}
-    \begin{enumerate}
-        \item Konstruktion eines minimalen Spannbaums nach Prim
-        \item Durchlaufen mit Tiefensuche
-        \item jede Kante wird zweimal durchlaufen
-        \item summierte Gewichte des minimalen Spannbaums müssen kleiner sein als das optimale TSP-Ergebnis
-        \item Optimierung:
-              \begin{itemize}
-                  \item Knoten schon einmal besucht: beim nächsten Mal überspringen
-                  \item bei einem Schritt mehrere Möglichkeiten: zuerst kürzeren Weg wählen (greedy)
-              \end{itemize}
-    \end{enumerate}
-\end{bonus}
-
-\begin{defi}{Backtracking}
-    Durchlauf eines Lösungsbaum in Pre-Order-Reihenfolge.
-
-    Situation: Mehrere Alternativen sind in bestimmten Schritten des Algorithmus möglich.
-
-    Lösung mit \emph{Backtracking}:
-    \begin{enumerate}
-        \item Wähle eine Alternative und verfolge dieses Weg weiter.
-        \item Falls man so eine Lösung des Problems findet, ist man fertig.
-        \item Ansonsten gehe einen Schritt zurück und verfolge rekursiv eine andere (nicht versuchte) Alternative in diesem Schritt.
-        \item Falls alle Alternativen erfolglos probiert wurden, einen Schritt zurückgehen $\ldots$
-    \end{enumerate}
-
-    Backtracking-Algorithmen können exponentiellen Aufwand haben.
-
-    Tipps:
-    \begin{itemize}
-        \item Durch Einführung von Zusatzbedingungen möglichst viele Sackgassen ausschließen.
-        \item Symmetriebedingungen ausnutzen.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Branch and Bound}
-    \begin{enumerate}
-        \item Ermitteln einer oberen Schranke (greedy)
-        \item Falls dieser Wert überschritten wird, kann man die Suche auf diesem Pfad abbrechen.
-        \item Bessere Lösungen nutzen, um die Schranke zu verbessern.
-    \end{enumerate}
-\end{defi}
-
-
-\subsection{Graphalgorithmen}
-
-\begin{defi}{Bipartiter Graph}
-    Ein Graph $G=(V, E)$ heißt \emph{bipartit}, wenn man $V$ in disjunkte Mengen $U$ und $W$ zerlegen kann, so dass alle Kanten zwischen $U$ und $W$ verlaufen.
-
-    Die Knoten eines bipartiten Graphen lassen sich mit zwei Farben so einfärben, dass zwei Nachbarknoten immer unterschiedlich eingefärbt sind.
-\end{defi}
-
-\begin{algo}{Prüfung ob ein Graph bipartit ist}
-    \begin{enumerate}
-        \item Einfärben des 1. Knotens
-        \item Durchlauf mit Breitensuche
-        \item Abwechselndes Färben
-    \end{enumerate}
-
-    Start bei Knoten 1.
-
-    \vspace{1em}
-
-    \begin{center}
-        \begin{tikzpicture}
-            \node[draw, circle, text=white, fill = blue!50] (1) {1};
-            \node[draw, circle, right=of 1] (2) {2};
-            \node[draw, circle, right=of 2] (3) {3};
-            \node[draw, circle, below=of 1] (4) {4};
-            \node[draw, circle, right=of 4] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-            \node[draw, circle, right=of 6] (7) {7};
-
-            \path (1) edge (2);
-            \path (2) edge (3);
-            \path (1) edge (4);
-            \path (4) edge (5);
-            \path (2) edge (5);
-            \path (4) edge (6);
-            \path (6) edge (7);
-            \path (3) edge[bend left=30] (7);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tikzpicture}
-            \node[draw, circle, text=white, fill = blue!50] (1) {1};
-            \node[draw, circle, text=white, right=of 1, fill = red!50] (2) {2};
-            \node[draw, circle, right=of 2] (3) {3};
-            \node[draw, circle, text=white, below=of 1, fill = red!50] (4) {4};
-            \node[draw, circle, right=of 4] (5) {5};
-            \node[draw, circle, below=of 4] (6) {6};
-            \node[draw, circle, right=of 6] (7) {7};
-
-            \path (1) edge (2);
-            \path (2) edge (3);
-            \path (1) edge (4);
-            \path (4) edge (5);
-            \path (2) edge (5);
-            \path (4) edge (6);
-            \path (6) edge (7);
-            \path (3) edge[bend left=30] (7);
-        \end{tikzpicture}
-
-        \vspace{1em}
-
-        \begin{tikzpicture}
-            \node[draw, circle, text=white, fill = blue!50] (1) {1};
-            \node[draw, circle, text=white, right=of 1, fill = red!50] (2) {2};
-            \node[draw, circle, text=white, right=of 2, fill = blue!50] (3) {3};
-            \node[draw, circle, text=white, below=of 1, fill = red!50] (4) {4};
-            \node[draw, circle, text=white, right=of 4, fill = blue!50] (5) {5};
-            \node[draw, circle, text=white, below=of 4, fill = blue!50] (6) {6};
-            \node[draw, circle, right=of 6] (7) {7};
-
-            \path (1) edge (2);
-            \path (2) edge (3);
-            \path (1) edge (4);
-            \path (4) edge (5);
-            \path (2) edge (5);
-            \path (4) edge (6);
-            \path (6) edge (7);
-            \path (3) edge[bend left=30] (7);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tikzpicture}
-            \node[draw, circle, text=white, fill = blue!50] (1) {1};
-            \node[draw, circle, text=white, right=of 1, fill = red!50] (2) {2};
-            \node[draw, circle, text=white, right=of 2, fill = blue!50] (3) {3};
-            \node[draw, circle, text=white, below=of 1, fill = red!50] (4) {4};
-            \node[draw, circle, text=white, right=of 4, fill = blue!50] (5) {5};
-            \node[draw, circle, text=white, below=of 4, fill = blue!50] (6) {6};
-            \node[draw, circle, text=white, right=of 6, fill = red!50] (7) {7};
-
-            \path (1) edge (2);
-            \path (2) edge (3);
-            \path (1) edge (4);
-            \path (4) edge (5);
-            \path (2) edge (5);
-            \path (4) edge (6);
-            \path (6) edge (7);
-            \path (3) edge[bend left=30] (7);
-        \end{tikzpicture}
-    \end{center}
-\end{algo}
-
-\begin{defi}{Spannbaum}
-    Ein \emph{Spannbaum} verbindet alle Knoten eines ungerichteten Graphen miteinander, hat jedoch keine Kreise.
-
-    Der \emph{minimale Spannbaum} ist der Spannbaum, dessen Kanten das kleinste summierte Gewicht haben.
-\end{defi}
-
-\begin{algo}{Prim-Algorithmus}
-    \begin{enumerate}
-        \item Wähle einen beliebigen Startknoten für den minimalen Spannbaum $T$
-        \item Solange $T$ noch nicht alle Knoten enthält:
-              \begin{itemize}
-                  \item Wähle eine Kante $e$ mit minimalem Gewicht aus, die einen noch nicht in $T$ enthaltenen Knoten $v$ mit $T$ verbindet.
-                  \item Füge $e$ und $v$ dem Graphen $T$ hinzu.
-              \end{itemize}
-    \end{enumerate}
-
-    Start bei Knoten $A$.
-
-    \vspace{1em}
-    \begin{center}
-        \begin{tikzpicture}
-            \node[draw, circle, prim node] (A) {$A$};
-            \node[draw, circle, below right=of A] (B) {$B$};
-            \node[draw, circle, above right=of B] (C) {$C$};
-            \node[draw, circle, below left=of B] (D) {$D$};
-            \node[draw, circle, below right=of B] (E) {$E$};
-            \node[draw, circle, below=of D] (F) {$F$};
-            \node[draw, circle, below=of E] (G) {$G$};
-
-            \path (A) edge node[weight,above right] {7} (B);
-            \path (B) edge node[weight,above left] {8} (C);
-            \path (D) edge node[weight,right] {5} (A);
-            \path (D) edge node[weight,above left] {9} (B);
-            \path (E) edge node[weight,above right] {7} (B);
-            \path (C) edge node[weight,right] {5} (E);
-            \path (D) edge node[weight,above] {15} (E);
-            \path (D) edge node[weight,right] {6} (F);
-            \path (E) edge node[weight,above left] {8} (F);
-            \path (E) edge node[weight,right] {11} (G);
-            \path (F) edge node[weight,above] {9} (G);
-        \end{tikzpicture}
-        %
-        \hspace{3em}
-        %
-        \begin{tikzpicture}
-            \node[draw, circle, prim node] (A) {$A$};
-            \node[draw, circle, below right=of A] (B) {$B$};
-            \node[draw, circle, above right=of B] (C) {$C$};
-            \node[draw, circle, below left=of B, prim node] (D) {$D$};
-            \node[draw, circle, below right=of B] (E) {$E$};
-            \node[draw, circle, below=of D] (F) {$F$};
-            \node[draw, circle, below=of E] (G) {$G$};
-
-            \path (A) edge node[weight,above right] {7} (B);
-            \path (B) edge node[weight,above left] {8} (C);
-            \path (D) edge[prim edge] node[weight,right] {5} (A);
-            \path (D) edge node[weight,above left] {9} (B);
-            \path (E) edge node[weight,above right] {7} (B);
-            \path (C) edge node[weight,right] {5} (E);
-            \path (D) edge node[weight,above] {15} (E);
-            \path (D) edge node[weight,right] {6} (F);
-            \path (E) edge node[weight,above left] {8} (F);
-            \path (E) edge node[weight,right] {11} (G);
-            \path (F) edge node[weight,above] {9} (G);
-        \end{tikzpicture}
-        %
-        \hspace{3em}
-        %
-        \begin{tikzpicture}
-            \node[draw, circle, prim node] (A) {$A$};
-            \node[draw, circle, below right=of A] (B) {$B$};
-            \node[draw, circle, above right=of B] (C) {$C$};
-            \node[draw, circle, below left=of B, prim node] (D) {$D$};
-            \node[draw, circle, below right=of B] (E) {$E$};
-            \node[draw, circle, below=of D, prim node] (F) {$F$};
-            \node[draw, circle, below=of E] (G) {$G$};
-
-            \path (A) edge node[weight,above right] {7} (B);
-            \path (B) edge node[weight,above left] {8} (C);
-            \path (D) edge[prim edge] node[weight,right] {5} (A);
-            \path (D) edge node[weight,above left] {9} (B);
-            \path (E) edge node[weight,above right] {7} (B);
-            \path (C) edge node[weight,right] {5} (E);
-            \path (D) edge node[weight,above] {15} (E);
-            \path (D) edge[prim edge] node[weight,right] {6} (F);
-            \path (E) edge node[weight,above left] {8} (F);
-            \path (E) edge node[weight,right] {11} (G);
-            \path (F) edge node[weight,above] {9} (G);
-        \end{tikzpicture}
-        %
-        \vspace{1em}
-        %
-
-        \begin{tikzpicture}
-            \node[draw, circle, prim node] (A) {$A$};
-            \node[draw, circle, below right=of A, prim node] (B) {$B$};
-            \node[draw, circle, above right=of B] (C) {$C$};
-            \node[draw, circle, below left=of B, prim node] (D) {$D$};
-            \node[draw, circle, below right=of B] (E) {$E$};
-            \node[draw, circle, below=of D, prim node] (F) {$F$};
-            \node[draw, circle, below=of E] (G) {$G$};
-
-            \path (A) edge[prim edge] node[weight,above right] {7} (B);
-            \path (B) edge node[weight,above left] {8} (C);
-            \path (D) edge[prim edge] node[weight,right] {5} (A);
-            \path (D) edge node[weight,above left] {9} (B);
-            \path (E) edge node[weight,above right] {7} (B);
-            \path (C) edge node[weight,right] {5} (E);
-            \path (D) edge node[weight,above] {15} (E);
-            \path (D) edge[prim edge] node[weight,right] {6} (F);
-            \path (E) edge node[weight,above left] {8} (F);
-            \path (E) edge node[weight,right] {11} (G);
-            \path (F) edge node[weight,above] {9} (G);
-        \end{tikzpicture}
-        %
-        \hspace{3em}
-        %
-        \begin{tikzpicture}
-            \node[draw, circle, prim node] (A) {$A$};
-            \node[draw, circle, below right=of A, prim node] (B) {$B$};
-            \node[draw, circle, above right=of B] (C) {$C$};
-            \node[draw, circle, below left=of B, prim node] (D) {$D$};
-            \node[draw, circle, below right=of B, prim node] (E) {$E$};
-            \node[draw, circle, below=of D, prim node] (F) {$F$};
-            \node[draw, circle, below=of E] (G) {$G$};
-
-            \path (A) edge[prim edge] node[weight,above right] {7} (B);
-            \path (B) edge node[weight,above left] {8} (C);
-            \path (D) edge[prim edge] node[weight,right] {5} (A);
-            \path (D) edge node[weight,above left] {9} (B);
-            \path (E) edge[prim edge] node[weight,above right] {7} (B);
-            \path (C) edge node[weight,right] {5} (E);
-            \path (D) edge node[weight,above] {15} (E);
-            \path (D) edge[prim edge] node[weight,right] {6} (F);
-            \path (E) edge node[weight,above left] {8} (F);
-            \path (E) edge node[weight,right] {11} (G);
-            \path (F) edge node[weight,above] {9} (G);
-        \end{tikzpicture}
-        %
-        \hspace{3em}
-        %
-        \begin{tikzpicture}
-            \node[draw, circle, prim node] (A) {$A$};
-            \node[draw, circle, below right=of A, prim node] (B) {$B$};
-            \node[draw, circle, above right=of B, prim node] (C) {$C$};
-            \node[draw, circle, below left=of B, prim node] (D) {$D$};
-            \node[draw, circle, below right=of B, prim node] (E) {$E$};
-            \node[draw, circle, below=of D, prim node] (F) {$F$};
-            \node[draw, circle, below=of E] (G) {$G$};
-
-            \path (A) edge[prim edge] node[weight,above right] {7} (B);
-            \path (B) edge node[weight,above left] {8} (C);
-            \path (D) edge[prim edge] node[weight,right] {5} (A);
-            \path (D) edge node[weight,above left] {9} (B);
-            \path (E) edge[prim edge] node[weight,above right] {7} (B);
-            \path (C) edge[prim edge] node[weight,right] {5} (E);
-            \path (D) edge node[weight,above] {15} (E);
-            \path (D) edge[prim edge] node[weight,right] {6} (F);
-            \path (E) edge node[weight,above left] {8} (F);
-            \path (E) edge node[weight,right] {11} (G);
-            \path (F) edge node[weight,above] {9} (G);
-        \end{tikzpicture}
-        %
-        \vspace{1em}
-        %
-
-        \begin{tikzpicture}
-            \node[draw, circle, prim node] (A) {$A$};
-            \node[draw, circle, below right=of A, prim node] (B) {$B$};
-            \node[draw, circle, above right=of B, prim node] (C) {$C$};
-            \node[draw, circle, below left=of B, prim node] (D) {$D$};
-            \node[draw, circle, below right=of B, prim node] (E) {$E$};
-            \node[draw, circle, below=of D, prim node] (F) {$F$};
-            \node[draw, circle, below=of E, prim node] (G) {$G$};
-
-            \path (A) edge[prim edge] node[weight,above right] {7} (B);
-            \path (B) edge node[weight,above left] {8} (C);
-            \path (D) edge[prim edge] node[weight,right] {5} (A);
-            \path (D) edge node[weight,above left] {9} (B);
-            \path (E) edge[prim edge] node[weight,above right] {7} (B);
-            \path (C) edge[prim edge] node[weight,right] {5} (E);
-            \path (D) edge node[weight,above] {15} (E);
-            \path (D) edge[prim edge] node[weight,right] {6} (F);
-            \path (E) edge node[weight,above left] {8} (F);
-            \path (E) edge node[weight,right] {11} (G);
-            \path (F) edge[prim edge] node[weight,above] {9} (G);
-        \end{tikzpicture}
-    \end{center}
-\end{algo}
-
-\begin{defi}{Shortest-Path-Probleme}
-    Eigentlich: Suche nach \emph{günstigsten Wegen} in gewichteten Graphen: Gewichte $\simeq$ Kosten
-
-    Bei Anwendung auf ungewichtete Graphen ergibt sich: \emph{kürzeste Wege}.
-
-    Beispiele:
-    \begin{itemize}
-        \item Single-Source-Shortest-Path
-              \begin{itemize}
-                  \item Dijkstra-Algorithmus (nicht-negative Kantengewichte)
-                  \item Bellman-Ford-Algorithmus (keine negativen Zykel)
-              \end{itemize}
-        \item All-Pairs-Shortest-Path
-              \begin{itemize}
-                  \item Floyd-Warshall-Algorithmus
-              \end{itemize}
-    \end{itemize}
-\end{defi}
-
-\begin{algo}{Dijkstra-Algorithmus}
-    Gegeben: Graph $G = (V, E)$, dessen Bewertungsfunktion die Eigenschaften hat:
-    \begin{itemize}
-        \item Jede Kante von $v_i$ nach $v_j$ hat nicht-negative Kosten: $C(i, j) \geq 0$
-        \item Falls keine Kante zwischen $v_i$ und $v_j$: $C(i, j) = \infty$
-        \item Diagonalelemente: $C(i, i) = 0$
-    \end{itemize}
-
-    Menge $S$: die Knoten, deren günstigste Wegekosten von der vorgegebenen Quelle (Startknoten) bereits bekannt sind.
-
-    \begin{enumerate}
-        \item Initialisierung: $S = \{ \text{Startknoten} \}$
-        \item Beginnend mit Quelle alle ausgehenden Kanten betrachten (analog Breitensuche). Nachfolgerknoten $v$ mit günstigster Kante zu $S$ hinzunehmen.
-        \item Jetzt: Berechnen, ob die Knoten in $V \setminus S$ günstiger über $v$ als Zwischenweg erreichbar sind, als ohne Umweg über $v$.
-        \item Danach: Denjenigen Knoten $v'$ zu $S$ hinzunehmen, der nun am günstigsten zu erreichen ist. Bei zwei gleich günstigen Knoten wird ein beliebiger davon ausgewählt.
-        \item Ab Schritt 3 wiederholen, bis alle Knoten in $S$ sind.
-    \end{enumerate}
-
-    Zeitkomplexität (bei Speicherung des Graphen mit Adjazenzmatrix): $\bigo(\abs{V}^2)$
-\end{algo}
-
-\begin{example}{Dijkstra-Algorithmus}
-    \begin{center}
-        \begin{tikzpicture}[->]
-            \node[draw, circle] (A) {$A$};
-            \node[draw, circle, below right=of A] (D) {$D$};
-            \node[draw, circle, right=of D] (E) {$E$};
-            \node[draw, circle, above right=of E] (B) {$B$};
-            \node[draw, circle, below right=of B] (H) {$H$};
-            \node[draw, circle, below left=of H] (G) {$G$};
-            \node[draw, circle, below left=of A] (F) {$F$};
-            \node[draw, circle, below right=of F] (C) {$C$};
-
-            \path (A) edge node[weight, below left] {4} (D);
-            \path (A) edge node[weight, above right] {2} (E);
-            \path (A) edge node[weight, above right] {12} (B);
-            \path (A) edge node[weight, above left] {30} (F);
-            \path (E) edge node[weight, above] {1} (D);
-            \path (E) edge node[weight, below right] {8} (C);
-            \path (E) edge node[weight, above left] {8} (B);
-            \path (C) edge node[weight, above right] {3} (F);
-            \path (C) edge node[weight, above right] {3} (F);
-            \path (C) edge node[weight, above] {12} (G);
-            \path (G) edge node[weight, right] {4} (B);
-            \path (G) edge node[weight, below right] {5} (H);
-            \path (H) edge node[weight, above right] {2} (B);
-        \end{tikzpicture}
-
-        \vspace{1em}
-
-        \begin{tabular}{|c|ccccccc|ccccccc|}
-            \hline
-            \multirow{2}{*}{$v_i$} & $d[2]$      & $d[3]$      & $d[4]$     & $d[5]$     & $d[6]$      & $d[7]$      & $d[8]$      & $p[2]$ & $p[3]$ & $p[4]$ & $p[5]$ & $p[6]$ & $p[7]$ & $p[8]$ \\ \cline{2-15}
-                                   & B           & C           & D          & E          & F           & G           & H           & B      & C      & D      & E      & F      & G      & H      \\
-            \hline
-            A                      & 12          &             & 4          & \textbf{2} & 30          &             &             & A      &        & A      & A      & A      &        &        \\
-            E                      & 10          & 10          & \textbf{3} & \textbf{2} & 30          &             &             & A      & E      & E      & A      & A      &        &        \\
-            D                      & \textbf{10} & 10          & \textbf{3} & \textbf{2} & 30          &             &             & A      & E      & E      & A      & A      &        &        \\
-            B                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & 30          &             &             & A      & E      & E      & A      & A      &        &        \\
-            C                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & \textbf{13} & 22          &             & A      & E      & E      & A      & C      & C      &        \\
-            F                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & \textbf{13} & \textbf{22} &             & A      & E      & E      & A      & C      & C      &        \\
-            G                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & \textbf{13} & \textbf{22} & \textbf{27} & A      & E      & E      & A      & C      & C      & G      \\
-            H                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & \textbf{13} & \textbf{22} & \textbf{27} & A      & E      & E      & A      & C      & C      & G      \\
-            \hline
-        \end{tabular}
-    \end{center}
-
-    \vspace{1em}
-
-    \url{https://youtu.be/4pBP2hbnGso} (Herleitung und Erklärung)
-\end{example}
-
-\begin{algo}{Bellman-Ford-Algorithmus}
-    Gegeben: Graph $G = (V, E)$, dessen Bewertungsfunktion die Eigenschaften hat:
-    \begin{itemize}
-        \item Falls keine Kante zwischen $v_i$ und $v_j$: $C(i, j) = \infty$
-        \item Diagonalelemente: $C(i, i) = 0$
-    \end{itemize}
-
-    \begin{enumerate}
-        \item Initialisierung: Startknoten $s$, Distanz zu $V \setminus \{s\}$ auf $\infty$ setzen
-        \item Für jede Kante $(i, j)$:
-              \begin{itemize}
-                  \item Falls Distanz zu $v_i$ bekannt:
-                        \subitem Falls $d(v_i) + C(i, j) < d(v_j)$, setze $d(v_j)$ auf $d(v_i) + C(i, j)$
-              \end{itemize}
-    \end{enumerate}
-
-    Zeitkomplexität: $\bigo(\abs{V} \cdot \abs{E})$
-\end{algo}
-
-\begin{example}{Bellman-Ford-Algorithmus}
-    \begin{center}
-        \begin{tikzpicture}[->,baseline,anchor=north]
-            \node[draw, circle] (S) {$S$};
-            \node[draw, circle, above right=of S] (A) {$A$};
-            \node[draw, circle, right=of A] (B) {$B$};
-            \node[draw, circle, below right=of S] (C) {$C$};
-            \node[draw, circle, right=of C] (D) {$D$};
-
-            \path (S) edge node[weight, above left] {2} (A);
-            \path (S) edge node[weight, below left] {5} (C);
-            \path (A) edge node[weight, above] {4} (B);
-            \path (C) edge node[weight, above] {2} (D);
-            \path (C) edge node[weight, left] {-4} (A);
-            \path (D) edge node[weight, right] {8} (B);
-            \path (B) edge[bend left=10] node[weight, below right] {1} (C);
-            \path (C) edge[bend left=10] node[weight, above left] {6} (B);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}{|c||c|c|c|c|c|}
-            \hline
-              & S & A        & B        & C        & D        \\
-            \hline
-            0 & 0 & $\infty$ & $\infty$ & $\infty$ & $\infty$ \\
-            1 & 0 & 2        & $\infty$ & 5        & $\infty$ \\
-            2 & 0 & 1        & 6        & 5        & 7        \\
-            3 & 0 & 1        & 5        & 5        & 7        \\
-            4 & 0 & 1        & 5        & 5        & 7        \\
-            \hline
-        \end{tabular}
-
-        Keine Änderungen nach Schritt 3 $\implies$ Fertig!
-    \end{center}
-\end{example}
-
-\begin{algo}{Floyd-Algorithmus}
-    Gegeben: Graph $G = (V, E)$, dessen Bewertungsfunktion die Eigenschaften hat:
-    \begin{itemize}
-        \item Jede Kante von $v_i$ nach $v_j$ hat nicht-negative Kosten: $C(i, j) \geq 0$
-        \item Falls keine Kante zwischen $v_i$ und $v_j$: $C(i, j) = \infty$
-        \item Diagonalelemente: $C(i, i) = 0$
-    \end{itemize}
-
-    Im Kontrast zum Dijkstra-Algorithmus bestimmt der \emph{Floyd-Algorithmus} für alle geordneten Paare $(v, w)$ den kürzesten Weg von $v$ nach $w$.
-
-    $\abs{V}$ Iterationen:
-    \begin{enumerate}
-        \item Vergleiche Kosten von
-              \begin{itemize}
-                  \item direkter Verbindung von Knoten $i$ zu Knoten $j$
-                  \item Umweg über Knoten $1$ (also: von $i$ nach $1$ + von $1$ nach $j$)
-                  \item Falls Umweg günstiger: alten Weg durch Umweg ersetzen
-              \end{itemize}
-        \item Umwege über Knoten $2$ betrachten.
-        \item[$k$.] Umwege über Knoten $k$ betrachten.
-    \end{enumerate}
-
-    Der Floyd-Algorithmus nutzt eine $\abs{V} \times \abs{V}$-Matrix, um die Kosten der günstigsten Wege zu speichern:
-    \begin{center}
-        $A_k[i][j] :=$ minimale Kosten, um in Schritt $k$ über irgendwelche der Knoten in $V$ vom Knoten $i$ zum Knoten $j$ zu gelangen
-    \end{center}
-
-    \begin{itemize}
-        \item Initialisierung: $A_0[i][j]= C(i, j)$
-        \item $\abs{V}$ Iterationen mit \glqq dynamischer Programmierung\grqq:
-              \subitem Iterationsformel zur Aktualisierung von $A[i][j]$:
-              $$
-                  A_k[i][j] = \min \{ A_{k-1}[i][j] , A_{k-1}[i][k] + A_{k-1}[k][j] \}
-              $$
-    \end{itemize}
-\end{algo}
-
-\begin{code}{Floyd-Algorithmus}
-    \lstinputlisting{floyd.java}
-\end{code}
-
-\begin{example}{Floyd-Algorithmus}
-    \newcolumntype{g}{>{\columncolor{gray!25}}c}
-
-    $A_0$ (direkter Weg):
-    \begin{center}
-        \begin{tikzpicture}[baseline,anchor=north]
-            \node[draw, circle] (1) {$1$};
-            \node[draw, circle, right=of 1] (2) {$2$};
-            \node[draw, circle, below=of 1] (3) {$3$};
-            \node[draw, circle, right=of 3] (4) {$4$};
-
-            \path (1) edge node[weight, above] {2} (2);
-            \path (1) edge node[weight, left] {3} (3);
-            \path (3) edge node[weight, below] {7} (4);
-            \path (2) edge node[weight, right] {1} (4);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|cccc|}
-            \hline
-              & 1                   & 2                   & 3                   & 4                   \\
-            \hline
-            1 & \textcolor{gray}{0} & 2                   & 3                   & $\infty$            \\
-            2 & 2                   & \textcolor{gray}{0} & $\infty$            & 1                   \\
-            3 & 3                   & $\infty$            & \textcolor{gray}{0} & 7                   \\
-            4 & $\infty$            & 1                   & 7                   & \textcolor{gray}{0} \\
-            \hline
-        \end{tabular}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|cccc|}
-            \hline
-              & 1                   & 2                   & 3                   & 4 \\
-            \hline
-            1 & \textcolor{gray}{-} & -                   & -                   & - \\
-            2 & -                   & \textcolor{gray}{-} & -                   & - \\
-            3 & -                   & -                   & \textcolor{gray}{-} & - \\
-            4 & -                   & -                   & -                   & - \\
-            \hline
-        \end{tabular}
-    \end{center}
-
-    $A_1$ (Umweg über 1):
-    \begin{center}
-        \begin{tikzpicture}[baseline,anchor=north]
-            \node[draw, circle] (1) {$1$};
-            \node[draw, circle, right=of 1] (2) {$2$};
-            \node[draw, circle, below=of 1] (3) {$3$};
-            \node[draw, circle, right=of 3] (4) {$4$};
-
-            \path (1) edge node[weight, above] {2} (2);
-            \path (1) edge node[weight, left] {3} (3);
-            \path (3) edge node[weight, below] {7} (4);
-            \path (2) edge node[weight, right] {1} (4);
-            %\path (1) edge[blue, bend left=45] node[weight, above, blue] {2} (2);
-            %\path (1) edge[blue, bend right=45] node[weight, left, blue] {3} (3);
-            \path (2) edge[dashed, red, bend right] node[weight, above left, pos=1] {5} (1.north west);
-            \path (1.north west) edge[dashed, red, bend right] (3);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|gccc|}
-            \hline
-              & 1                   & 2                   & 3                   & 4                   \\
-            \hline
-            \rowcolor{gray!25}
-            1 & \textcolor{gray}{0} & 2                   & 3                   & $\infty$            \\
-            2 & 2                   & \textcolor{gray}{0} & \textcolor{red}{5}  & 1                   \\
-            3 & 3                   & \textcolor{red}{5}  & \textcolor{gray}{0} & 7                   \\
-            4 & $\infty$            & 1                   & 7                   & \textcolor{gray}{0} \\
-            \hline
-        \end{tabular}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|cccc|}
-            \hline
-              & 1                   & 2                   & 3                   & 4 \\
-            \hline
-            1 & \textcolor{gray}{-} & -                   & -                   & - \\
-            2 & -                   & \textcolor{gray}{-} & 1                   & - \\
-            3 & -                   & 1                   & \textcolor{gray}{-} & - \\
-            4 & -                   & -                   & -                   & - \\
-            \hline
-        \end{tabular}
-    \end{center}
-
-    $$A_0[2][3] > A_0[3][1] + A_0[1][2] \implies A_1[2][3] = A_0[3][1] + A_0[1][2] = 3 + 2 = 5$$
-    $$A_0[3][2] > A_0[2][1] + A_0[1][3] \implies A_1[3][2] = A_0[2][1] + A_0[1][3] = 2 + 3 = 5$$
-
-
-    $A_2$ (Umweg über 2):
-    \begin{center}
-        \begin{tikzpicture}[baseline,anchor=north]
-            \node[draw, circle] (1) {$1$};
-            \node[draw, circle, right=of 1] (2) {$2$};
-            \node[draw, circle, below=of 1] (3) {$3$};
-            \node[draw, circle, right=of 3] (4) {$4$};
-
-            \path (1) edge node[weight, above] {2} (2);
-            \path (1) edge node[weight, left] {3} (3);
-            \path (3) edge node[weight, below] {7} (4);
-            \path (2) edge node[weight, right] {1} (4);
-
-            % old edge 2-1-3
-            \path (2) edge[dashed, blue, bend right] node[weight, above left, pos=1] {5} (1.north west);
-            \path (1.north west) edge[dashed, blue, bend right] (3);
-            % new edge 1-2-4
-            \path (1) edge[dashed, red, bend left] node[weight, above right, pos=1] {3} (2.north east);
-            \path (2.north east) edge[dashed, red, bend left] (4);
-            % old edge 3-2-4
-            \path (3) edge[dashed, red, bend left] node[weight, below right, pos=0.5] {6} (2.south west);
-            \path (2.south west) edge[dashed, red, bend right] (4);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|cgcc|}
-            \hline
-              & 1                   & 2                   & 3                   & 4                   \\
-            \hline
-            1 & \textcolor{gray}{0} & 2                   & 3                   & \textcolor{red}{3}  \\
-            \rowcolor{gray!25}
-            2 & 2                   & \textcolor{gray}{0} & 5                   & 1                   \\
-            3 & 3                   & 5                   & \textcolor{gray}{0} & \textcolor{red}{6}  \\
-            4 & \textcolor{red}{3}  & 1                   & \textcolor{red}{6}  & \textcolor{gray}{0} \\
-            \hline
-        \end{tabular}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|cccc|}
-            \hline
-              & 1                   & 2                   & 3                   & 4 \\
-            \hline
-            1 & \textcolor{gray}{-} & -                   & -                   & 2 \\
-            2 & -                   & \textcolor{gray}{-} & 1                   & - \\
-            3 & -                   & 1                   & \textcolor{gray}{-} & 2 \\
-            4 & 2                   & -                   & 2                   & - \\
-            \hline
-        \end{tabular}
-    \end{center}
-
-    $$A_1[1][4] > A_1[1][2] + A_1[2][4] \implies A_2[2][3] = A_1[1][2] + A_1[2][4] = 2 + 1 = 3$$
-    $$A_1[4][1] > A_1[4][2] + A_1[2][1] \implies A_2[3][2] = A_1[4][2] + A_1[2][1] = 1 + 2 = 3$$
-    $$A_1[3][4] > A_1[3][2] + A_1[2][4] \implies A_2[3][4] = A_1[3][2] + A_1[2][4] = 5 + 1 = 6$$
-    $$A_1[4][3] > A_1[4][2] + A_1[2][3] \implies A_2[4][3] = A_1[4][2] + A_1[2][3] = 1 + 5 = 6$$
-
-    $A_3$ (Umweg über 3):
-    \begin{center}
-        \begin{tikzpicture}[baseline,anchor=north]
-            \node[draw, circle] (1) {$1$};
-            \node[draw, circle, right=of 1] (2) {$2$};
-            \node[draw, circle, below=of 1] (3) {$3$};
-            \node[draw, circle, right=of 3] (4) {$4$};
-
-            \path (1) edge node[weight, above] {2} (2);
-            \path (1) edge node[weight, left] {3} (3);
-            \path (3) edge node[weight, below] {7} (4);
-            \path (2) edge node[weight, right] {1} (4);
-
-            % old edge 2-1-3
-            \path (2) edge[dashed, blue, bend right] node[weight, above left, pos=1] {5} (1.north west);
-            \path (1.north west) edge[dashed, blue, bend right] (3);
-            % old edge 1-2-4
-            \path (1) edge[dashed, blue, bend left] node[weight, above right, pos=1] {3} (2.north east);
-            \path (2.north east) edge[dashed, blue, bend left] (4);
-            % old edge 3-2-4
-            \path (3) edge[dashed, blue, bend left] node[weight, below right, pos=0.5] {6} (2.south west);
-            \path (2.south west) edge[dashed, blue, bend right] (4);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|ccgc|}
-            \hline
-              & 1                   & 2                   & 3                   & 4                   \\
-            \hline
-            1 & \textcolor{gray}{0} & 2                   & 3                   & 3                   \\
-            2 & 2                   & \textcolor{gray}{0} & 5                   & 1                   \\
-            \rowcolor{gray!25}
-            3 & 3                   & 5                   & \textcolor{gray}{0} & 6                   \\
-            4 & 3                   & 1                   & 6                   & \textcolor{gray}{0} \\
-            \hline
-        \end{tabular}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|cccc|}
-            \hline
-              & 1                   & 2                   & 3                   & 4 \\
-            \hline
-            1 & \textcolor{gray}{-} & -                   & -                   & 2 \\
-            2 & -                   & \textcolor{gray}{-} & 1                   & - \\
-            3 & -                   & 1                   & \textcolor{gray}{-} & 2 \\
-            4 & 2                   & -                   & 2                   & - \\
-            \hline
-        \end{tabular}
-    \end{center}
-
-    $A_4$ (Umweg über 4):
-    \begin{center}
-        \begin{tikzpicture}[baseline,anchor=north]
-            \node[draw, circle] (1) {$1$};
-            \node[draw, circle, right=of 1] (2) {$2$};
-            \node[draw, circle, below=of 1] (3) {$3$};
-            \node[draw, circle, right=of 3] (4) {$4$};
-
-            \path (1) edge node[weight, above] {2} (2);
-            \path (1) edge node[weight, left] {3} (3);
-            \path (3) edge node[weight, below] {7} (4);
-            \path (2) edge node[weight, right] {1} (4);
-
-            % old edge 2-1-3
-            \path (2) edge[dashed, blue, bend right] node[weight, above left, pos=1] {5} (1.north west);
-            \path (1.north west) edge[dashed, blue, bend right] (3);
-            % old edge 1-2-4
-            \path (1) edge[dashed, blue, bend left] node[weight, above right, pos=1] {3} (2.north east);
-            \path (2.north east) edge[dashed, blue, bend left] (4);
-            % old edge 3-2-4
-            \path (3) edge[dashed, blue, bend left] node[weight, below right, pos=0.5] {6} (2.south west);
-            \path (2.south west) edge[dashed, blue, bend right] (4);
-        \end{tikzpicture}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|cccg|}
-            \hline
-              & 1                   & 2                   & 3                   & 4                   \\
-            \hline
-            1 & \textcolor{gray}{0} & 2                   & 3                   & 3                   \\
-            2 & 2                   & \textcolor{gray}{0} & 5                   & 1                   \\
-            3 & 3                   & 5                   & \textcolor{gray}{0} & 6                   \\
-            \rowcolor{gray!25}
-            4 & 3                   & 1                   & 6                   & \textcolor{gray}{0} \\
-            \hline
-        \end{tabular}
-        %
-        \hspace{5em}
-        %
-        \begin{tabular}[t]{|c|cccc|}
-            \hline
-              & 1                   & 2                   & 3                   & 4 \\
-            \hline
-            1 & \textcolor{gray}{-} & -                   & -                   & 2 \\
-            2 & -                   & \textcolor{gray}{-} & 1                   & - \\
-            3 & -                   & 1                   & \textcolor{gray}{-} & 2 \\
-            4 & 2                   & -                   & 2                   & - \\
-            \hline
-        \end{tabular}
-    \end{center}
-\end{example}
\ No newline at end of file
+\section{Graphen}
+
+\begin{defi}{Gerichteter Graph}
+    Ein \emph{gerichteter Graph} $G = (V, E)$ besteht aus
+    \begin{itemize}
+        \item einer endlichen, nicht leeren Menge $V = \{v_1, \ldots, v_n\}$ von \emph{Knoten (vertices)} und
+        \item einer Relation $E \subseteq V \times V$ von geordneten Paaren $e = (u, v)$ den \emph{Kanten (edges)}.
+    \end{itemize}
+
+    Jede Kante $(u,v) \in E$ hat einen Anfangsknoten $u$ und einen Enknoten $v$ und damit eine Richtung von $u$ nach $v$ ($u=v$ ist möglich).
+
+    \begin{center}
+        \begin{tikzpicture}[->]
+            \node[draw, circle] (1) {1};
+            \node[draw, circle, below=of 1] (2) {2};
+            \node[draw, circle, right=of 2] (3) {3};
+            \node[draw, circle, above=of 3] (4) {4};
+            \node[draw, circle, right=of 4] (5) {5};
+
+            %\draw[->] (1) to[bend left=15] (4);
+            %\draw[->] (4) to[bend left=15] (1);
+            %\draw[->] (1) to (2);
+            %\draw[->] (2) to (3);
+            %\draw[->] (3) to (4);
+            %\draw[->] (4) to (5);
+
+            \path (1) edge[bend left=15] (4);
+            \path (4) edge[bend left=15] (1);
+            \path (1) edge (2);
+            \path (2) edge (3);
+            \path (3) edge (4);
+            \path (4) edge (5);
+            \path (5) edge[loop above] (5);
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
+
+\begin{defi}{Ungerichteter Graph}
+    Ein \emph{ungerichteter Graph} $G = (V, E)$ besteht aus
+    \begin{itemize}
+        \item einer endlichen, nicht leeren Menge $V = \{v_1, \ldots, v_n\}$ von \emph{Knoten (vertices)} und
+        \item einer symmetrischen Relation $E \subseteq V \times V$ von geordneten Paaren $e = (u, v) \iff (v, u)$ den \emph{Kanten (edges)}.
+    \end{itemize}
+
+    Jede Kante $(u,v) \in E$ hat einen Anfangsknoten $u$ und einen Enknoten $v$ und damit eine Richtung von $u$ nach $v$ ($u=v$ ist möglich).
+
+    \vspace{1em}
+    \begin{center}
+        \begin{tikzpicture}
+            \node[draw, circle] (1) {1};
+            \node[draw, circle, below=of 1] (2) {2};
+            \node[draw, circle, right=of 2] (3) {3};
+            \node[draw, circle, above=of 3] (4) {4};
+            \node[draw, circle, right=of 4] (5) {5};
+
+            %\draw[->] (1) to[bend left=15] (4);
+            %\draw[->] (4) to[bend left=15] (1);
+            %\draw[->] (1) to (2);
+            %\draw[->] (2) to (3);
+            %\draw[->] (3) to (4);
+            %\draw[->] (4) to (5);
+
+            \path (1) edge (4);
+            \path (1) edge (2);
+            \path (2) edge (3);
+            \path (3) edge (4);
+            \path (4) edge (5);
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
+
+\begin{defi}{Gewichteter Graph}
+    Ein Graph heißt \emph{gewichtet}, wenn jeder Kante ein Wert als \emph{Gewicht} zugeordnet ist (z.B. Transportkosten, Entfernung).
+
+    \begin{center}
+        \begin{tikzpicture}[->]
+            \node[draw, circle] (1) {1};
+            \node[draw, circle, below=of 1] (2) {2};
+            \node[draw, circle, right=of 2] (3) {3};
+            \node[draw, circle, above=of 3] (4) {4};
+            \node[draw, circle, right=of 4] (5) {5};
+
+            %\draw[->] (1) to[bend left=15] (4);
+            %\draw[->] (4) to[bend left=15] (1);
+            %\draw[->] (1) to (2);
+            %\draw[->] (2) to (3);
+            %\draw[->] (3) to (4);
+            %\draw[->] (4) to (5);
+
+            \path (1) edge[bend left=15] node[above,scale=0.7] {2} (4);
+            \path (4) edge[bend left=15] node[below,scale=0.7] {1} (1);
+            \path (1) edge node[left,scale=0.7] {2} (2);
+            \path (2) edge node[above,scale=0.7] {1} (3);
+            \path (3) edge node[right,scale=0.7] {8} (4);
+            \path (4) edge node[above,scale=0.7] {1} (5);
+            \path (5) edge[loop above] node[above,scale=0.7] {2} (5);
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
+
+\begin{defi}{Teilgraph}
+    $G' = (V', E')$ heißt \emph{Teilgraph} von $G=(V, E)$, wenn gilt:
+    $$
+        V' \subseteq V \quad \text{und} \quad E' \subseteq E
+    $$
+\end{defi}
+
+\begin{defi}{Weg}
+    Sei $G = (V, E)$ ein Graph.
+
+    Eine Folge von Knoten
+    $$
+        W := (v_1, v_2, \ldots, v_n)
+    $$
+    heißt \emph{Weg} oder \emph{Pfad} in $G$, falls gilt:
+    $$
+        \forall 1 \leq i \leq n-1 : (v_i, v_{i+1}) \in E
+    $$
+    (also eine Folge von zusammenhängenden Kanten)
+
+    $\alpha(W) := v_1$ heißt \emph{Anfangsknoten} des Weges $W$.
+
+    $\omega(W) := v_n$ heißt \emph{Endknoten} des Weges $W$.
+
+    $\forall v_i \in V : (v_i)$ heißt \emph{trivialer Weg} und ist stets ein Weg in $G$.
+
+    Die \emph{Länge eines Weges} ist $l(W) := n-1$, falls $n$ Knoten auf diesem Weg besucht werden.
+
+    Ein Weg heißt \emph{einfacher Weg}, wenn kein Knoten (ausgenommen Start- und Endknoten) mehr als einmal vorkommt.
+
+    Ein \emph{Zykel} oder \emph{Kreis} ist ein nicht-trivialer einfacher Weg mit der Bedingung $\alpha(W) = \omega(W)$.
+\end{defi}
+
+\begin{defi}{Adjazenz}
+    Zwei Knoten heißen \emph{adjazent (benachbart)}, wenn sie eine Kante verbindet.
+\end{defi}
+
+\begin{defi}{Speicherung von Graphen}
+    \begin{itemize}
+        \item Kantenorientiert
+              \begin{itemize}
+                  \item Index für Kanten
+                  \item für jede Kante speichern: Vorgänger-, Nachfolgerknoten (Markierung, Gewicht)
+                  \item meist statische Darstellung, z.B. Kantenliste
+              \end{itemize}
+        \item Knotenorientiert
+              \begin{itemize}
+                  \item gebräuchlicher als kantenorientiert
+                  \item in vielen Ausprägungen, z.B. Knotenliste, Adjazenzmatrix, Adjazenzliste
+                  \item für Adjazenzmatrix gilt:
+                        $$
+                            A_{ij} = \begin{cases}
+                                1 & \text{, falls} \ (i, j) \in E \\
+                                0 & \text{, sonst}
+                            \end{cases}
+                        $$
+              \end{itemize}
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Kantenliste}
+    \begin{center}
+        \begin{tikzpicture}[->]
+            \node[draw, circle] (1) {1};
+            \node[draw, circle, below left=of 1] (3) {3};
+            \node[draw, circle, below right=of 1] (4) {4};
+            \node[draw, circle, above right=of 4] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+    \end{center}
+
+    Für eine Kantenliste gilt:
+    \begin{itemize}
+        \item Position \texttt{0}: Anzahl der Knoten
+        \item Position \texttt{1}: Anzahl der Kanten
+        \item Danach für jede Kante \texttt{c = (i, j)}:
+              \begin{itemize}
+                  \item Startknoten \texttt{i}
+                  \item Endknoten \texttt{j}
+              \end{itemize}
+    \end{itemize}
+
+    Für den Graphen $G$ oben gilt die Kantenliste:
+
+    \centering
+
+    \texttt{[6,11,1,2,1,3,3,1,4,1,3,4,3,6,5,3,5,5,6,5,6,2,6,4]}
+
+\end{example}
+
+\begin{example}{Knotenliste}
+    \begin{center}
+        \begin{tikzpicture}[->]
+            \node[draw, circle] (1) {1};
+            \node[draw, circle, below left=of 1] (3) {3};
+            \node[draw, circle, below right=of 1] (4) {4};
+            \node[draw, circle, above right=of 4] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+    \end{center}
+
+    Für eine Knoten gilt:
+    \begin{itemize}
+        \item Position \texttt{0}: Anzahl der Knoten
+        \item Position \texttt{1}: Anzahl der Kanten
+        \item Danach für jeden Knoten \texttt{i}:
+              \begin{itemize}
+                  \item Ausgangsgrad des Knotens \texttt{i} (Anzahl der ausgehenden Kanten)
+                  \item Alle Knoten \texttt{j} für die gilt $(i, j) \in E$
+              \end{itemize}
+    \end{itemize}
+
+    Für den Graphen $G$ oben gilt die Knotenliste:
+
+    \centering
+
+    \texttt{[6,11,2,2,3,0,3,1,4,6,1,1,2,3,5,3,2,4,5]}
+
+\end{example}
+
+\begin{example}{Adjazenzmatrix}
+    \begin{center}
+        \begin{tikzpicture}[->]
+            \node[draw, circle] (1) {1};
+            \node[draw, circle, below left=of 1] (3) {3};
+            \node[draw, circle, below right=of 1] (4) {4};
+            \node[draw, circle, above right=of 4] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+    \end{center}
+
+    Für den Graphen $G$ oben gilt die Adjazenzmatrix:
+    $$
+        A(G) = \vektor{
+            0 & 1 & 1 & 0 & 0 & 0 \\
+            0 & 0 & 0 & 0 & 0 & 0 \\
+            1 & 0 & 0 & 1 & 0 & 1 \\
+            1 & 0 & 0 & 0 & 0 & 0 \\
+            0 & 0 & 1 & 0 & 1 & 0 \\
+            0 & 1 & 0 & 1 & 1 & 0
+        }
+    $$
+\end{example}
+
+\begin{example}{Adjazenzliste}
+    \begin{center}
+        \begin{tikzpicture}[->]
+            \node[draw, circle] (1) {1};
+            \node[draw, circle, below left=of 1] (3) {3};
+            \node[draw, circle, below right=of 1] (4) {4};
+            \node[draw, circle, above right=of 4] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+    \end{center}
+
+    Für den Graphen $G$ oben gilt die Adjazenzliste:
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{tikzpicture}[
+            start chain = going below,
+            StackBlock/.style={minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            every node/.style={draw, label distance=0.5em},
+            node distance=0em
+            ]
+            {
+            \node [StackBlock] (k1) {$1$};
+            \node [StackBlock,yshift=-0.5em] (k2) {$2$};
+            \node [StackBlock,yshift=-0.5em] (k3) {$3$};
+            \node [StackBlock,yshift=-0.5em] (k4) {$4$};
+            \node [StackBlock,yshift=-0.5em] (k5) {$5$};
+            \node [StackBlock,yshift=-0.5em] (k6) {$6$};
+
+            % Chain 1
+            { [continue chain = going right]
+            \chainin (k1);
+
+            \node [StackBlock, xshift=2em] (12) {$2$};
+            \node [StackBlock] (12p) {};
+            \node [StackBlock, xshift=2em] (13) {$3$};
+            \node [StackBlock] (13p) {};
+            }
+
+            % Chain 3
+            { [continue chain = going right]
+            \chainin (k3);
+
+            \node [StackBlock, xshift=2em] (31) {$1$};
+            \node [StackBlock] (31p) {};
+            \node [StackBlock, xshift=2em] (34) {$4$};
+            \node [StackBlock] (34p) {};
+            \node [StackBlock, xshift=2em] (36) {$6$};
+            \node [StackBlock] (36p) {};
+            }
+
+            % Chain 4
+            { [continue chain = going right]
+            \chainin (k4);
+
+            \node [StackBlock, xshift=2em] (41) {$1$};
+            \node [StackBlock] (41p) {};
+            }
+
+            % Chain 5
+            { [continue chain = going right]
+            \chainin (k5);
+
+            \node [StackBlock, xshift=2em] (53) {$3$};
+            \node [StackBlock] (53p) {};
+            \node [StackBlock, xshift=2em] (55) {$5$};
+            \node [StackBlock] (55p) {};
+            }
+
+            % Chain 6
+            { [continue chain = going right]
+            \chainin (k6);
+
+            \node [StackBlock, xshift=2em] (62) {$2$};
+            \node [StackBlock] (62p) {};
+            \node [StackBlock, xshift=2em] (64) {$4$};
+            \node [StackBlock] (64p) {};
+            \node [StackBlock, xshift=2em] (65) {$5$};
+            \node [StackBlock] (65p) {};
+            }
+
+            \draw[->] (k1.east) [out=0, in=180] to (12.west);
+            \draw[->] (k3.east) [out=0, in=180] to (31.west);
+            \draw[->] (k4.east) [out=0, in=180] to (41.west);
+            \draw[->] (k5.east) [out=0, in=180] to (53.west);
+            \draw[->] (k6.east) [out=0, in=180] to (62.west);
+
+            \draw[->] (12p.center) [out=0, in=180] to (13.west);
+
+            \draw[->] (31p.center) [out=0, in=180] to (34.west);
+            \draw[->] (34p.center) [out=0, in=180] to (36.west);
+
+            \draw[->] (53p.center) [out=0, in=180] to (55.west);
+
+            \draw[->] (62p.center) [out=0, in=180] to (64.west);
+            \draw[->] (64p.center) [out=0, in=180] to (65.west);
+            }
+        \end{tikzpicture}
+    \end{center}
+\end{example}
+
+\subsection{Suche}
+
+\begin{algo}{Breitensuche}
+    \begin{enumerate}
+        \item Zunächst werden alle Knoten als \glqq noch nicht besucht\grqq markiert.
+        \item Startpunkt $v$ wählen und als \glqq besucht\grqq markieren.
+        \item Jetzt:
+              \begin{enumerate}
+                  \item alle von $v$ aus direkt erreichbaren (nicht besuchten) Knoten \glqq besuchen\grqq
+                  \item alle von $v$ über zwei Kanten erreichbaren (nicht besuchten) Knoten \glqq besuchen\grqq
+                  \item $\ldots$
+              \end{enumerate}
+        \item Wenn noch nicht alle Knoten besucht worden sind, wähle einen neuen unbesuchten Startpunkt $v$ und beginne bei Schritt 3
+    \end{enumerate}
+
+    Start bei Knoten 1.
+
+    \begin{center}
+        \begin{tikzpicture}[->]
+            \node[draw, circle, current] (1) {1};
+            \node[draw, circle, below left=of 1] (3) {3};
+            \node[draw, circle, below right=of 1] (4) {4};
+            \node[draw, circle, above right=of 4] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1, current] (3) {3};
+            \node[draw, circle, below right=of 1] (4) {4};
+            \node[draw, circle, above right=of 4, current] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        %\hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1, visited] (3) {3};
+            \node[draw, circle, below right=of 1, current] (4) {4};
+            \node[draw, circle, above right=of 4, visited] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4, current] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1, visited] (3) {3};
+            \node[draw, circle, below right=of 1, visited] (4) {4};
+            \node[draw, circle, above right=of 4, visited] (2) {2};
+            \node[draw, circle, below=of 3, current] (5) {5};
+            \node[draw, circle, below=of 4, visited] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        %\hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1, visited] (3) {3};
+            \node[draw, circle, below right=of 1, visited] (4) {4};
+            \node[draw, circle, above right=of 4, visited] (2) {2};
+            \node[draw, circle, below=of 3, visited] (5) {5};
+            \node[draw, circle, below=of 4, visited] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+    \end{center}
+\end{algo}
+
+\begin{algo}{Tiefensuche}
+    \begin{enumerate}
+        \item Zunächst alle Knoten als \glqq noch nicht besucht\grqq markieren.
+        \item Startpunkt $v$ wählen und als \glqq besucht\grqq markieren.
+        \item Von dort aus möglichst langen Pfad entlang gehen; dabei nur bisher nicht besuchte Knoten \glqq besuchen\grqq
+        \item Wenn dann noch nicht alle Knoten besucht worden sind, wähle einen neuen unbesuchten Startpunkt $v$ und beginne bei Schritt 3
+    \end{enumerate}
+
+    Start bei Knoten 1.
+
+    \begin{center}
+        \begin{tikzpicture}[->]
+            \node[draw, circle, current] (1) {1};
+            \node[draw, circle, below left=of 1] (3) {3};
+            \node[draw, circle, below right=of 1] (4) {4};
+            \node[draw, circle, above right=of 4] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1] (3) {3};
+            \node[draw, circle, below right=of 1] (4) {4};
+            \node[draw, circle, above right=of 4, current] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        %\hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1, current] (3) {3};
+            \node[draw, circle, below right=of 1] (4) {4};
+            \node[draw, circle, above right=of 4, visited] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1, visited] (3) {3};
+            \node[draw, circle, below right=of 1, current] (4) {4};
+            \node[draw, circle, above right=of 4, visited] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        %\hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1, visited] (3) {3};
+            \node[draw, circle, below right=of 1, visited] (4) {4};
+            \node[draw, circle, above right=of 4, visited] (2) {2};
+            \node[draw, circle, below=of 3] (5) {5};
+            \node[draw, circle, below=of 4, current] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1, visited] (3) {3};
+            \node[draw, circle, below right=of 1, visited] (4) {4};
+            \node[draw, circle, above right=of 4, visited] (2) {2};
+            \node[draw, circle, below=of 3, current] (5) {5};
+            \node[draw, circle, below=of 4, visited] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+        %
+        %\hspace{5em}
+        %
+        \begin{tikzpicture}[->]
+            \node[draw, circle, visited] (1) {1};
+            \node[draw, circle, below left=of 1, visited] (3) {3};
+            \node[draw, circle, below right=of 1, visited] (4) {4};
+            \node[draw, circle, above right=of 4, visited] (2) {2};
+            \node[draw, circle, below=of 3, visited] (5) {5};
+            \node[draw, circle, below=of 4, visited] (6) {6};
+
+            \path (5) edge[loop below] (5);
+            \path (1) edge[bend left=15] (3);
+            \path (3) edge[bend left=15] (1);
+            \path (4) edge (1);
+            \path (1) edge (2);
+            \path (3) edge (4);
+            \path (5) edge (3);
+            \path (3) edge (6);
+            \path (6) edge (4);
+            \path (6) edge (5);
+            \path (6) edge (2);
+        \end{tikzpicture}
+    \end{center}
+\end{algo}
+
+\begin{defi}{Level-Order-Baumdurchlauf}
+    Führt man eine Breitensuche bei Bäumen aus, stellt man fest:
+    \begin{itemize}
+        \item Es ist nicht nötig, die Knoten zu markieren.
+        \item Der Baum wird Ebene für Ebene durchlaufen,
+    \end{itemize}
+
+    Diesen Durchlauf nennt man \emph{Level-Order-Durchlauf}.
+\end{defi}
+
+\begin{defi}{Pre-Order-Baumdurchlauf}
+    Führt man eine Tiefensuche bei Bäumen aus, nennt man diesen Durchlauf \emph{Pre-Order-Durchlauf}.
+
+    Dabei wird stets der linke Teilbaum zuerst durchlaufen.
+\end{defi}
+
+\begin{defi}{Post-Order-Baumdurchlauf}
+    \begin{enumerate}
+        \item Durchlaufe linken Teilbaum
+        \item Durchlaufe rechten Teilbaum
+        \item Betrachte die Wurzel
+    \end{enumerate}
+\end{defi}
+
+\begin{defi}{In-Order-Baumdurchlauf}
+    \begin{enumerate}
+        \item Durchlaufe linken Teilbaum
+        \item Betrachte die Wurzel
+        \item Durchlaufe rechten Teilbaum
+    \end{enumerate}
+\end{defi}
+
+\begin{example}{Baumdurchläufe}
+    \begin{center}
+        \begin{forest}
+            baseline,anchor=north,
+            for tree={circle, draw,
+                    minimum size=2em, % <-- added
+                    inner sep=1pt}
+                [
+                    45
+                        [
+                            36
+                                [
+                                    25
+                                        [
+                                            2
+                                        ]
+                                        [
+                                            3
+                                        ]
+                                ]
+                                [
+                                    26
+                                        [
+                                            19
+                                        ]
+                                        [, draw=none, edge={draw=none}]
+                                ]
+                        ]
+                        [
+                            17
+                                [
+                                    7
+                                ]
+                                [
+                                    1
+                                ]
+                        ]
+                ]
+        \end{forest}
+    \end{center}
+
+    Für den gegebenen Baum gelten folgende Baumdurchläufe:
+
+    \centering
+    \begin{tabular}{|l|cccccccccc|}
+        \hline
+        Pre-Order   & 45 & 36 & 25 & 2  & 3  & 26 & 19 & 17 & 7  & 1  \\
+        \hline
+        In-Order    & 2  & 25 & 3  & 19 & 26 & 36 & 45 & 7  & 17 & 1  \\
+        \hline
+        Post-Order  & 2  & 3  & 25 & 19 & 26 & 36 & 7  & 1  & 17 & 45 \\
+        \hline
+        Level-Order & 45 & 36 & 17 & 25 & 26 & 7  & 1  & 2  & 3  & 19 \\
+        \hline
+    \end{tabular}
+\end{example}
+
+
+\subsection{Entwurfsprinzipien}
+
+\begin{defi}{Traveling-Salesman-Problem}
+    Das \emph{Traveling-Salesman-Problem} ist ein Optimierungsproblem.
+    Die Aufgabe besteht darin, eine Reihenfolge für den Besuch mehrerer Orte so zu wählen, dass:
+    \begin{itemize}
+        \item kein Ort doppelt besucht wird und
+        \item die Reisestrecke minimal ist.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Greedy}
+    Wähle immer den Schritt, desse unmittelbarer Folgezustand das beste Ergebnis liefert.
+    Denke nicht an die weiteren Schritte (greedy = gierig).
+
+    Ob ein Greedy-Algorithmus die optimale Lösung liefert oder nicht, ist vom konkreten Problem abhängig.
+
+    Für das Traveling-Salesman-Problem ist eine Greedy-Lösung z.B. die \emph{Nearest-Neighbour-Lösung}:
+    \begin{itemize}
+        \item Gehe in jedem Schritt zur nächstliegenden Stadt, die noch nicht besucht ist.
+        \item $\bigo(n^2)$
+        \item liefert nicht die optimale Lösung (kann sogar beliebig schlecht werden)
+        \item arbeitet meistens einigermaßen gut
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{Random Insertion}
+    Wähle immer einen zufälligen Knoten.
+
+    \begin{itemize}
+        \item $\bigo(n^2)$
+        \item keine Garantie, dass die Lösung irgendeinem Gütekriterium genügt
+        \item im Allgmeinen ist Lösung ziemlich gut
+        \item Vorteil: Durch den Zufallsfaktor kann man das Verfahren beliebig oft wiederholen und sich die beste Lösung heraussuchen.
+    \end{itemize}
+\end{bonus}
+
+\begin{bonus}{Lösung mit minimalem Spannbaum}
+    \begin{enumerate}
+        \item Konstruktion eines minimalen Spannbaums nach Prim
+        \item Durchlaufen mit Tiefensuche
+        \item jede Kante wird zweimal durchlaufen
+        \item summierte Gewichte des minimalen Spannbaums müssen kleiner sein als das optimale TSP-Ergebnis
+        \item Optimierung:
+              \begin{itemize}
+                  \item Knoten schon einmal besucht: beim nächsten Mal überspringen
+                  \item bei einem Schritt mehrere Möglichkeiten: zuerst kürzeren Weg wählen (greedy)
+              \end{itemize}
+    \end{enumerate}
+\end{bonus}
+
+\begin{defi}{Backtracking}
+    Durchlauf eines Lösungsbaum in Pre-Order-Reihenfolge.
+
+    Situation: Mehrere Alternativen sind in bestimmten Schritten des Algorithmus möglich.
+
+    Lösung mit \emph{Backtracking}:
+    \begin{enumerate}
+        \item Wähle eine Alternative und verfolge dieses Weg weiter.
+        \item Falls man so eine Lösung des Problems findet, ist man fertig.
+        \item Ansonsten gehe einen Schritt zurück und verfolge rekursiv eine andere (nicht versuchte) Alternative in diesem Schritt.
+        \item Falls alle Alternativen erfolglos probiert wurden, einen Schritt zurückgehen $\ldots$
+    \end{enumerate}
+
+    Backtracking-Algorithmen können exponentiellen Aufwand haben.
+
+    Tipps:
+    \begin{itemize}
+        \item Durch Einführung von Zusatzbedingungen möglichst viele Sackgassen ausschließen.
+        \item Symmetriebedingungen ausnutzen.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Branch and Bound}
+    \begin{enumerate}
+        \item Ermitteln einer oberen Schranke (greedy)
+        \item Falls dieser Wert überschritten wird, kann man die Suche auf diesem Pfad abbrechen.
+        \item Bessere Lösungen nutzen, um die Schranke zu verbessern.
+    \end{enumerate}
+\end{defi}
+
+
+\subsection{Graphalgorithmen}
+
+\begin{defi}{Bipartiter Graph}
+    Ein Graph $G=(V, E)$ heißt \emph{bipartit}, wenn man $V$ in disjunkte Mengen $U$ und $W$ zerlegen kann, so dass alle Kanten zwischen $U$ und $W$ verlaufen.
+
+    Die Knoten eines bipartiten Graphen lassen sich mit zwei Farben so einfärben, dass zwei Nachbarknoten immer unterschiedlich eingefärbt sind.
+\end{defi}
+
+\begin{algo}{Prüfung ob ein Graph bipartit ist}
+    \begin{enumerate}
+        \item Einfärben des 1. Knotens
+        \item Durchlauf mit Breitensuche
+        \item Abwechselndes Färben
+    \end{enumerate}
+
+    Start bei Knoten 1.
+
+    \vspace{1em}
+
+    \begin{center}
+        \begin{tikzpicture}
+            \node[draw, circle, text=white, fill = blue!50] (1) {1};
+            \node[draw, circle, right=of 1] (2) {2};
+            \node[draw, circle, right=of 2] (3) {3};
+            \node[draw, circle, below=of 1] (4) {4};
+            \node[draw, circle, right=of 4] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+            \node[draw, circle, right=of 6] (7) {7};
+
+            \path (1) edge (2);
+            \path (2) edge (3);
+            \path (1) edge (4);
+            \path (4) edge (5);
+            \path (2) edge (5);
+            \path (4) edge (6);
+            \path (6) edge (7);
+            \path (3) edge[bend left=30] (7);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tikzpicture}
+            \node[draw, circle, text=white, fill = blue!50] (1) {1};
+            \node[draw, circle, text=white, right=of 1, fill = red!50] (2) {2};
+            \node[draw, circle, right=of 2] (3) {3};
+            \node[draw, circle, text=white, below=of 1, fill = red!50] (4) {4};
+            \node[draw, circle, right=of 4] (5) {5};
+            \node[draw, circle, below=of 4] (6) {6};
+            \node[draw, circle, right=of 6] (7) {7};
+
+            \path (1) edge (2);
+            \path (2) edge (3);
+            \path (1) edge (4);
+            \path (4) edge (5);
+            \path (2) edge (5);
+            \path (4) edge (6);
+            \path (6) edge (7);
+            \path (3) edge[bend left=30] (7);
+        \end{tikzpicture}
+
+        \vspace{1em}
+
+        \begin{tikzpicture}
+            \node[draw, circle, text=white, fill = blue!50] (1) {1};
+            \node[draw, circle, text=white, right=of 1, fill = red!50] (2) {2};
+            \node[draw, circle, text=white, right=of 2, fill = blue!50] (3) {3};
+            \node[draw, circle, text=white, below=of 1, fill = red!50] (4) {4};
+            \node[draw, circle, text=white, right=of 4, fill = blue!50] (5) {5};
+            \node[draw, circle, text=white, below=of 4, fill = blue!50] (6) {6};
+            \node[draw, circle, right=of 6] (7) {7};
+
+            \path (1) edge (2);
+            \path (2) edge (3);
+            \path (1) edge (4);
+            \path (4) edge (5);
+            \path (2) edge (5);
+            \path (4) edge (6);
+            \path (6) edge (7);
+            \path (3) edge[bend left=30] (7);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tikzpicture}
+            \node[draw, circle, text=white, fill = blue!50] (1) {1};
+            \node[draw, circle, text=white, right=of 1, fill = red!50] (2) {2};
+            \node[draw, circle, text=white, right=of 2, fill = blue!50] (3) {3};
+            \node[draw, circle, text=white, below=of 1, fill = red!50] (4) {4};
+            \node[draw, circle, text=white, right=of 4, fill = blue!50] (5) {5};
+            \node[draw, circle, text=white, below=of 4, fill = blue!50] (6) {6};
+            \node[draw, circle, text=white, right=of 6, fill = red!50] (7) {7};
+
+            \path (1) edge (2);
+            \path (2) edge (3);
+            \path (1) edge (4);
+            \path (4) edge (5);
+            \path (2) edge (5);
+            \path (4) edge (6);
+            \path (6) edge (7);
+            \path (3) edge[bend left=30] (7);
+        \end{tikzpicture}
+    \end{center}
+\end{algo}
+
+\begin{defi}{Spannbaum}
+    Ein \emph{Spannbaum} verbindet alle Knoten eines ungerichteten Graphen miteinander, hat jedoch keine Kreise.
+
+    Der \emph{minimale Spannbaum} ist der Spannbaum, dessen Kanten das kleinste summierte Gewicht haben.
+\end{defi}
+
+\begin{algo}{Prim-Algorithmus}
+    \begin{enumerate}
+        \item Wähle einen beliebigen Startknoten für den minimalen Spannbaum $T$
+        \item Solange $T$ noch nicht alle Knoten enthält:
+              \begin{itemize}
+                  \item Wähle eine Kante $e$ mit minimalem Gewicht aus, die einen noch nicht in $T$ enthaltenen Knoten $v$ mit $T$ verbindet.
+                  \item Füge $e$ und $v$ dem Graphen $T$ hinzu.
+              \end{itemize}
+    \end{enumerate}
+
+    Start bei Knoten $A$.
+
+    \vspace{1em}
+    \begin{center}
+        \begin{tikzpicture}
+            \node[draw, circle, prim node] (A) {$A$};
+            \node[draw, circle, below right=of A] (B) {$B$};
+            \node[draw, circle, above right=of B] (C) {$C$};
+            \node[draw, circle, below left=of B] (D) {$D$};
+            \node[draw, circle, below right=of B] (E) {$E$};
+            \node[draw, circle, below=of D] (F) {$F$};
+            \node[draw, circle, below=of E] (G) {$G$};
+
+            \path (A) edge node[weight,above right] {7} (B);
+            \path (B) edge node[weight,above left] {8} (C);
+            \path (D) edge node[weight,right] {5} (A);
+            \path (D) edge node[weight,above left] {9} (B);
+            \path (E) edge node[weight,above right] {7} (B);
+            \path (C) edge node[weight,right] {5} (E);
+            \path (D) edge node[weight,above] {15} (E);
+            \path (D) edge node[weight,right] {6} (F);
+            \path (E) edge node[weight,above left] {8} (F);
+            \path (E) edge node[weight,right] {11} (G);
+            \path (F) edge node[weight,above] {9} (G);
+        \end{tikzpicture}
+        %
+        \hspace{3em}
+        %
+        \begin{tikzpicture}
+            \node[draw, circle, prim node] (A) {$A$};
+            \node[draw, circle, below right=of A] (B) {$B$};
+            \node[draw, circle, above right=of B] (C) {$C$};
+            \node[draw, circle, below left=of B, prim node] (D) {$D$};
+            \node[draw, circle, below right=of B] (E) {$E$};
+            \node[draw, circle, below=of D] (F) {$F$};
+            \node[draw, circle, below=of E] (G) {$G$};
+
+            \path (A) edge node[weight,above right] {7} (B);
+            \path (B) edge node[weight,above left] {8} (C);
+            \path (D) edge[prim edge] node[weight,right] {5} (A);
+            \path (D) edge node[weight,above left] {9} (B);
+            \path (E) edge node[weight,above right] {7} (B);
+            \path (C) edge node[weight,right] {5} (E);
+            \path (D) edge node[weight,above] {15} (E);
+            \path (D) edge node[weight,right] {6} (F);
+            \path (E) edge node[weight,above left] {8} (F);
+            \path (E) edge node[weight,right] {11} (G);
+            \path (F) edge node[weight,above] {9} (G);
+        \end{tikzpicture}
+        %
+        \hspace{3em}
+        %
+        \begin{tikzpicture}
+            \node[draw, circle, prim node] (A) {$A$};
+            \node[draw, circle, below right=of A] (B) {$B$};
+            \node[draw, circle, above right=of B] (C) {$C$};
+            \node[draw, circle, below left=of B, prim node] (D) {$D$};
+            \node[draw, circle, below right=of B] (E) {$E$};
+            \node[draw, circle, below=of D, prim node] (F) {$F$};
+            \node[draw, circle, below=of E] (G) {$G$};
+
+            \path (A) edge node[weight,above right] {7} (B);
+            \path (B) edge node[weight,above left] {8} (C);
+            \path (D) edge[prim edge] node[weight,right] {5} (A);
+            \path (D) edge node[weight,above left] {9} (B);
+            \path (E) edge node[weight,above right] {7} (B);
+            \path (C) edge node[weight,right] {5} (E);
+            \path (D) edge node[weight,above] {15} (E);
+            \path (D) edge[prim edge] node[weight,right] {6} (F);
+            \path (E) edge node[weight,above left] {8} (F);
+            \path (E) edge node[weight,right] {11} (G);
+            \path (F) edge node[weight,above] {9} (G);
+        \end{tikzpicture}
+        %
+        \vspace{1em}
+        %
+
+        \begin{tikzpicture}
+            \node[draw, circle, prim node] (A) {$A$};
+            \node[draw, circle, below right=of A, prim node] (B) {$B$};
+            \node[draw, circle, above right=of B] (C) {$C$};
+            \node[draw, circle, below left=of B, prim node] (D) {$D$};
+            \node[draw, circle, below right=of B] (E) {$E$};
+            \node[draw, circle, below=of D, prim node] (F) {$F$};
+            \node[draw, circle, below=of E] (G) {$G$};
+
+            \path (A) edge[prim edge] node[weight,above right] {7} (B);
+            \path (B) edge node[weight,above left] {8} (C);
+            \path (D) edge[prim edge] node[weight,right] {5} (A);
+            \path (D) edge node[weight,above left] {9} (B);
+            \path (E) edge node[weight,above right] {7} (B);
+            \path (C) edge node[weight,right] {5} (E);
+            \path (D) edge node[weight,above] {15} (E);
+            \path (D) edge[prim edge] node[weight,right] {6} (F);
+            \path (E) edge node[weight,above left] {8} (F);
+            \path (E) edge node[weight,right] {11} (G);
+            \path (F) edge node[weight,above] {9} (G);
+        \end{tikzpicture}
+        %
+        \hspace{3em}
+        %
+        \begin{tikzpicture}
+            \node[draw, circle, prim node] (A) {$A$};
+            \node[draw, circle, below right=of A, prim node] (B) {$B$};
+            \node[draw, circle, above right=of B] (C) {$C$};
+            \node[draw, circle, below left=of B, prim node] (D) {$D$};
+            \node[draw, circle, below right=of B, prim node] (E) {$E$};
+            \node[draw, circle, below=of D, prim node] (F) {$F$};
+            \node[draw, circle, below=of E] (G) {$G$};
+
+            \path (A) edge[prim edge] node[weight,above right] {7} (B);
+            \path (B) edge node[weight,above left] {8} (C);
+            \path (D) edge[prim edge] node[weight,right] {5} (A);
+            \path (D) edge node[weight,above left] {9} (B);
+            \path (E) edge[prim edge] node[weight,above right] {7} (B);
+            \path (C) edge node[weight,right] {5} (E);
+            \path (D) edge node[weight,above] {15} (E);
+            \path (D) edge[prim edge] node[weight,right] {6} (F);
+            \path (E) edge node[weight,above left] {8} (F);
+            \path (E) edge node[weight,right] {11} (G);
+            \path (F) edge node[weight,above] {9} (G);
+        \end{tikzpicture}
+        %
+        \hspace{3em}
+        %
+        \begin{tikzpicture}
+            \node[draw, circle, prim node] (A) {$A$};
+            \node[draw, circle, below right=of A, prim node] (B) {$B$};
+            \node[draw, circle, above right=of B, prim node] (C) {$C$};
+            \node[draw, circle, below left=of B, prim node] (D) {$D$};
+            \node[draw, circle, below right=of B, prim node] (E) {$E$};
+            \node[draw, circle, below=of D, prim node] (F) {$F$};
+            \node[draw, circle, below=of E] (G) {$G$};
+
+            \path (A) edge[prim edge] node[weight,above right] {7} (B);
+            \path (B) edge node[weight,above left] {8} (C);
+            \path (D) edge[prim edge] node[weight,right] {5} (A);
+            \path (D) edge node[weight,above left] {9} (B);
+            \path (E) edge[prim edge] node[weight,above right] {7} (B);
+            \path (C) edge[prim edge] node[weight,right] {5} (E);
+            \path (D) edge node[weight,above] {15} (E);
+            \path (D) edge[prim edge] node[weight,right] {6} (F);
+            \path (E) edge node[weight,above left] {8} (F);
+            \path (E) edge node[weight,right] {11} (G);
+            \path (F) edge node[weight,above] {9} (G);
+        \end{tikzpicture}
+        %
+        \vspace{1em}
+        %
+
+        \begin{tikzpicture}
+            \node[draw, circle, prim node] (A) {$A$};
+            \node[draw, circle, below right=of A, prim node] (B) {$B$};
+            \node[draw, circle, above right=of B, prim node] (C) {$C$};
+            \node[draw, circle, below left=of B, prim node] (D) {$D$};
+            \node[draw, circle, below right=of B, prim node] (E) {$E$};
+            \node[draw, circle, below=of D, prim node] (F) {$F$};
+            \node[draw, circle, below=of E, prim node] (G) {$G$};
+
+            \path (A) edge[prim edge] node[weight,above right] {7} (B);
+            \path (B) edge node[weight,above left] {8} (C);
+            \path (D) edge[prim edge] node[weight,right] {5} (A);
+            \path (D) edge node[weight,above left] {9} (B);
+            \path (E) edge[prim edge] node[weight,above right] {7} (B);
+            \path (C) edge[prim edge] node[weight,right] {5} (E);
+            \path (D) edge node[weight,above] {15} (E);
+            \path (D) edge[prim edge] node[weight,right] {6} (F);
+            \path (E) edge node[weight,above left] {8} (F);
+            \path (E) edge node[weight,right] {11} (G);
+            \path (F) edge[prim edge] node[weight,above] {9} (G);
+        \end{tikzpicture}
+    \end{center}
+\end{algo}
+
+\begin{defi}{Shortest-Path-Probleme}
+    Eigentlich: Suche nach \emph{günstigsten Wegen} in gewichteten Graphen: Gewichte $\simeq$ Kosten
+
+    Bei Anwendung auf ungewichtete Graphen ergibt sich: \emph{kürzeste Wege}.
+
+    Beispiele:
+    \begin{itemize}
+        \item Single-Source-Shortest-Path
+              \begin{itemize}
+                  \item Dijkstra-Algorithmus (nicht-negative Kantengewichte)
+                  \item Bellman-Ford-Algorithmus (keine negativen Zykel)
+              \end{itemize}
+        \item All-Pairs-Shortest-Path
+              \begin{itemize}
+                  \item Floyd-Warshall-Algorithmus
+              \end{itemize}
+        \item One-Pair
+              \begin{itemize}
+                  \item A*-Algorithmus
+              \end{itemize}
+    \end{itemize}
+\end{defi}
+
+\begin{algo}{Dijkstra-Algorithmus}
+    Gegeben: Graph $G = (V, E)$, dessen Bewertungsfunktion die Eigenschaften hat:
+    \begin{itemize}
+        \item Jede Kante von $v_i$ nach $v_j$ hat nicht-negative Kosten: $C(i, j) \geq 0$
+        \item Falls keine Kante zwischen $v_i$ und $v_j$: $C(i, j) = \infty$
+        \item Diagonalelemente: $C(i, i) = 0$
+    \end{itemize}
+
+    Menge $S$: die Knoten, deren günstigste Wegekosten von der vorgegebenen Quelle (Startknoten) bereits bekannt sind.
+
+    \begin{enumerate}
+        \item Initialisierung: $S = \{ \text{Startknoten} \}$
+        \item Beginnend mit Quelle alle ausgehenden Kanten betrachten (analog Breitensuche). Nachfolgerknoten $v$ mit günstigster Kante zu $S$ hinzunehmen.
+        \item Jetzt: Berechnen, ob die Knoten in $V \setminus S$ günstiger über $v$ als Zwischenweg erreichbar sind, als ohne Umweg über $v$.
+        \item Danach: Denjenigen Knoten $v'$ zu $S$ hinzunehmen, der nun am günstigsten zu erreichen ist. Bei zwei gleich günstigen Knoten wird ein beliebiger davon ausgewählt.
+        \item Ab Schritt 3 wiederholen, bis alle Knoten in $S$ sind.
+    \end{enumerate}
+
+    Zeitkomplexität (bei Speicherung des Graphen mit Adjazenzmatrix): $\bigo(\abs{V}^2)$
+\end{algo}
+
+\begin{example}{Dijkstra-Algorithmus}
+    \begin{center}
+        \begin{tikzpicture}[->]
+            \node[draw, circle] (A) {$A$};
+            \node[draw, circle, below right=of A] (D) {$D$};
+            \node[draw, circle, right=of D] (E) {$E$};
+            \node[draw, circle, above right=of E] (B) {$B$};
+            \node[draw, circle, below right=of B] (H) {$H$};
+            \node[draw, circle, below left=of H] (G) {$G$};
+            \node[draw, circle, below left=of A] (F) {$F$};
+            \node[draw, circle, below right=of F] (C) {$C$};
+
+            \path (A) edge node[weight, below left] {4} (D);
+            \path (A) edge node[weight, above right] {2} (E);
+            \path (A) edge node[weight, above right] {12} (B);
+            \path (A) edge node[weight, above left] {30} (F);
+            \path (E) edge node[weight, above] {1} (D);
+            \path (E) edge node[weight, below right] {8} (C);
+            \path (E) edge node[weight, above left] {8} (B);
+            \path (C) edge node[weight, above right] {3} (F);
+            \path (C) edge node[weight, above right] {3} (F);
+            \path (C) edge node[weight, above] {12} (G);
+            \path (G) edge node[weight, right] {4} (B);
+            \path (G) edge node[weight, below right] {5} (H);
+            \path (H) edge node[weight, above right] {2} (B);
+        \end{tikzpicture}
+
+        \vspace{1em}
+
+        \begin{tabular}{|c|ccccccc|ccccccc|}
+            \hline
+            \multirow{2}{*}{$v_i$} & $d[2]$      & $d[3]$      & $d[4]$     & $d[5]$     & $d[6]$      & $d[7]$      & $d[8]$      & $p[2]$ & $p[3]$ & $p[4]$ & $p[5]$ & $p[6]$ & $p[7]$ & $p[8]$ \\ \cline{2-15}
+                                   & B           & C           & D          & E          & F           & G           & H           & B      & C      & D      & E      & F      & G      & H      \\
+            \hline
+            A                      & 12          &             & 4          & \textbf{2} & 30          &             &             & A      &        & A      & A      & A      &        &        \\
+            E                      & 10          & 10          & \textbf{3} & \textbf{2} & 30          &             &             & E      & E      & E      & A      & A      &        &        \\
+            D                      & \textbf{10} & 10          & \textbf{3} & \textbf{2} & 30          &             &             & E      & E      & E      & A      & A      &        &        \\
+            B                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & 30          &             &             & E      & E      & E      & A      & A      &        &        \\
+            C                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & \textbf{13} & 22          &             & E      & E      & E      & A      & C      & C      &        \\
+            F                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & \textbf{13} & \textbf{22} &             & E      & E      & E      & A      & C      & C      &        \\
+            G                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & \textbf{13} & \textbf{22} & \textbf{27} & E      & E      & E      & A      & C      & C      & G      \\
+            H                      & \textbf{10} & \textbf{10} & \textbf{3} & \textbf{2} & \textbf{13} & \textbf{22} & \textbf{27} & E      & E      & E      & A      & C      & C      & G      \\
+            \hline
+        \end{tabular}
+    \end{center}
+
+    \vspace{1em}
+
+    \url{https://youtu.be/4pBP2hbnGso} (Herleitung und Erklärung)
+\end{example}
+
+\begin{algo}{Bellman-Ford-Algorithmus}
+    Gegeben: Graph $G = (V, E)$, dessen Bewertungsfunktion die Eigenschaften hat:
+    \begin{itemize}
+        \item Falls keine Kante zwischen $v_i$ und $v_j$: $C(i, j) = \infty$
+        \item Diagonalelemente: $C(i, i) = 0$
+    \end{itemize}
+
+    \begin{enumerate}
+        \item Initialisierung: Startknoten $s$, Distanz zu $V \setminus \{s\}$ auf $\infty$ setzen
+        \item Für jede Kante $(i, j)$:
+              \begin{itemize}
+                  \item Falls Distanz zu $v_i$ bekannt:
+                        \subitem Falls $d(v_i) + C(i, j) < d(v_j)$, setze $d(v_j)$ auf $d(v_i) + C(i, j)$
+              \end{itemize}
+    \end{enumerate}
+
+    Zeitkomplexität: $\bigo(\abs{V} \cdot \abs{E})$
+\end{algo}
+
+\begin{example}{Bellman-Ford-Algorithmus}
+    \begin{center}
+        \begin{tikzpicture}[->,baseline,anchor=north]
+            \node[draw, circle] (S) {$S$};
+            \node[draw, circle, above right=of S] (A) {$A$};
+            \node[draw, circle, right=of A] (B) {$B$};
+            \node[draw, circle, below right=of S] (C) {$C$};
+            \node[draw, circle, right=of C] (D) {$D$};
+
+            \path (S) edge node[weight, above left] {2} (A);
+            \path (S) edge node[weight, below left] {5} (C);
+            \path (A) edge node[weight, above] {4} (B);
+            \path (C) edge node[weight, above] {2} (D);
+            \path (C) edge node[weight, left] {-4} (A);
+            \path (D) edge node[weight, right] {8} (B);
+            \path (B) edge[bend left=10] node[weight, below right] {1} (C);
+            \path (C) edge[bend left=10] node[weight, above left] {6} (B);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}{|c||c|c|c|c|c|}
+            \hline
+              & S & A        & B        & C        & D        \\
+            \hline
+            0 & 0 & $\infty$ & $\infty$ & $\infty$ & $\infty$ \\
+            1 & 0 & 2        & $\infty$ & 5        & $\infty$ \\
+            2 & 0 & 1        & 6        & 5        & 7        \\
+            3 & 0 & 1        & 5        & 5        & 7        \\
+            4 & 0 & 1        & 5        & 5        & 7        \\
+            \hline
+        \end{tabular}
+
+        Keine Änderungen nach Schritt 3 $\implies$ Fertig!
+    \end{center}
+\end{example}
+
+\begin{algo}{Floyd-Algorithmus}
+    Gegeben: Graph $G = (V, E)$, dessen Bewertungsfunktion die Eigenschaften hat:
+    \begin{itemize}
+        \item Jede Kante von $v_i$ nach $v_j$ hat nicht-negative Kosten: $C(i, j) \geq 0$
+        \item Falls keine Kante zwischen $v_i$ und $v_j$: $C(i, j) = \infty$
+        \item Diagonalelemente: $C(i, i) = 0$
+    \end{itemize}
+
+    Im Kontrast zum Dijkstra-Algorithmus bestimmt der \emph{Floyd-Algorithmus} für alle geordneten Paare $(v, w)$ den kürzesten Weg von $v$ nach $w$.
+
+    $\abs{V}$ Iterationen:
+    \begin{enumerate}
+        \item Vergleiche Kosten von
+              \begin{itemize}
+                  \item direkter Verbindung von Knoten $i$ zu Knoten $j$
+                  \item Umweg über Knoten $1$ (also: von $i$ nach $1$ + von $1$ nach $j$)
+                  \item Falls Umweg günstiger: alten Weg durch Umweg ersetzen
+              \end{itemize}
+        \item Umwege über Knoten $2$ betrachten.
+        \item[$k$.] Umwege über Knoten $k$ betrachten.
+    \end{enumerate}
+
+    Der Floyd-Algorithmus nutzt eine $\abs{V} \times \abs{V}$-Matrix, um die Kosten der günstigsten Wege zu speichern:
+    \begin{center}
+        $A_k[i][j] :=$ minimale Kosten, um in Schritt $k$ über irgendwelche der Knoten in $V$ vom Knoten $i$ zum Knoten $j$ zu gelangen
+    \end{center}
+
+    \begin{itemize}
+        \item Initialisierung: $A_0[i][j]= C(i, j)$
+        \item $\abs{V}$ Iterationen mit \glqq dynamischer Programmierung\grqq:
+              \subitem Iterationsformel zur Aktualisierung von $A[i][j]$:
+              $$
+                  A_k[i][j] = \min \{ A_{k-1}[i][j] , A_{k-1}[i][k] + A_{k-1}[k][j] \}
+              $$
+    \end{itemize}
+
+    Der Floyd-Algorithmus ist ein wichtiges Beispiel für dynamische Programmierung.
+\end{algo}
+
+\begin{code}{Floyd-Algorithmus}
+    \lstinputlisting{floyd.java}
+\end{code}
+
+\begin{example}{Floyd-Algorithmus}
+    \newcolumntype{g}{>{\columncolor{gray!25}}c}
+
+    $A_0$ (direkter Weg):
+    \begin{center}
+        \begin{tikzpicture}[baseline,anchor=north]
+            \node[draw, circle] (1) {$1$};
+            \node[draw, circle, right=of 1] (2) {$2$};
+            \node[draw, circle, below=of 1] (3) {$3$};
+            \node[draw, circle, right=of 3] (4) {$4$};
+
+            \path (1) edge node[weight, above] {2} (2);
+            \path (1) edge node[weight, left] {3} (3);
+            \path (3) edge node[weight, below] {7} (4);
+            \path (2) edge node[weight, right] {1} (4);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|cccc|}
+            \hline
+              & 1                   & 2                   & 3                   & 4                   \\
+            \hline
+            1 & \textcolor{gray}{0} & 2                   & 3                   & $\infty$            \\
+            2 & 2                   & \textcolor{gray}{0} & $\infty$            & 1                   \\
+            3 & 3                   & $\infty$            & \textcolor{gray}{0} & 7                   \\
+            4 & $\infty$            & 1                   & 7                   & \textcolor{gray}{0} \\
+            \hline
+        \end{tabular}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|cccc|}
+            \hline
+              & 1                   & 2                   & 3                   & 4 \\
+            \hline
+            1 & \textcolor{gray}{-} & -                   & -                   & - \\
+            2 & -                   & \textcolor{gray}{-} & -                   & - \\
+            3 & -                   & -                   & \textcolor{gray}{-} & - \\
+            4 & -                   & -                   & -                   & - \\
+            \hline
+        \end{tabular}
+    \end{center}
+
+    $A_1$ (Umweg über 1):
+    \begin{center}
+        \begin{tikzpicture}[baseline,anchor=north]
+            \node[draw, circle] (1) {$1$};
+            \node[draw, circle, right=of 1] (2) {$2$};
+            \node[draw, circle, below=of 1] (3) {$3$};
+            \node[draw, circle, right=of 3] (4) {$4$};
+
+            \path (1) edge node[weight, above] {2} (2);
+            \path (1) edge node[weight, left] {3} (3);
+            \path (3) edge node[weight, below] {7} (4);
+            \path (2) edge node[weight, right] {1} (4);
+            %\path (1) edge[blue, bend left=45] node[weight, above, blue] {2} (2);
+            %\path (1) edge[blue, bend right=45] node[weight, left, blue] {3} (3);
+            \path (2) edge[dashed, red, bend right] node[weight, above left, pos=1] {5} (1.north west);
+            \path (1.north west) edge[dashed, red, bend right] (3);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|gccc|}
+            \hline
+              & 1                   & 2                   & 3                   & 4                   \\
+            \hline
+            \rowcolor{gray!25}
+            1 & \textcolor{gray}{0} & 2                   & 3                   & $\infty$            \\
+            2 & 2                   & \textcolor{gray}{0} & \textcolor{red}{5}  & 1                   \\
+            3 & 3                   & \textcolor{red}{5}  & \textcolor{gray}{0} & 7                   \\
+            4 & $\infty$            & 1                   & 7                   & \textcolor{gray}{0} \\
+            \hline
+        \end{tabular}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|cccc|}
+            \hline
+              & 1                   & 2                   & 3                   & 4 \\
+            \hline
+            1 & \textcolor{gray}{-} & -                   & -                   & - \\
+            2 & -                   & \textcolor{gray}{-} & 1                   & - \\
+            3 & -                   & 1                   & \textcolor{gray}{-} & - \\
+            4 & -                   & -                   & -                   & - \\
+            \hline
+        \end{tabular}
+    \end{center}
+
+    $$A_0[2][3] > A_0[3][1] + A_0[1][2] \implies A_1[2][3] = A_0[3][1] + A_0[1][2] = 3 + 2 = 5$$
+    $$A_0[3][2] > A_0[2][1] + A_0[1][3] \implies A_1[3][2] = A_0[2][1] + A_0[1][3] = 2 + 3 = 5$$
+
+
+    $A_2$ (Umweg über 2):
+    \begin{center}
+        \begin{tikzpicture}[baseline,anchor=north]
+            \node[draw, circle] (1) {$1$};
+            \node[draw, circle, right=of 1] (2) {$2$};
+            \node[draw, circle, below=of 1] (3) {$3$};
+            \node[draw, circle, right=of 3] (4) {$4$};
+
+            \path (1) edge node[weight, above] {2} (2);
+            \path (1) edge node[weight, left] {3} (3);
+            \path (3) edge node[weight, below] {7} (4);
+            \path (2) edge node[weight, right] {1} (4);
+
+            % old edge 2-1-3
+            \path (2) edge[dashed, blue, bend right] node[weight, above left, pos=1] {5} (1.north west);
+            \path (1.north west) edge[dashed, blue, bend right] (3);
+            % new edge 1-2-4
+            \path (1) edge[dashed, red, bend left] node[weight, above right, pos=1] {3} (2.north east);
+            \path (2.north east) edge[dashed, red, bend left] (4);
+            % old edge 3-2-4
+            \path (3) edge[dashed, red, bend left] node[weight, below right, pos=0.5] {6} (2.south west);
+            \path (2.south west) edge[dashed, red, bend right] (4);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|cgcc|}
+            \hline
+              & 1                   & 2                   & 3                   & 4                   \\
+            \hline
+            1 & \textcolor{gray}{0} & 2                   & 3                   & \textcolor{red}{3}  \\
+            \rowcolor{gray!25}
+            2 & 2                   & \textcolor{gray}{0} & 5                   & 1                   \\
+            3 & 3                   & 5                   & \textcolor{gray}{0} & \textcolor{red}{6}  \\
+            4 & \textcolor{red}{3}  & 1                   & \textcolor{red}{6}  & \textcolor{gray}{0} \\
+            \hline
+        \end{tabular}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|cccc|}
+            \hline
+              & 1                   & 2                   & 3                   & 4 \\
+            \hline
+            1 & \textcolor{gray}{-} & -                   & -                   & 2 \\
+            2 & -                   & \textcolor{gray}{-} & 1                   & - \\
+            3 & -                   & 1                   & \textcolor{gray}{-} & 2 \\
+            4 & 2                   & -                   & 2                   & - \\
+            \hline
+        \end{tabular}
+    \end{center}
+
+    $$A_1[1][4] > A_1[1][2] + A_1[2][4] \implies A_2[2][3] = A_1[1][2] + A_1[2][4] = 2 + 1 = 3$$
+    $$A_1[4][1] > A_1[4][2] + A_1[2][1] \implies A_2[3][2] = A_1[4][2] + A_1[2][1] = 1 + 2 = 3$$
+    $$A_1[3][4] > A_1[3][2] + A_1[2][4] \implies A_2[3][4] = A_1[3][2] + A_1[2][4] = 5 + 1 = 6$$
+    $$A_1[4][3] > A_1[4][2] + A_1[2][3] \implies A_2[4][3] = A_1[4][2] + A_1[2][3] = 1 + 5 = 6$$
+
+    $A_3$ (Umweg über 3):
+    \begin{center}
+        \begin{tikzpicture}[baseline,anchor=north]
+            \node[draw, circle] (1) {$1$};
+            \node[draw, circle, right=of 1] (2) {$2$};
+            \node[draw, circle, below=of 1] (3) {$3$};
+            \node[draw, circle, right=of 3] (4) {$4$};
+
+            \path (1) edge node[weight, above] {2} (2);
+            \path (1) edge node[weight, left] {3} (3);
+            \path (3) edge node[weight, below] {7} (4);
+            \path (2) edge node[weight, right] {1} (4);
+
+            % old edge 2-1-3
+            \path (2) edge[dashed, blue, bend right] node[weight, above left, pos=1] {5} (1.north west);
+            \path (1.north west) edge[dashed, blue, bend right] (3);
+            % old edge 1-2-4
+            \path (1) edge[dashed, blue, bend left] node[weight, above right, pos=1] {3} (2.north east);
+            \path (2.north east) edge[dashed, blue, bend left] (4);
+            % old edge 3-2-4
+            \path (3) edge[dashed, blue, bend left] node[weight, below right, pos=0.5] {6} (2.south west);
+            \path (2.south west) edge[dashed, blue, bend right] (4);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|ccgc|}
+            \hline
+              & 1                   & 2                   & 3                   & 4                   \\
+            \hline
+            1 & \textcolor{gray}{0} & 2                   & 3                   & 3                   \\
+            2 & 2                   & \textcolor{gray}{0} & 5                   & 1                   \\
+            \rowcolor{gray!25}
+            3 & 3                   & 5                   & \textcolor{gray}{0} & 6                   \\
+            4 & 3                   & 1                   & 6                   & \textcolor{gray}{0} \\
+            \hline
+        \end{tabular}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|cccc|}
+            \hline
+              & 1                   & 2                   & 3                   & 4 \\
+            \hline
+            1 & \textcolor{gray}{-} & -                   & -                   & 2 \\
+            2 & -                   & \textcolor{gray}{-} & 1                   & - \\
+            3 & -                   & 1                   & \textcolor{gray}{-} & 2 \\
+            4 & 2                   & -                   & 2                   & - \\
+            \hline
+        \end{tabular}
+    \end{center}
+
+    $A_4$ (Umweg über 4):
+    \begin{center}
+        \begin{tikzpicture}[baseline,anchor=north]
+            \node[draw, circle] (1) {$1$};
+            \node[draw, circle, right=of 1] (2) {$2$};
+            \node[draw, circle, below=of 1] (3) {$3$};
+            \node[draw, circle, right=of 3] (4) {$4$};
+
+            \path (1) edge node[weight, above] {2} (2);
+            \path (1) edge node[weight, left] {3} (3);
+            \path (3) edge node[weight, below] {7} (4);
+            \path (2) edge node[weight, right] {1} (4);
+
+            % old edge 2-1-3
+            \path (2) edge[dashed, blue, bend right] node[weight, above left, pos=1] {5} (1.north west);
+            \path (1.north west) edge[dashed, blue, bend right] (3);
+            % old edge 1-2-4
+            \path (1) edge[dashed, blue, bend left] node[weight, above right, pos=1] {3} (2.north east);
+            \path (2.north east) edge[dashed, blue, bend left] (4);
+            % old edge 3-2-4
+            \path (3) edge[dashed, blue, bend left] node[weight, below right, pos=0.5] {6} (2.south west);
+            \path (2.south west) edge[dashed, blue, bend right] (4);
+        \end{tikzpicture}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|cccg|}
+            \hline
+              & 1                   & 2                   & 3                   & 4                   \\
+            \hline
+            1 & \textcolor{gray}{0} & 2                   & 3                   & 3                   \\
+            2 & 2                   & \textcolor{gray}{0} & 5                   & 1                   \\
+            3 & 3                   & 5                   & \textcolor{gray}{0} & 6                   \\
+            \rowcolor{gray!25}
+            4 & 3                   & 1                   & 6                   & \textcolor{gray}{0} \\
+            \hline
+        \end{tabular}
+        %
+        \hspace{5em}
+        %
+        \begin{tabular}[t]{|c|cccc|}
+            \hline
+              & 1                   & 2                   & 3                   & 4 \\
+            \hline
+            1 & \textcolor{gray}{-} & -                   & -                   & 2 \\
+            2 & -                   & \textcolor{gray}{-} & 1                   & - \\
+            3 & -                   & 1                   & \textcolor{gray}{-} & 2 \\
+            4 & 2                   & -                   & 2                   & - \\
+            \hline
+        \end{tabular}
+    \end{center}
+\end{example}
+
+\begin{algo}{Warshall-Algorithmus}
+    Gegeben: Graph $G = (V, E)$, egal ob gerichtet oder nicht.
+
+    Aufgabenstellung: Prüfe für alle geordneten Paare $(v_i, v_j)$, ob ein Weg von $v_i$ nach $v_j$ existiert.
+
+    Ziel: Berechne Adjazenzmatrix $A$ zu \emph{transitivem Abschluss} von $G$:
+    \begin{center}
+        $A[i][j] = $ \texttt{true} $\iff$ es existiert ein nicht-trivialer Weg (Länge $>0$) von $v_i$ nach $v_j$
+    \end{center}
+
+    Iterationsformel zur Aktualisierung von $A[i][j]$:
+    $$
+        A_k[i][j] = A_{k-1}[i][j] \lor (A_{k-1}[i][k] \land A_{k-1}[k][j])
+    $$
+
+    Der Algorithmus funktioniert also analog zum Floyd-Algorithmus.
+\end{algo}
+
+\begin{code}{Warshall-Algorithmus}
+    \lstinputlisting{warshall.java}
+\end{code}
\ No newline at end of file
diff --git a/algo/grundbegriffe.tex b/algo/grundbegriffe.tex
index d54ea78b03cc4ebd6d5462b8d56dd1a3ed9bc811..6f1ce698b5b785aa427048aea785692e369e8d14 100644
--- a/algo/grundbegriffe.tex
+++ b/algo/grundbegriffe.tex
@@ -1,101 +1,101 @@
-\section{Grundbegriffe}
-\begin{defi}{Eigenschaften eines Algorithmus}
-    \begin{itemize}
-        \item \emph{Terminierung:} Der Algorithmus bricht nach \emph{endlichen vielen} Schritten ab.
-        \item \emph{Determiniertheit:} Bei vorgegebener Eingabe wird ein eindeutiges \emph{Ergebnis} geliefert.
-        \item \emph{Determinismus:} Eindeutige Vorgabe der \emph{Abfolge} der auszuführenden Schritte
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Landau-Notation}
-    Seien $f, g$ reellwertige Funktionen der reellen Zahlen.
-    Dann gilt: \cite{wiki:Landau-Symbole}
-
-    \begin{tabular}{l|l|l}
-        Notation          & Definition       & Mathematische Definition                                                                                                  \\
-        \hline
-        $f \in \bigo(g)$  & obere Schranke   & $\exists C > 0 \exists x_0 > 0 \forall x > x_0 : \abs{f(x)} \leq C \cdot \abs{g(x)}$                                      \\
-        $f \in \Omega(g)$ & untere Schranke  & $\exists c > 0 \exists x_0 > 0 \forall x > x_0 : c\cdot \abs{g(x)} \leq \abs{f(x)}$                                       \\
-        $f \in \Theta(g)$ & scharfe Schranke & $\exists c > 0 \exists C > 0 \exists x_0 > 0 \forall x > x_0 : c\cdot \abs{g(x)} \leq \abs{f(x)} \leq C \cdot \abs{g(x)}$ \\
-    \end{tabular}
-
-    Anschaulicher gilt:
-
-    \begin{tabular}{l|l}
-        Notation          & Anschauliche Bedeutung                        \\
-        \hline
-        $f \in \bigo(g)$  & $f$ wächst nicht wesentlich schneller als $g$ \\
-        $f \in \Omega(g)$ & $f$ wächst nicht wesentlich langsamer als $g$ \\
-        $f \in \Theta(g)$ & $f$ wächst genauso schnell wie $g$
-    \end{tabular}
-\end{defi}
-
-\begin{example}{Landau-Notation}
-    Aus \cite{wiki:Landau-Symbole} :
-
-    \begin{tabular}{l|l}
-        Notation                & Beispiel                                          \\
-        \hline
-        $f \in \bigo(1)$        & Feststellen, ob eine Binärzahl gerade ist         \\
-        $f \in \bigo(\log n)$   & Binäre Suche im sortierten Feld mit $n$ Einträgen \\
-        $f \in \bigo(\sqrt{n})$ & Anzahl der Divisionen des naiven Primzahltests    \\
-        $f \in \bigo(n)$        & Suche im unsortierten Feld mit $n$ Einträgen      \\
-        $f \in \bigo(n\log n)$  & Mergesort, Heapsort                               \\
-        $f \in \bigo(n^2)$      & Selectionsort                                     \\
-        $f \in \bigo(n^m)$      &                                                   \\
-        $f \in \bigo(2^{cn})$   & (Backtracking)                                    \\
-        $f \in \bigo(n!)$       & Traveling Salesman Problem
-    \end{tabular}
-\end{example}
-
-\begin{bonus}{Visualisierung Komplexitätsklassen}
-    \begin{center}
-        \begin{tikzpicture}[scale=1]
-            \begin{axis}[
-                    %view={45}{15},
-                    width=15cm,
-                    unit vector ratio*=1 1,
-                    axis lines = middle,
-                    grid=major,
-                    ymin=0,
-                    ymax=50,
-                    xmin=0,
-                    xmax=50,
-                    %zmin=-1,
-                    %zmax=10,
-                    xlabel = $n$,
-                    ylabel = $N$,
-                    %zlabel = $z$,
-                    %xtick style={draw=none},
-                    %ytick style={draw=none},
-                    %ztick style={draw=none},
-                    xtick distance={5},
-                    ytick distance={5},
-                    %ztick distance={1},
-                    %xticklabels=\empty,
-                    %yticklabels=\empty,
-                    %zticklabels=\empty,
-                    disabledatascaling,
-                    %stack dir=minus,
-                    cycle list name=color list,
-                    samples=250,
-                    solid,
-                    smooth,
-                    line width=1.0pt,
-                    no markers,
-                    legend cell align={left},
-                    reverse legend,
-                ]
-
-                \addplot +[domain=0:50]{0};         \addlegendentry{$\bigo(1)$};
-                \addplot +[domain=0:50]{ln(x)};     \addlegendentry{$\bigo(\log(n))$};
-                \addplot +[domain=0:50]{sqrt(x)};   \addlegendentry{$\bigo(\sqrt{n})$};
-                \addplot +[domain=0:50]{x};         \addlegendentry{$\bigo(n)$};
-                \addplot +[domain=0:50]{x * ln(x)}; \addlegendentry{$\bigo(n \log(n))$};
-                \addplot +[domain=0:50]{x^2};       \addlegendentry{$\bigo(n^2)$};
-                \addplot +[domain=0:10]{2^x};        \addlegendentry{$\bigo(2^n)$};
-                \addplot +[domain=0:5]{facreal(x)}; \addlegendentry{$\bigo(n!)$};
-            \end{axis}
-        \end{tikzpicture}
-    \end{center}
-\end{bonus}
+\section{Grundbegriffe}
+\begin{defi}{Eigenschaften eines Algorithmus}
+    \begin{itemize}
+        \item \emph{Terminierung:} Der Algorithmus bricht nach \emph{endlichen vielen} Schritten ab.
+        \item \emph{Determiniertheit:} Bei vorgegebener Eingabe wird ein eindeutiges \emph{Ergebnis} geliefert.
+        \item \emph{Determinismus:} Eindeutige Vorgabe der \emph{Abfolge} der auszuführenden Schritte
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Landau-Notation}
+    Seien $f, g$ reellwertige Funktionen der reellen Zahlen.
+    Dann gilt: \cite{wiki:Landau-Symbole}
+
+    \begin{tabular}{l|l|l}
+        Notation          & Definition       & Mathematische Definition                                                                                                  \\
+        \hline
+        $f \in \bigo(g)$  & obere Schranke   & $\exists C > 0 \exists x_0 > 0 \forall x > x_0 : \abs{f(x)} \leq C \cdot \abs{g(x)}$                                      \\
+        $f \in \Omega(g)$ & untere Schranke  & $\exists c > 0 \exists x_0 > 0 \forall x > x_0 : c\cdot \abs{g(x)} \leq \abs{f(x)}$                                       \\
+        $f \in \Theta(g)$ & scharfe Schranke & $\exists c > 0 \exists C > 0 \exists x_0 > 0 \forall x > x_0 : c\cdot \abs{g(x)} \leq \abs{f(x)} \leq C \cdot \abs{g(x)}$ \\
+    \end{tabular}
+
+    Anschaulicher gilt:
+
+    \begin{tabular}{l|l}
+        Notation          & Anschauliche Bedeutung                        \\
+        \hline
+        $f \in \bigo(g)$  & $f$ wächst nicht wesentlich schneller als $g$ \\
+        $f \in \Omega(g)$ & $f$ wächst nicht wesentlich langsamer als $g$ \\
+        $f \in \Theta(g)$ & $f$ wächst genauso schnell wie $g$
+    \end{tabular}
+\end{defi}
+
+\begin{example}{Landau-Notation}
+    Aus \cite{wiki:Landau-Symbole} :
+
+    \begin{tabular}{l|l}
+        Notation                & Beispiel                                          \\
+        \hline
+        $f \in \bigo(1)$        & Feststellen, ob eine Binärzahl gerade ist         \\
+        $f \in \bigo(\log n)$   & Binäre Suche im sortierten Feld mit $n$ Einträgen \\
+        $f \in \bigo(\sqrt{n})$ & Anzahl der Divisionen des naiven Primzahltests    \\
+        $f \in \bigo(n)$        & Suche im unsortierten Feld mit $n$ Einträgen      \\
+        $f \in \bigo(n\log n)$  & Mergesort, Heapsort                               \\
+        $f \in \bigo(n^2)$      & Selectionsort                                     \\
+        $f \in \bigo(n^m)$      &                                                   \\
+        $f \in \bigo(2^{cn})$   & (Backtracking)                                    \\
+        $f \in \bigo(n!)$       & Traveling Salesman Problem
+    \end{tabular}
+\end{example}
+
+\begin{bonus}{Visualisierung Komplexitätsklassen}
+    \begin{center}
+        \begin{tikzpicture}[scale=1]
+            \begin{axis}[
+                    %view={45}{15},
+                    width=15cm,
+                    unit vector ratio*=1 1,
+                    axis lines = middle,
+                    grid=major,
+                    ymin=0,
+                    ymax=50,
+                    xmin=0,
+                    xmax=50,
+                    %zmin=-1,
+                    %zmax=10,
+                    xlabel = $n$,
+                    ylabel = $N$,
+                    %zlabel = $z$,
+                    %xtick style={draw=none},
+                    %ytick style={draw=none},
+                    %ztick style={draw=none},
+                    xtick distance={5},
+                    ytick distance={5},
+                    %ztick distance={1},
+                    %xticklabels=\empty,
+                    %yticklabels=\empty,
+                    %zticklabels=\empty,
+                    disabledatascaling,
+                    %stack dir=minus,
+                    cycle list name=color list,
+                    samples=250,
+                    solid,
+                    smooth,
+                    line width=1.0pt,
+                    no markers,
+                    legend cell align={left},
+                    reverse legend,
+                ]
+
+                \addplot +[domain=0:50]{0};         \addlegendentry{$\bigo(1)$};
+                \addplot +[domain=0:50]{ln(x)};     \addlegendentry{$\bigo(\log(n))$};
+                \addplot +[domain=0:50]{sqrt(x)};   \addlegendentry{$\bigo(\sqrt{n})$};
+                \addplot +[domain=0:50]{x};         \addlegendentry{$\bigo(n)$};
+                \addplot +[domain=0:50]{x * ln(x)}; \addlegendentry{$\bigo(n \log(n))$};
+                \addplot +[domain=0:50]{x^2};       \addlegendentry{$\bigo(n^2)$};
+                \addplot +[domain=0:10]{2^x};        \addlegendentry{$\bigo(2^n)$};
+                \addplot +[domain=0:5]{facreal(x)}; \addlegendentry{$\bigo(n!)$};
+            \end{axis}
+        \end{tikzpicture}
+    \end{center}
+\end{bonus}
diff --git a/algo/insertionsort.java b/algo/insertionsort.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc3f2337b8324bc14c9e65615c2fe5fa832d3dcb
--- /dev/null
+++ b/algo/insertionsort.java
@@ -0,0 +1,18 @@
+public void insertionSort(int[] a) {
+    for (int i = 0; i < a.length; i++) {
+        int m = a[i];
+
+        // fuer alle Elemente links vom aktuellen Element
+        for(int j = i; j > 0; j--) {
+            if (a[j-1] <= m) {
+                break;
+            }
+
+            // groessere Elemente nach hinten schieben 
+            a[j] = a[j-1];
+        }
+
+        // m an freiem Platz einfuegen
+        a[j] = m;
+    }
+}
\ No newline at end of file
diff --git a/algo/selectionsort.java b/algo/selectionsort.java
new file mode 100644
index 0000000000000000000000000000000000000000..17c40a33d5c2054b38171d5cd5a0386c5612dd1c
--- /dev/null
+++ b/algo/selectionsort.java
@@ -0,0 +1,11 @@
+public void selectionSort (int[] a) {
+    for(int i = 0; i < a.length; i++) {
+        int small = i;
+        for(int j = i+1; j < a.length; j++) {
+            if(a[small] > a[j]) {
+                small = j;
+            }
+        }
+        swap(a, i, small);
+    }
+}
\ No newline at end of file
diff --git a/algo/simplesort.java b/algo/simplesort.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b01bdbe7989b7834bc0789e0a87359d04309024
--- /dev/null
+++ b/algo/simplesort.java
@@ -0,0 +1,9 @@
+public void simpleSort (int[] a) {
+    for(int i = 0; i < a.length; i++) {
+        for(int j = i+1; j < a.length; j++) {
+            if (a[i] > a[j]) {
+                swap(a, i, j);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/algo/sortierverfahren.tex b/algo/sortierverfahren.tex
new file mode 100644
index 0000000000000000000000000000000000000000..8445bc18e33e885a0c831efa5ed4b389f8da4a20
--- /dev/null
+++ b/algo/sortierverfahren.tex
@@ -0,0 +1,1454 @@
+\section{Sortierverfahren}
+
+\begin{defi}{Klassifikationskriterien für Sortieralgorithmen}
+    \begin{itemize}
+        \item Effizienz
+              \begin{itemize}
+                  \item Schlechter als $\bigo(n^2)$: nicht ganz ernst gemeinte Verfahren
+                  \item $\bigo(n^2)$: Elementare Sortierverfahren
+                        \begin{itemize}
+                            \item Bubble-Sort
+                            \item Insertion-Sort
+                            \item Selection-Sort
+                        \end{itemize}
+                  \item Zwischen $\bigo(n^2)$ und $\bigo(n \log n)$
+                        \begin{itemize}
+                            \item Shell-Sort
+                        \end{itemize}
+                  \item $\bigo(n \log n)$: Höhere Sortierverfahren
+                        \begin{itemize}
+                            \item Heap-Sort
+                            \item Merge-Sort
+                            \item Quick-Sort
+                        \end{itemize}
+                  \item Besser als $\bigo(n \log n)$: Spezialisierte Sortierverfahren
+                        \begin{itemize}
+                            \item Radix-Sort
+                        \end{itemize}
+              \end{itemize}
+        \item Speicherverbrauch
+        \item Intern vs. Extern
+        \item Stabil vs. Instabil
+        \item allgemein vs. spezialisiert
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{Beste Sortierverfahren}
+    \begin{itemize}
+        \item normalerweise Quick-Sort
+        \item Merge-Sort, falls:
+              \begin{itemize}
+                  \item die Datenmenge zu groß für den Hauptspeicher ist.
+                  \item die Daten als verkettete Liste vorliegen.
+                  \item ein stabiles Verfahren nötig ist.
+              \end{itemize}
+        \item Insertion-Sort, falls:
+              \begin{itemize}
+                  \item wenige Elemente u sortieren sind.
+                  \item die Daten schon vorsortiert sind.
+              \end{itemize}
+        \item Radix-Sort, falls:
+              \begin{itemize}
+                  \item sich ein hoher Programmieraufwand für ein sehr schnelles Verfahren lohnt.
+              \end{itemize}
+    \end{itemize}
+\end{bonus}
+
+\subsection{Elementare Sortierverfahren}
+
+\begin{algo}{Simple-Sort}
+    Das Suchen und Vertauschen wir bei \emph{Simple-Sort} wie folgt realisiert:
+    \begin{enumerate}
+        \item Gehe vom Element \texttt{i} aus nach rechts
+        \item Jedes Mal, wenn ein kleineres Element als das auf Position \texttt{i} auftaucht, vertausche es mit dem Element \texttt{i}
+        \item Wiederholen bis das Array sortiert ist
+    \end{enumerate}
+
+    Simple-Sort ergibt einen besonders einfachen Code, ist aber langsamer als z.B. Selection-Sort.
+    Dann zu nutzen, wenn:
+    \begin{itemize}
+        \item Sie keine Zeit oder Lust zum Nachdenken haben.
+        \item die Felder so klein sind, dass der Algorithmus nicht effektiv sein muss.
+        \item niemand sonst Ihren Code zu sehen bekommt.
+    \end{itemize}
+\end{algo}
+
+\begin{code}{Simple-Sort}
+    \lstinputlisting{simplesort.java}
+\end{code}
+
+\begin{algo}{Selection-Sort}
+    \emph{Selection-Sort} funktioniert ähnlich wie Simple-Sort:
+    \begin{enumerate}
+        \item Suchen des kleinsten Elements im unsortierten Bereich
+        \item Vertauschen mit Position \texttt{i}
+        \item Wiederholen bis das Array sortiert ist
+    \end{enumerate}
+
+    Selection-Sort ist eines der wichtigeren elementaren Verfahren, ist aber meistens etwas langsamer als Insertion-Sort.
+
+    Selection-Sort ist instabil und bietet keine Vorteile, wenn das Feld schon vorsortiert ist.
+\end{algo}
+
+\begin{code}{Selection-Sort}
+    \lstinputlisting{selectionsort.java}
+\end{code}
+
+\begin{example}{Selection-Sort}
+    \centering
+
+    \begin{tikzpicture}[
+        start chain,
+        node distance = 0em,
+        ArrayBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+        sorted/.style={fill=blue!25},
+        i/.style={fill=teal!25, label=above:\texttt{i}},
+        min/.style={fill=red!25, label=above:\texttt{min}},
+        i min/.style={fill=teal!25, label=above:\texttt{i,min}},
+        ]
+        { start chain = going right
+
+        \node [ArrayBlock, i] (0_3) {$3$};
+        \node [ArrayBlock] (0_8a) {$8_a$};
+        \node [ArrayBlock] (0_8b) {$8_b$};
+        \node [ArrayBlock] (0_6) {$6$};
+        \node [ArrayBlock] (0_4) {$4$};
+        \node [ArrayBlock, min] (0_2) {$2$};
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-4em, sorted] (1_2) {$2$};
+        \node [ArrayBlock, i] (1_8a) {$8_a$};
+        \node [ArrayBlock] (1_8b) {$8_b$};
+        \node [ArrayBlock] (1_6) {$6$};
+        \node [ArrayBlock] (1_4) {$4$};
+        \node [ArrayBlock, min] (1_3) {$3$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-8em, sorted] (2_2) {$2$};
+        \node [ArrayBlock, sorted] (2_3) {$3$};
+        \node [ArrayBlock, i] (2_8b) {$8_b$};
+        \node [ArrayBlock] (2_6) {$6$};
+        \node [ArrayBlock, min] (2_4) {$4$};
+        \node [ArrayBlock] (2_8a) {$8_a$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-12em, sorted] (3_2) {$2$};
+        \node [ArrayBlock, sorted] (3_3) {$3$};
+        \node [ArrayBlock, sorted] (3_4) {$4$};
+        \node [ArrayBlock, i min] (3_6) {$6$};
+        \node [ArrayBlock] (3_8b) {$8_b$};
+        \node [ArrayBlock] (3_8a) {$8_a$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-16em, sorted] (4_2) {$2$};
+        \node [ArrayBlock, sorted] (4_3) {$3$};
+        \node [ArrayBlock, sorted] (4_4) {$4$};
+        \node [ArrayBlock, sorted] (4_6) {$6$};
+        \node [ArrayBlock, i min] (4_8b) {$8_b$};
+        \node [ArrayBlock] (4_8a) {$8_a$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-20em, sorted] (5_2) {$2$};
+        \node [ArrayBlock, sorted] (5_3) {$3$};
+        \node [ArrayBlock, sorted] (5_4) {$4$};
+        \node [ArrayBlock, sorted] (5_6) {$6$};
+        \node [ArrayBlock, sorted] (5_8b) {$8_b$};
+        \node [ArrayBlock, i min] (5_8a) {$8_a$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-24em, sorted] (6_2) {$2$};
+        \node [ArrayBlock, sorted] (6_3) {$3$};
+        \node [ArrayBlock, sorted] (6_4) {$4$};
+        \node [ArrayBlock, sorted] (6_6) {$6$};
+        \node [ArrayBlock, sorted] (6_8b) {$8_b$};
+        \node [ArrayBlock, sorted] (6_8a) {$8_a$};
+        }
+        }
+
+        \draw[<->] (0_3) -- ++(0,-1.5em) -| (0_2);
+        \draw[<->] (1_3) -- ++(0,-1.5em) -| (1_8a);
+        \draw[<->] (2_4) -- ++(0,-1.5em) -| (2_8b);
+        \draw[<->] (3_6) -- ++(0,-1.5em) -| (3_6);
+        \draw[<->] (4_8b) -- ++(0,-1.5em) -| (4_8b);
+        \draw[<->] (5_8a) -- ++(0,-1.5em) -| (5_8a);
+    \end{tikzpicture}
+\end{example}
+
+\begin{algo}{Insertion-Sort}
+    Die Grundidee ist:
+    \begin{enumerate}
+        \item Starte mit einem Wert im Array (meist Position \texttt{0})
+        \item Nimm jeweils den nächsten Eintrag im Array und füge ihn an der richtigen Stelle im sortierten Bereich ein
+        \item Wiederholen bis das Array sortiert ist
+    \end{enumerate}
+
+    Insertion-Sort ist in den meisten Fällen der schnellste elementare Suchalgorithmus - auch, weil er potentielle Vorsortierung ausnutzt.
+
+    Insertion-Sort ist stabil.
+\end{algo}
+
+\begin{code}{Insertion-Sort}
+    \lstinputlisting{insertionsort.java}
+\end{code}
+
+\begin{example}{Insertion-Sort}
+    \centering
+
+    \begin{tikzpicture}[
+        start chain,
+        node distance = 0em,
+        ArrayBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+        sorted/.style={fill=blue!25},
+        i/.style={fill=teal!25, label=above:\texttt{i}},
+        ]
+        { start chain = going right
+
+        \node [ArrayBlock, i] (0_3) {$3$};
+        \node [ArrayBlock] (0_8a) {$8_a$};
+        \node [ArrayBlock] (0_8b) {$8_b$};
+        \node [ArrayBlock] (0_6) {$6$};
+        \node [ArrayBlock] (0_4) {$4$};
+        \node [ArrayBlock] (0_2) {$2$};
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-4em, sorted] (1_3) {$3$};
+        \node [ArrayBlock, i] (1_8a) {$8_a$};
+        \node [ArrayBlock] (1_8b) {$8_b$};
+        \node [ArrayBlock] (1_6) {$6$};
+        \node [ArrayBlock] (1_4) {$4$};
+        \node [ArrayBlock] (1_2) {$2$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-8em, sorted] (2_3) {$3$};
+        \node [ArrayBlock, sorted] (2_8a) {$8_a$};
+        \node [ArrayBlock, i] (2_8b) {$8_b$};
+        \node [ArrayBlock] (2_6) {$6$};
+        \node [ArrayBlock] (2_4) {$4$};
+        \node [ArrayBlock] (2_2) {$2$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-12em, sorted] (3_3) {$3$};
+        \node [ArrayBlock, sorted] (3_8a) {$8_a$};
+        \node [ArrayBlock, sorted] (3_8b) {$8_b$};
+        \node [ArrayBlock, i] (3_6) {$6$};
+        \node [ArrayBlock] (3_4) {$4$};
+        \node [ArrayBlock] (3_2) {$2$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-16em, sorted] (4_3) {$3$};
+        \node [ArrayBlock, sorted] (4_6) {$6$};
+        \node [ArrayBlock, sorted] (4_8a) {$8_a$};
+        \node [ArrayBlock, sorted] (4_8b) {$8_b$};
+        \node [ArrayBlock, i] (4_4) {$4$};
+        \node [ArrayBlock] (4_2) {$2$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-20em, sorted] (5_3) {$3$};
+        \node [ArrayBlock, sorted] (5_4) {$4$};
+        \node [ArrayBlock, sorted] (5_6) {$6$};
+        \node [ArrayBlock, sorted] (5_8a) {$8_a$};
+        \node [ArrayBlock, sorted] (5_8b) {$8_b$};
+        \node [ArrayBlock, i] (5_2) {$2$};
+        }
+
+        { [continue chain = going right]
+        \chainin (0_3);
+
+        \node [ArrayBlock, xshift=-2em, yshift=-24em, sorted] (6_2) {$2$};
+        \node [ArrayBlock, sorted] (6_3) {$3$};
+        \node [ArrayBlock, sorted] (6_4) {$4$};
+        \node [ArrayBlock, sorted] (6_6) {$6$};
+        \node [ArrayBlock, sorted] (6_8a) {$8_a$};
+        \node [ArrayBlock, sorted] (6_8b) {$8_b$};
+        }
+
+        \draw[<->] (0_3) -- ++(0,-1.5em) -| (0_3.south west);
+        \draw[<->] (1_8a) -- ++(0,-1.5em) -| (1_8a.south west);
+        \draw[<->] (2_8b) -- ++(0,-1.5em) -| (2_8b.south west);
+        \draw[<->] (3_6) -- ++(0,-1.5em) -| (3_8a.south west);
+        \draw[<->] (4_4) -- ++(0,-1.5em) -| (4_6.south west);
+        \draw[<->] (5_2) -- ++(0,-1.5em) -| (5_3.south west);
+        }
+    \end{tikzpicture}
+\end{example}
+
+\begin{bonus}{Bewertung elementarer Sortierverfahren}
+    \begin{itemize}
+        \item Simple-Sort
+              \begin{itemize}
+                  \item Einfach zu implementieren
+                  \item Langsam
+              \end{itemize}
+        \item Selection-Sort
+              \begin{itemize}
+                  \item Aufwand unabhängig von Vorsortierung
+                  \item nie mehr als $\bigo(n)$ Vertauschungen nötig
+              \end{itemize}
+        \item Bubble-Sort
+              \begin{itemize}
+                  \item Stabil
+                  \item Vorsortierung wird ausgenutzt
+              \end{itemize}
+        \item Insertion-Sort
+              \begin{itemize}
+                  \item Stabil
+                  \item Vorsortierung wird ausgenutzt
+                  \item schnell für eine elementares Suchverfahren ($\bigo(n^2)$)
+              \end{itemize}
+    \end{itemize}
+\end{bonus}
+
+\subsection{Höhere Sortierverfahren}
+
+\begin{algo}{Heap-Sort}
+    Der Heap ist Grundlage für das Sortierverfahren \emph{Heap-Sort}.
+
+    \begin{itemize}
+        \item Zu Beginn: Unsortiertes Feld
+        \item Phase 1:
+              \begin{itemize}
+                  \item Alle Elemente werden nacheinander in einen Heap eingefügt
+                  \item Resultat ist ein Heap, der in ein Feld eingebettet ist
+              \end{itemize}
+        \item Phase 2:
+              \begin{itemize}
+                  \item Die Elemente werden in absteigender Reihenfolge entfernt (Wurzel!)
+                  \item Heap schrumpft immer weiter
+              \end{itemize}
+    \end{itemize}
+
+    \begin{center}
+        \begin{tikzpicture}
+            [
+                start chain,
+                node distance = 0pt,
+                HeapBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=teal!30},
+                SortedBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=blue!30},
+            ]
+
+            { start chain = going right
+                \node [HeapBlock, label=above:\texttt{root}] (1) {$0$};
+                \node [HeapBlock] (2) {$1$};
+                \node [HeapBlock] (3) {$2$};
+                \node [HeapBlock] (dots) {$\ldots$};
+                \node [HeapBlock] (n2) {$n-2$};
+                \node [HeapBlock] (n1) {$n-1$};
+                \node [HeapBlock] (n) {$n$};
+
+                \draw[->, blue] ([yshift=1em] 1.north east) to[bend left=30] ([yshift=.5em] n.north);
+
+                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
+                (1.south west) -- (n.south east) node[midway,yshift=-2em]{Heap};
+                %\draw[->] (val.south) [out=-30, in=-150] to (4.south);
+            }
+        \end{tikzpicture}
+        \hspace{4em}
+        \begin{tikzpicture}
+            [
+                start chain,
+                node distance = 0pt,
+                HeapBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=teal!30},
+                SortedBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=blue!30},
+            ]
+
+            { start chain = going right
+                \node [HeapBlock, label=above:\texttt{root}] (1) {$0$};
+                \node [HeapBlock] (2) {$1$};
+                \node [HeapBlock] (3) {$2$};
+                \node [HeapBlock] (dots) {$\ldots$};
+                \node [HeapBlock] (n2) {$n-2$};
+                \node [HeapBlock] (n1) {$n-1$};
+                \node [SortedBlock] (n) {$n$};
+
+                \draw[->, blue] ([yshift=1em] 1.north east) to[bend left=30] ([yshift=.5em] n1.north);
+
+                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
+                (1.south west) -- (n1.south east) node[midway,yshift=-2em]{Heap};
+
+                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
+                (n.south west) -- (n.south east) node[midway,yshift=-2em]{sortiertes Array};
+                %\draw[->] (val.south) [out=-30, in=-150] to (4.south);
+            }
+        \end{tikzpicture}
+
+        \begin{tikzpicture}
+            [
+                start chain,
+                node distance = 0pt,
+                HeapBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=teal!30},
+                SortedBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=blue!30},
+            ]
+
+            { start chain = going right
+                \node [HeapBlock, label=above:\texttt{root}] (1) {$0$};
+                \node [HeapBlock] (2) {$1$};
+                \node [HeapBlock] (3) {$2$};
+                \node [HeapBlock] (dots) {$\ldots$};
+                \node [HeapBlock] (n2) {$n-2$};
+                \node [SortedBlock] (n1) {$n-1$};
+                \node [SortedBlock] (n) {$n$};
+                \node [xshift=2em, on chain] (dots2) {$\ldots$};
+
+                \draw[->, blue] ([yshift=1em] 1.north east) to[bend left=30] ([yshift=.5em] n2.north);
+
+                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
+                (1.south west) -- (n2.south east) node[midway,yshift=-2em]{Heap};
+
+                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
+                (n1.south west) -- (n.south east) node[midway,yshift=-2em]{sortiertes Array};
+                %\draw[->] (val.south) [out=-30, in=-150] to (4.south);
+            }
+        \end{tikzpicture}
+        \hspace{1em}
+        \begin{tikzpicture}
+            [
+                start chain,
+                node distance = 0pt,
+                HeapBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=teal!30},
+                SortedBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain, fill=blue!30},
+            ]
+
+            { start chain = going right
+                \node [SortedBlock] (1) {$0$};
+                \node [SortedBlock] (2) {$1$};
+                \node [SortedBlock] (3) {$2$};
+                \node [SortedBlock] (dots) {$\ldots$};
+                \node [SortedBlock] (n2) {$n-2$};
+                \node [SortedBlock] (n1) {$n-1$};
+                \node [SortedBlock] (n) {$n$};
+
+                %\draw[->, blue] ([yshift=1em] 1.north) to[bend left=30] ([yshift=.5em] n2.north);
+
+                %\draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
+                %(1.south west) -- (n2.south east) node[midway,yshift=-2em]{Heap};
+
+                \draw [decorate,decoration={brace,amplitude=5pt,mirror,raise=.5em}]
+                (1.south west) -- (n.south east) node[midway,yshift=-2em]{sortiertes Array};
+                %\draw[->] (val.south) [out=-30, in=-150] to (4.south);
+            }
+        \end{tikzpicture}
+    \end{center}
+\end{algo}
+
+\begin{algo}{Quick-Sort}
+    \emph{Quick-Sort} ist ein rekursiver Algorithmus, der nach dem Prinzip von \glqq divide-and-conquer\grqq (\glqq teile und herrsche\grqq) arbeitet:
+    \begin{enumerate}
+        \item Müssen 0 oder 1 Elemente sortiert werden: Rekursionsabbruch
+        \item Wähle ein Element als \emph{Pivot-Element} aus
+        \item Teile das Feld in zwei Teile Teile:\footnote{Beachte: Die Elemente werden \emph{in-place} getauscht. Siehe Beispiel.}
+              \begin{itemize}
+                  \item Ein Teil mit den Elementen größer als das Pivot.
+                  \item Ein Teil mit den Elementen kleiner als das Pivot.
+              \end{itemize}
+        \item Wiederhole rekursiv für beide Teilfelder.
+    \end{enumerate}
+
+
+    Die überwiegende Mehrheit der Programmbibliotheken benutzt Quick-Sort.
+    In fast allen Fällen sind zwei Optimierungen eingebaut:
+    \begin{itemize}
+        \item \glqq Median of three\grqq
+        \item \glqq Behandlung kleiner Teilfelder\grqq
+    \end{itemize}
+\end{algo}
+
+\begin{example}{Quick-Sort}
+    \textcolor{red}{ACHTUNG: Das Beispiel muss in Rücksprache mit Herrn Pflug noch angepasst werden.
+        Der in der Vorlesung benutzte - und damit klausurrelevante - Quick-Sort nutzt ein \emph{in-place}-Verfahren zum Aufteilen der Elemente.
+        Das Beispiel unten (noch) nicht.}
+
+    \centering
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}, xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+        ]
+        { start chain = going right
+            \node [array] (23) {$23$};
+            \node [array] (01) {$1$};
+            \node [array] (05) {$5$};
+            \node [array] (20) {$20$};
+            \node [array] (10) {$10$};
+            \node [array] (18) {$18$};
+            \node [array] (08) {$8$};
+            \node [array] (46) {$46$};
+            \node [array] (11) {$11$};
+            \node [array] (03) {$3$};
+            \node [array] (36) {$36$};
+            \node [array] (07) {$7$};
+            \node [array] (30) {$30$};
+            \node [array] (09) {$9$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}, xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+        ]
+        { start chain = going right
+            \node [array] (23) {$23$};
+            \node [array] (01) {$1$};
+            \node [array] (05) {$5$};
+            \node [array] (20) {$20$};
+            \node [array] (10) {$10$};
+            \node [array] (18) {$18$};
+            \node [array] (08) {$8$};
+            \node [array] (46) {$46$};
+            \node [array] (11) {$11$};
+            \node [array] (03) {$3$};
+            \node [array] (36) {$36$};
+            \node [array] (07) {$7$};
+            \node [array] (30) {$30$};
+            \node [array, pivot] (09) {$9$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+        ]
+        { start chain = going right
+            \node [array] (01) {$1$};
+            \node [array] (05) {$5$};
+            \node [array] (08) {$8$};
+            \node [array] (03) {$3$};
+            \node [array] (07) {$7$};
+            %
+            \node [array, pivot, shifted] (09) {$9$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            \node [array] (10) {$10$};
+            \node [array] (18) {$18$};
+            \node [array] (46) {$46$};
+            \node [array] (11) {$11$};
+            \node [array] (36) {$36$};
+            \node [array] (30) {$30$};
+        }
+
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (01.north west) -- (07.north east) node[midway,yshift=1.5em] {\texttt{<= 9}};
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (23.north west) -- (30.north east) node[midway,yshift=1.5em] {\texttt{> 9}};
+    \end{tikzpicture}
+
+
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+        ]
+        { start chain = going right
+            \node [array] (01) {$1$};
+            \node [array] (05) {$5$};
+            \node [array] (08) {$8$};
+            \node [array] (03) {$3$};
+            \node [array] (07) {$7$};
+            %
+            \node [array, sorted, shifted] (09) {$9$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            \node [array] (10) {$10$};
+            \node [array] (18) {$18$};
+            \node [array] (46) {$46$};
+            \node [array] (11) {$11$};
+            \node [array] (36) {$36$};
+            \node [array] (30) {$30$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+        ]
+        { start chain = going right
+            \node [array] (01) {$1$};
+            \node [array] (05) {$5$};
+            \node [array] (08) {$8$};
+            \node [array] (03) {$3$};
+            %
+            \node [array, pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted] (09) {$9$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            \node [array] (10) {$10$};
+            \node [array] (18) {$18$};
+            \node [array] (46) {$46$};
+            \node [array] (11) {$11$};
+            \node [array] (36) {$36$};
+            \node [array, pivot, shifted] (30) {$30$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+        ]
+        { start chain = going right
+            \node [array] (01) {$1$};
+            \node [array] (05) {$5$};
+            \node [array] (03) {$3$};
+            %
+            \node [array, pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted] (08) {$8$};
+            %
+            \node [array, shifted, sorted] (09) {$9$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            \node [array] (10) {$10$};
+            \node [array] (18) {$18$};
+            \node [array] (11) {$11$};
+            %
+            \node [array, pivot, shifted] (30) {$30$};
+            %
+            \node [array, shifted] (46) {$46$};
+            \node [array] (36) {$36$};
+        }
+
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (01.north west) -- (03.north east) node[midway,yshift=1.5em] {\texttt{<= 7}};
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (08.north west) -- (08.north east) node[midway,yshift=1.5em] {\texttt{> 7}};
+
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (23.north west) -- (11.north east) node[midway,yshift=1.5em] {\texttt{<= 30}};
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (46.north west) -- (36.north east) node[midway,yshift=1.5em] {\texttt{> 30}};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array] (01) {$1$};
+            \node [array] (05) {$5$};
+            \node [array] (03) {$3$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            \node [array] (10) {$10$};
+            \node [array] (18) {$18$};
+            \node [array] (11) {$11$};
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, shifted] (46) {$46$};
+            \node [array] (36) {$36$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array] (01) {$1$};
+            \node [array] (05) {$5$};
+            %
+            \node [array, pivot, shifted] (03) {$3$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            \node [array] (10) {$10$};
+            \node [array] (18) {$18$};
+            %
+            \node [array, pivot, shifted] (11) {$11$};
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, shifted] (46) {$46$};
+            %
+            \node [array, pivot, shifted] (36) {$36$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array] (01) {$1$};
+            %
+            \node [array, pivot, shifted] (03) {$3$};
+            %
+            \node [array, shifted] (05) {$5$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted] (10) {$10$};
+            %
+            \node [array, pivot, shifted] (11) {$11$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            \node [array] (18) {$18$};
+            %
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, pivot, shifted] (36) {$36$};
+            %
+            \node [array, shifted] (46) {$46$};
+        }
+
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (01.north west) -- (01.north east) node[midway,yshift=1.5em] {\texttt{<= 3}};
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (05.north west) -- (05.north east) node[midway,yshift=1.5em] {\texttt{> 3}};
+
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (10.north west) -- (10.north east) node[midway,yshift=1.5em] {\texttt{<= 11}};
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (23.north west) -- (18.north east) node[midway,yshift=1.5em] {\texttt{> 11}};
+
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (46.north west) -- (46.north east) node[midway,yshift=1.5em] {\texttt{> 36}};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array, sorted end] (01) {$1$};
+            %
+            \node [array, sorted pivot, shifted] (03) {$3$};
+            %
+            \node [array, shifted, sorted end] (05) {$5$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted, sorted end] (10) {$10$};
+            %
+            \node [array, sorted pivot, shifted] (11) {$11$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            \node [array] (18) {$18$};
+            %
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, sorted pivot, shifted] (36) {$36$};
+            %
+            \node [array, shifted, sorted end] (46) {$46$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array, sorted end] (01) {$1$};
+            %
+            \node [array, sorted pivot, shifted] (03) {$3$};
+            %
+            \node [array, shifted, sorted end] (05) {$5$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted, sorted end] (10) {$10$};
+            %
+            \node [array, sorted pivot, shifted] (11) {$11$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            %
+            \node [array, pivot, shifted] (18) {$18$};
+            %
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, sorted pivot, shifted] (36) {$36$};
+            %
+            \node [array, shifted, sorted end] (46) {$46$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array, sorted end] (01) {$1$};
+            %
+            \node [array, sorted pivot, shifted] (03) {$3$};
+            %
+            \node [array, shifted, sorted end] (05) {$5$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted, sorted end] (10) {$10$};
+            %
+            \node [array, sorted pivot, shifted] (11) {$11$};
+            %
+            \node [array, pivot, shifted] (18) {$18$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            %
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, sorted pivot, shifted] (36) {$36$};
+            %
+            \node [array, shifted, sorted end] (46) {$46$};
+        }
+
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (23.north west) -- (20.north east) node[midway,yshift=1.5em] {\texttt{> 18}};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array, sorted end] (01) {$1$};
+            %
+            \node [array, sorted pivot, shifted] (03) {$3$};
+            %
+            \node [array, shifted, sorted end] (05) {$5$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted, sorted end] (10) {$10$};
+            %
+            \node [array, sorted pivot, shifted] (11) {$11$};
+            %
+            \node [array, sorted pivot, shifted] (18) {$18$};
+            %
+            \node [array, shifted] (23) {$23$};
+            \node [array] (20) {$20$};
+            %
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, sorted pivot, shifted] (36) {$36$};
+            %
+            \node [array, shifted, sorted end] (46) {$46$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array, sorted end] (01) {$1$};
+            %
+            \node [array, sorted pivot, shifted] (03) {$3$};
+            %
+            \node [array, shifted, sorted end] (05) {$5$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted, sorted end] (10) {$10$};
+            %
+            \node [array, sorted pivot, shifted] (11) {$11$};
+            %
+            \node [array, sorted pivot, shifted] (18) {$18$};
+            %
+            \node [array, shifted] (23) {$23$};
+            %
+            \node [array, pivot, shifted] (20) {$20$};
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, sorted pivot, shifted] (36) {$36$};
+            %
+            \node [array, shifted, sorted end] (46) {$46$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array, sorted end] (01) {$1$};
+            %
+            \node [array, sorted pivot, shifted] (03) {$3$};
+            %
+            \node [array, shifted, sorted end] (05) {$5$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted, sorted end] (10) {$10$};
+            %
+            \node [array, sorted pivot, shifted] (11) {$11$};
+            %
+            \node [array, sorted pivot, shifted] (18) {$18$};
+            %
+            \node [array, pivot, shifted] (20) {$20$};
+            %
+            \node [array, shifted] (23) {$23$};
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, sorted pivot, shifted] (36) {$36$};
+            %
+            \node [array, shifted, sorted end] (46) {$46$};
+        }
+
+        \draw [decorate,decoration={brace,amplitude=5pt,raise=.5em}]
+        (23.north west) -- (23.north east) node[midway,yshift=1.5em] {\texttt{> 20}};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            pivot/.style = {draw, red, on chain, label=above:\texttt{pivot}},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted pivot/.style = {array, fill=blue!25},
+            sorted end/.style = {array, fill=blue!10},
+        ]
+        { start chain = going right
+            \node [array, sorted end] (01) {$1$};
+            %
+            \node [array, sorted pivot, shifted] (03) {$3$};
+            %
+            \node [array, shifted, sorted end] (05) {$5$};
+            %
+            \node [array, sorted pivot, shifted] (07) {$7$};
+            %
+            \node [array, shifted, sorted end] (08) {$8$};
+            %
+            \node [array, shifted, sorted pivot] (09) {$9$};
+            %
+            \node [array, shifted, sorted end] (10) {$10$};
+            %
+            \node [array, sorted pivot, shifted] (11) {$11$};
+            %
+            \node [array, sorted pivot, shifted] (18) {$18$};
+            %
+            \node [array, sorted pivot, shifted] (20) {$20$};
+            %
+            \node [array, shifted, sorted end] (23) {$23$};
+            %
+            \node [array, sorted pivot, shifted] (30) {$30$};
+            %
+            \node [array, sorted pivot, shifted] (36) {$36$};
+            %
+            \node [array, shifted, sorted end] (46) {$46$};
+        }
+    \end{tikzpicture}
+\end{example}
+
+\begin{defi}{Zeitkomplexität von Quick-Sort}
+    \begin{itemize}
+        \item Best-Case:
+              \begin{itemize}
+                  \item Pivot-Wert ist immer Median der Teilliste $\implies$ Teillisten werden stets halbiert
+                  \item $\log n$ Stufen nötig mit $n$ Elementen
+                  \item $\bigo(n \log n)$
+              \end{itemize}
+        \item Worst-Case:
+              \begin{itemize}
+                  \item Pivot-Wert ist immer größtes oder kleinstes Element der Teilliste
+                  \item $n-1$ Stufen nötig mit $n-i$ Elementen pro Stufe
+                  \item $\bigo(n^2)$
+              \end{itemize}
+        \item Average-Case:
+              \begin{itemize}
+                  \item Berechnung ziemlich aufwändig
+                  \item $\bigo(n \log n)$
+              \end{itemize}
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{Standard-Optimierung von Pivot-Elementen}
+    Wählt man z.B. bei einem vorsortierten Array stets das letzte Element, hat man genau den Worst-Case.
+
+    \emph{Median-of-three-Methode} zum Auswählen des Pivots:
+    \begin{itemize}
+        \item Es werden drei Elemente als Referenz-Elemente (Anfang, Mitte, Ende) gewählt, von denen dann der Median als Pivot verwendet wird.
+        \item Kann auf mehr als drei Elemente ausgebaut werden.
+    \end{itemize}
+\end{bonus}
+
+\begin{bonus}{Standard-Optimierung des Rekursionsabbruchs}
+    Beim \glqq einfachen\grqq  Rekursionsabbruch (Teilliste enthält 0 oder 1 Elemente) sind die letzten Rekursionsdurchgänge nicht mehr effektiv.
+
+    Daher kann die Rekursion z.B. schon früher abgebrochen werden und die dann vorhandene Teilliste mit Insertion-Sort sortiert werden.
+    Die Grenze dafür ist nicht klar festgelegt (Empfehlung von Knuth und Sedgewick liegt bei 9, im Internet aber oft zwischen 3 und 32).
+\end{bonus}
+
+\begin{defi}{Dual-Pivot Quick-Sort}
+    Der \emph{Dual-Pivot Quick-Sort} funktioniert analog zum normalen Quick-Sort.
+
+    Hier werden jedoch zwei Pivot-Elemente verwendet, die dann die entsprechende Teilliste in drei Bereiche aufteilen.
+\end{defi}
+
+\begin{defi}{Internes und externes Sortieren}
+    Bis jetzt wurde vorausgesetzt, dass schneller Zugriff auf einen beliebigen Datensatz (\emph{wahlfreier Zugriff}) möglich ist.
+    Das ist zumeist möglich, wenn der Datensatz im Hauptspeicher liegt.
+    Ist dies der Fall, spricht man von \emph{internem Sortieren}.
+
+    Bei sehr großen Datenbeständen ist das aber oft nicht mehr möglich, da sie z.B. auf Hintergrundspeicher ausgelagert werden müssen.
+    Hier hat man dann lediglich \emph{sequentiellen Zugriff}\footnote{das Gleiche gilt auch für verkettete Listen} und man spricht von \emph{externem Sortieren}.
+\end{defi}
+
+\begin{algo}{Merge-Sort}
+    \emph{Merge-Sort} kann sowohl iterativ als auch rekursiv implementiert werden, wobei die rekursive Variante etwas schneller ist.
+
+    Der rekursive Ablauf ist:
+    \begin{enumerate}
+        \item Teile die Daten in zwei Hälften
+        \item Unterteilung wird fortgesetzt, bis nur noch ein Element in einer Menge vorhanden ist
+        \item Teilstücke werden für sich sortiert
+        \item sortierte Teilstücke werden zusammengeführt
+    \end{enumerate}
+
+    Merge-Sort ist stabil.
+
+    Die Komplexität von Merge-Sort liegt in $\bigo(n \log n)$.
+\end{algo}
+
+\begin{example}{Merge-Sort (rekursiv)}
+    \centering
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+        ]
+        { start chain = going right
+            \node [array] (38) {$38$};
+            \node [array] (27) {$27$};
+            \node [array] (43) {$43$};
+            \node [array] (03) {$3$};
+            \node [array] (09) {$9$};
+            \node [array] (82) {$82$};
+            \node [array] (10) {$10$};
+        }
+
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(38.south west) -- (03.south east) node[midway,yshift=-1.5em] {};
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(09.south west) -- (10.south east) node[midway,yshift=-1.5em] {};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+        ]
+        { start chain = going right
+            \node [array] (38) {$38$};
+            \node [array] (27) {$27$};
+            \node [array] (43) {$43$};
+            \node [array] (03) {$3$};
+            %
+            \node [array, shifted] (09) {$9$};
+            \node [array] (82) {$82$};
+            \node [array] (10) {$10$};
+        }
+
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(38.south west) -- (27.south east) node[midway,yshift=-1.5em] {};
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(43.south west) -- (03.south east) node[midway,yshift=-1.5em] {};
+        %
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(09.south west) -- (82.south east) node[midway,yshift=-1.5em] {};
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(10.south west) -- (10.south east) node[midway,yshift=-1.5em] {};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+        ]
+        { start chain = going right
+            \node [array] (38) {$38$};
+            \node [array] (27) {$27$};
+            %
+            \node [array, shifted] (43) {$43$};
+            \node [array] (03) {$3$};
+            %
+            \node [array, shifted] (09) {$9$};
+            \node [array] (82) {$82$};
+            %
+            \node [array, shifted] (10) {$10$};
+        }
+
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(38.south west) -- (38.south east) node[midway,yshift=-1.5em] {};
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(27.south west) -- (27.south east) node[midway,yshift=-1.5em] {};
+        %
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(43.south west) -- (43.south east) node[midway,yshift=-1.5em] {};
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(03.south west) -- (03.south east) node[midway,yshift=-1.5em] {};
+        %
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(09.south west) -- (09.south east) node[midway,yshift=-1.5em] {};
+        %\draw [decorate,decoration={brace,mirror,amplitude=5pt,raise=.5em}]
+        %(82.south west) -- (82.south east) node[midway,yshift=-1.5em] {};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+            framed/.style = {draw, red, densely dashed, label=below:\texttt{sort}},
+        ]
+        { start chain = going right
+            \node [array] (38) {$38$};
+            %
+            \node [array, shifted] (27) {$27$};
+            %
+            \node [array, shifted] (43) {$43$};
+            %
+            \node [array, shifted] (03) {$3$};
+            %
+            \node [array, shifted] (09) {$9$};
+            %
+            \node [array, shifted] (82) {$82$};
+            %
+            \node [array, shifted] (10) {$10$};
+        }
+
+        \node [framed, fit={(38) (27)}] {};
+        \node [framed, fit={(43) (03)}] {};
+        \node [framed, fit={(09) (82)}] {};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+            framed/.style = {draw, red, densely dashed, label=below:\texttt{sort}},
+        ]
+        { start chain = going right
+            \node [array] (27) {$27$};
+            \node [array] (38) {$38$};
+            %
+            \node [array, shifted] (03) {$3$};
+            \node [array] (43) {$43$};
+            %
+            \node [array, shifted] (09) {$9$};
+            \node [array] (82) {$82$};
+            %
+            \node [array, shifted] (10) {$10$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+            framed/.style = {draw, red, densely dashed, label=below:\texttt{sort}},
+        ]
+        { start chain = going right
+            \node [array] (27) {$27$};
+            \node [array] (38) {$38$};
+            %
+            \node [array, shifted] (03) {$3$};
+            \node [array] (43) {$43$};
+            %
+            \node [array, shifted] (09) {$9$};
+            \node [array] (82) {$82$};
+            %
+            \node [array, shifted] (10) {$10$};
+        }
+
+        \node [framed, fit={(27) (43)}] {};
+        \node [framed, fit={(09) (10)}] {};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+            framed/.style = {draw, red, densely dashed, label=below:\texttt{sort}},
+        ]
+        { start chain = going right
+            \node [array] (03) {$3$};
+            \node [array] (27) {$27$};
+            \node [array] (38) {$38$};
+            \node [array] (43) {$43$};
+            %
+            \node [array, shifted] (09) {$9$};
+            \node [array] (10) {$10$};
+            \node [array] (82) {$82$};
+        }
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+            framed/.style = {draw, red, densely dashed, label=below:\texttt{sort}},
+        ]
+        { start chain = going right
+            \node [array] (03) {$3$};
+            \node [array] (27) {$27$};
+            \node [array] (38) {$38$};
+            \node [array] (43) {$43$};
+            %
+            \node [array, shifted] (09) {$9$};
+            \node [array] (10) {$10$};
+            \node [array] (82) {$82$};
+        }
+
+        \node [framed, fit={(03) (82)}] {};
+    \end{tikzpicture}
+
+    \begin{tikzpicture}[
+            start chain,
+            node distance = 0pt,
+            shifted/.style = {xshift=1em},
+            array/.style = {draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+            sorted/.style = {array, fill=blue!25},
+            framed/.style = {draw, red, densely dashed, label=below:\texttt{sort}},
+        ]
+        { start chain = going right
+            \node [array, sorted] (03) {$3$};
+            \node [array, sorted] (09) {$9$};
+            \node [array, sorted] (10) {$10$};
+            \node [array, sorted] (27) {$27$};
+            \node [array, sorted] (38) {$38$};
+            \node [array, sorted] (43) {$43$};
+            \node [array, sorted] (82) {$82$};
+        }
+    \end{tikzpicture}
+\end{example}
+
+\begin{defi}{Optimierung von Merge-Sort}
+    \begin{itemize}
+        \item Felduntergrenze
+              \begin{itemize}
+                  \item Feld wird nicht in Einzelelemente geteilt, sondern in Gruppen zu $n$ Elementen, die dann mit Insertion-Sort sortiert werden
+                  \item gcj-Java nimmt 6 Elemente als Grenze
+                  \item Python nimmt 64 Elemente als Grenze
+              \end{itemize}
+        \item Trivialfall
+              \begin{itemize}
+                  \item ist das kleinste Element der einen Teilfolge größer als das größte Element der anderen Teilfolge $\implies$ Zusammenfügen beschränkt sich auf Hintereinandersetzen der beiden Teilfolgen
+                  \item genutzt von z.B. Java
+                  \item Vorsortierung wird ausgenutzt
+              \end{itemize}
+        \item Natürlicher Merge-Sort
+              \begin{itemize}
+                  \item weitergehende Ausnutzung der Vorsortierung
+                  \item jede Zahlenfolge besteht aus Teilstücken, die abwechselnd monoton steigend und monoton fallend sind
+                  \item Idee ist, diese bereits sortierten Teilstücke als Ausgangsbasis des Merge-Sorts zu nehmen
+                  \item bei nahezu sortierten Feldern werden die Teilstücke sehr groß und as Verfahren sehr schnell
+                  \item Best-Case in $\bigo(n)$
+              \end{itemize}
+    \end{itemize}
+\end{defi}
+
+\subsection{Spezialisierte Sortierverfahren}
+
+\begin{defi}{Radix-Sort}
+    \emph{Radix-Sort} heißt eine Gruppe von Sortierverfahren mit folgenden Eigenschaften:
+    \begin{itemize}
+        \item Sortiervorgang erfolgt mehrstufig
+        \item zunächst wird Grobsortierung vorgenommen, zu der nur ein Teil des Schlüssels (z.B. erstes Zeichen) herangezogen wird
+        \item grob sortierte Bereiche dann feinsortiert, wobei schrittweise der restliche Teil des Schlüssels verwendet wird
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{MSD-Radix-Sort}
+    \begin{itemize}
+        \item MSD = most significant digits
+        \item In der 1. Stufe wird die erste Ziffer betrachtet.
+        \item Benutzt Bucket-Sort mit Teillisten.
+        \item Bucket-Sort wird für die einzelnen Buckets weiter genutzt, bis alle Werte sortiert sind
+    \end{itemize}
+\end{bonus}
+
+\begin{bonus}{LSD-Radix-Sort}
+    \begin{itemize}
+        \item LSD = least significant digits
+        \item In der 1. Stufe wird die letzte Ziffer betrachtet.
+        \item Benutzt Bucket-Sort mit schlüsselindiziertem Zählen.
+    \end{itemize}
+\end{bonus}
+
+\begin{algo}{Bucket-Sort}
+    \emph{Bucket-Sort} sortiert für bestimmte Werte-Verteilungen einen Datensatz in linearer Zeit.
+
+    Der Algorithmus ist in drei Phasen eingeteilt:
+    \begin{enumerate}
+        \item Verteilung der Elemente auf die Buckets
+        \item Jeder Bucket wird mit einem weiteren Sortiertverfahren sortiert .
+        \item Der Inhalt der sortierten Buckets wird konkateniert.
+    \end{enumerate}
+
+    Zu viele oder zu wenige Eimer können zu großen Laufzeitproblemen führen.
+    Empfohlen werden:
+    \begin{itemize}
+        \item Sedgewick: Für 64-bit Schlüssel (\texttt{long}) $2^{16}$ Eimer
+        \item Linux-related: Für 32-bit Schlüssel (\texttt{int}) $2^{11}$ Eimer
+    \end{itemize}
+
+    Der Einsatz von Bucket-Sort lohnt sich nur, wenn die Anzahl der zu sortierenden Werte deutlich größer ist, als die Anzahl der Eimer.
+\end{algo}
\ No newline at end of file
diff --git a/algo/warshall.java b/algo/warshall.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f29f81b235a1e04f8f31adf1039d5b137279aa2
--- /dev/null
+++ b/algo/warshall.java
@@ -0,0 +1,7 @@
+for(int i = 0; i < a.length; i++) {
+    for(int j = 0; j < a.length; j++) {
+        for(int k = 0; k < a.length; k++) {
+            a[j][k] = a[j][k] || (a[j][i] && a[i][k]);
+        }
+    }
+}
\ No newline at end of file
diff --git a/ana1/ana1.tex b/ana1/ana1.tex
index d3c8547cc6b219e0904bf948608d154ad6e685be..ff987013ed0bffce82cce6b25fc9b92212895330 100644
--- a/ana1/ana1.tex
+++ b/ana1/ana1.tex
@@ -1,1563 +1,1563 @@
-\documentclass[german]{../spicker}
-
-\usepackage{amsmath}
-\usepackage{polynom}
-\usepackage{array}   % for \newcolumntype macro
-\usepackage{tikz}
-\usepackage{pgfplots}
-\usepgfplotslibrary{fillbetween}
-\pgfplotsset{compat=1.17}
-\title{Analysis 1}
-\author{Patrick Gustav Blaneck, Felix Racz}
-\makeindex[intoc]
-\makeindex[intoc, name=Beispiele,title=Beispiele]
-
-\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
-\newcommand{\vektor}[1]{\begin{pmatrix*}[r] #1 \end{pmatrix*}}
-\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
-
-\renewcommand{\abs}[1]{\left| #1 \right|}
-\newcommand{\cis}[1]{\left( \cos\left( #1 \right) + i \sin\left( #1 \right) \right)}
-\newcommand{\sgn}{\text{sgn}}
-\newcommand{\diff}{\mathrm{d}}
-\newcommand{\dx}{~\mathrm{d}x}
-\newcommand{\du}{~\mathrm{d}u}
-\newcommand{\dv}{~\mathrm{d}v}
-\newcommand{\dw}{~\mathrm{d}w}
-\newcommand{\dt}{~\mathrm{d}t}
-\newcommand{\dn}{~\mathrm{d}n}
-\newcommand{\dudx}{~\frac{\mathrm{d}u}{\mathrm{d}x}}
-\newcommand{\dudn}{~\frac{\mathrm{d}u}{\mathrm{d}n}}
-\newcommand{\dvdx}{~\frac{\mathrm{d}v}{\mathrm{d}x}}
-\newcommand{\dwdx}{~\frac{\mathrm{d}w}{\mathrm{d}x}}
-\newcommand{\dtdx}{~\frac{\mathrm{d}t}{\mathrm{d}x}}
-\newcommand{\ddx}{\frac{\mathrm{d}}{\mathrm{d}x}}
-\newcommand{\dFdx}{\frac{\mathrm{d}F}{\mathrm{d}x}}
-\newcommand{\dfdx}{\frac{\mathrm{d}f}{\mathrm{d}x}}
-\newcommand{\interval}[1]{\left[ #1 \right]}
-
-\newcolumntype{L}{>{$}l<{$}} % math-mode version of "l" column type
-\newcolumntype{R}{>{$}r<{$}} % math-mode version of "r" column type
-\newcolumntype{C}{>{$}c<{$}} % math-mode version of "c" column type
-\newcolumntype{P}{>{$}p<{$}} % math-mode version of "l" column type
-
-\begin{document}
-\maketitle
-\tableofcontents
-\newpage
-
-%\setcounter{section}{1}
-
-\section{Grundlagen}
-
-\subsection{Funktionen}
-
-\begin{thirdboxl}
-    \begin{defi}{Injektivität}
-        $f(x) = f(x')\implies x = x'$
-    \end{defi}
-\end{thirdboxl}%
-\begin{thirdboxm}
-    \begin{defi}{Surjektivität}
-        $\forall y, \exists x: y = f(x)$
-    \end{defi}
-\end{thirdboxm}%
-\begin{thirdboxr}
-    \begin{defi}{Bijektivität}
-        $\forall y, \exists! x: y = f(x)$
-    \end{defi}
-\end{thirdboxr}%
-
-\begin{algo}{Beweisen der Injektivität}
-    \begin{enumerate}
-        \item Behauptung: $f(x) = f(x')$
-        \item Umformen auf eine Aussage der Form $x = x'$
-    \end{enumerate}
-\end{algo}
-
-\begin{algo}{Beweisen der Surjektivität}
-    \begin{enumerate}
-        \item Aufstellen der Umkehrfunktion
-        \item Zeigen, dass diese Umkehrfunktion auf dem gesamten Definitionsbereich definiert ist
-    \end{enumerate}
-\end{algo}
-
-\begin{algo}{Beweisen der Bijektivität}
-    \begin{enumerate}
-        \item Injektivität beweisen
-        \item Surjektivität beweisen
-    \end{enumerate}
-\end{algo}
-
-\subsection{Polynome}
-
-\begin{defi}{Polynom}
-    Eine Funktion $p(x) = \sum^n_{i=0} a_i x^i$ mit $a_i, x \in \R ~ (\C), a_n \neq 0$ heißt \emph{Polynom vom Grad} $n$.
-\end{defi}
-
-\begin{halfboxl}
-    \vspace{-\baselineskip}
-    \begin{bonus}{Abspalten von Linearfaktoren}
-        Sei $x_0$ eine Nullstelle eines Polynoms $p(x)$, dann ist
-        $$ p(x) = q(x) \cdot (x-x_0).$$
-        Dabei ist $(x-x_0)$ ein abgespaltener Linearfaktor und $q(n)$ das entsprechend reduzierte Polynom mit $q(n) = \frac{p(x)}{x-x_0}$.
-    \end{bonus}
-\end{halfboxl}%
-\begin{halfboxr}
-    \vspace{-\baselineskip}
-    \begin{bonus}{Faktorisierung}
-        Sind $x_1, \ldots, x_n$ Nullstellen eines Polynoms $p(x)$, so ist
-        $$ p(x) = a_n \cdot (x-x_1) \cdot \ldots \cdot (x-x_n)$$
-        die Faktorisierung von $p(x)$.
-    \end{bonus}
-\end{halfboxr}%
-
-\subsubsection*{Polynome vom Grad 2}
-\begin{halfboxl}
-    \vspace{-\baselineskip}
-    \begin{algo}{$pq$-Formel}
-        \begin{enumerate}
-            \item Polynom der Form $x^2 + px + q = 0$
-            \item $x_{1,2} = -\frac{p}{2} \pm \sqrt{\left(\frac{p}{2}\right)^2 - q}$
-        \end{enumerate}
-    \end{algo}
-\end{halfboxl}%
-\begin{halfboxr}
-    \vspace{-\baselineskip}
-    \begin{algo}{Mitternachtsformel}
-        \begin{enumerate}
-            \item Polynom der Form $ax^2 + bx + c = 0$
-            \item $x_{1,2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$
-        \end{enumerate}
-    \end{algo}
-\end{halfboxr}
-
-\begin{bonus}{Besonderheiten bei $x \in \C$}
-    \begin{itemize}
-        \item Ist $x_i$ eine Nullstelle des Polynoms $p(x)$ mit \emph{reellen Koeffizienten}, dann ist auch $\overline{x_i}$ eine Nullstelle von $p(x)$.
-    \end{itemize}
-\end{bonus}
-
-\subsection{Gebrochen rationale Funktionen}
-
-\begin{defi}{Gebrochen rationale Funktionen}
-    Seien $p_m(x)$ und $p_n(x)$ Polynome vom Grad $m$ bzw. $n$, dann heißt
-    $$
-        f(x) = \frac{p_m(x)}{p_n(x)}
-    $$
-    \emph{gebrochen rationale Funktion}.\\
-    Im Fall $m<n$ heißt die Funktion \emph{echt gebrochen rational}, sonst \emph{unecht gebrochen rational}.
-\end{defi}
-
-\begin{algo}{Polynomdivision}
-    Gegeben ist \emph{unecht gebrochen rationale Funktion} $f(x) = \frac{p_m(x)}{p_n(x)}$
-    \begin{enumerate}
-        \item \emph{Dividiere} die größten Exponenten aus beiden Polynomen
-        \item \emph{Mutipliziere} Ergebnis mit Divisor zurück
-        \item \emph{Subtrahiere} Ergebnis vom Dividenden
-        \item Wiederhole, bis:
-              \subitem Ergebnis 0 ist, oder
-              \subitem Grad des Ergebnisses kleiner ist als Grad des Divisors (ergibt \emph{Rest})
-    \end{enumerate}
-\end{algo}
-
-%\begin{bonus}{Polynomdivision Beispiel}
-%    \polylongdiv[style=C]{x^3+x^2-1}{x-1}
-%\end{bonus}
-
-\begin{algo}{Hornerschema}
-    Gegeben ist \emph{Polynom} $p_m(x)$ und ein \emph{Wert} $x_0$
-
-    Vorbereitung:
-    \begin{itemize}
-        \item Erstelle eine Tabelle mit $m + 2$ Spalten und 3 Zeilen
-        \item Erste Zelle frei lassen und dann Koeffizienten $a_m, a_{m-1}, \ldots, a_0$ in die erste Zeile schreiben
-        \item In die erste Zelle der zweiten Zeile kommt $x_0$
-    \end{itemize}
-
-    Anwendung (beginnend in zweiter Zelle der dritten Zeile):
-    \begin{enumerate}
-        \item Erster Koeffizient der ersten Zeile in die dritte Zeile
-        \item \emph{Multipliziere} Zahl der ersten Spalte mit diesem Koeffizienten
-        \item Schreibe Ergebnis in zweite Zeile, unterhalb des nächsten Koeffizienten
-        \item \emph{Addiere} Ergebnis mit diesem Koeffizienten
-        \item Wiederhole 2-4 bis zum Schluss
-    \end{enumerate}
-
-    Ergebnis:
-    \begin{itemize}
-        \item Wert des Polynoms $p_m(x_0)$ in letzter Zelle der letzten Zeile
-        \item Bei Wert $p_m(x_0) = 0$ steht in der letzten Zeile das Polynom nach Abspalten des Linearfaktors $(x-x_0)$
-    \end{itemize}
-\end{algo}
-
-%\begin{bonus}{Hornerschema Beispiel}
-%    Gegeben: $p_4(x) = 2x^4-3x^3+4x^2-5x+2$ an der Stelle $x_0 = 1$
-%    \polyhornerscheme[x=1]{2x^4-3x^3+4x^2-5x+2}
-%    Ergebnis: $p_4(1) = 0 \implies (x-1) \text{ ist Linearfaktor von } p_4(x) \text{ und } \frac{p_4(x)}{x-1} = 2x^3 = x^2 + 3x -2$
-%\end{bonus}
-
-\begin{bonus}{Tipps und Tricks}
-    \begin{itemize}
-        \item Polynomdivision und Hornerschema funktionieren auch sehr gut mit komplexen Zahlen
-        \item Bei mehreren abzuspaltenden Linearfaktoren bietet sich das Hornerschema sehr gut an
-    \end{itemize}
-\end{bonus}
-
-\begin{algo}{Partialbruchzerlegung}
-    Gegeben: \emph{Echt gebrochen rationale Funktion}  $f(x) = \frac{p_m(x)}{p_n(x)}$
-    \begin{enumerate}
-        \item Berechne Nullstellen des \emph{Nennerpolynoms} $x_0, \ldots, x_k \in \R$
-        \item Verschiedene Fälle:
-              \subitem Relle Nullstellen:
-              \subsubitem $x_i$ ist einfache Nullstelle $\implies \frac{A}{x-x_1}$
-              \subsubitem $x_i$ ist $r$-fache Nullstelle $\implies  \frac{A_1}{x-x_1} +  \frac{A_2}{(x-x_1)^2} + \ldots + \frac{A_r}{(x-x_1)^r}$
-              \subitem Nichtrelle Nullstellen:
-              \subsubitem Einfacher quadratischer Term $\implies \frac{Ax + B}{x^2+px+q}$
-              \subsubitem $r$-facher quadratischer Term $\implies \frac{A_1x + B_1}{x^2+px+q} + \frac{A_2x + B_2}{(x^2+px+q)^2} + \ldots + \frac{A_rx + B_r}{(x^2+px+q)^r}$
-        \item Koeffizientenvergleich:
-              \begin{enumerate}
-                  \item Brüche gleichnamig machen (Multipliziere beide Seiten mit Nennerpolynom)
-                  \item Potenzen von $x$ zusammenfassen
-                  \item Gleichungssystem lösen
-                  \item Lösungen in Ansatz einsetzen
-              \end{enumerate}
-    \end{enumerate}
-\end{algo}
-
-\begin{bonus}{Besonderheiten in $\C$}
-    \begin{itemize}
-        \item Für Partialbrüche ohne relle Nullstellen können wir in $\C$ stets Nullstellen finden. Das Verfahren erfolgt dann analog mit komplexen Nullstellen.
-    \end{itemize}
-\end{bonus}
-
-\begin{bonus}{Tipps und Tricks}
-    \begin{itemize}
-        \item Partialbruchzerlegung ist erst bei einer \emph{echt gebrochen rationale Funktion} sinnvoll
-        \item Ist die Funktion unecht gebrochen rational, führe zuerst eine Polynomdivision durch und zerlege dann den Rest in die Partialbrüche
-    \end{itemize}
-\end{bonus}
-
-
-\subsection{Gleichungen und Ungleichungen}
-
-\begin{algo}{Berechnen einer Lösungsmenge bei Ungleichungen}
-    Gegeben: Ungleichung mit Bezug auf Variable $x$
-    \begin{enumerate}
-        \item Für jeden Betrag $\left| a(x) \right|$, eine Fallunterscheidung machen für
-              \subitem $a(x) \geq 0 \implies \left| a(x) \right| = a(x)$
-              \subitem $a(x) < 0 \implies \left| a(x) \right| = -a(x)$
-              \subitem \emph{Hier haben wir bereits eine Einschränkung für die Lösungsmenge des jeweiligen Falles gegeben!}
-        \item Ungleichungen nach $x$ auflösen
-        \item Jeder Fall $i$ erzeugt eine Lösungsmenge $L_i$ bestehend aus\emph{ umgestellter Ungleichung} und Fallbedingungen
-        \item Lösungsmenge $L = \bigcup^n_{i = 1} L_i$, wobei $n$ die Anzahl der betrachteten Fälle ist
-    \end{enumerate}
-\end{algo}
-
-\begin{bonus}{Tipps und Tricks}
-    \begin{itemize}
-        \item $n$ Beträge in der Gleichung können zu $2^n$ Fällen führen.
-        \item Es kann vorkommen, dass ein Fall einer Fallunterscheidung unerreichbar ist, z.B. für $x > 5 \land x < 1$. Die Lösungsmenge $L$ ist dann leer ($L = \emptyset$).
-        \item Radizieren (Wurzelziehen) ist in Ungleichungen nur erlaubt, wenn danach der \emph{Betrag} der Wurzel betrachtet wird
-        \item Quadrieren einer Ungleichung `erzeugt' potentiell ein falsches Ergebnis. Nach dem Quadrieren sollte man also jedes Ergebnis prüfen.
-        \item Multiplikation mit negativen Zahlen sollte vermieden werden, da das Umdrehen des Ungleichheitszeichens schnell für Flüchtigkeitsfehler sorgen kann.
-    \end{itemize}
-\end{bonus}
-
-\subsection{Komplexe Analysis}
-\begin{bonus}{Rechenregeln für komplexe Zahlen in kartesischen Koordinaten}
-    \textbf{Darstellung:} $z = a + i \cdot b$ und $w = c + i \cdot d$
-
-    \textbf{Addition und Subtraktion:} $z \pm w = (a\pm c) + i \cdot (b \pm d)$
-
-    \textbf{Multiplikation:} $z \cdot w = (ac -bd) + i \cdot (ad + bc)$
-
-    \textbf{Division:} $\frac{z}{w} = \frac{z \cdot \overline{w}}{w \cdot \overline{w}}$
-
-    \textbf{Komplex konjugiert:} Vorzeichen von $\Im$ wechseln: $\overline{z} = a- i \cdot b$
-
-    \textbf{Betrag:} Abstand vom Ursprung: $\abs{z} = \sqrt{z \cdot \overline{z}} = \sqrt{a^2 + b^2}$
-\end{bonus}
-
-\begin{bonus}{Rechenregeln für komplexe Zahlen in Polarkoordinaten}
-    \textbf{Darstellung:} $z = r \cdot (\cos\theta + i \cdot \sin \theta) = r \cdot e^{i \cdot \theta}$
-
-    \textbf{Multiplikation:} $z \cdot w = r_z \cdot r_w \cdot e^{i \cdot (\theta_z + \theta_w)}$
-
-    \textbf{Division:} $\frac{z}{w} = \frac{r_z}{r_w} \cdot e^{i \cdot (\theta_z - \theta_w)}$
-
-    \textbf{Komplex konjugiert:} $\overline{z} = (r, -\theta) = (r, 2\pi - \theta)$
-
-    \textbf{Betrag:} $\abs{z} = r$
-\end{bonus}
-
-\begin{algo}{Kartesische Koordinaten $\to$ Polarkoordinaten}
-    \begin{enumerate}
-        \item $r = \abs{z} = \sqrt{x^2 + y^2}$
-        \item
-              \subitem $y \geq 0 : \theta = \arctan \frac{x}{r}$
-              \subitem $y < 0 : \theta = -\arctan \frac{x}{r}$
-    \end{enumerate}
-\end{algo}
-
-\begin{algo}{Polarkoordinaten $\to$ Kartesische Koordinaten}
-    \begin{enumerate}
-        \item $x = r \cdot \cos \theta$
-        \item $y = r \cdot \sin \theta$
-    \end{enumerate}
-\end{algo}
-
-\begin{algo}{Radizieren von komplexen Zahlen}
-    Gesucht: Lösung von $z^n = r \cdot e^{i\cdot \theta}$
-    \begin{enumerate}
-        \item Ist $z^n$ nicht in Polarkoordinaten gegeben, so ist zunächst die Polarform zu bilden.
-        \item Bertechne $r_k = \sqrt[n]{r}$. Dieser Radius ist die Länge aller Lösungen.
-        \item Berechne für alle $k \in [0, n-1]$
-              $$
-                  \theta_k = \frac{\theta + k\cdot 2\pi}{n} = \frac{\theta}{n} + \frac{k}{n} \cdot 2\pi
-              $$
-        \item Die Lösungen sind dann die $n$ Zahlen $z_k = (r_k, \theta_k)$ für $k \in [0, n-1]$.
-    \end{enumerate}
-    \qed
-\end{algo}
-
-\section{Folgen und Reihen}
-
-\subsection{Grundlagen}
-\begin{bonus}{Rechenregeln für Summen}
-    $$
-        \begin{aligned}
-            \sum_{k=m}^n a_k                    & = \sum_{k=m-l}^{n-l} a_{k+l}          \\
-            \sum_{k=m}^n a_k                    & = \sum_{k=m}^c a_k + \sum_{k=c}^n a_k \\
-            \sum_{k=m}^n a_k + \sum_{k=m}^n b_k & = \sum_{k=m}^n a_k + b_k              \\
-            \sum_{k=m}^n c\cdot a_k             & = c\cdot\sum_{k=m}^n a_k
-        \end{aligned}
-    $$
-    Die Regeln gelten auch für unendliche Reihen.
-\end{bonus}
-
-\begin{bonus}{Wichtige Summen}
-    \begin{itemize}
-        \item Arithmetische Summe: $$\sum^n_{k=1} k = \frac{n(n+1)}{2}$$
-        \item Geometrische Summe: $$\sum^n_{k=1} x^k = \frac{1-x^{n+1}}{1-x} = \frac{x^{n+1} - 1}{x-1}$$
-        \item Summe der Quadratzahlen: $$\sum^n_{k=1} k^2 = \frac{n(n+1)(2n+1)}{6}$$
-        \item Summe der Kubikzahlen: $$\sum^n_{k=1} k^3 = \left(\frac{n(n+1)}{2}\right)^2$$
-    \end{itemize}
-\end{bonus}
-
-\subsection{Binomialkoeffizienten und der binomische Lehrsatz}
-
-\begin{defi}{Binomialkoeffizient}
-    Die Anzahl der $k$-elementigen Teilmengen einer $n$-elementigen Menge bezeichnen wir mit $\binom{n}{k}$.
-    Diese Zahlen heißen \emph{Binomialkoeffizienten} oder Binomialzahlen.
-\end{defi}
-
-\begin{defi}{Rekursionsformel für Binomialkoeffizient}
-    Für $k, n \in \N$ mit $k \leq n$ gilt:
-    $$
-        \binom{n}{k} = \binom{n-1}{k} + \binom{n-1}{k-1}
-    $$
-\end{defi}
-
-\begin{defi}{Kombinatorische Formel für Binomialkoeffizient}
-    $$
-        \binom{n}{k} = \begin{cases}
-            0                          & , \text{ für } k > n    \\
-            \frac{n!}{(n-k)! \cdot k!} & , \text{ für } k \leq n
-        \end{cases}
-    $$
-\end{defi}
-
-\begin{defi}{Der binomische Lehrsatz}
-    Für beliebige $a, b \in \R$ und $n \in \N$ gilt:
-    $$
-        (a+b)^n = \sum^n_{k=0} \binom{n}{k} a^k \cdot b^{n-k}
-    $$
-\end{defi}
-
-\section{Konvergenz von Folgen, Reihen und Funktionen}
-
-\subsection{Grundlagen}
-\begin{defi}{Schranken}
-    Gilt $$\forall x\in A : \abs{x} < K,$$ so heißt die Menge $A$ \emph{beschränkt} und $K$ \emph{Schranke}.
-
-    Gilt nur $x \leq K$, so heißt die Menge \emph{nach oben beschränkt} und $K$ \emph{obere Schranke}.
-
-    Im Falle $x \geq K$ heißt $A$ \emph{nach unten beschränkt} und $K$ \emph{untere Schranke}.
-\end{defi}
-
-\begin{defi}{Beschränktheit}
-    Eine Menge $M$ heißt genau dann \emph{beschränkt}, wenn sie nach oiben und nach unten beschränkt ist.
-\end{defi}
-
-\begin{defi}{Supremum, Maximum}
-    Der Wert
-    $$
-        K= \min_{K^* \in \R} \{K \text{ ist obere Schranke}\}
-    $$
-    heißt \emph{kleinste obere Schranke} oder \emph{Supremum von A}.
-    Notation: $\sup A$
-
-    Gilt $K \in A$, so heißt $K$ \emph{Maximum von A}. Notation: $\max A$.
-\end{defi}
-
-\begin{defi}{Infimum, Minimum}
-    Der Wert
-    $$
-        K= \max_{K^* \in \R} \{K \text{ ist untere Schranke}\}
-    $$
-    heißt \emph{größte untere Schranke} oder \emph{Infimum von A}.
-    Notation: $\inf A$
-
-    Gilt $K \in A$, so heißt $K$ \emph{Minimum von A}. Notation: $\min A$.
-\end{defi}
-
-\begin{bonus}{Vollständigkeitsaxiom}
-    Jede nicht-leere nach oben beschränkte Menge $A$ hat ein \emph{Supremum}, jede nicht-leere nach unten beschränkte Menge $A$ hat ein \emph{Infimum}.
-\end{bonus}
-
-\begin{defi}{$\epsilon$-Umgebung von $K$ in $\R$}
-    $$
-        U_\epsilon(K) := \{ x \in \R \mid \abs{x - K} < \epsilon \}
-    $$
-    heißt $\epsilon$\emph{-Umgebung von} $K$ \emph{in} $\R$.
-\end{defi}
-
-\begin{defi}{Innerer Punkt}
-    $x_0 \in A$ heißt \emph{innerer Punkt von A}, falls eine $\epsilon$-Umgebung existiert, so dass $U_\epsilon (x_0) \in A$, also vollständig in $A$ enthalten ist.
-    $A$ heißt \emph{offen}, falls jeder Punkt der Menge innerer Punkt ist.
-\end{defi}
-
-\begin{defi}{Häufungspunkt (Mengen)}
-    $a$ heißt \emph{Häufungspunkt einer Menge A}, wenn $\forall \epsilon > 0$ in der Umgebung $U_\epsilon (a)$ ein Punkt $x \in A$ mit $x \neq a$ existiert.
-
-    Sei $x$ größter Häufungspunkt von $A$, dann heißt
-    $$
-        x = \lim\sup A \text{ (Limes Superior).}
-    $$
-
-    Sei $x$ kleinster Häufungspunkt von $A$, dann heißt
-    $$
-        x = \lim\inf A \text{ (Limes Inferior).}
-    $$
-\end{defi}
-
-\begin{defi}{Abgeschlossenheit}
-    $A$ heißt \emph{abgeschlossen}, wenn jeder Häufungspunkt von $A$ in $A$ liegt.
-\end{defi}
-
-\begin{defi}{Bolzano-Weierstrass für Mengen}
-    Jede unendliche beschränkte Menge $A$ reeller Zahlen besitzt mindestens einen Häufungspunkt.
-\end{defi}
-
-\subsection{Konvergenz von Folgen}
-
-\begin{defi}{Monotonie}
-    Eine Folge $a_n$ heißt \emph{monoton wachsend}, falls $\forall n \in \N : a_n \leq a_{n+1}$.
-    Gilt sogar $a_n < a_{n+1}$, so heißt die Folge \emph{streng monoton wachsend}.
-
-    Eine Folge $a_n$ heißt \emph{monoton fallend}, falls $\forall n \in \N : a_n \geq a_{n+1}$.
-    Gilt sogar $a_n > a_{n+1}$, so heißt die Folge \emph{streng monoton fallend}.
-\end{defi}
-
-\begin{defi}{Häufungspunkt (Folgen)}
-
-    $a$ heißt \emph{Häufungspunkt einer Folge}, wenn zu jeder $\epsilon$-Umgebung $U_\epsilon (a)$ unendlich viele Folgenglieder $a_n$ in $U_\epsilon (a)$ liegen, also
-    $$
-        \forall \epsilon > 0 , \exists \infty\text{-viele } a_n : \abs{a_n - a} < \epsilon
-    $$
-\end{defi}
-
-\begin{defi}{Grenzwert / Limes}
-    Eine Zahl $a\in \R \text{ oder } \C$ heißt \emph{Grenzwert} oder \emph{Limes} einer Zahlenfolge $a_n$, wenn $\forall \epsilon >0, \exists n_0 (\epsilon)$, so dass für alle $n \geq n_0 (\epsilon)$ (fast immer) gilt
-    $$
-        \abs{a_n - a} < \epsilon
-    $$
-
-    Jeder Grenzwert ist auch ein Häufungspunkt.
-\end{defi}
-
-\begin{defi}{Konvergenz / Divergenz}
-    Eine Folge $a_n$ heißt \emph{konvergent}, falls ein Grenzwert existiert.
-
-    Existiert dieser nicht, so heißt die Folge \emph{divergent}.
-
-    Eine konvergente Folge mit $a=0$ heißt \emph{Nullfolge}.
-
-    Ist $\lim_{n\to\infty}a_n = a$, so ist $\lim_{n\to\infty}(a_n-a) = 0$, d.h. $b_n=\lim_{n\to\infty}(a_n-a)$ ist \emph{Nullfolge}.
-\end{defi}
-
-\begin{defi}{Bolzano-Weierstrass für Folgen}
-    1. Jede beschränkte Folge $a_n$ besitzt mindestens eine konvergente Teilfolge.
-
-    2. Jede beschränkte Folge $a_n$ besitzt einen kleinsten und größten Häufungspunkt mit $b \geq a$
-    $$
-        \begin{aligned}
-            a & = \lim\inf a_n, \\
-            b & = \lim\sup a_n.
-        \end{aligned}
-    $$
-    3. Eine Folge konvergiert genau dann, wenn sie beschränkt ist und nur einen Häufungspunkt besitzt. Dann ist
-    $$
-        a = \lim_{n\to\infty} a_n = \lim\inf a_n = \lim\sup a_n.
-    $$
-\end{defi}
-
-\begin{defi}{Sandwich-Lemma oder Einschnürungssatz}
-    Gilt fast immer, also bis auf endliche viele $n$ (oder auch für $n \geq n_0$)
-    $$
-        a_n \leq c_n \leq b_n
-    $$
-    und $\lim_{n\to\infty}a_n = a = \lim_{n\to\infty}b_n$, so ist
-    $$
-        \lim_{n\to\infty}c_n = a.
-    $$
-\end{defi}
-
-\begin{bonus}{Rechenregeln für Grenzwerte}
-    $$
-        \begin{aligned}
-            \lim_{n\to\infty} (a_n + b_n)     & = a+b                                          \\
-            \lim_{n\to\infty} c\cdot a_n      & = c \cdot a                                    \\
-            \lim_{n\to\infty} a_nb_n          & = a \cdot b                                    \\
-            \lim_{n\to\infty} \frac{a_n}{b_n} & = \frac{a}{b} \text{ für } b_n \neq 0, b\neq 0 \\
-            \lim_{n\to\infty} \frac{1}{a_n}   & = \frac{1}{a} \text{ für } a_n \neq 0, a\neq 0
-        \end{aligned}
-    $$
-\end{bonus}
-
-\begin{bonus}{Wichtige Grenzwerte}
-    $$
-        \begin{aligned}
-            \lim_{n\to\infty} \frac{1}{n^\alpha} & = 0 \text{ für } \alpha >0             \\
-            \lim_{n\to\infty} \sqrt[n]{a}        & = 1 \text{ für } a > 0                 \\
-            \lim_{n\to\infty} q^n                & = 0 \text{ für } \abs{q} < 1           \\
-            \lim_{n\to\infty} n^kq^n             & = 0 \text{ für } \abs{q} < 1, k \in \N \\
-            \lim_{n\to\infty} \sqrt[n]{n}        & = 1                                    \\
-            \lim_{n\to\infty} \frac{n!}{n^n}     & = 0
-        \end{aligned}
-    $$
-\end{bonus}
-
-\begin{defi}{Konvergenz monotoner Folgen}
-    Jede beschränkte monotone Folge ist konvergent.
-
-    Der Grenzwert ist bei monoton fallenden Folgen $\inf a_n$, bei wachsenden Folgen $\sup a_n$.
-\end{defi}
-
-\begin{defi}{Eulersche Zahl}
-    Der Grenzert $\lim_{n\to\infty} \left(1 + \frac{1}{n}\right)^n = e$ existiert und heißt \emph{eulersche Zahl}.
-\end{defi}
-
-\begin{defi}{Cauchy-Konvergenz}
-    Eine Folge $a_n$ heißt \emph{Cauchy-konvergent}, falls
-    $$
-        \forall\epsilon > 0, \exists n_0 (\epsilon) \text{ mit } \abs{a_n-a_m} < \epsilon, \forall n > m \geq n_0.
-    $$
-\end{defi}
-
-\subsection{Unendliche Reihen}
-\begin{defi}{Unendliche Reihe}
-    \[
-        \sum_{k=m}^{\infty} a_k = \lim_{n\to\infty} \sum_{k=m}^{n} a_k
-    \]
-\end{defi}
-
-\begin{defi}{Cauchy-Reihe}
-    \[
-        \forall\varepsilon>0 , \exists n_0(\varepsilon) : \left| \sum_{k=m+1}^n a_k \right| < \varepsilon , \forall n>m\geq n_0
-    \]
-    Eine Reihe \emph{konvergiert} genau dann, wenn die zugehörige Cauchy-Reihe konvergiert.
-\end{defi}
-
-\begin{bonus}{Konvergenz durch Nullfolge}
-    Sei $\sum^n_{k=1}a_k$ konvergent, dann ist $a_k$ Nullfolge.
-\end{bonus}
-
-\begin{defi}{Absolute Konvergenz}
-    Eine Reihe heißt \emph{absolut konvergent} wenn $\sum_{k=0}^{\infty} |a_k|$ konvergiert.
-
-    Analog heißt eine Folge \emph{absolut konvergent} wenn $|a_n|$ konvergiert.
-\end{defi}
-
-\begin{algo}{Teleskopsumme}
-    Eine Teleskopsumme hat man dann, wenn sich die Terme einer Summe gegenseitig auflösen.
-\end{algo}
-
-\begin{example}{Teleskopsumme}
-    \[
-        \sum_{k=1}^n \frac{1}{k} - \frac{1}{k+1} = \sum_{k=1}^n \frac{1}{k} - \sum_{k=2}^{n+1} \frac{1}{k} = \frac{1}{1} +\left( \sum_{k=2}^n \frac{1}{k} - \sum_{k=2}^n \frac{1}{k} \right) - \frac{1}{n+1} = 1-\frac{1}{n+1}
-    \]
-\end{example}
-
-\begin{algo}{Majorantenkriterium}
-    Man sucht eine zweite Folge $b_k$, sodass diese fast immer größer ist als die vorgegebene Folge ist.
-
-    Konvergiert $\sum_{k=1}^{\infty} b_k$ dann konvergiert auch die ursprüngliche Reihe.
-\end{algo}
-
-\begin{example}{Majorantenkriterium}
-    Konvergiert $\sum_{k=1}^{\infty} \frac{1}{k^2+1}$?
-
-    Ja, da $\frac{1}{k^2+1} < \frac{1}{k^2}$ und wir wissen, dass $\sum_{k=1}^{\infty} \frac{1}{k^2}$ konvergiert.\\
-    Wir haben also eine konvergente Majorante.
-\end{example}
-
-\begin{algo}{Minorantenkriterium}
-    Man sucht eine zweite Folge $b_k$, sodass diese fast immer kleiner ist als die vorgegebene Folge ist.
-    Divergiert $\sum_{k=1}^{\infty} b_k$ dann divergiert auch die ursprüngliche Reihe.
-\end{algo}
-
-\begin{example}{Majorantenkriterium}
-    Konvergiert $\sum_{k=1}^{\infty} \frac{1}{\ln(k)}$?
-
-    Nein, da $\frac{1}{k} < \frac{1}{\ln(k)}$ ($k\geq3$) und wir wissen, dass $\sum_{k=1}^{\infty} \frac{1}{k}$ divergiert.\\
-    Wir haben also eine divergente Minorante.
-\end{example}
-
-\begin{algo}{Cauchy-Kondensatioskriterium}
-    Die Konvergenz von folgenden Reihen ist äquivalent.
-    $$
-        \sum_{k=1}^{\infty} a_k \quad \text{ und } \quad
-        \sum_{k=1}^{\infty} 2^k \cdot a_{2^k}
-    $$
-\end{algo}
-
-\begin{example}{Cauchy-Kondensatioskriterium}
-    Konvergiert $\sum_{k=1}^{\infty} \frac{1}{k}$?
-
-    Die Frage ist äquivalent dazu, ob
-    \[
-        \sum_{k=1}^{\infty} 2^k \cdot \frac{1}{2^k} = \sum_{k=1}^{\infty} 1
-    \]
-    konvergiert. Das tut sie offensichtlich nicht, also konvergiert auch $\sum_{k=1}^{\infty} \frac{1}{k}$ nicht.
-\end{example}
-
-\begin{algo}{Wurzelkriterium}
-    Sei $r = \lim_{n\to\infty} \sqrt[n]{|a_n|}$.
-    Dann konvergiert $\sum_{k=1}^{\infty} a_k$ für $r<1$.
-    Für $r>1$ divergiert die Reihe.
-    Für $r=1$ liefert das Kriterium keine Aussage.
-\end{algo}
-
-\begin{example}{Wurzelkriterium}
-    Konvergiert die Reihe $\sum_{k=1}^{\infty} \frac{1}{7^k}$?
-
-    Es gilt
-    \[
-        r = \lim_{k\to\infty} \sqrt[k]{\frac{1}{7^k}} = \frac{1}{7} < 1
-    \]
-    Also konvergiert die Reihe.
-\end{example}
-
-\begin{algo}{Quotientenkriterium}
-    Sei $r = \lim_{n\to\infty} \left| \frac{a_{n+1}}{a_n} \right|$.
-
-    Dann konvergiert $\sum_{k=1}^{\infty} a_k$ für $r<1$.
-
-    Für $r>1$ divergiert die Reihe.
-
-    Für $r=1$ liefert das Kriterium keine Aussage.
-\end{algo}
-
-\begin{example}{Quotientenkriterium}
-    Konvergert die Reihe $\sum_{k=1}^{\infty} \frac{x^k}{k!}$?
-
-    Wir berechnen dann
-    \[
-        r = \lim_{n\to\infty} \left| \frac{\frac{x^{n+1}}{(n+1)!}}{\frac{x^n}{n!}} \right|
-        = \lim_{n\to\infty} \left| \frac{x}{n+1} \right| = 0
-    \]
-    Die Reihe konvergiert also für alle $x$.
-\end{example}
-
-\begin{algo}{Leibnizkriterium}
-    Das Leibnizkriterium wird für alternierende Reihen genutzt.
-
-    Sei $\sum_{k=1}^{\infty} (-1)^n \cdot a_n$ und $a_n$ eine beliebige Folge.
-
-    Jetzt muss man nur drei Eigenschaften für $a_n$ zeigen:
-    \begin{enumerate}
-        \item $a_n$ muss monoton fallend sein,
-        \item $a_n$ muss immer größer als Null sein und
-        \item $\lim_{n\to\infty} a_n =0$.
-    \end{enumerate}
-
-    Dann konvergiert die Reihe.
-\end{algo}
-
-\begin{example}{Leibnizkriterium}
-    Konvergiert die Reihe $\sum_{k=2}^{\infty} (-1)^n \cdot \frac{1}{\ln(k)}$.
-    Wir wissen, dass $\ln(k) > 0$ für $k>1$.
-    Außerdem wissen wir, dass der natürliche Logarithmus monoton steigend ist, also ist $\frac{1}{\ln(k)}$ monoton fallend.
-    Es gilt auch $\lim_{n\to\infty} = 0$. Also konvergiert die Reihe.
-\end{example}
-
-
-\subsection{Potenzreihen}
-
-\begin{defi}{Potenzreihe}
-    Sei $x \in \R, a_n \in \R$, so heißt
-    $$
-        p(x) := \sum_{n=0}^{\infty} a_nx^n
-    $$
-    \emph{reelle Potenzreihe von x}.
-
-    Jede Potenzreihe konvergiert für $x=0$.
-\end{defi}
-
-\begin{defi}{Konvergenz von Potenzreihen (Entwicklungspunkt $x_0 = 0$)}
-    Jede Potenzreihe konvergiert für $x=0$.
-
-    Jede Potenzreihe konvergiert für
-    $$
-        \abs{x} < R = \lim_{n\to\infty} \abs{\frac{a_n}{a_{n+1}}} \quad \text{ bzw. } \quad \abs{x} < R = \frac{1}{\lim_{n\to\infty} \sqrt[n]{\abs{a_n}}}
-    $$
-    und divergiert für $\abs{x} > R$.
-
-    Der Rand muss oft gesondert betrachtet werden!
-\end{defi}
-
-\begin{defi}{Konvergenz von Potenzreihen (Entwicklungspunkt $x_0 \neq 0$)}
-    Jede Potenzreihe $p(x) = \sum^\infty_{n=0} a_n (x-x_0)^n$ konvergiert für
-    $$
-        \abs{x-x_0} < R = \lim_{n\to\infty} \abs{\frac{a_n}{a_{n+1}}}\quad  \text{ bzw. } \quad \abs{x} < R = \frac{1}{\lim_{n\to\infty} \sqrt[n]{\abs{a_n}}}
-    $$
-    und divergiert für $\abs{x-x_0} > R$.
-
-    Der Rand muss oft gesondert betrachtet werden!
-\end{defi}
-
-\begin{defi}{Konvergenzradius}
-    $$
-        R = \lim_{n\to\infty} \abs{\frac{a_n}{a_{n+1}}}\quad  \text{ bzw. } R = \frac{1}{\lim_{n\to\infty} \sqrt[n]{\abs{a_n}}}
-    $$
-    \emph{heißt der Konvergenzradius der Potenzreihe}.
-\end{defi}
-
-\begin{bonus}{Spezielle Potenzreihen}
-    $$
-        \begin{aligned}
-            f(x) = \frac{1}{1-c(x-x_0)} & \iff \sum^\infty_{n=0} c^n \cdot (x-x_0)^n \text{ für } \abs{x-x_0} < \frac{1}{\abs{c}}
-        \end{aligned}
-    $$
-\end{bonus}
-
-\begin{example}{Potenzreihe um Entwicklungspunkt bestimmen}
-    Wir wollen die Potenzreihe um $x_0 = 1$ der Reihe $$f(x) = \frac{3}{5+2x}$$ bestimmen.
-    Zunächst ist:
-    $$
-        \begin{aligned}
-            f(x) & ={} \frac{3}{5+2x}                                                                                                       \\
-                 & ={} 3\cdot \frac{1}{5+2(x-1) + 2}                                                                                        \\
-                 & ={} 3\cdot \frac{1}{7- (-2) \cdot (x-1)}                                                                                 \\
-                 & ={} \frac{3}{7}\cdot \frac{1}{1- (-\frac{2}{7}) \cdot (x-1)}                                                             \\
-                 & ={} \frac{3}{7}\cdot \sum^\infty_{n=0} \left(\frac{-2}{7} \cdot (x-1)\right)^n \text{ für } \abs{\frac{-2}{7} (x-1)} < 1 \\
-                 & ={} \frac{3}{7}\cdot \sum^\infty_{n=0} \left(\frac{-2}{7}\right)^n \cdot (x-1)^n \text{ für } \abs{x-1} < \frac{7}{2}
-        \end{aligned}
-    $$
-\end{example}
-
-\begin{defi}{Exponentialfunktion}
-    Die Funktion
-    $$
-        \exp(x) = \sum^\infty_{n=0} \frac{x^n}{n!}
-    $$
-    heißt \emph{Exponentialfunktion} oder \emph{exponentielle Funktion}.
-    Sie konvergiert für jedes $x\in \R$ und ist damit wohldefiniert.
-\end{defi}
-
-\subsection{Grenzwerte von Funktionen}
-
-\begin{defi}{Konvergenz von Funktionen}
-    Gilt $\forall x_n$, dass (falls $\lim_{n\to\infty} x_n=x_0$ gilt):
-    $$
-        \lim_{n\to\infty} f(x_n) = L
-    $$
-    so heißt die Funktion \emph{konvergent für} $x \to x_0$ und wir schreiben
-    $$
-        \lim_{n\to\infty} =: \lim_{x\to x_0} f(x).
-    $$
-\end{defi}
-
-\begin{defi}{Stetigkeit von Funktionen}
-    Gilt $\forall x_n$, dass (falls $\lim_{n\to\infty} x_n=x_0$ gilt):
-    $$
-        \lim_{n\to\infty} f(x_n) = f(x_0)
-    $$
-    so heißt die Funktion \emph{stetig in} $x_0$.
-
-    Jede Potenzreihe ist im Inneren ihres Konvergenzradius (also nicht zwingend für die Randpunkte) stetig.
-\end{defi}
-
-\begin{defi}{Rechtsseitiger und linksseitiger Grenzwert}
-    Existiert für Folgen $x_n$ mit $x_n > x_0$ ein Grenzwert $L$, also existiert
-    $$
-        \lim_{x \to x_0 \land x > x_0} f(x) = L =:  \lim_{x \downarrow x_0} f(x)
-    $$
-    so heißt der Grenzwert \emph{rechtsseitiger Grenzwert}.
-    Gilt $L=f(x_0)$, so heißt die Funktion \emph{rechtsseitig stetig.}
-
-    Entsprechend für $x < x_0$:
-    $$
-        \lim_{x \to x_0 \land x < x_0} f(x) = L =:  \lim_{x \uparrow x_0} f(x).
-    $$
-\end{defi}
-
-\begin{defi}{Stetigkeit}
-    Eine Funktion $f(x)$ ist genau dann \emph{stetig in} $x_0$, wenn
-    $$
-        \lim_{x \downarrow x_0} f(x_0) = \lim_{x \uparrow  x_0} f(x_0) = f(x_0).
-    $$
-
-    Sei $f : D \to \R$ heißt \emph{stetig auf} $D = [a, b]$, falls $f$ für jedes $x_0 \in D$ stetig ist.
-\end{defi}
-
-\begin{defi}{$\epsilon$-$\delta$-Kriterium}
-    Eine Funktion $f(x)$ heißt \emph{stetig in} $x_0$, falls
-    $$
-        \forall \epsilon > 0, \exists \delta(x_0, \epsilon) > 0, \forall \abs{x-x_0} < \delta : \abs{f(x)-f(x_0)} < \epsilon
-    $$
-\end{defi}
-
-\begin{example}{$\epsilon$-$\delta$-Kriterium}
-    Untersuche die Stetigkeit von $f(x) = \frac{1}{\sqrt{x}}, \quad x > 0$.
-
-    $f(x)$ ist stetig in $x_0$, wenn
-    $$\forall \epsilon > 0, \exists \delta (x_0, \epsilon) > 0: \forall \abs{x-x_0} < \delta \Rightarrow \abs{f(x)-f(x_0)} < \epsilon$$
-    $$
-        \begin{aligned}
-                       & \abs{f(x)-f(x_0)}                                                                                                                                        \\
-            = \quad    & \abs{\frac{1}{\sqrt{x}}-\frac{1}{\sqrt{x_0}}}                                                                                                            \\
-            = \quad    & \abs{\left(\frac{1}{\sqrt{x}}-\frac{1}{\sqrt{x_0}}\right) \cdot \frac{\frac{1}{\sqrt{x}}+\frac{1}{\sqrt{x_0}}}{\frac{1}{\sqrt{x}}+\frac{1}{\sqrt{x_0}}}} \\
-            = \quad    & \abs{\frac{\frac{1}{x}-\frac{1}{x_0}}{\frac{1}{\sqrt{x}}+\frac{1}{\sqrt{x_0}}}}                                                                          \\
-            = \quad    & \abs{\frac{\frac{x_0-x}{x x_0}}{\frac{\sqrt{x_0} + \sqrt{x}}{ \sqrt{x  x_0}}}}                                                                           \\
-            = \quad    & \abs{ \frac{(x_0 - x)  \sqrt{x x_0} }{ x x_0  \left( \sqrt{x_0} + \sqrt{x} \right) } }                                                                   \\
-            = \quad    & \abs{ \frac{x_0 - x }{ \sqrt{x x_0 } \left( \sqrt{x_0} + \sqrt{x} \right) } }                                                                            \\
-            = \quad    & \abs{ \frac{x-x_0 }{ \sqrt{x x_0 } \left( \sqrt{x_0} + \sqrt{x} \right) } }                                                                              \\
-            = \quad    & \abs{x-x_0} \cdot \frac{1 }{ \sqrt{x x_0 } \left( \sqrt{x_0} + \sqrt{x} \right) }                                                                        \\
-            < \quad    & \delta \cdot \frac{1 }{ \sqrt{x x_0 } \left( \sqrt{x_0} + \sqrt{x} \right) }                                                                             \\
-            \leq \quad & \delta \cdot \frac{1 }{ \sqrt{x x_0 } \sqrt{x_0} + \sqrt{x x_0 } \sqrt{x} }                                                                              \\
-            \leq \quad & \delta \cdot \frac{1 }{ \sqrt{x x_0 } \sqrt{x} }                                                                                                         \\
-            \leq \quad & \delta \cdot \frac{1 }{ x\sqrt{x_0} }                                                                                                                    \\
-        \end{aligned}
-    $$
-    Sei $\abs{x-x_0} < \frac{x_0}{2}$:
-
-    $$\abs{x-x_0} < \frac{x_0}{2} \implies x_0 -\frac{x_0}{2}  < x < x_0 + \frac{x_0}{2}  \iff \frac{x_0}{2} < x$$
-
-    Daraus folgt weiterhin:
-    $$
-        \begin{aligned}
-                       & \delta \cdot \frac{1 }{ x\sqrt{x_0} }       \\
-            < \quad    & \frac{2\delta }{ x_0\sqrt{x_0} } < \epsilon \\
-            \iff \quad & \delta < \frac{x_0\sqrt{x_0}}{2} \epsilon
-        \end{aligned}
-    $$
-
-    Mit $\delta = \min\{\frac{x_0}{2}, \frac{x_0\sqrt{x_0}}{2}\epsilon\}$ ist $f(x)$ stetig.\qed
-\end{example}
-
-\begin{defi}{Sandwich-Lemma für Funktionen}
-    Gilt
-    $$
-        \forall \abs{x-x_0} < K, x\neq x_0 : f(x) \leq g(x) \leq h(x)
-    $$
-    und
-    $$
-        \lim_{x\to x_0} f(x) = \lim_{x\to x_0} h(x) = c
-    $$
-    so ist auch
-    $$
-        \lim_{x\to x_0} g(x) = c.
-    $$
-\end{defi}
-
-\begin{defi}{Unstetigkeit}
-    Es gibt verschiedene Typen der Unstetigkeit:
-    \begin{enumerate}
-        \item Sprungstellen:
-              $$
-                  \lim_{x\uparrow x_0} f(x) \neq\lim_{x\downarrow x_0} f(x)
-              $$
-        \item Unendlichkeitsstellen: $f$ ist in der Umgebung von $x_0$ nicht beschränkt, d.h.
-              $$
-                  \lim_{x\to x_0} f(x) > R
-              $$
-        \item Oszillationsstellen: z.B.
-              $$
-                  \lim_{x\to 0} \sin \frac{1}{x} \text{ in } x_0 = 0
-              $$
-        \item Singuläre Definitionen:
-              $$
-                  f(x) = \begin{cases}
-                      g(x) & , \text{ für } x \in M    \\
-                      h(x) & , \text{ für } x \notin M
-                  \end{cases}
-              $$
-        \item Definitionslücken: z.B.
-              $$
-                  f(x) = \frac{x}{x} \text{ für } x \neq 0
-              $$
-        \item Kombinationen aus den oben genannten
-    \end{enumerate}
-\end{defi}
-
-\begin{defi}{Hebbare Lücke}
-    Sei $f(x)$ stetig für $x\neq x_0, x_0 \notin D$.
-    Dann erhält man mit $f(x) := \lim_{x\to x_0} f(x)$ eine stetige Funktion, wenn der Grenzwert existiert.
-    $x_0$ heißt \emph{hebbare Lücke}.
-\end{defi}
-
-\begin{bonus}{Stetigkeit auf Intervallen}
-    Sei $f : [a, b] \to \R$ stetig, dann:
-    \begin{itemize}
-        \item ist $f(x)$ beschränkt.
-        \item existieren $x_1, x_2 \in [a, b]: f(x_1) \leq f(x) \leq f(x_2), \forall x \in [a, b]$
-    \end{itemize}
-\end{bonus}
-
-\begin{defi}{Gleichmäßige Stetigkeit}
-    Eine Funktion $f : D \to \R$ heißt \emph{gleichmäßig stetig auf D}, falls es ein $\delta > 0$ unabhängig von $x_0$ gibt, so dass
-    $$
-        \abs{f(x) - f(x_0)} < \epsilon, \forall \abs{x-x_0} < \delta.
-    $$
-
-    Jede gleichmäßig stetige Funktion ist stetig.
-
-    Eine stetige Funktion $f : [a, b] \to \R$ ist gleichmäßig stetig.
-\end{defi}
-
-\begin{defi}{Lipschitz-Stetigkeit}
-    Eine Funktion $f$ heißt \emph{lokal Lipschitz-stetig in} $x_0$, wenn es ein $L \geq 0$ und ein $\delta > 0$ gibt, so dass
-    $$
-        \abs{f(x) - f(x_0)} \leq L \cdot \abs{x-x_0}, \forall \abs{x-x_0} < \delta.
-    $$
-
-    Eine Funktion $f$ heißt \emph{Lipschitz-stetig}, wenn es ein $L \geq 0$, so dass
-    $$
-        \abs{f(x) - f(y)} \leq L \cdot \abs{x-y}, \forall x, y \in [a, b].
-    $$
-    $L$ heißt \emph{Lipschitz-Konstante}.
-
-    Ist eine Funktion Lipschitz-stetig, so ist sie auch gleichmäßig stetig.
-\end{defi}
-
-\begin{example}{Lipschitz-Stetigkeit}\
-    $$f(x) = \sqrt{2+3x}$$
-
-    Ist die Funktion lokal Lipschitz-stetig im Punkt $x_0 = 1$?
-    Berechnen Sie gegebenenfalls die Lipschitz-Konstante $L$ in Abhängigkeit von $\delta$.
-    Lipschitz-Stetigkeit: $\exists L \geq 0, \forall x,x_0\in D: \abs{f(x)-f(x_0)} \leq L \cdot \abs{x-x_0}$
-
-    $$
-        \begin{aligned}
-                                                             & \abs{f(x)-f(y)}                                                                                     \\
-            = \quad                                          & \abs{\sqrt{2+3x} - \sqrt{2+3y}}                                                                     \\
-            = \quad                                          & \abs{(\sqrt{2+3x} - \sqrt{2+3y}) \cdot \frac{\sqrt{2+3x} + \sqrt{2+3y}}{\sqrt{2+3x} + \sqrt{2+3y}}} \\
-            = \quad                                          & \abs{\frac{2+3x-(2+3y)}{\sqrt{2+3x} + \sqrt{2+3y}}}                                                 \\
-            = \quad                                          & \abs{\frac{3(x-y)}{\sqrt{2+3x} + \sqrt{2+3y}}}                                                      \\
-            = \quad                                          & \frac{3}{\sqrt{2+3x} + \sqrt{2+3y}} \cdot \abs{x-y}                                                 \\
-            \overset{x,y\in (x_0-\delta, x_0+\delta)}< \quad & \frac{3}{\sqrt{2+3(x_0-\delta)} + \sqrt{2+3(x_0-\delta)}} \cdot \abs{x-y}                           \\
-            = \quad                                          & \frac{3}{\sqrt{2+3(1-\delta)} + \sqrt{2+3(1-\delta)}} \cdot \abs{x-y}                               \\
-            = \quad                                          & \frac{3}{\sqrt{2+3-3\delta} + \sqrt{2+3-3\delta}} \cdot \abs{x-y}                                   \\
-            = \quad                                          & \frac{3}{2\cdot \sqrt{5-3\delta}} \cdot \abs{x-y}                                                   \\
-        \end{aligned}
-    $$
-    Damit ist $f$ lokal Lipschitz-stetig im Punkt $x_0 = 1$ mit $L = \frac{3}{2\cdot \sqrt{5-3\delta}}$.\qed
-\end{example}
-
-\begin{defi}{Zwischenwertsatz}
-    Sei $f : [a, b] \to \R$ stetig mit $f(a) = c$ und $f(b) = d$, dann gilt
-    $$
-        \forall y \in [\min(c, d) , \max(c, d)], \exists x \in [a, b] : f(x) = y.
-    $$
-\end{defi}
-
-\begin{defi}{Fixpunktsatz}
-    Ein Wert $x^* \in \R$ heißt \emph{Fixpunkt} einer Funktion $f(x)$, falls $x^* = f(x^*)$.
-
-    Sei $f : [a, b] \to [c, d]$ stetig mit $[c, d] \subset [a, b]$ (\emph{selbstkontrahierend}), dann existiert ein \emph{Fixpunkt} $u = f(u)$.
-\end{defi}
-
-\begin{example}{Fixpunktberechnung (Teil 1)}
-    Gegeben ist die Funktion
-    $$f: [0,\infty) \to [0, \infty), \quad f(x) = \frac{x+\frac{1}{2}}{x+1}$$
-
-    (a) Zeigen Sie, dass die Funktion die Voraussetzungen des Fixpunktsatzes erfüllt.
-
-    \textbf{Stetigkeit:}
-    $f$ ist offensichtlich stetig, da $f$ aus stetigen Funktionen zusammengesetzt ist (und insbesondere, da $\forall x\in [0,\infty]: x\neq -1$).
-
-    \textbf{Monotonieverhalten:}
-    Wir vermuten, dass die Funktion monoton steigend ist:
-    $$
-        \begin{aligned}
-                         & x \geq y \implies f(x) \geq f(y)                                                           \\
-            \equiv \quad & x \geq y \implies \frac{x+\frac{1}{2}}{x+1} \geq \frac{y+\frac{1}{2}}{y+1}                 \\
-            \equiv \quad & x \geq y \implies \left(x+\frac{1}{2}\right)(y+1) \geq \left(y+\frac{1}{2}\right)(x+1)     \\
-            \equiv \quad & x \geq y \implies xy+ x + \frac{y}{2}+ \frac{1}{2} \geq xy + y + \frac{x}{2} + \frac{1}{2} \\
-            \equiv \quad & x \geq y \implies x + \frac{y}{2}\geq y + \frac{x}{2}                                      \\
-            \equiv \quad & x \geq y \implies x - \frac{x}{2}\geq y - \frac{y}{2}                                      \\
-            \equiv \quad & x \geq y \implies \frac{x}{2}\geq \frac{y}{2}                                              \\
-            \equiv \quad & x \geq y \implies x\geq y \quad \checkmark
-        \end{aligned}
-    $$
-    Damit ist $f$ monoton steigend.
-
-    \textbf{Kontraktion:} Zu zeigen: $\forall x\in [0,\infty)]: f(x) \in [0,\infty)]$:
-
-    $$f(0) = \frac{0+\frac{1}{2}}{0+1} = \frac{1}{2}\in [0,\infty), \text{ und } \lim_{n\to\infty} f(n) = \lim_{n\to\infty} \frac{n+\frac{1}{2}}{n+1} = 1\in [0,\infty)$$
-
-    Da beide Werte im gegebenen Definitionsbereich sind und $f$ monoton steigend ist, ist $f$ insgesamt selbstkontrahierend.
-
-    Insgesamt sind also alle Bedingungen für den Fixpunktsatz erfüllt.\qed
-
-\end{example}
-
-\begin{example}{Fixpunktberechnung (Teil 2)}
-    (b) Berechnen Sie den Fixpunkt von $f$.
-    $$
-        \begin{aligned}
-                           & f(x^*) = x^*                                            \\
-            \equiv \quad   & \frac{x^*+\frac{1}{2}}{x^*+1} = x^*                     \\
-            \equiv \quad   & x^*+\frac{1}{2} = x^*(x^*+1)                            \\
-            \equiv \quad   & x^*+\frac{1}{2} = (x^*)^2+x^*                           \\
-            \equiv \quad   & 0 = (x^*)^2-\frac{1}{2}                                 \\
-            \implies \quad & x^* = \sqrt{\frac{1}{2}} \lor x^* = -\sqrt{\frac{1}{2}}
-        \end{aligned}
-    $$
-
-    $x^* \in [0,\infty] \implies x^* = \sqrt{\frac{1}{2}}$\qed
-\end{example}
-
-\section{Differentialrechnung}
-\subsection{Tangentengleichung}
-
-\begin{algo}{Tangentengleichung}
-    Wollen wir die Gleichung der Tangente einer Funktion $f(x)$ in einem Punkt $x_0$ bestimmen, so verwenden wir den Ansatz
-    $$
-        T(x) = f_1(x) = m \cdot (x-x_0) + b.
-    $$
-    Die Tangente im Punkt $x_0$ hat die Eigenschaften
-    \begin{itemize}
-        \item Die Steigung ist $m = f'(x)$,
-        \item Sie geht durch den Punkt $(x_0, f(x_0))$.
-    \end{itemize}
-
-    Einsetzen der zweiten Bedingung liefert
-    $$
-        f(x_0) = f_1(x_0) = b
-    $$
-    und damit ist die Tangentengleichung bekannt mit
-    $$
-        f_1(x) = f'(x_0) \cdot (x-x_0) + f(x_0).
-    $$
-\end{algo}
-
-\newpage
-\subsection{Ableitungsregeln}
-
-\begin{defi}{Faktorregel}
-    $$
-        f(x) = c \cdot g(x) \implies f'(x) = c \cdot g'(x)
-    $$
-\end{defi}
-
-\begin{defi}{Summenregel}
-    $$
-        f(x) = g(x) + h(x) \implies f'(x) = g'(x) + h'(x)
-    $$
-\end{defi}
-
-\begin{defi}{Produktregel}
-    $$
-        f(x) = g(x) \cdot h(x) \implies f'(x) = g'(x)\cdot h(x) + g(x) \cdot h'(x)
-    $$
-\end{defi}
-
-\begin{defi}{Quotientenregel}
-    $$
-        f(x) = \frac{g(x)}{h(x)} \implies f'(x) = \frac{g'(x)\cdot h(x) - g(x)\cdot h'(x)}{[h(x)]^2}
-    $$
-\end{defi}
-
-\begin{defi}{Kettenregel}
-    $$
-        f(x) = g(h(x)) \implies f'(x) = g'(h(x)) \cdot h'(x)
-    $$
-\end{defi}
-
-\begin{bonus}{Ableitung der Umkehrfunktion}
-    $$
-        (f^{-1})(y) = \frac{1}{f'(x)} = \frac{1}{f'(f^{-1}(y))}
-    $$
-\end{bonus}
-
-\begin{bonus}{Elementare Ableitungsfunktionen}
-    \begin{center}
-        \begin{tabular}{C | C}
-            f(x)   & f'(x)                             \\
-            \hline
-            x^n    & n \cdot x^{n-1}                   \\
-            \sin x & \cos x                            \\
-            \cos x & -\sin x                           \\
-            \tan x & \frac{1}{\cos^2 x} = \tan^2 x + 1 \\
-            \cot x & \frac{-1}{\sin^2 x}               \\
-            e^x    & e^x                               \\
-            a^x    & a^x \cdot \ln a                   \\
-            \ln x  & \frac{1}{x}
-        \end{tabular}
-    \end{center}
-\end{bonus}
-
-\subsection{Lokale Extrema}
-
-\begin{defi}{Lokale Extrema}
-    Existiert eine Stelle $x_0$ einer Funktion $f(x)$ und eine $\epsilon$-Umgebung $U_\epsilon (x_0)$ von $x_0$, so dass $\forall x \in U_\epsilon (x_0)$ gilt:
-    \begin{itemize}
-        \item $f(x) \geq f(x_0)$, so heißt $x_0$ \emph{lokales Minimum},
-        \item $f(x) \leq f(x_0)$, so heißt $x_0$ \emph{lokales Maximum}.
-    \end{itemize}
-
-    Ist $f$ differenzierbar in $x_0$ und $x_0$ lokales Extremum, sei gilt
-    $$
-        f'(x_0) = 0.
-    $$
-\end{defi}
-
-\subsection{Mittelwertsatz}
-
-\begin{bonus}{Satz von Rolle}
-    Ist $f$ auf $[a, b]$ stetig mit $f(a) = f(b)$ und auf $(a, b)$ differenzierbar, so existiert ein $x^* \in (a, b) : f'(x^*) = 0$.
-\end{bonus}
-
-\begin{defi}{Mittelwertsatz}
-    Sei $f \in C[a, b]$ und in $(a, b)$ differenzierbar.
-    Dann existiert ein $x^* \in (a, b)$ mit
-    $$
-        f'(x^*) = \frac{f(b)  -f(a)}{b-a}.
-    $$
-\end{defi}
-
-\subsection{Stetigkeit und Differenzierbarkeit von Potenzreihen}
-
-\begin{defi}{Stetigkeit / Differenzierbarkeit von Potenzreihen}
-    Jede Potenzreihe ist stetig im Inneren des Konvergenzbereiches.
-    Die Potenzreihe $p(x) = \sum^\infty_{n=0} a_n(x-x_0)^n$ ist differenzierbar im Inneren des Konvergenzbereiches und die Ableitung $p'(x)$ kann summandenweise berechnet werden mit:
-    $$
-        \begin{aligned}
-            p'(x) & = \sum^\infty_{n=1} a_n \cdot n \cdot (x-x_0)^{n-1}       \\
-                  & = \sum^\infty_{n=0} a_{n+1} \cdot (n+1) \cdot (x-x_0)^{n}
-        \end{aligned}
-    $$
-\end{defi}
-
-\subsection{Monotonie}
-
-\begin{defi}{Monotonie für Funktionen}
-    Eine Funktion heißt \emph{monoton wachsend auf} $[a, b]$, falls
-    $$
-        \forall x_1, x_2 \in (a, b), x_1 < x_2 : f(x_1) \leq f(x_2) \iff \forall x \in (a, b): f'(x) \geq 0.
-    $$
-    Eine Funktion heißt \emph{streng monoton wachsend auf} $[a, b]$, falls
-    $$
-        \forall x_1, x_2 \in (a, b), x_1 < x_2 : f(x_1) < f(x_2) \iff \forall x \in (a, b): f'(x) > 0.
-    $$
-    Eine Funktion heißt \emph{monoton fallend auf} $[a, b]$, falls
-    $$
-        \forall x_1, x_2 \in (a, b), x_1 < x_2 : f(x_1) \geq f(x_2) \iff \forall x \in (a, b): f'(x) \leq 0.
-    $$
-    Eine Funktion heißt \emph{streng monoton fallend auf} $[a, b]$, falls
-    $$
-        \forall x_1, x_2 \in (a, b), x_1 < x_2 : f(x_1) > f(x_2) \iff \forall x \in (a, b): f'(x) < 0.
-    $$
-\end{defi}
-
-\subsection{Die Grenzwerte von de L'Hospital}
-
-\begin{defi}{Regeln von de L'Hospital}
-    Seien $f, g \in C[a, b]$ und in $(a, b)$ differenzierbar mit $f(a) = g(a) = 0$.
-
-    Weiterhin gelte $\forall x \in (a, b): g'(x) \neq 0$ und es existiert
-    $$
-        \lim_{x\to a} \frac{f'(x)}{g'(x)}
-    $$
-    dann existiert auch
-    $$
-        \lim_{x\to a } \frac{f(x)}{g(x)}
-    $$
-    und es ist
-    $$
-        \lim_{x\to a } \frac{f(x)}{g(x)} = \lim_{x\to a} \frac{f'(x)}{g'(x)}.
-    $$
-\end{defi}
-
-\subsection{Krümmungseigenschaften}
-
-\begin{defi}{Krümmung}
-    Sei $f\in C^2(a, b)$ und ist $\forall x \in (a, b) : f''(x) > 0$, so heißt $f(x)$ \emph{konvex} oder \emph{linksgekrümmt}.
-
-    Ist $\forall x \in (a, b) : f''(x) < 0$ so heißt $f(x)$ \emph{konkav} oder \emph{rechtsgekrümmt}
-\end{defi}
-
-\begin{defi}{Wendepunkt}
-    Sei $f \in C^2(a, b)$ und wechselt die Funktion für $x^* \in (a, b)$ von einer links- zu einer rechtsgekrümmten Funktion (oder umgekehrt), so heißt $x^*$ \emph{Wendepunkt der Funktion}.
-
-    Ist $x^*$ Wendepunkt und $f \in C^2(a, b)$, so ist $f''(x) = 0$.
-\end{defi}
-
-\subsection{Die Taylorreihe}
-
-\begin{defi}{Taylorreihe}
-    $$
-        \begin{aligned}
-            f(x) & = \sum^\infty_{n=0} \frac{f^{(n)}(x_0)}{n!} (x-x_0)^n                                           \\
-                 & = f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)}{2}(x-x_0)^2 + \frac{f'''(x_0)}{6}(x-x_0)^3 + \ldots
-        \end{aligned}
-    $$
-    Dabei heißt $x_0$ Entwicklungspunkt der Potenzreihe und die Reihe konvergiert für $\abs{x-x_0} < r$ mit $r = \lim_{n\to\infty}\abs{\frac{a_n}{a_{n+1}}}$.
-\end{defi}
-
-\begin{example}{Taylorreihe}
-    \textbf{Bestimmen Sie das Taylorpolynom dritten Grades für die Funktion $g(x) = \ln(x\cdot e^{-2x})$ an der Stelle $x_0 = 1$.}
-
-    Taylorpolynom $k$-ten Grades einer Funktion $f$:
-    $$T_k(x) := \sum_{n=0}^k \frac{\mathrm{d}^n f}{\mathrm{d}x^n} (x_0)\cdot\frac{(x-x_0)^n}{n!} $$
-
-    Das Taylorpolynom dritten Grades von $g(x) = \ln(x\cdot e^{-2x})$ an der Stelle $x_0 = 1$ ist dann gegeben durch:
-    $$
-        \begin{aligned}
-            T_3(x) ={}      & \sum_{n=0}^3 \frac{\mathrm{d}^n g}{\mathrm{d}x^n} (1)\cdot\frac{(x-1)^n}{n!}                                                                                                                       \\
-            ={}             & g(1) + \frac{\mathrm{d} g}{\mathrm{d} x}(1)\cdot\frac{x-1}{1!} + \frac{\mathrm{d^2} g}{\mathrm{d} x^2}(1)\cdot\frac{(x-1)^2}{2!} + \frac{\mathrm{d^3} g}{\mathrm{d} x^3}(1)\cdot\frac{(x-1)^3}{3!} \\
-            \stackrel{*}={} & \ln(e^{-2}) + \left( \frac{1}{1}- 2 \right)\cdot(x-1) + \frac{-1}{1}\cdot\frac{(x-1)^2}{2} + \frac{2}{1}\cdot\frac{(x-1)^3}{6}                                                                     \\
-            ={}             & -2 -(x-1) - \frac{1}{2}\cdot (x-1)^2 +\frac{1}{3}\cdot (x-1)^3                                                                                                                                     \\
-            ={}             & -2 -x+1 - \frac{1}{2}\cdot (x^2-2x+1) +\frac{1}{3}\cdot (x^3 -3x^2+3x-1)                                                                                                                           \\
-            ={}             & -1 -x - \frac{x^2}{2} + x -\frac{1}{2} +\frac{x^3}{3} - x^2 + x -\frac{1}{3}                                                                                                                       \\
-            ={}             & \frac{x^3}{3}- \frac{3x^2}{2} + x - \frac{11}{6}
-        \end{aligned}
-    $$
-    \qed
-
-    \vspace{2em}
-
-    \textbf{Nebenrechnungen:}
-    $$
-        \frac{\mathrm{d} g}{\mathrm{d} x} = \frac{1}{x} - 2, \quad
-        \frac{\mathrm{d}^2 g}{\mathrm{d} x^2} = \frac{-1}{x^2}, \quad
-        \frac{\mathrm{d}^3 g}{\mathrm{d} x^3} = \frac{2}{x^3}
-    $$
-\end{example}
-
-\newpage
-\section{Integration}
-\subsection{Flächenberechnung}
-
-\begin{defi}{Stammfunktion}
-    Sei $f\in C[a, b]$. Eine differenzierbare Funktion $F(x)$ mit $\forall x\in [a, b] : F'(x) = f(x)$ heißt eine \emph{Stammfunktion von f}.
-\end{defi}
-
-\begin{defi}{Unbestimmtes Integral}
-    $F(x) = \int f(x) \dx$ heißt das \emph{unbestimmte Integral von f}.
-\end{defi}
-
-\begin{defi}{Hauptsatz der Differential- und Integralrechnung}
-    Sei $f\in C[a, b]$, dann ist
-    $$
-        F_a(x) = \int^x_a f(t)\dt \text{ differenzierbar}
-    $$
-    und es gilt
-    $$
-        F'_a(x) = f(x).
-    $$
-    Damit ist also:
-    $$
-        \left(\int^x_a f(t)\dt\right)' = F'_a(x) = f(x).
-    $$
-\end{defi}
-
-\begin{defi}{Fläche einer Funktion}
-    Sei $f \in C[a, b]$, dann ist die Fläche der Funktion im Intervall $[a, b]$ gegeben mit
-    $$
-        \int_a^b f(x) \dx = F(b) - F(a) =: \left.F(x)\right|^b_{x=1}
-    $$
-\end{defi}
-
-\begin{bonus}{Potenzregel}
-    $$
-        \int x^n \dx = \frac{1}{n+1}x^{n+1} + C
-    $$
-\end{bonus}
-
-\begin{bonus}{Faktorregel}
-    $$
-        \int c\cdot f(x) \dx = c\cdot \int f(x) \dx
-    $$
-\end{bonus}
-
-\begin{bonus}{Summenregel}
-    $$
-        \int (f(x) + g(x))\dx = \int f(x) \dx + \int g(x) \dx
-    $$
-\end{bonus}
-
-\begin{bonus}{Partielle Integration}
-    $$
-        \int f'(x)g(x) \dx = f(x)g(x) - \int f(x) g'(x) \dx
-    $$
-
-    Entscheidend bei partieller Integration ist die Wahl von $f(x)$ und $g'(x)$.
-    Eine falsche Wahl kann unter Umständen dazu führen, dass das Integral noch komplizierter wird.
-
-    \textbf{Faustregel:}
-    \begin{enumerate}
-        \item L - logarithmische Funktionen ($\ln$, $\log_a$, $\ldots$)
-        \item I - inverse Winkelfunktionen ($\arcsin$, $\arccos$, $\arctan$, $\ldots$)
-        \item A - algebraische Funktionen ($x^2$, $5x^3$, $\ldots$)
-        \item T - trigonometrische Funktionen ($\sin$, $\cos$, $\tan$, $\csc$, $\ldots$)
-        \item E - Exponentialfunktionen ($e^x$, $5a^x$, $\ldots$)
-    \end{enumerate}
-    Entsprechend des Rangs wird $f(x)$ ausgewählt. Will man beispielsweise $x^2\cos x$ integrieren, so würde man $x^2$ für $f(x)$ wählen und $\cos x$ für $g'(x)$, da algebraische Funktionen höher in der Liste stehen als trigonometrische Funktionen.
-\end{bonus}
-
-\begin{bonus}{Integration durch Substitution}
-    $$
-        \int f(x)\dx = \int f(\phi(u)) \cdot \phi'(u) \du
-    $$
-\end{bonus}
-
-\subsection{Integration zur Berechnung von Flächen zwischen mehreren Funktionen}
-
-\begin{algo}{Berechnung der Fläche zwischen zwei Funktionen}
-    Wir betrachten die Fläche zwischen zwei Funktionen $f(x)$ und $g(x)$.
-
-    \begin{enumerate}
-        \item Schnittpunkte $a, b$ von $f(x)$ und $g(x)$ berechnen.
-        \item Integriere $\abs{f(x) - g(x)}$ zwischen den Schnittpunkten:
-              $$
-                  \abs{\int^b_a\abs{f(x) -g(x)} \dx}
-              $$
-    \end{enumerate}
-
-    Beachte: Bei mehr als zwei Schnittpunkten müssen mehrere Integrale mit den jeweiligen Grenzen addiert werden.
-
-    Das Verfahren lässt sich sehr einfach auf mehrere Funktionen erweitern.
-\end{algo}
-
-\begin{bonus}{Beispiel: Fläche zwischen drei Funktionen}
-    Wie groß ist der Flächeninhalt, der von den Funktionen
-    $$
-        f(x) = -0.25x^4 + 4, \quad g(x) = -2x-4, \quad h(x) = 2x-4
-    $$
-    eingeschlossen wird?
-    \begin{center}
-        \begin{tikzpicture}
-            \begin{axis}[
-                    axis lines=middle,
-                    xmin=-4.5,xmax=4.5,ymin=-4.5,ymax=4.5
-                ]
-                \addplot[blue, samples=1000, domain=-2.4:2.4, name path=A] {-0.25*x*x*x*x + 4} node[right] {$f$}; % f(x)
-                \addplot[yellow!70!red, samples=300, domain=-4:4, name path=B] {-2*x - 4} node[pos=0, left] {$g$}; % g(x)
-                \addplot[red!90!teal, samples=300, domain=-4:4, name path=C] {2*x-4} node[right] {$h$}; % h(x)
-                \addplot[gray!30, opacity=0.5] fill between[of=A and C,soft clip={domain=0:2}];
-                \addplot[gray!30, opacity=0.5] fill between[of=A and B,soft clip={domain=-2:0}];
-            \end{axis}
-        \end{tikzpicture}
-    \end{center}
-
-    Wir sehen in der Zeichnung, dass für die Fläche $A$ zwischen den Graphen gilt:
-    $$
-        \begin{aligned}
-            A ={} & \abs{  \int_{-2}^{0} \left(f(x) - g(x)\right) \dx} + \abs{ \int_{0}^{2} \left(f(x) - h(x)\right) \dx}                           \\
-            ={}   & \abs{ \int_{-2}^{0} \left(-\frac{1}{4}x^4 + 2x + 8\right) \dx} + \abs{ \int_{0}^{2} \left(-\frac{1}{4}x^4 - 2x + 8\right) \dx}  \\
-            ={}   & \abs{ \left[ -\frac{1}{20}x^5 + x^2 + 8x \right]_{-2}^{0} } + \abs{ \left[ -\frac{1}{20}x^5 - x^2 + 8x \right]_0^2 }            \\
-            ={}   & \abs{ 0 - \left( -\frac{1}{20}\cdot(-2)^5 + (-2)^2 + 8\cdot(-2) \right) } + \abs{ -\frac{1}{20}\cdot 2^5 + 2^2 + 8\cdot 2 - 0 } \\
-            ={}   & \abs{-\frac{8}{5} - 4 + 16 } + \abs{-\frac{8}{5} - 4 + 16}                                                                      \\
-            ={}   & \frac{52}{5} + \frac{52}{5}                                                                                                     \\
-            ={}   & \frac{104}{5}
-        \end{aligned}
-    $$
-    Damit beträgt der Flächeninhalt $\frac{104}{5}$ Flächeneinheiten. \qed
-\end{bonus}
-
-\newpage
-\subsection{Längenberechnung}
-
-\begin{algo}{Längenberechnung eines Graphen}
-    Gegeben sind eine Funktion $f\in C[a, b]$ und die Punkte $a, b$.
-
-    Die Länge $L_a^b$ des Graphen der Funktion $f$ ist dann gegeben mit
-    $$
-        L^b_a(f) = \int_a^b \sqrt{1+(f'(x))^2} \dx
-    $$
-\end{algo}
-
-\subsection{Mantelflächenberechnung}
-
-\begin{algo}{Mantelflächenberechnung}
-    Gegeben sind eine Funktion $f\in C[a, b]$ und die Punkte $a, b$.
-
-    Die Mantelfläche $M_a^b$ des Rotationskörpers der Funktion $f$ ist dann gegeben mit
-    $$
-        M^b_a(f) = \int_a^b 2\pi \cdot f(x) \cdot \sqrt{1+(f'(x))^2} \dx
-    $$
-\end{algo}
-
-\subsection{Rotationsvolumenberechnung}
-
-\begin{algo}{Rotationsvolumenberechnung}
-    Gegeben sind eine Funktion $f\in C[a, b]$ und die Punkte $a, b$.
-
-    Das Volumen $M_a^b$ des Rotationskörpers der Funktion $f$ ist dann gegeben mit
-    $$
-        V^b_a(f) = \int_a^b \pi \cdot f(x)^2 \dx
-    $$
-\end{algo}
-
-\subsection{Differentiation von Integralen mit variablen Grenzen}
-
-\begin{algo}{Differentiation von Integralen mit variablen Grenzen}
-    Gegeben sei das Integral
-    $$
-        \int^{h(x)}_{g(x)} f(t)\dt.
-    $$
-    Dann gilt:
-    $$
-        \left(\int^{h(x)}_{g(x)} f(t)\dt\right)' = f(h(x)) \cdot h'(x) - f(g(x))\cdot g'(x).
-    $$
-\end{algo}
-
-\subsection{Parameterintegrale}
-
-\begin{defi}{Parameterintegral}
-    Sei $f(x, t)$ eine von zwei rellen Parametern abhängige Funktion.
-    Die Funktionen $g_1(x)$ und $g_2(x)$ seien stetig auf $[a, b]$ und differenzierbar auf $(a, b)$ sowie $f(x, t)$ integrierbar bez. $t$.
-
-    Dann heißt
-    $$
-        F(x) = \int^{g_2(x)}_{g_1(x)} f(x, t) \dt
-    $$
-    das \emph{Parameterintegral}.
-\end{defi}
-
-\begin{example}{Parameterintegral}
-    $$
-        \begin{aligned}
-            \lim_{x\to\infty} \left( \frac{1}{x} \cdot \int_0^x \frac{t+1}{t^2 + 2} \dt\right)
-             & \overset{\text{de L'Hospital}}={} \lim_{x\to\infty} \left( \frac{1}{1} \cdot \left( \frac{x+1}{x^2 + 2} \cdot 1 - \frac{0+1}{0+2} \cdot 0 \right)\right) \\
-             & ={} \lim_{x\to\infty} \left( \frac{x+1}{x^2 + 2} \right)                                                                                                 \\
-             & ={} 0
-        \end{aligned}
-    $$\qed
-\end{example}
-
-\begin{defi}{Leibniz-Regel}
-    Das Parameterintegral $F(x) = \int^{g_2(x)}_{g_1(x)} f(x, t) \dt$ ist differenzierbar und es ist
-    $$
-        F'(x) = f(x, g_2(x)) \cdot g'_2(x) - f(x, g_1(x)) \cdot g'_1(x) + \int^{g_2(x)}_{g_1(x)} \frac{\mathrm{d} f(x, t)}{\dx}\dt
-    $$
-\end{defi}
-
-\begin{example}{Leibniz-Regel}
-    $$F(x) = \int_{t=x}^{x^2} \frac{1}{t} \cdot \ln (1 + x\cdot t) \dt \quad (x>0)$$
-    $$
-        \begin{aligned}
-            \dFdx
-             & ={} \int_{t=x}^{x^2} \frac{1}{t} \cdot \ln (1 + x\cdot t) \dt                                                                                                                                \\
-             & ={} \frac{1}{x^2} \cdot \ln (1 + x\cdot x^2) \cdot 2x - \left( \frac{1}{x} \cdot \ln (1 + x\cdot x) \cdot 1 \right) + \int^{x^2}_{t=x} \frac{1}{t} \cdot t \cdot \frac{1}{1 + x \cdot t} \dt \\
-             & ={} \frac{2\ln (1 + x^3)}{x} - \frac{\ln(1+x^2)}{x} + \left[ \frac{\ln(1+x\cdot t)}{x} \right]^{x^2}_{t=x}                                                                                   \\
-             & ={} \frac{2\ln (1 + x^3)}{x} - \frac{\ln(1+x^2)}{x} + \frac{\ln(1+x\cdot x^2)}{x} - \frac{\ln(1+x\cdot x)}{x}                                                                                \\
-             & ={} \frac{3\ln (1 + x^3) - 2\ln(1+x^2)}{x}                                                                                                                                                   \\
-        \end{aligned}
-    $$\qed
-\end{example}
-
-\subsection{Uneigentliche Integrale}
-
-\begin{defi}{Uneigentliche Integrale}
-    Sei $f(x)$ beschränkt auf $\R$, dann definieren wir
-    $$
-        \begin{aligned}
-            \int^\infty_a f(x) \dx         & := \lim_{R\to\infty} \int^R_a f(x)\dx                                          \\
-            \int^b_{-\infty} f(x) \dx      & := \lim_{R\to\infty} \int^b_{-R} f(x)\dx                                       \\
-            \int^\infty_{-\infty} f(x) \dx & := \lim_{R\to\infty} \int^R_{c} f(x)\dx + \lim_{R\to\infty} \int^c_{R} f(x)\dx
-        \end{aligned}
-    $$
-\end{defi}
-
-\begin{defi}{Konvergenz von Integralen}
-    Die Integrale heißen \emph{konvergent}, wenn die Grenzwerte existieren, sonst heißen sie \emph{divergent}.
-\end{defi}
-
-\subsection{Absolute Konvergenz}
-
-\begin{defi}{Absolute Konvergenz von Integralen}
-    Sei $\int^b_a f(x) \dx$ ein eigentliches oder uneigentliches Integral.
-
-    Konvergiert
-    $$
-        \int^b_a \abs{f(x)} \dx,
-    $$
-    so heißt $\int^b_a f(x) \dx$ \emph{absolut konvergent}.
-\end{defi}
-
-\subsection{Weitere Konvergenzkriterien}
-
-\begin{defi}{Majoranten- und Minorantenkriterium für unbeschränkte Integrationsintervalle}
-    Sei $\forall x \in [a, \infty) : 0 \leq \abs{f(x)} \leq g(x)$ und konvergiert $\int^\infty_a g(x)$, dann konvergiert $\int^\infty_a f(x) \dx$ und es gilt
-    $$
-        \abs{\int^\infty_a f(x) \dx} \leq \int^\infty_a \abs{f(x)} \dx \leq \int^\infty_a g(x) \dx.
-    $$
-
-    Ist $\forall x\in [a, \infty) : 0\leq g(x) \leq f(x)$ und divergiert $\int^\infty_a g(x) \dx$, so divergiert auch $\int^\infty_a f(x) \dx$.
-\end{defi}
-
-\begin{defi}{Majoranten- und Minorantenkriterium für unbeschränkte Integranden}
-    Sei $\forall x \in [a, b] : 0 \leq \abs{f(x)} \leq g(x)$ und konvergiert $\int^b_a g(x)$, dann konvergiert $\int^b_a f(x) \dx$ und es gilt
-    $$
-        \abs{\int^\infty_a f(x) \dx} \leq \int^b_a \abs{f(x)} \dx \leq \int^b_a g(x) \dx.
-    $$
-
-    Ist $\forall x\in [a, b] : 0\leq g(x) \leq f(x)$ und divergiert $\int^b_a g(x) \dx$, so divergiert auch $\int^b_a f(x) \dx$.
-\end{defi}
-
-\subsection{Das Integralkriterium zur Konvergenz von Reihen}
-
-\begin{defi}{Integralkriterium}
-    Sei $f$ eine auf $[m-1, \infty]$ monoton fallende Funktion mit $\forall x \in [m, \infty) : f(x) \geq 0$, dann ist die Reihe
-    $$
-        \sum^\infty_{n=m} f(n)
-    $$
-    genau dann \emph{konvergent}, wenn
-    $$
-        \int^\infty_m f(x) \dx
-    $$
-    existiert. Es gilt bei Konvergenz
-    $$
-        \sum^\infty_{n=m+1} f(n) \leq \int^\infty_m f(x) \dx \leq \sum^\infty_{n=m} f(n) \leq \int^\infty_{m-1} f(x) \dx.
-    $$
-\end{defi}
-
-\begin{example}{Integralkriterium}
-    \[
-        \sum^\infty_{n=1} \frac{1}{\sqrt[3]{n}} = \sum^\infty_{n=1} f(n)
-    \]
-    $f(n)$ ist offensichtlich auf dem Intervall $[1, \infty )$ streng monoton fallend.
-
-    Damit muss nur geprüft werden, dass das Integral $\int^\infty_{n=1} f(n) \dn$ existiert bzw. konvergiert:
-
-    $$
-        \begin{aligned}
-            \int^\infty_{n=1} f(n) \dn
-             & ={} \int^\infty_{n=1} \frac{1}{\sqrt[3]{n}} \dn                              \\
-             & ={} \lim_{b\to\infty} \left[ \frac{3n^{\frac{2}{3}}}{2} \right]^b_{n=1}      \\
-             & ={} \lim_{b\to\infty} \left( \frac{3b^{\frac{2}{3}}}{2} - \frac{3}{2}\right) \\
-             & ={} \infty
-        \end{aligned}
-    $$
-    Damit divergiert das Integral und die gegebene Summe divergiert ebenfalls.\qed
-\end{example}
-
-\printindex
-\printindex[Beispiele]
-\end{document}
+\documentclass[german]{../spicker}
+
+\usepackage{amsmath}
+\usepackage{polynom}
+\usepackage{array}   % for \newcolumntype macro
+\usepackage{tikz}
+\usepackage{pgfplots}
+\usepgfplotslibrary{fillbetween}
+\pgfplotsset{compat=1.17}
+\title{Analysis 1}
+\author{Patrick Gustav Blaneck, Felix Racz}
+\makeindex[intoc]
+\makeindex[intoc, name=Beispiele,title=Beispiele]
+
+\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
+\newcommand{\vektor}[1]{\begin{pmatrix*}[r] #1 \end{pmatrix*}}
+\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
+
+\renewcommand{\abs}[1]{\left| #1 \right|}
+\newcommand{\cis}[1]{\left( \cos\left( #1 \right) + i \sin\left( #1 \right) \right)}
+\newcommand{\sgn}{\text{sgn}}
+\newcommand{\diff}{\mathrm{d}}
+\newcommand{\dx}{~\mathrm{d}x}
+\newcommand{\du}{~\mathrm{d}u}
+\newcommand{\dv}{~\mathrm{d}v}
+\newcommand{\dw}{~\mathrm{d}w}
+\newcommand{\dt}{~\mathrm{d}t}
+\newcommand{\dn}{~\mathrm{d}n}
+\newcommand{\dudx}{~\frac{\mathrm{d}u}{\mathrm{d}x}}
+\newcommand{\dudn}{~\frac{\mathrm{d}u}{\mathrm{d}n}}
+\newcommand{\dvdx}{~\frac{\mathrm{d}v}{\mathrm{d}x}}
+\newcommand{\dwdx}{~\frac{\mathrm{d}w}{\mathrm{d}x}}
+\newcommand{\dtdx}{~\frac{\mathrm{d}t}{\mathrm{d}x}}
+\newcommand{\ddx}{\frac{\mathrm{d}}{\mathrm{d}x}}
+\newcommand{\dFdx}{\frac{\mathrm{d}F}{\mathrm{d}x}}
+\newcommand{\dfdx}{\frac{\mathrm{d}f}{\mathrm{d}x}}
+\newcommand{\interval}[1]{\left[ #1 \right]}
+
+\newcolumntype{L}{>{$}l<{$}} % math-mode version of "l" column type
+\newcolumntype{R}{>{$}r<{$}} % math-mode version of "r" column type
+\newcolumntype{C}{>{$}c<{$}} % math-mode version of "c" column type
+\newcolumntype{P}{>{$}p<{$}} % math-mode version of "l" column type
+
+\begin{document}
+\maketitle
+\tableofcontents
+\newpage
+
+%\setcounter{section}{1}
+
+\section{Grundlagen}
+
+\subsection{Funktionen}
+
+\begin{thirdboxl}
+    \begin{defi}{Injektivität}
+        $f(x) = f(x')\implies x = x'$
+    \end{defi}
+\end{thirdboxl}%
+\begin{thirdboxm}
+    \begin{defi}{Surjektivität}
+        $\forall y, \exists x: y = f(x)$
+    \end{defi}
+\end{thirdboxm}%
+\begin{thirdboxr}
+    \begin{defi}{Bijektivität}
+        $\forall y, \exists! x: y = f(x)$
+    \end{defi}
+\end{thirdboxr}%
+
+\begin{algo}{Beweisen der Injektivität}
+    \begin{enumerate}
+        \item Behauptung: $f(x) = f(x')$
+        \item Umformen auf eine Aussage der Form $x = x'$
+    \end{enumerate}
+\end{algo}
+
+\begin{algo}{Beweisen der Surjektivität}
+    \begin{enumerate}
+        \item Aufstellen der Umkehrfunktion
+        \item Zeigen, dass diese Umkehrfunktion auf dem gesamten Definitionsbereich definiert ist
+    \end{enumerate}
+\end{algo}
+
+\begin{algo}{Beweisen der Bijektivität}
+    \begin{enumerate}
+        \item Injektivität beweisen
+        \item Surjektivität beweisen
+    \end{enumerate}
+\end{algo}
+
+\subsection{Polynome}
+
+\begin{defi}{Polynom}
+    Eine Funktion $p(x) = \sum^n_{i=0} a_i x^i$ mit $a_i, x \in \R ~ (\C), a_n \neq 0$ heißt \emph{Polynom vom Grad} $n$.
+\end{defi}
+
+\begin{halfboxl}
+    \vspace{-\baselineskip}
+    \begin{bonus}{Abspalten von Linearfaktoren}
+        Sei $x_0$ eine Nullstelle eines Polynoms $p(x)$, dann ist
+        $$ p(x) = q(x) \cdot (x-x_0).$$
+        Dabei ist $(x-x_0)$ ein abgespaltener Linearfaktor und $q(n)$ das entsprechend reduzierte Polynom mit $q(n) = \frac{p(x)}{x-x_0}$.
+    \end{bonus}
+\end{halfboxl}%
+\begin{halfboxr}
+    \vspace{-\baselineskip}
+    \begin{bonus}{Faktorisierung}
+        Sind $x_1, \ldots, x_n$ Nullstellen eines Polynoms $p(x)$, so ist
+        $$ p(x) = a_n \cdot (x-x_1) \cdot \ldots \cdot (x-x_n)$$
+        die Faktorisierung von $p(x)$.
+    \end{bonus}
+\end{halfboxr}%
+
+\subsubsection*{Polynome vom Grad 2}
+\begin{halfboxl}
+    \vspace{-\baselineskip}
+    \begin{algo}{$pq$-Formel}
+        \begin{enumerate}
+            \item Polynom der Form $x^2 + px + q = 0$
+            \item $x_{1,2} = -\frac{p}{2} \pm \sqrt{\left(\frac{p}{2}\right)^2 - q}$
+        \end{enumerate}
+    \end{algo}
+\end{halfboxl}%
+\begin{halfboxr}
+    \vspace{-\baselineskip}
+    \begin{algo}{Mitternachtsformel}
+        \begin{enumerate}
+            \item Polynom der Form $ax^2 + bx + c = 0$
+            \item $x_{1,2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$
+        \end{enumerate}
+    \end{algo}
+\end{halfboxr}
+
+\begin{bonus}{Besonderheiten bei $x \in \C$}
+    \begin{itemize}
+        \item Ist $x_i$ eine Nullstelle des Polynoms $p(x)$ mit \emph{reellen Koeffizienten}, dann ist auch $\overline{x_i}$ eine Nullstelle von $p(x)$.
+    \end{itemize}
+\end{bonus}
+
+\subsection{Gebrochen rationale Funktionen}
+
+\begin{defi}{Gebrochen rationale Funktionen}
+    Seien $p_m(x)$ und $p_n(x)$ Polynome vom Grad $m$ bzw. $n$, dann heißt
+    $$
+        f(x) = \frac{p_m(x)}{p_n(x)}
+    $$
+    \emph{gebrochen rationale Funktion}.\\
+    Im Fall $m<n$ heißt die Funktion \emph{echt gebrochen rational}, sonst \emph{unecht gebrochen rational}.
+\end{defi}
+
+\begin{algo}{Polynomdivision}
+    Gegeben ist \emph{unecht gebrochen rationale Funktion} $f(x) = \frac{p_m(x)}{p_n(x)}$
+    \begin{enumerate}
+        \item \emph{Dividiere} die größten Exponenten aus beiden Polynomen
+        \item \emph{Mutipliziere} Ergebnis mit Divisor zurück
+        \item \emph{Subtrahiere} Ergebnis vom Dividenden
+        \item Wiederhole, bis:
+              \subitem Ergebnis 0 ist, oder
+              \subitem Grad des Ergebnisses kleiner ist als Grad des Divisors (ergibt \emph{Rest})
+    \end{enumerate}
+\end{algo}
+
+%\begin{bonus}{Polynomdivision Beispiel}
+%    \polylongdiv[style=C]{x^3+x^2-1}{x-1}
+%\end{bonus}
+
+\begin{algo}{Hornerschema}
+    Gegeben ist \emph{Polynom} $p_m(x)$ und ein \emph{Wert} $x_0$
+
+    Vorbereitung:
+    \begin{itemize}
+        \item Erstelle eine Tabelle mit $m + 2$ Spalten und 3 Zeilen
+        \item Erste Zelle frei lassen und dann Koeffizienten $a_m, a_{m-1}, \ldots, a_0$ in die erste Zeile schreiben
+        \item In die erste Zelle der zweiten Zeile kommt $x_0$
+    \end{itemize}
+
+    Anwendung (beginnend in zweiter Zelle der dritten Zeile):
+    \begin{enumerate}
+        \item Erster Koeffizient der ersten Zeile in die dritte Zeile
+        \item \emph{Multipliziere} Zahl der ersten Spalte mit diesem Koeffizienten
+        \item Schreibe Ergebnis in zweite Zeile, unterhalb des nächsten Koeffizienten
+        \item \emph{Addiere} Ergebnis mit diesem Koeffizienten
+        \item Wiederhole 2-4 bis zum Schluss
+    \end{enumerate}
+
+    Ergebnis:
+    \begin{itemize}
+        \item Wert des Polynoms $p_m(x_0)$ in letzter Zelle der letzten Zeile
+        \item Bei Wert $p_m(x_0) = 0$ steht in der letzten Zeile das Polynom nach Abspalten des Linearfaktors $(x-x_0)$
+    \end{itemize}
+\end{algo}
+
+%\begin{bonus}{Hornerschema Beispiel}
+%    Gegeben: $p_4(x) = 2x^4-3x^3+4x^2-5x+2$ an der Stelle $x_0 = 1$
+%    \polyhornerscheme[x=1]{2x^4-3x^3+4x^2-5x+2}
+%    Ergebnis: $p_4(1) = 0 \implies (x-1) \text{ ist Linearfaktor von } p_4(x) \text{ und } \frac{p_4(x)}{x-1} = 2x^3 = x^2 + 3x -2$
+%\end{bonus}
+
+\begin{bonus}{Tipps und Tricks}
+    \begin{itemize}
+        \item Polynomdivision und Hornerschema funktionieren auch sehr gut mit komplexen Zahlen
+        \item Bei mehreren abzuspaltenden Linearfaktoren bietet sich das Hornerschema sehr gut an
+    \end{itemize}
+\end{bonus}
+
+\begin{algo}{Partialbruchzerlegung}
+    Gegeben: \emph{Echt gebrochen rationale Funktion}  $f(x) = \frac{p_m(x)}{p_n(x)}$
+    \begin{enumerate}
+        \item Berechne Nullstellen des \emph{Nennerpolynoms} $x_0, \ldots, x_k \in \R$
+        \item Verschiedene Fälle:
+              \subitem Relle Nullstellen:
+              \subsubitem $x_i$ ist einfache Nullstelle $\implies \frac{A}{x-x_1}$
+              \subsubitem $x_i$ ist $r$-fache Nullstelle $\implies  \frac{A_1}{x-x_1} +  \frac{A_2}{(x-x_1)^2} + \ldots + \frac{A_r}{(x-x_1)^r}$
+              \subitem Nichtrelle Nullstellen:
+              \subsubitem Einfacher quadratischer Term $\implies \frac{Ax + B}{x^2+px+q}$
+              \subsubitem $r$-facher quadratischer Term $\implies \frac{A_1x + B_1}{x^2+px+q} + \frac{A_2x + B_2}{(x^2+px+q)^2} + \ldots + \frac{A_rx + B_r}{(x^2+px+q)^r}$
+        \item Koeffizientenvergleich:
+              \begin{enumerate}
+                  \item Brüche gleichnamig machen (Multipliziere beide Seiten mit Nennerpolynom)
+                  \item Potenzen von $x$ zusammenfassen
+                  \item Gleichungssystem lösen
+                  \item Lösungen in Ansatz einsetzen
+              \end{enumerate}
+    \end{enumerate}
+\end{algo}
+
+\begin{bonus}{Besonderheiten in $\C$}
+    \begin{itemize}
+        \item Für Partialbrüche ohne relle Nullstellen können wir in $\C$ stets Nullstellen finden. Das Verfahren erfolgt dann analog mit komplexen Nullstellen.
+    \end{itemize}
+\end{bonus}
+
+\begin{bonus}{Tipps und Tricks}
+    \begin{itemize}
+        \item Partialbruchzerlegung ist erst bei einer \emph{echt gebrochen rationale Funktion} sinnvoll
+        \item Ist die Funktion unecht gebrochen rational, führe zuerst eine Polynomdivision durch und zerlege dann den Rest in die Partialbrüche
+    \end{itemize}
+\end{bonus}
+
+
+\subsection{Gleichungen und Ungleichungen}
+
+\begin{algo}{Berechnen einer Lösungsmenge bei Ungleichungen}
+    Gegeben: Ungleichung mit Bezug auf Variable $x$
+    \begin{enumerate}
+        \item Für jeden Betrag $\left| a(x) \right|$, eine Fallunterscheidung machen für
+              \subitem $a(x) \geq 0 \implies \left| a(x) \right| = a(x)$
+              \subitem $a(x) < 0 \implies \left| a(x) \right| = -a(x)$
+              \subitem \emph{Hier haben wir bereits eine Einschränkung für die Lösungsmenge des jeweiligen Falles gegeben!}
+        \item Ungleichungen nach $x$ auflösen
+        \item Jeder Fall $i$ erzeugt eine Lösungsmenge $L_i$ bestehend aus\emph{ umgestellter Ungleichung} und Fallbedingungen
+        \item Lösungsmenge $L = \bigcup^n_{i = 1} L_i$, wobei $n$ die Anzahl der betrachteten Fälle ist
+    \end{enumerate}
+\end{algo}
+
+\begin{bonus}{Tipps und Tricks}
+    \begin{itemize}
+        \item $n$ Beträge in der Gleichung können zu $2^n$ Fällen führen.
+        \item Es kann vorkommen, dass ein Fall einer Fallunterscheidung unerreichbar ist, z.B. für $x > 5 \land x < 1$. Die Lösungsmenge $L$ ist dann leer ($L = \emptyset$).
+        \item Radizieren (Wurzelziehen) ist in Ungleichungen nur erlaubt, wenn danach der \emph{Betrag} der Wurzel betrachtet wird
+        \item Quadrieren einer Ungleichung `erzeugt' potentiell ein falsches Ergebnis. Nach dem Quadrieren sollte man also jedes Ergebnis prüfen.
+        \item Multiplikation mit negativen Zahlen sollte vermieden werden, da das Umdrehen des Ungleichheitszeichens schnell für Flüchtigkeitsfehler sorgen kann.
+    \end{itemize}
+\end{bonus}
+
+\subsection{Komplexe Analysis}
+\begin{bonus}{Rechenregeln für komplexe Zahlen in kartesischen Koordinaten}
+    \textbf{Darstellung:} $z = a + i \cdot b$ und $w = c + i \cdot d$
+
+    \textbf{Addition und Subtraktion:} $z \pm w = (a\pm c) + i \cdot (b \pm d)$
+
+    \textbf{Multiplikation:} $z \cdot w = (ac -bd) + i \cdot (ad + bc)$
+
+    \textbf{Division:} $\frac{z}{w} = \frac{z \cdot \overline{w}}{w \cdot \overline{w}}$
+
+    \textbf{Komplex konjugiert:} Vorzeichen von $\Im$ wechseln: $\overline{z} = a- i \cdot b$
+
+    \textbf{Betrag:} Abstand vom Ursprung: $\abs{z} = \sqrt{z \cdot \overline{z}} = \sqrt{a^2 + b^2}$
+\end{bonus}
+
+\begin{bonus}{Rechenregeln für komplexe Zahlen in Polarkoordinaten}
+    \textbf{Darstellung:} $z = r \cdot (\cos\theta + i \cdot \sin \theta) = r \cdot e^{i \cdot \theta}$
+
+    \textbf{Multiplikation:} $z \cdot w = r_z \cdot r_w \cdot e^{i \cdot (\theta_z + \theta_w)}$
+
+    \textbf{Division:} $\frac{z}{w} = \frac{r_z}{r_w} \cdot e^{i \cdot (\theta_z - \theta_w)}$
+
+    \textbf{Komplex konjugiert:} $\overline{z} = (r, -\theta) = (r, 2\pi - \theta)$
+
+    \textbf{Betrag:} $\abs{z} = r$
+\end{bonus}
+
+\begin{algo}{Kartesische Koordinaten $\to$ Polarkoordinaten}
+    \begin{enumerate}
+        \item $r = \abs{z} = \sqrt{x^2 + y^2}$
+        \item
+              \subitem $y \geq 0 : \theta = \arctan \frac{x}{r}$
+              \subitem $y < 0 : \theta = -\arctan \frac{x}{r}$
+    \end{enumerate}
+\end{algo}
+
+\begin{algo}{Polarkoordinaten $\to$ Kartesische Koordinaten}
+    \begin{enumerate}
+        \item $x = r \cdot \cos \theta$
+        \item $y = r \cdot \sin \theta$
+    \end{enumerate}
+\end{algo}
+
+\begin{algo}{Radizieren von komplexen Zahlen}
+    Gesucht: Lösung von $z^n = r \cdot e^{i\cdot \theta}$
+    \begin{enumerate}
+        \item Ist $z^n$ nicht in Polarkoordinaten gegeben, so ist zunächst die Polarform zu bilden.
+        \item Bertechne $r_k = \sqrt[n]{r}$. Dieser Radius ist die Länge aller Lösungen.
+        \item Berechne für alle $k \in [0, n-1]$
+              $$
+                  \theta_k = \frac{\theta + k\cdot 2\pi}{n} = \frac{\theta}{n} + \frac{k}{n} \cdot 2\pi
+              $$
+        \item Die Lösungen sind dann die $n$ Zahlen $z_k = (r_k, \theta_k)$ für $k \in [0, n-1]$.
+    \end{enumerate}
+    \qed
+\end{algo}
+
+\section{Folgen und Reihen}
+
+\subsection{Grundlagen}
+\begin{bonus}{Rechenregeln für Summen}
+    $$
+        \begin{aligned}
+            \sum_{k=m}^n a_k                    & = \sum_{k=m-l}^{n-l} a_{k+l}          \\
+            \sum_{k=m}^n a_k                    & = \sum_{k=m}^c a_k + \sum_{k=c}^n a_k \\
+            \sum_{k=m}^n a_k + \sum_{k=m}^n b_k & = \sum_{k=m}^n a_k + b_k              \\
+            \sum_{k=m}^n c\cdot a_k             & = c\cdot\sum_{k=m}^n a_k
+        \end{aligned}
+    $$
+    Die Regeln gelten auch für unendliche Reihen.
+\end{bonus}
+
+\begin{bonus}{Wichtige Summen}
+    \begin{itemize}
+        \item Arithmetische Summe: $$\sum^n_{k=1} k = \frac{n(n+1)}{2}$$
+        \item Geometrische Summe: $$\sum^n_{k=1} x^k = \frac{1-x^{n+1}}{1-x} = \frac{x^{n+1} - 1}{x-1}$$
+        \item Summe der Quadratzahlen: $$\sum^n_{k=1} k^2 = \frac{n(n+1)(2n+1)}{6}$$
+        \item Summe der Kubikzahlen: $$\sum^n_{k=1} k^3 = \left(\frac{n(n+1)}{2}\right)^2$$
+    \end{itemize}
+\end{bonus}
+
+\subsection{Binomialkoeffizienten und der binomische Lehrsatz}
+
+\begin{defi}{Binomialkoeffizient}
+    Die Anzahl der $k$-elementigen Teilmengen einer $n$-elementigen Menge bezeichnen wir mit $\binom{n}{k}$.
+    Diese Zahlen heißen \emph{Binomialkoeffizienten} oder Binomialzahlen.
+\end{defi}
+
+\begin{defi}{Rekursionsformel für Binomialkoeffizient}
+    Für $k, n \in \N$ mit $k \leq n$ gilt:
+    $$
+        \binom{n}{k} = \binom{n-1}{k} + \binom{n-1}{k-1}
+    $$
+\end{defi}
+
+\begin{defi}{Kombinatorische Formel für Binomialkoeffizient}
+    $$
+        \binom{n}{k} = \begin{cases}
+            0                          & , \text{ für } k > n    \\
+            \frac{n!}{(n-k)! \cdot k!} & , \text{ für } k \leq n
+        \end{cases}
+    $$
+\end{defi}
+
+\begin{defi}{Der binomische Lehrsatz}
+    Für beliebige $a, b \in \R$ und $n \in \N$ gilt:
+    $$
+        (a+b)^n = \sum^n_{k=0} \binom{n}{k} a^k \cdot b^{n-k}
+    $$
+\end{defi}
+
+\section{Konvergenz von Folgen, Reihen und Funktionen}
+
+\subsection{Grundlagen}
+\begin{defi}{Schranken}
+    Gilt $$\forall x\in A : \abs{x} < K,$$ so heißt die Menge $A$ \emph{beschränkt} und $K$ \emph{Schranke}.
+
+    Gilt nur $x \leq K$, so heißt die Menge \emph{nach oben beschränkt} und $K$ \emph{obere Schranke}.
+
+    Im Falle $x \geq K$ heißt $A$ \emph{nach unten beschränkt} und $K$ \emph{untere Schranke}.
+\end{defi}
+
+\begin{defi}{Beschränktheit}
+    Eine Menge $M$ heißt genau dann \emph{beschränkt}, wenn sie nach oiben und nach unten beschränkt ist.
+\end{defi}
+
+\begin{defi}{Supremum, Maximum}
+    Der Wert
+    $$
+        K= \min_{K^* \in \R} \{K \text{ ist obere Schranke}\}
+    $$
+    heißt \emph{kleinste obere Schranke} oder \emph{Supremum von A}.
+    Notation: $\sup A$
+
+    Gilt $K \in A$, so heißt $K$ \emph{Maximum von A}. Notation: $\max A$.
+\end{defi}
+
+\begin{defi}{Infimum, Minimum}
+    Der Wert
+    $$
+        K= \max_{K^* \in \R} \{K \text{ ist untere Schranke}\}
+    $$
+    heißt \emph{größte untere Schranke} oder \emph{Infimum von A}.
+    Notation: $\inf A$
+
+    Gilt $K \in A$, so heißt $K$ \emph{Minimum von A}. Notation: $\min A$.
+\end{defi}
+
+\begin{bonus}{Vollständigkeitsaxiom}
+    Jede nicht-leere nach oben beschränkte Menge $A$ hat ein \emph{Supremum}, jede nicht-leere nach unten beschränkte Menge $A$ hat ein \emph{Infimum}.
+\end{bonus}
+
+\begin{defi}{$\epsilon$-Umgebung von $K$ in $\R$}
+    $$
+        U_\epsilon(K) := \{ x \in \R \mid \abs{x - K} < \epsilon \}
+    $$
+    heißt $\epsilon$\emph{-Umgebung von} $K$ \emph{in} $\R$.
+\end{defi}
+
+\begin{defi}{Innerer Punkt}
+    $x_0 \in A$ heißt \emph{innerer Punkt von A}, falls eine $\epsilon$-Umgebung existiert, so dass $U_\epsilon (x_0) \in A$, also vollständig in $A$ enthalten ist.
+    $A$ heißt \emph{offen}, falls jeder Punkt der Menge innerer Punkt ist.
+\end{defi}
+
+\begin{defi}{Häufungspunkt (Mengen)}
+    $a$ heißt \emph{Häufungspunkt einer Menge A}, wenn $\forall \epsilon > 0$ in der Umgebung $U_\epsilon (a)$ ein Punkt $x \in A$ mit $x \neq a$ existiert.
+
+    Sei $x$ größter Häufungspunkt von $A$, dann heißt
+    $$
+        x = \lim\sup A \text{ (Limes Superior).}
+    $$
+
+    Sei $x$ kleinster Häufungspunkt von $A$, dann heißt
+    $$
+        x = \lim\inf A \text{ (Limes Inferior).}
+    $$
+\end{defi}
+
+\begin{defi}{Abgeschlossenheit}
+    $A$ heißt \emph{abgeschlossen}, wenn jeder Häufungspunkt von $A$ in $A$ liegt.
+\end{defi}
+
+\begin{defi}{Bolzano-Weierstrass für Mengen}
+    Jede unendliche beschränkte Menge $A$ reeller Zahlen besitzt mindestens einen Häufungspunkt.
+\end{defi}
+
+\subsection{Konvergenz von Folgen}
+
+\begin{defi}{Monotonie}
+    Eine Folge $a_n$ heißt \emph{monoton wachsend}, falls $\forall n \in \N : a_n \leq a_{n+1}$.
+    Gilt sogar $a_n < a_{n+1}$, so heißt die Folge \emph{streng monoton wachsend}.
+
+    Eine Folge $a_n$ heißt \emph{monoton fallend}, falls $\forall n \in \N : a_n \geq a_{n+1}$.
+    Gilt sogar $a_n > a_{n+1}$, so heißt die Folge \emph{streng monoton fallend}.
+\end{defi}
+
+\begin{defi}{Häufungspunkt (Folgen)}
+
+    $a$ heißt \emph{Häufungspunkt einer Folge}, wenn zu jeder $\epsilon$-Umgebung $U_\epsilon (a)$ unendlich viele Folgenglieder $a_n$ in $U_\epsilon (a)$ liegen, also
+    $$
+        \forall \epsilon > 0 , \exists \infty\text{-viele } a_n : \abs{a_n - a} < \epsilon
+    $$
+\end{defi}
+
+\begin{defi}{Grenzwert / Limes}
+    Eine Zahl $a\in \R \text{ oder } \C$ heißt \emph{Grenzwert} oder \emph{Limes} einer Zahlenfolge $a_n$, wenn $\forall \epsilon >0, \exists n_0 (\epsilon)$, so dass für alle $n \geq n_0 (\epsilon)$ (fast immer) gilt
+    $$
+        \abs{a_n - a} < \epsilon
+    $$
+
+    Jeder Grenzwert ist auch ein Häufungspunkt.
+\end{defi}
+
+\begin{defi}{Konvergenz / Divergenz}
+    Eine Folge $a_n$ heißt \emph{konvergent}, falls ein Grenzwert existiert.
+
+    Existiert dieser nicht, so heißt die Folge \emph{divergent}.
+
+    Eine konvergente Folge mit $a=0$ heißt \emph{Nullfolge}.
+
+    Ist $\lim_{n\to\infty}a_n = a$, so ist $\lim_{n\to\infty}(a_n-a) = 0$, d.h. $b_n=\lim_{n\to\infty}(a_n-a)$ ist \emph{Nullfolge}.
+\end{defi}
+
+\begin{defi}{Bolzano-Weierstrass für Folgen}
+    1. Jede beschränkte Folge $a_n$ besitzt mindestens eine konvergente Teilfolge.
+
+    2. Jede beschränkte Folge $a_n$ besitzt einen kleinsten und größten Häufungspunkt mit $b \geq a$
+    $$
+        \begin{aligned}
+            a & = \lim\inf a_n, \\
+            b & = \lim\sup a_n.
+        \end{aligned}
+    $$
+    3. Eine Folge konvergiert genau dann, wenn sie beschränkt ist und nur einen Häufungspunkt besitzt. Dann ist
+    $$
+        a = \lim_{n\to\infty} a_n = \lim\inf a_n = \lim\sup a_n.
+    $$
+\end{defi}
+
+\begin{defi}{Sandwich-Lemma oder Einschnürungssatz}
+    Gilt fast immer, also bis auf endliche viele $n$ (oder auch für $n \geq n_0$)
+    $$
+        a_n \leq c_n \leq b_n
+    $$
+    und $\lim_{n\to\infty}a_n = a = \lim_{n\to\infty}b_n$, so ist
+    $$
+        \lim_{n\to\infty}c_n = a.
+    $$
+\end{defi}
+
+\begin{bonus}{Rechenregeln für Grenzwerte}
+    $$
+        \begin{aligned}
+            \lim_{n\to\infty} (a_n + b_n)     & = a+b                                          \\
+            \lim_{n\to\infty} c\cdot a_n      & = c \cdot a                                    \\
+            \lim_{n\to\infty} a_nb_n          & = a \cdot b                                    \\
+            \lim_{n\to\infty} \frac{a_n}{b_n} & = \frac{a}{b} \text{ für } b_n \neq 0, b\neq 0 \\
+            \lim_{n\to\infty} \frac{1}{a_n}   & = \frac{1}{a} \text{ für } a_n \neq 0, a\neq 0
+        \end{aligned}
+    $$
+\end{bonus}
+
+\begin{bonus}{Wichtige Grenzwerte}
+    $$
+        \begin{aligned}
+            \lim_{n\to\infty} \frac{1}{n^\alpha} & = 0 \text{ für } \alpha >0             \\
+            \lim_{n\to\infty} \sqrt[n]{a}        & = 1 \text{ für } a > 0                 \\
+            \lim_{n\to\infty} q^n                & = 0 \text{ für } \abs{q} < 1           \\
+            \lim_{n\to\infty} n^kq^n             & = 0 \text{ für } \abs{q} < 1, k \in \N \\
+            \lim_{n\to\infty} \sqrt[n]{n}        & = 1                                    \\
+            \lim_{n\to\infty} \frac{n!}{n^n}     & = 0
+        \end{aligned}
+    $$
+\end{bonus}
+
+\begin{defi}{Konvergenz monotoner Folgen}
+    Jede beschränkte monotone Folge ist konvergent.
+
+    Der Grenzwert ist bei monoton fallenden Folgen $\inf a_n$, bei wachsenden Folgen $\sup a_n$.
+\end{defi}
+
+\begin{defi}{Eulersche Zahl}
+    Der Grenzert $\lim_{n\to\infty} \left(1 + \frac{1}{n}\right)^n = e$ existiert und heißt \emph{eulersche Zahl}.
+\end{defi}
+
+\begin{defi}{Cauchy-Konvergenz}
+    Eine Folge $a_n$ heißt \emph{Cauchy-konvergent}, falls
+    $$
+        \forall\epsilon > 0, \exists n_0 (\epsilon) \text{ mit } \abs{a_n-a_m} < \epsilon, \forall n > m \geq n_0.
+    $$
+\end{defi}
+
+\subsection{Unendliche Reihen}
+\begin{defi}{Unendliche Reihe}
+    \[
+        \sum_{k=m}^{\infty} a_k = \lim_{n\to\infty} \sum_{k=m}^{n} a_k
+    \]
+\end{defi}
+
+\begin{defi}{Cauchy-Reihe}
+    \[
+        \forall\varepsilon>0 , \exists n_0(\varepsilon) : \left| \sum_{k=m+1}^n a_k \right| < \varepsilon , \forall n>m\geq n_0
+    \]
+    Eine Reihe \emph{konvergiert} genau dann, wenn die zugehörige Cauchy-Reihe konvergiert.
+\end{defi}
+
+\begin{bonus}{Konvergenz durch Nullfolge}
+    Sei $\sum^n_{k=1}a_k$ konvergent, dann ist $a_k$ Nullfolge.
+\end{bonus}
+
+\begin{defi}{Absolute Konvergenz}
+    Eine Reihe heißt \emph{absolut konvergent} wenn $\sum_{k=0}^{\infty} |a_k|$ konvergiert.
+
+    Analog heißt eine Folge \emph{absolut konvergent} wenn $|a_n|$ konvergiert.
+\end{defi}
+
+\begin{algo}{Teleskopsumme}
+    Eine Teleskopsumme hat man dann, wenn sich die Terme einer Summe gegenseitig auflösen.
+\end{algo}
+
+\begin{example}{Teleskopsumme}
+    \[
+        \sum_{k=1}^n \frac{1}{k} - \frac{1}{k+1} = \sum_{k=1}^n \frac{1}{k} - \sum_{k=2}^{n+1} \frac{1}{k} = \frac{1}{1} +\left( \sum_{k=2}^n \frac{1}{k} - \sum_{k=2}^n \frac{1}{k} \right) - \frac{1}{n+1} = 1-\frac{1}{n+1}
+    \]
+\end{example}
+
+\begin{algo}{Majorantenkriterium}
+    Man sucht eine zweite Folge $b_k$, sodass diese fast immer größer ist als die vorgegebene Folge ist.
+
+    Konvergiert $\sum_{k=1}^{\infty} b_k$ dann konvergiert auch die ursprüngliche Reihe.
+\end{algo}
+
+\begin{example}{Majorantenkriterium}
+    Konvergiert $\sum_{k=1}^{\infty} \frac{1}{k^2+1}$?
+
+    Ja, da $\frac{1}{k^2+1} < \frac{1}{k^2}$ und wir wissen, dass $\sum_{k=1}^{\infty} \frac{1}{k^2}$ konvergiert.\\
+    Wir haben also eine konvergente Majorante.
+\end{example}
+
+\begin{algo}{Minorantenkriterium}
+    Man sucht eine zweite Folge $b_k$, sodass diese fast immer kleiner ist als die vorgegebene Folge ist.
+    Divergiert $\sum_{k=1}^{\infty} b_k$ dann divergiert auch die ursprüngliche Reihe.
+\end{algo}
+
+\begin{example}{Majorantenkriterium}
+    Konvergiert $\sum_{k=1}^{\infty} \frac{1}{\ln(k)}$?
+
+    Nein, da $\frac{1}{k} < \frac{1}{\ln(k)}$ ($k\geq3$) und wir wissen, dass $\sum_{k=1}^{\infty} \frac{1}{k}$ divergiert.\\
+    Wir haben also eine divergente Minorante.
+\end{example}
+
+\begin{algo}{Cauchy-Kondensatioskriterium}
+    Die Konvergenz von folgenden Reihen ist äquivalent.
+    $$
+        \sum_{k=1}^{\infty} a_k \quad \text{ und } \quad
+        \sum_{k=1}^{\infty} 2^k \cdot a_{2^k}
+    $$
+\end{algo}
+
+\begin{example}{Cauchy-Kondensatioskriterium}
+    Konvergiert $\sum_{k=1}^{\infty} \frac{1}{k}$?
+
+    Die Frage ist äquivalent dazu, ob
+    \[
+        \sum_{k=1}^{\infty} 2^k \cdot \frac{1}{2^k} = \sum_{k=1}^{\infty} 1
+    \]
+    konvergiert. Das tut sie offensichtlich nicht, also konvergiert auch $\sum_{k=1}^{\infty} \frac{1}{k}$ nicht.
+\end{example}
+
+\begin{algo}{Wurzelkriterium}
+    Sei $r = \lim_{n\to\infty} \sqrt[n]{|a_n|}$.
+    Dann konvergiert $\sum_{k=1}^{\infty} a_k$ für $r<1$.
+    Für $r>1$ divergiert die Reihe.
+    Für $r=1$ liefert das Kriterium keine Aussage.
+\end{algo}
+
+\begin{example}{Wurzelkriterium}
+    Konvergiert die Reihe $\sum_{k=1}^{\infty} \frac{1}{7^k}$?
+
+    Es gilt
+    \[
+        r = \lim_{k\to\infty} \sqrt[k]{\frac{1}{7^k}} = \frac{1}{7} < 1
+    \]
+    Also konvergiert die Reihe.
+\end{example}
+
+\begin{algo}{Quotientenkriterium}
+    Sei $r = \lim_{n\to\infty} \left| \frac{a_{n+1}}{a_n} \right|$.
+
+    Dann konvergiert $\sum_{k=1}^{\infty} a_k$ für $r<1$.
+
+    Für $r>1$ divergiert die Reihe.
+
+    Für $r=1$ liefert das Kriterium keine Aussage.
+\end{algo}
+
+\begin{example}{Quotientenkriterium}
+    Konvergert die Reihe $\sum_{k=1}^{\infty} \frac{x^k}{k!}$?
+
+    Wir berechnen dann
+    \[
+        r = \lim_{n\to\infty} \left| \frac{\frac{x^{n+1}}{(n+1)!}}{\frac{x^n}{n!}} \right|
+        = \lim_{n\to\infty} \left| \frac{x}{n+1} \right| = 0
+    \]
+    Die Reihe konvergiert also für alle $x$.
+\end{example}
+
+\begin{algo}{Leibnizkriterium}
+    Das Leibnizkriterium wird für alternierende Reihen genutzt.
+
+    Sei $\sum_{k=1}^{\infty} (-1)^n \cdot a_n$ und $a_n$ eine beliebige Folge.
+
+    Jetzt muss man nur drei Eigenschaften für $a_n$ zeigen:
+    \begin{enumerate}
+        \item $a_n$ muss monoton fallend sein,
+        \item $a_n$ muss immer größer als Null sein und
+        \item $\lim_{n\to\infty} a_n =0$.
+    \end{enumerate}
+
+    Dann konvergiert die Reihe.
+\end{algo}
+
+\begin{example}{Leibnizkriterium}
+    Konvergiert die Reihe $\sum_{k=2}^{\infty} (-1)^n \cdot \frac{1}{\ln(k)}$.
+    Wir wissen, dass $\ln(k) > 0$ für $k>1$.
+    Außerdem wissen wir, dass der natürliche Logarithmus monoton steigend ist, also ist $\frac{1}{\ln(k)}$ monoton fallend.
+    Es gilt auch $\lim_{n\to\infty} = 0$. Also konvergiert die Reihe.
+\end{example}
+
+
+\subsection{Potenzreihen}
+
+\begin{defi}{Potenzreihe}
+    Sei $x \in \R, a_n \in \R$, so heißt
+    $$
+        p(x) := \sum_{n=0}^{\infty} a_nx^n
+    $$
+    \emph{reelle Potenzreihe von x}.
+
+    Jede Potenzreihe konvergiert für $x=0$.
+\end{defi}
+
+\begin{defi}{Konvergenz von Potenzreihen (Entwicklungspunkt $x_0 = 0$)}
+    Jede Potenzreihe konvergiert für $x=0$.
+
+    Jede Potenzreihe konvergiert für
+    $$
+        \abs{x} < R = \lim_{n\to\infty} \abs{\frac{a_n}{a_{n+1}}} \quad \text{ bzw. } \quad \abs{x} < R = \frac{1}{\lim_{n\to\infty} \sqrt[n]{\abs{a_n}}}
+    $$
+    und divergiert für $\abs{x} > R$.
+
+    Der Rand muss oft gesondert betrachtet werden!
+\end{defi}
+
+\begin{defi}{Konvergenz von Potenzreihen (Entwicklungspunkt $x_0 \neq 0$)}
+    Jede Potenzreihe $p(x) = \sum^\infty_{n=0} a_n (x-x_0)^n$ konvergiert für
+    $$
+        \abs{x-x_0} < R = \lim_{n\to\infty} \abs{\frac{a_n}{a_{n+1}}}\quad  \text{ bzw. } \quad \abs{x} < R = \frac{1}{\lim_{n\to\infty} \sqrt[n]{\abs{a_n}}}
+    $$
+    und divergiert für $\abs{x-x_0} > R$.
+
+    Der Rand muss oft gesondert betrachtet werden!
+\end{defi}
+
+\begin{defi}{Konvergenzradius}
+    $$
+        R = \lim_{n\to\infty} \abs{\frac{a_n}{a_{n+1}}}\quad  \text{ bzw. } R = \frac{1}{\lim_{n\to\infty} \sqrt[n]{\abs{a_n}}}
+    $$
+    \emph{heißt der Konvergenzradius der Potenzreihe}.
+\end{defi}
+
+\begin{bonus}{Spezielle Potenzreihen}
+    $$
+        \begin{aligned}
+            f(x) = \frac{1}{1-c(x-x_0)} & \iff \sum^\infty_{n=0} c^n \cdot (x-x_0)^n \text{ für } \abs{x-x_0} < \frac{1}{\abs{c}}
+        \end{aligned}
+    $$
+\end{bonus}
+
+\begin{example}{Potenzreihe um Entwicklungspunkt bestimmen}
+    Wir wollen die Potenzreihe um $x_0 = 1$ der Reihe $$f(x) = \frac{3}{5+2x}$$ bestimmen.
+    Zunächst ist:
+    $$
+        \begin{aligned}
+            f(x) & ={} \frac{3}{5+2x}                                                                                                       \\
+                 & ={} 3\cdot \frac{1}{5+2(x-1) + 2}                                                                                        \\
+                 & ={} 3\cdot \frac{1}{7- (-2) \cdot (x-1)}                                                                                 \\
+                 & ={} \frac{3}{7}\cdot \frac{1}{1- (-\frac{2}{7}) \cdot (x-1)}                                                             \\
+                 & ={} \frac{3}{7}\cdot \sum^\infty_{n=0} \left(\frac{-2}{7} \cdot (x-1)\right)^n \text{ für } \abs{\frac{-2}{7} (x-1)} < 1 \\
+                 & ={} \frac{3}{7}\cdot \sum^\infty_{n=0} \left(\frac{-2}{7}\right)^n \cdot (x-1)^n \text{ für } \abs{x-1} < \frac{7}{2}
+        \end{aligned}
+    $$
+\end{example}
+
+\begin{defi}{Exponentialfunktion}
+    Die Funktion
+    $$
+        \exp(x) = \sum^\infty_{n=0} \frac{x^n}{n!}
+    $$
+    heißt \emph{Exponentialfunktion} oder \emph{exponentielle Funktion}.
+    Sie konvergiert für jedes $x\in \R$ und ist damit wohldefiniert.
+\end{defi}
+
+\subsection{Grenzwerte von Funktionen}
+
+\begin{defi}{Konvergenz von Funktionen}
+    Gilt $\forall x_n$, dass (falls $\lim_{n\to\infty} x_n=x_0$ gilt):
+    $$
+        \lim_{n\to\infty} f(x_n) = L
+    $$
+    so heißt die Funktion \emph{konvergent für} $x \to x_0$ und wir schreiben
+    $$
+        \lim_{n\to\infty} =: \lim_{x\to x_0} f(x).
+    $$
+\end{defi}
+
+\begin{defi}{Stetigkeit von Funktionen}
+    Gilt $\forall x_n$, dass (falls $\lim_{n\to\infty} x_n=x_0$ gilt):
+    $$
+        \lim_{n\to\infty} f(x_n) = f(x_0)
+    $$
+    so heißt die Funktion \emph{stetig in} $x_0$.
+
+    Jede Potenzreihe ist im Inneren ihres Konvergenzradius (also nicht zwingend für die Randpunkte) stetig.
+\end{defi}
+
+\begin{defi}{Rechtsseitiger und linksseitiger Grenzwert}
+    Existiert für Folgen $x_n$ mit $x_n > x_0$ ein Grenzwert $L$, also existiert
+    $$
+        \lim_{x \to x_0 \land x > x_0} f(x) = L =:  \lim_{x \downarrow x_0} f(x)
+    $$
+    so heißt der Grenzwert \emph{rechtsseitiger Grenzwert}.
+    Gilt $L=f(x_0)$, so heißt die Funktion \emph{rechtsseitig stetig.}
+
+    Entsprechend für $x < x_0$:
+    $$
+        \lim_{x \to x_0 \land x < x_0} f(x) = L =:  \lim_{x \uparrow x_0} f(x).
+    $$
+\end{defi}
+
+\begin{defi}{Stetigkeit}
+    Eine Funktion $f(x)$ ist genau dann \emph{stetig in} $x_0$, wenn
+    $$
+        \lim_{x \downarrow x_0} f(x_0) = \lim_{x \uparrow  x_0} f(x_0) = f(x_0).
+    $$
+
+    Sei $f : D \to \R$ heißt \emph{stetig auf} $D = [a, b]$, falls $f$ für jedes $x_0 \in D$ stetig ist.
+\end{defi}
+
+\begin{defi}{$\epsilon$-$\delta$-Kriterium}
+    Eine Funktion $f(x)$ heißt \emph{stetig in} $x_0$, falls
+    $$
+        \forall \epsilon > 0, \exists \delta(x_0, \epsilon) > 0, \forall \abs{x-x_0} < \delta : \abs{f(x)-f(x_0)} < \epsilon
+    $$
+\end{defi}
+
+\begin{example}{$\epsilon$-$\delta$-Kriterium}
+    Untersuche die Stetigkeit von $f(x) = \frac{1}{\sqrt{x}}, \quad x > 0$.
+
+    $f(x)$ ist stetig in $x_0$, wenn
+    $$\forall \epsilon > 0, \exists \delta (x_0, \epsilon) > 0: \forall \abs{x-x_0} < \delta \Rightarrow \abs{f(x)-f(x_0)} < \epsilon$$
+    $$
+        \begin{aligned}
+                       & \abs{f(x)-f(x_0)}                                                                                                                                        \\
+            = \quad    & \abs{\frac{1}{\sqrt{x}}-\frac{1}{\sqrt{x_0}}}                                                                                                            \\
+            = \quad    & \abs{\left(\frac{1}{\sqrt{x}}-\frac{1}{\sqrt{x_0}}\right) \cdot \frac{\frac{1}{\sqrt{x}}+\frac{1}{\sqrt{x_0}}}{\frac{1}{\sqrt{x}}+\frac{1}{\sqrt{x_0}}}} \\
+            = \quad    & \abs{\frac{\frac{1}{x}-\frac{1}{x_0}}{\frac{1}{\sqrt{x}}+\frac{1}{\sqrt{x_0}}}}                                                                          \\
+            = \quad    & \abs{\frac{\frac{x_0-x}{x x_0}}{\frac{\sqrt{x_0} + \sqrt{x}}{ \sqrt{x  x_0}}}}                                                                           \\
+            = \quad    & \abs{ \frac{(x_0 - x)  \sqrt{x x_0} }{ x x_0  \left( \sqrt{x_0} + \sqrt{x} \right) } }                                                                   \\
+            = \quad    & \abs{ \frac{x_0 - x }{ \sqrt{x x_0 } \left( \sqrt{x_0} + \sqrt{x} \right) } }                                                                            \\
+            = \quad    & \abs{ \frac{x-x_0 }{ \sqrt{x x_0 } \left( \sqrt{x_0} + \sqrt{x} \right) } }                                                                              \\
+            = \quad    & \abs{x-x_0} \cdot \frac{1 }{ \sqrt{x x_0 } \left( \sqrt{x_0} + \sqrt{x} \right) }                                                                        \\
+            < \quad    & \delta \cdot \frac{1 }{ \sqrt{x x_0 } \left( \sqrt{x_0} + \sqrt{x} \right) }                                                                             \\
+            \leq \quad & \delta \cdot \frac{1 }{ \sqrt{x x_0 } \sqrt{x_0} + \sqrt{x x_0 } \sqrt{x} }                                                                              \\
+            \leq \quad & \delta \cdot \frac{1 }{ \sqrt{x x_0 } \sqrt{x} }                                                                                                         \\
+            \leq \quad & \delta \cdot \frac{1 }{ x\sqrt{x_0} }                                                                                                                    \\
+        \end{aligned}
+    $$
+    Sei $\abs{x-x_0} < \frac{x_0}{2}$:
+
+    $$\abs{x-x_0} < \frac{x_0}{2} \implies x_0 -\frac{x_0}{2}  < x < x_0 + \frac{x_0}{2}  \iff \frac{x_0}{2} < x$$
+
+    Daraus folgt weiterhin:
+    $$
+        \begin{aligned}
+                       & \delta \cdot \frac{1 }{ x\sqrt{x_0} }       \\
+            < \quad    & \frac{2\delta }{ x_0\sqrt{x_0} } < \epsilon \\
+            \iff \quad & \delta < \frac{x_0\sqrt{x_0}}{2} \epsilon
+        \end{aligned}
+    $$
+
+    Mit $\delta = \min\{\frac{x_0}{2}, \frac{x_0\sqrt{x_0}}{2}\epsilon\}$ ist $f(x)$ stetig.\qed
+\end{example}
+
+\begin{defi}{Sandwich-Lemma für Funktionen}
+    Gilt
+    $$
+        \forall \abs{x-x_0} < K, x\neq x_0 : f(x) \leq g(x) \leq h(x)
+    $$
+    und
+    $$
+        \lim_{x\to x_0} f(x) = \lim_{x\to x_0} h(x) = c
+    $$
+    so ist auch
+    $$
+        \lim_{x\to x_0} g(x) = c.
+    $$
+\end{defi}
+
+\begin{defi}{Unstetigkeit}
+    Es gibt verschiedene Typen der Unstetigkeit:
+    \begin{enumerate}
+        \item Sprungstellen:
+              $$
+                  \lim_{x\uparrow x_0} f(x) \neq\lim_{x\downarrow x_0} f(x)
+              $$
+        \item Unendlichkeitsstellen: $f$ ist in der Umgebung von $x_0$ nicht beschränkt, d.h.
+              $$
+                  \lim_{x\to x_0} f(x) > R
+              $$
+        \item Oszillationsstellen: z.B.
+              $$
+                  \lim_{x\to 0} \sin \frac{1}{x} \text{ in } x_0 = 0
+              $$
+        \item Singuläre Definitionen:
+              $$
+                  f(x) = \begin{cases}
+                      g(x) & , \text{ für } x \in M    \\
+                      h(x) & , \text{ für } x \notin M
+                  \end{cases}
+              $$
+        \item Definitionslücken: z.B.
+              $$
+                  f(x) = \frac{x}{x} \text{ für } x \neq 0
+              $$
+        \item Kombinationen aus den oben genannten
+    \end{enumerate}
+\end{defi}
+
+\begin{defi}{Hebbare Lücke}
+    Sei $f(x)$ stetig für $x\neq x_0, x_0 \notin D$.
+    Dann erhält man mit $f(x) := \lim_{x\to x_0} f(x)$ eine stetige Funktion, wenn der Grenzwert existiert.
+    $x_0$ heißt \emph{hebbare Lücke}.
+\end{defi}
+
+\begin{bonus}{Stetigkeit auf Intervallen}
+    Sei $f : [a, b] \to \R$ stetig, dann:
+    \begin{itemize}
+        \item ist $f(x)$ beschränkt.
+        \item existieren $x_1, x_2 \in [a, b]: f(x_1) \leq f(x) \leq f(x_2), \forall x \in [a, b]$
+    \end{itemize}
+\end{bonus}
+
+\begin{defi}{Gleichmäßige Stetigkeit}
+    Eine Funktion $f : D \to \R$ heißt \emph{gleichmäßig stetig auf D}, falls es ein $\delta > 0$ unabhängig von $x_0$ gibt, so dass
+    $$
+        \abs{f(x) - f(x_0)} < \epsilon, \forall \abs{x-x_0} < \delta.
+    $$
+
+    Jede gleichmäßig stetige Funktion ist stetig.
+
+    Eine stetige Funktion $f : [a, b] \to \R$ ist gleichmäßig stetig.
+\end{defi}
+
+\begin{defi}{Lipschitz-Stetigkeit}
+    Eine Funktion $f$ heißt \emph{lokal Lipschitz-stetig in} $x_0$, wenn es ein $L \geq 0$ und ein $\delta > 0$ gibt, so dass
+    $$
+        \abs{f(x) - f(x_0)} \leq L \cdot \abs{x-x_0}, \forall \abs{x-x_0} < \delta.
+    $$
+
+    Eine Funktion $f$ heißt \emph{Lipschitz-stetig}, wenn es ein $L \geq 0$, so dass
+    $$
+        \abs{f(x) - f(y)} \leq L \cdot \abs{x-y}, \forall x, y \in [a, b].
+    $$
+    $L$ heißt \emph{Lipschitz-Konstante}.
+
+    Ist eine Funktion Lipschitz-stetig, so ist sie auch gleichmäßig stetig.
+\end{defi}
+
+\begin{example}{Lipschitz-Stetigkeit}\
+    $$f(x) = \sqrt{2+3x}$$
+
+    Ist die Funktion lokal Lipschitz-stetig im Punkt $x_0 = 1$?
+    Berechnen Sie gegebenenfalls die Lipschitz-Konstante $L$ in Abhängigkeit von $\delta$.
+    Lipschitz-Stetigkeit: $\exists L \geq 0, \forall x,x_0\in D: \abs{f(x)-f(x_0)} \leq L \cdot \abs{x-x_0}$
+
+    $$
+        \begin{aligned}
+                                                             & \abs{f(x)-f(y)}                                                                                     \\
+            = \quad                                          & \abs{\sqrt{2+3x} - \sqrt{2+3y}}                                                                     \\
+            = \quad                                          & \abs{(\sqrt{2+3x} - \sqrt{2+3y}) \cdot \frac{\sqrt{2+3x} + \sqrt{2+3y}}{\sqrt{2+3x} + \sqrt{2+3y}}} \\
+            = \quad                                          & \abs{\frac{2+3x-(2+3y)}{\sqrt{2+3x} + \sqrt{2+3y}}}                                                 \\
+            = \quad                                          & \abs{\frac{3(x-y)}{\sqrt{2+3x} + \sqrt{2+3y}}}                                                      \\
+            = \quad                                          & \frac{3}{\sqrt{2+3x} + \sqrt{2+3y}} \cdot \abs{x-y}                                                 \\
+            \overset{x,y\in (x_0-\delta, x_0+\delta)}< \quad & \frac{3}{\sqrt{2+3(x_0-\delta)} + \sqrt{2+3(x_0-\delta)}} \cdot \abs{x-y}                           \\
+            = \quad                                          & \frac{3}{\sqrt{2+3(1-\delta)} + \sqrt{2+3(1-\delta)}} \cdot \abs{x-y}                               \\
+            = \quad                                          & \frac{3}{\sqrt{2+3-3\delta} + \sqrt{2+3-3\delta}} \cdot \abs{x-y}                                   \\
+            = \quad                                          & \frac{3}{2\cdot \sqrt{5-3\delta}} \cdot \abs{x-y}                                                   \\
+        \end{aligned}
+    $$
+    Damit ist $f$ lokal Lipschitz-stetig im Punkt $x_0 = 1$ mit $L = \frac{3}{2\cdot \sqrt{5-3\delta}}$.\qed
+\end{example}
+
+\begin{defi}{Zwischenwertsatz}
+    Sei $f : [a, b] \to \R$ stetig mit $f(a) = c$ und $f(b) = d$, dann gilt
+    $$
+        \forall y \in [\min(c, d) , \max(c, d)], \exists x \in [a, b] : f(x) = y.
+    $$
+\end{defi}
+
+\begin{defi}{Fixpunktsatz}
+    Ein Wert $x^* \in \R$ heißt \emph{Fixpunkt} einer Funktion $f(x)$, falls $x^* = f(x^*)$.
+
+    Sei $f : [a, b] \to [c, d]$ stetig mit $[c, d] \subset [a, b]$ (\emph{selbstkontrahierend}), dann existiert ein \emph{Fixpunkt} $u = f(u)$.
+\end{defi}
+
+\begin{example}{Fixpunktberechnung (Teil 1)}
+    Gegeben ist die Funktion
+    $$f: [0,\infty) \to [0, \infty), \quad f(x) = \frac{x+\frac{1}{2}}{x+1}$$
+
+    (a) Zeigen Sie, dass die Funktion die Voraussetzungen des Fixpunktsatzes erfüllt.
+
+    \textbf{Stetigkeit:}
+    $f$ ist offensichtlich stetig, da $f$ aus stetigen Funktionen zusammengesetzt ist (und insbesondere, da $\forall x\in [0,\infty]: x\neq -1$).
+
+    \textbf{Monotonieverhalten:}
+    Wir vermuten, dass die Funktion monoton steigend ist:
+    $$
+        \begin{aligned}
+                         & x \geq y \implies f(x) \geq f(y)                                                           \\
+            \equiv \quad & x \geq y \implies \frac{x+\frac{1}{2}}{x+1} \geq \frac{y+\frac{1}{2}}{y+1}                 \\
+            \equiv \quad & x \geq y \implies \left(x+\frac{1}{2}\right)(y+1) \geq \left(y+\frac{1}{2}\right)(x+1)     \\
+            \equiv \quad & x \geq y \implies xy+ x + \frac{y}{2}+ \frac{1}{2} \geq xy + y + \frac{x}{2} + \frac{1}{2} \\
+            \equiv \quad & x \geq y \implies x + \frac{y}{2}\geq y + \frac{x}{2}                                      \\
+            \equiv \quad & x \geq y \implies x - \frac{x}{2}\geq y - \frac{y}{2}                                      \\
+            \equiv \quad & x \geq y \implies \frac{x}{2}\geq \frac{y}{2}                                              \\
+            \equiv \quad & x \geq y \implies x\geq y \quad \checkmark
+        \end{aligned}
+    $$
+    Damit ist $f$ monoton steigend.
+
+    \textbf{Kontraktion:} Zu zeigen: $\forall x\in [0,\infty)]: f(x) \in [0,\infty)]$:
+
+    $$f(0) = \frac{0+\frac{1}{2}}{0+1} = \frac{1}{2}\in [0,\infty), \text{ und } \lim_{n\to\infty} f(n) = \lim_{n\to\infty} \frac{n+\frac{1}{2}}{n+1} = 1\in [0,\infty)$$
+
+    Da beide Werte im gegebenen Definitionsbereich sind und $f$ monoton steigend ist, ist $f$ insgesamt selbstkontrahierend.
+
+    Insgesamt sind also alle Bedingungen für den Fixpunktsatz erfüllt.\qed
+
+\end{example}
+
+\begin{example}{Fixpunktberechnung (Teil 2)}
+    (b) Berechnen Sie den Fixpunkt von $f$.
+    $$
+        \begin{aligned}
+                           & f(x^*) = x^*                                            \\
+            \equiv \quad   & \frac{x^*+\frac{1}{2}}{x^*+1} = x^*                     \\
+            \equiv \quad   & x^*+\frac{1}{2} = x^*(x^*+1)                            \\
+            \equiv \quad   & x^*+\frac{1}{2} = (x^*)^2+x^*                           \\
+            \equiv \quad   & 0 = (x^*)^2-\frac{1}{2}                                 \\
+            \implies \quad & x^* = \sqrt{\frac{1}{2}} \lor x^* = -\sqrt{\frac{1}{2}}
+        \end{aligned}
+    $$
+
+    $x^* \in [0,\infty] \implies x^* = \sqrt{\frac{1}{2}}$\qed
+\end{example}
+
+\section{Differentialrechnung}
+\subsection{Tangentengleichung}
+
+\begin{algo}{Tangentengleichung}
+    Wollen wir die Gleichung der Tangente einer Funktion $f(x)$ in einem Punkt $x_0$ bestimmen, so verwenden wir den Ansatz
+    $$
+        T(x) = f_1(x) = m \cdot (x-x_0) + b.
+    $$
+    Die Tangente im Punkt $x_0$ hat die Eigenschaften
+    \begin{itemize}
+        \item Die Steigung ist $m = f'(x)$,
+        \item Sie geht durch den Punkt $(x_0, f(x_0))$.
+    \end{itemize}
+
+    Einsetzen der zweiten Bedingung liefert
+    $$
+        f(x_0) = f_1(x_0) = b
+    $$
+    und damit ist die Tangentengleichung bekannt mit
+    $$
+        f_1(x) = f'(x_0) \cdot (x-x_0) + f(x_0).
+    $$
+\end{algo}
+
+\newpage
+\subsection{Ableitungsregeln}
+
+\begin{defi}{Faktorregel}
+    $$
+        f(x) = c \cdot g(x) \implies f'(x) = c \cdot g'(x)
+    $$
+\end{defi}
+
+\begin{defi}{Summenregel}
+    $$
+        f(x) = g(x) + h(x) \implies f'(x) = g'(x) + h'(x)
+    $$
+\end{defi}
+
+\begin{defi}{Produktregel}
+    $$
+        f(x) = g(x) \cdot h(x) \implies f'(x) = g'(x)\cdot h(x) + g(x) \cdot h'(x)
+    $$
+\end{defi}
+
+\begin{defi}{Quotientenregel}
+    $$
+        f(x) = \frac{g(x)}{h(x)} \implies f'(x) = \frac{g'(x)\cdot h(x) - g(x)\cdot h'(x)}{[h(x)]^2}
+    $$
+\end{defi}
+
+\begin{defi}{Kettenregel}
+    $$
+        f(x) = g(h(x)) \implies f'(x) = g'(h(x)) \cdot h'(x)
+    $$
+\end{defi}
+
+\begin{bonus}{Ableitung der Umkehrfunktion}
+    $$
+        (f^{-1})(y) = \frac{1}{f'(x)} = \frac{1}{f'(f^{-1}(y))}
+    $$
+\end{bonus}
+
+\begin{bonus}{Elementare Ableitungsfunktionen}
+    \begin{center}
+        \begin{tabular}{C | C}
+            f(x)   & f'(x)                             \\
+            \hline
+            x^n    & n \cdot x^{n-1}                   \\
+            \sin x & \cos x                            \\
+            \cos x & -\sin x                           \\
+            \tan x & \frac{1}{\cos^2 x} = \tan^2 x + 1 \\
+            \cot x & \frac{-1}{\sin^2 x}               \\
+            e^x    & e^x                               \\
+            a^x    & a^x \cdot \ln a                   \\
+            \ln x  & \frac{1}{x}
+        \end{tabular}
+    \end{center}
+\end{bonus}
+
+\subsection{Lokale Extrema}
+
+\begin{defi}{Lokale Extrema}
+    Existiert eine Stelle $x_0$ einer Funktion $f(x)$ und eine $\epsilon$-Umgebung $U_\epsilon (x_0)$ von $x_0$, so dass $\forall x \in U_\epsilon (x_0)$ gilt:
+    \begin{itemize}
+        \item $f(x) \geq f(x_0)$, so heißt $x_0$ \emph{lokales Minimum},
+        \item $f(x) \leq f(x_0)$, so heißt $x_0$ \emph{lokales Maximum}.
+    \end{itemize}
+
+    Ist $f$ differenzierbar in $x_0$ und $x_0$ lokales Extremum, sei gilt
+    $$
+        f'(x_0) = 0.
+    $$
+\end{defi}
+
+\subsection{Mittelwertsatz}
+
+\begin{bonus}{Satz von Rolle}
+    Ist $f$ auf $[a, b]$ stetig mit $f(a) = f(b)$ und auf $(a, b)$ differenzierbar, so existiert ein $x^* \in (a, b) : f'(x^*) = 0$.
+\end{bonus}
+
+\begin{defi}{Mittelwertsatz}
+    Sei $f \in C[a, b]$ und in $(a, b)$ differenzierbar.
+    Dann existiert ein $x^* \in (a, b)$ mit
+    $$
+        f'(x^*) = \frac{f(b)  -f(a)}{b-a}.
+    $$
+\end{defi}
+
+\subsection{Stetigkeit und Differenzierbarkeit von Potenzreihen}
+
+\begin{defi}{Stetigkeit / Differenzierbarkeit von Potenzreihen}
+    Jede Potenzreihe ist stetig im Inneren des Konvergenzbereiches.
+    Die Potenzreihe $p(x) = \sum^\infty_{n=0} a_n(x-x_0)^n$ ist differenzierbar im Inneren des Konvergenzbereiches und die Ableitung $p'(x)$ kann summandenweise berechnet werden mit:
+    $$
+        \begin{aligned}
+            p'(x) & = \sum^\infty_{n=1} a_n \cdot n \cdot (x-x_0)^{n-1}       \\
+                  & = \sum^\infty_{n=0} a_{n+1} \cdot (n+1) \cdot (x-x_0)^{n}
+        \end{aligned}
+    $$
+\end{defi}
+
+\subsection{Monotonie}
+
+\begin{defi}{Monotonie für Funktionen}
+    Eine Funktion heißt \emph{monoton wachsend auf} $[a, b]$, falls
+    $$
+        \forall x_1, x_2 \in (a, b), x_1 < x_2 : f(x_1) \leq f(x_2) \iff \forall x \in (a, b): f'(x) \geq 0.
+    $$
+    Eine Funktion heißt \emph{streng monoton wachsend auf} $[a, b]$, falls
+    $$
+        \forall x_1, x_2 \in (a, b), x_1 < x_2 : f(x_1) < f(x_2) \iff \forall x \in (a, b): f'(x) > 0.
+    $$
+    Eine Funktion heißt \emph{monoton fallend auf} $[a, b]$, falls
+    $$
+        \forall x_1, x_2 \in (a, b), x_1 < x_2 : f(x_1) \geq f(x_2) \iff \forall x \in (a, b): f'(x) \leq 0.
+    $$
+    Eine Funktion heißt \emph{streng monoton fallend auf} $[a, b]$, falls
+    $$
+        \forall x_1, x_2 \in (a, b), x_1 < x_2 : f(x_1) > f(x_2) \iff \forall x \in (a, b): f'(x) < 0.
+    $$
+\end{defi}
+
+\subsection{Die Grenzwerte von de L'Hospital}
+
+\begin{defi}{Regeln von de L'Hospital}
+    Seien $f, g \in C[a, b]$ und in $(a, b)$ differenzierbar mit $f(a) = g(a) = 0$.
+
+    Weiterhin gelte $\forall x \in (a, b): g'(x) \neq 0$ und es existiert
+    $$
+        \lim_{x\to a} \frac{f'(x)}{g'(x)}
+    $$
+    dann existiert auch
+    $$
+        \lim_{x\to a } \frac{f(x)}{g(x)}
+    $$
+    und es ist
+    $$
+        \lim_{x\to a } \frac{f(x)}{g(x)} = \lim_{x\to a} \frac{f'(x)}{g'(x)}.
+    $$
+\end{defi}
+
+\subsection{Krümmungseigenschaften}
+
+\begin{defi}{Krümmung}
+    Sei $f\in C^2(a, b)$ und ist $\forall x \in (a, b) : f''(x) > 0$, so heißt $f(x)$ \emph{konvex} oder \emph{linksgekrümmt}.
+
+    Ist $\forall x \in (a, b) : f''(x) < 0$ so heißt $f(x)$ \emph{konkav} oder \emph{rechtsgekrümmt}
+\end{defi}
+
+\begin{defi}{Wendepunkt}
+    Sei $f \in C^2(a, b)$ und wechselt die Funktion für $x^* \in (a, b)$ von einer links- zu einer rechtsgekrümmten Funktion (oder umgekehrt), so heißt $x^*$ \emph{Wendepunkt der Funktion}.
+
+    Ist $x^*$ Wendepunkt und $f \in C^2(a, b)$, so ist $f''(x) = 0$.
+\end{defi}
+
+\subsection{Die Taylorreihe}
+
+\begin{defi}{Taylorreihe}
+    $$
+        \begin{aligned}
+            f(x) & = \sum^\infty_{n=0} \frac{f^{(n)}(x_0)}{n!} (x-x_0)^n                                           \\
+                 & = f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)}{2}(x-x_0)^2 + \frac{f'''(x_0)}{6}(x-x_0)^3 + \ldots
+        \end{aligned}
+    $$
+    Dabei heißt $x_0$ Entwicklungspunkt der Potenzreihe und die Reihe konvergiert für $\abs{x-x_0} < r$ mit $r = \lim_{n\to\infty}\abs{\frac{a_n}{a_{n+1}}}$.
+\end{defi}
+
+\begin{example}{Taylorreihe}
+    \textbf{Bestimmen Sie das Taylorpolynom dritten Grades für die Funktion $g(x) = \ln(x\cdot e^{-2x})$ an der Stelle $x_0 = 1$.}
+
+    Taylorpolynom $k$-ten Grades einer Funktion $f$:
+    $$T_k(x) := \sum_{n=0}^k \frac{\mathrm{d}^n f}{\mathrm{d}x^n} (x_0)\cdot\frac{(x-x_0)^n}{n!} $$
+
+    Das Taylorpolynom dritten Grades von $g(x) = \ln(x\cdot e^{-2x})$ an der Stelle $x_0 = 1$ ist dann gegeben durch:
+    $$
+        \begin{aligned}
+            T_3(x) ={}      & \sum_{n=0}^3 \frac{\mathrm{d}^n g}{\mathrm{d}x^n} (1)\cdot\frac{(x-1)^n}{n!}                                                                                                                       \\
+            ={}             & g(1) + \frac{\mathrm{d} g}{\mathrm{d} x}(1)\cdot\frac{x-1}{1!} + \frac{\mathrm{d^2} g}{\mathrm{d} x^2}(1)\cdot\frac{(x-1)^2}{2!} + \frac{\mathrm{d^3} g}{\mathrm{d} x^3}(1)\cdot\frac{(x-1)^3}{3!} \\
+            \stackrel{*}={} & \ln(e^{-2}) + \left( \frac{1}{1}- 2 \right)\cdot(x-1) + \frac{-1}{1}\cdot\frac{(x-1)^2}{2} + \frac{2}{1}\cdot\frac{(x-1)^3}{6}                                                                     \\
+            ={}             & -2 -(x-1) - \frac{1}{2}\cdot (x-1)^2 +\frac{1}{3}\cdot (x-1)^3                                                                                                                                     \\
+            ={}             & -2 -x+1 - \frac{1}{2}\cdot (x^2-2x+1) +\frac{1}{3}\cdot (x^3 -3x^2+3x-1)                                                                                                                           \\
+            ={}             & -1 -x - \frac{x^2}{2} + x -\frac{1}{2} +\frac{x^3}{3} - x^2 + x -\frac{1}{3}                                                                                                                       \\
+            ={}             & \frac{x^3}{3}- \frac{3x^2}{2} + x - \frac{11}{6}
+        \end{aligned}
+    $$
+    \qed
+
+    \vspace{2em}
+
+    \textbf{Nebenrechnungen:}
+    $$
+        \frac{\mathrm{d} g}{\mathrm{d} x} = \frac{1}{x} - 2, \quad
+        \frac{\mathrm{d}^2 g}{\mathrm{d} x^2} = \frac{-1}{x^2}, \quad
+        \frac{\mathrm{d}^3 g}{\mathrm{d} x^3} = \frac{2}{x^3}
+    $$
+\end{example}
+
+\newpage
+\section{Integration}
+\subsection{Flächenberechnung}
+
+\begin{defi}{Stammfunktion}
+    Sei $f\in C[a, b]$. Eine differenzierbare Funktion $F(x)$ mit $\forall x\in [a, b] : F'(x) = f(x)$ heißt eine \emph{Stammfunktion von f}.
+\end{defi}
+
+\begin{defi}{Unbestimmtes Integral}
+    $F(x) = \int f(x) \dx$ heißt das \emph{unbestimmte Integral von f}.
+\end{defi}
+
+\begin{defi}{Hauptsatz der Differential- und Integralrechnung}
+    Sei $f\in C[a, b]$, dann ist
+    $$
+        F_a(x) = \int^x_a f(t)\dt \text{ differenzierbar}
+    $$
+    und es gilt
+    $$
+        F'_a(x) = f(x).
+    $$
+    Damit ist also:
+    $$
+        \left(\int^x_a f(t)\dt\right)' = F'_a(x) = f(x).
+    $$
+\end{defi}
+
+\begin{defi}{Fläche einer Funktion}
+    Sei $f \in C[a, b]$, dann ist die Fläche der Funktion im Intervall $[a, b]$ gegeben mit
+    $$
+        \int_a^b f(x) \dx = F(b) - F(a) =: \left.F(x)\right|^b_{x=1}
+    $$
+\end{defi}
+
+\begin{bonus}{Potenzregel}
+    $$
+        \int x^n \dx = \frac{1}{n+1}x^{n+1} + C
+    $$
+\end{bonus}
+
+\begin{bonus}{Faktorregel}
+    $$
+        \int c\cdot f(x) \dx = c\cdot \int f(x) \dx
+    $$
+\end{bonus}
+
+\begin{bonus}{Summenregel}
+    $$
+        \int (f(x) + g(x))\dx = \int f(x) \dx + \int g(x) \dx
+    $$
+\end{bonus}
+
+\begin{bonus}{Partielle Integration}
+    $$
+        \int f'(x)g(x) \dx = f(x)g(x) - \int f(x) g'(x) \dx
+    $$
+
+    Entscheidend bei partieller Integration ist die Wahl von $f(x)$ und $g'(x)$.
+    Eine falsche Wahl kann unter Umständen dazu führen, dass das Integral noch komplizierter wird.
+
+    \textbf{Faustregel:}
+    \begin{enumerate}
+        \item L - logarithmische Funktionen ($\ln$, $\log_a$, $\ldots$)
+        \item I - inverse Winkelfunktionen ($\arcsin$, $\arccos$, $\arctan$, $\ldots$)
+        \item A - algebraische Funktionen ($x^2$, $5x^3$, $\ldots$)
+        \item T - trigonometrische Funktionen ($\sin$, $\cos$, $\tan$, $\csc$, $\ldots$)
+        \item E - Exponentialfunktionen ($e^x$, $5a^x$, $\ldots$)
+    \end{enumerate}
+    Entsprechend des Rangs wird $f(x)$ ausgewählt. Will man beispielsweise $x^2\cos x$ integrieren, so würde man $x^2$ für $f(x)$ wählen und $\cos x$ für $g'(x)$, da algebraische Funktionen höher in der Liste stehen als trigonometrische Funktionen.
+\end{bonus}
+
+\begin{bonus}{Integration durch Substitution}
+    $$
+        \int f(x)\dx = \int f(\phi(u)) \cdot \phi'(u) \du
+    $$
+\end{bonus}
+
+\subsection{Integration zur Berechnung von Flächen zwischen mehreren Funktionen}
+
+\begin{algo}{Berechnung der Fläche zwischen zwei Funktionen}
+    Wir betrachten die Fläche zwischen zwei Funktionen $f(x)$ und $g(x)$.
+
+    \begin{enumerate}
+        \item Schnittpunkte $a, b$ von $f(x)$ und $g(x)$ berechnen.
+        \item Integriere $\abs{f(x) - g(x)}$ zwischen den Schnittpunkten:
+              $$
+                  \abs{\int^b_a\abs{f(x) -g(x)} \dx}
+              $$
+    \end{enumerate}
+
+    Beachte: Bei mehr als zwei Schnittpunkten müssen mehrere Integrale mit den jeweiligen Grenzen addiert werden.
+
+    Das Verfahren lässt sich sehr einfach auf mehrere Funktionen erweitern.
+\end{algo}
+
+\begin{bonus}{Beispiel: Fläche zwischen drei Funktionen}
+    Wie groß ist der Flächeninhalt, der von den Funktionen
+    $$
+        f(x) = -0.25x^4 + 4, \quad g(x) = -2x-4, \quad h(x) = 2x-4
+    $$
+    eingeschlossen wird?
+    \begin{center}
+        \begin{tikzpicture}
+            \begin{axis}[
+                    axis lines=middle,
+                    xmin=-4.5,xmax=4.5,ymin=-4.5,ymax=4.5
+                ]
+                \addplot[blue, samples=1000, domain=-2.4:2.4, name path=A] {-0.25*x*x*x*x + 4} node[right] {$f$}; % f(x)
+                \addplot[yellow!70!red, samples=300, domain=-4:4, name path=B] {-2*x - 4} node[pos=0, left] {$g$}; % g(x)
+                \addplot[red!90!teal, samples=300, domain=-4:4, name path=C] {2*x-4} node[right] {$h$}; % h(x)
+                \addplot[gray!30, opacity=0.5] fill between[of=A and C,soft clip={domain=0:2}];
+                \addplot[gray!30, opacity=0.5] fill between[of=A and B,soft clip={domain=-2:0}];
+            \end{axis}
+        \end{tikzpicture}
+    \end{center}
+
+    Wir sehen in der Zeichnung, dass für die Fläche $A$ zwischen den Graphen gilt:
+    $$
+        \begin{aligned}
+            A ={} & \abs{  \int_{-2}^{0} \left(f(x) - g(x)\right) \dx} + \abs{ \int_{0}^{2} \left(f(x) - h(x)\right) \dx}                           \\
+            ={}   & \abs{ \int_{-2}^{0} \left(-\frac{1}{4}x^4 + 2x + 8\right) \dx} + \abs{ \int_{0}^{2} \left(-\frac{1}{4}x^4 - 2x + 8\right) \dx}  \\
+            ={}   & \abs{ \left[ -\frac{1}{20}x^5 + x^2 + 8x \right]_{-2}^{0} } + \abs{ \left[ -\frac{1}{20}x^5 - x^2 + 8x \right]_0^2 }            \\
+            ={}   & \abs{ 0 - \left( -\frac{1}{20}\cdot(-2)^5 + (-2)^2 + 8\cdot(-2) \right) } + \abs{ -\frac{1}{20}\cdot 2^5 + 2^2 + 8\cdot 2 - 0 } \\
+            ={}   & \abs{-\frac{8}{5} - 4 + 16 } + \abs{-\frac{8}{5} - 4 + 16}                                                                      \\
+            ={}   & \frac{52}{5} + \frac{52}{5}                                                                                                     \\
+            ={}   & \frac{104}{5}
+        \end{aligned}
+    $$
+    Damit beträgt der Flächeninhalt $\frac{104}{5}$ Flächeneinheiten. \qed
+\end{bonus}
+
+\newpage
+\subsection{Längenberechnung}
+
+\begin{algo}{Längenberechnung eines Graphen}
+    Gegeben sind eine Funktion $f\in C[a, b]$ und die Punkte $a, b$.
+
+    Die Länge $L_a^b$ des Graphen der Funktion $f$ ist dann gegeben mit
+    $$
+        L^b_a(f) = \int_a^b \sqrt{1+(f'(x))^2} \dx
+    $$
+\end{algo}
+
+\subsection{Mantelflächenberechnung}
+
+\begin{algo}{Mantelflächenberechnung}
+    Gegeben sind eine Funktion $f\in C[a, b]$ und die Punkte $a, b$.
+
+    Die Mantelfläche $M_a^b$ des Rotationskörpers der Funktion $f$ ist dann gegeben mit
+    $$
+        M^b_a(f) = \int_a^b 2\pi \cdot f(x) \cdot \sqrt{1+(f'(x))^2} \dx
+    $$
+\end{algo}
+
+\subsection{Rotationsvolumenberechnung}
+
+\begin{algo}{Rotationsvolumenberechnung}
+    Gegeben sind eine Funktion $f\in C[a, b]$ und die Punkte $a, b$.
+
+    Das Volumen $M_a^b$ des Rotationskörpers der Funktion $f$ ist dann gegeben mit
+    $$
+        V^b_a(f) = \int_a^b \pi \cdot f(x)^2 \dx
+    $$
+\end{algo}
+
+\subsection{Differentiation von Integralen mit variablen Grenzen}
+
+\begin{algo}{Differentiation von Integralen mit variablen Grenzen}
+    Gegeben sei das Integral
+    $$
+        \int^{h(x)}_{g(x)} f(t)\dt.
+    $$
+    Dann gilt:
+    $$
+        \left(\int^{h(x)}_{g(x)} f(t)\dt\right)' = f(h(x)) \cdot h'(x) - f(g(x))\cdot g'(x).
+    $$
+\end{algo}
+
+\subsection{Parameterintegrale}
+
+\begin{defi}{Parameterintegral}
+    Sei $f(x, t)$ eine von zwei rellen Parametern abhängige Funktion.
+    Die Funktionen $g_1(x)$ und $g_2(x)$ seien stetig auf $[a, b]$ und differenzierbar auf $(a, b)$ sowie $f(x, t)$ integrierbar bez. $t$.
+
+    Dann heißt
+    $$
+        F(x) = \int^{g_2(x)}_{g_1(x)} f(x, t) \dt
+    $$
+    das \emph{Parameterintegral}.
+\end{defi}
+
+\begin{example}{Parameterintegral}
+    $$
+        \begin{aligned}
+            \lim_{x\to\infty} \left( \frac{1}{x} \cdot \int_0^x \frac{t+1}{t^2 + 2} \dt\right)
+             & \overset{\text{de L'Hospital}}={} \lim_{x\to\infty} \left( \frac{1}{1} \cdot \left( \frac{x+1}{x^2 + 2} \cdot 1 - \frac{0+1}{0+2} \cdot 0 \right)\right) \\
+             & ={} \lim_{x\to\infty} \left( \frac{x+1}{x^2 + 2} \right)                                                                                                 \\
+             & ={} 0
+        \end{aligned}
+    $$\qed
+\end{example}
+
+\begin{defi}{Leibniz-Regel}
+    Das Parameterintegral $F(x) = \int^{g_2(x)}_{g_1(x)} f(x, t) \dt$ ist differenzierbar und es ist
+    $$
+        F'(x) = f(x, g_2(x)) \cdot g'_2(x) - f(x, g_1(x)) \cdot g'_1(x) + \int^{g_2(x)}_{g_1(x)} \frac{\mathrm{d} f(x, t)}{\dx}\dt
+    $$
+\end{defi}
+
+\begin{example}{Leibniz-Regel}
+    $$F(x) = \int_{t=x}^{x^2} \frac{1}{t} \cdot \ln (1 + x\cdot t) \dt \quad (x>0)$$
+    $$
+        \begin{aligned}
+            \dFdx
+             & ={} \int_{t=x}^{x^2} \frac{1}{t} \cdot \ln (1 + x\cdot t) \dt                                                                                                                                \\
+             & ={} \frac{1}{x^2} \cdot \ln (1 + x\cdot x^2) \cdot 2x - \left( \frac{1}{x} \cdot \ln (1 + x\cdot x) \cdot 1 \right) + \int^{x^2}_{t=x} \frac{1}{t} \cdot t \cdot \frac{1}{1 + x \cdot t} \dt \\
+             & ={} \frac{2\ln (1 + x^3)}{x} - \frac{\ln(1+x^2)}{x} + \left[ \frac{\ln(1+x\cdot t)}{x} \right]^{x^2}_{t=x}                                                                                   \\
+             & ={} \frac{2\ln (1 + x^3)}{x} - \frac{\ln(1+x^2)}{x} + \frac{\ln(1+x\cdot x^2)}{x} - \frac{\ln(1+x\cdot x)}{x}                                                                                \\
+             & ={} \frac{3\ln (1 + x^3) - 2\ln(1+x^2)}{x}                                                                                                                                                   \\
+        \end{aligned}
+    $$\qed
+\end{example}
+
+\subsection{Uneigentliche Integrale}
+
+\begin{defi}{Uneigentliche Integrale}
+    Sei $f(x)$ beschränkt auf $\R$, dann definieren wir
+    $$
+        \begin{aligned}
+            \int^\infty_a f(x) \dx         & := \lim_{R\to\infty} \int^R_a f(x)\dx                                          \\
+            \int^b_{-\infty} f(x) \dx      & := \lim_{R\to\infty} \int^b_{-R} f(x)\dx                                       \\
+            \int^\infty_{-\infty} f(x) \dx & := \lim_{R\to\infty} \int^R_{c} f(x)\dx + \lim_{R\to\infty} \int^c_{R} f(x)\dx
+        \end{aligned}
+    $$
+\end{defi}
+
+\begin{defi}{Konvergenz von Integralen}
+    Die Integrale heißen \emph{konvergent}, wenn die Grenzwerte existieren, sonst heißen sie \emph{divergent}.
+\end{defi}
+
+\subsection{Absolute Konvergenz}
+
+\begin{defi}{Absolute Konvergenz von Integralen}
+    Sei $\int^b_a f(x) \dx$ ein eigentliches oder uneigentliches Integral.
+
+    Konvergiert
+    $$
+        \int^b_a \abs{f(x)} \dx,
+    $$
+    so heißt $\int^b_a f(x) \dx$ \emph{absolut konvergent}.
+\end{defi}
+
+\subsection{Weitere Konvergenzkriterien}
+
+\begin{defi}{Majoranten- und Minorantenkriterium für unbeschränkte Integrationsintervalle}
+    Sei $\forall x \in [a, \infty) : 0 \leq \abs{f(x)} \leq g(x)$ und konvergiert $\int^\infty_a g(x)$, dann konvergiert $\int^\infty_a f(x) \dx$ und es gilt
+    $$
+        \abs{\int^\infty_a f(x) \dx} \leq \int^\infty_a \abs{f(x)} \dx \leq \int^\infty_a g(x) \dx.
+    $$
+
+    Ist $\forall x\in [a, \infty) : 0\leq g(x) \leq f(x)$ und divergiert $\int^\infty_a g(x) \dx$, so divergiert auch $\int^\infty_a f(x) \dx$.
+\end{defi}
+
+\begin{defi}{Majoranten- und Minorantenkriterium für unbeschränkte Integranden}
+    Sei $\forall x \in [a, b] : 0 \leq \abs{f(x)} \leq g(x)$ und konvergiert $\int^b_a g(x)$, dann konvergiert $\int^b_a f(x) \dx$ und es gilt
+    $$
+        \abs{\int^\infty_a f(x) \dx} \leq \int^b_a \abs{f(x)} \dx \leq \int^b_a g(x) \dx.
+    $$
+
+    Ist $\forall x\in [a, b] : 0\leq g(x) \leq f(x)$ und divergiert $\int^b_a g(x) \dx$, so divergiert auch $\int^b_a f(x) \dx$.
+\end{defi}
+
+\subsection{Das Integralkriterium zur Konvergenz von Reihen}
+
+\begin{defi}{Integralkriterium}
+    Sei $f$ eine auf $[m-1, \infty]$ monoton fallende Funktion mit $\forall x \in [m, \infty) : f(x) \geq 0$, dann ist die Reihe
+    $$
+        \sum^\infty_{n=m} f(n)
+    $$
+    genau dann \emph{konvergent}, wenn
+    $$
+        \int^\infty_m f(x) \dx
+    $$
+    existiert. Es gilt bei Konvergenz
+    $$
+        \sum^\infty_{n=m+1} f(n) \leq \int^\infty_m f(x) \dx \leq \sum^\infty_{n=m} f(n) \leq \int^\infty_{m-1} f(x) \dx.
+    $$
+\end{defi}
+
+\begin{example}{Integralkriterium}
+    \[
+        \sum^\infty_{n=1} \frac{1}{\sqrt[3]{n}} = \sum^\infty_{n=1} f(n)
+    \]
+    $f(n)$ ist offensichtlich auf dem Intervall $[1, \infty )$ streng monoton fallend.
+
+    Damit muss nur geprüft werden, dass das Integral $\int^\infty_{n=1} f(n) \dn$ existiert bzw. konvergiert:
+
+    $$
+        \begin{aligned}
+            \int^\infty_{n=1} f(n) \dn
+             & ={} \int^\infty_{n=1} \frac{1}{\sqrt[3]{n}} \dn                              \\
+             & ={} \lim_{b\to\infty} \left[ \frac{3n^{\frac{2}{3}}}{2} \right]^b_{n=1}      \\
+             & ={} \lim_{b\to\infty} \left( \frac{3b^{\frac{2}{3}}}{2} - \frac{3}{2}\right) \\
+             & ={} \infty
+        \end{aligned}
+    $$
+    Damit divergiert das Integral und die gegebene Summe divergiert ebenfalls.\qed
+\end{example}
+
+\printindex
+\printindex[Beispiele]
+\end{document}
diff --git a/ana2/ana2.pdf b/ana2/ana2.pdf
index 68d018ea2853b4c6a32a4a86fb6b954f4370915b..8c444a85b250f5aafc555eafe3323c0d8d062289 100644
Binary files a/ana2/ana2.pdf and b/ana2/ana2.pdf differ
diff --git a/ana2/ana2.tex b/ana2/ana2.tex
index 838d5e559f7a2f1b4b36163fc277a4209548be5f..d0396b9c844eb14e9ece6871c6160e1f680114f8 100644
--- a/ana2/ana2.tex
+++ b/ana2/ana2.tex
@@ -1,1742 +1,1742 @@
-\documentclass[german]{../spicker}
-
-\usepackage{amsmath}
-\usepackage{polynom}
-\usepackage{array}   % for \newcolumntype macro
-\usepackage{tikz}
-\usepackage{pgfplots}
-\usepackage{multirow,bigdelim}
-\usepgfplotslibrary{fillbetween}
-
-\title{Analysis 2}
-\author{Patrick Gustav Blaneck}
-\makeindex[intoc]
-\makeindex[intoc, name=Beispiele,title=Beispiele]
-
-\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
-\newcommand{\vektor}[1]{\begin{pmatrix*}[c] #1 \end{pmatrix*}}
-\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
-
-\renewcommand{\d}{\,\mathrm{d}}
-
-\renewcommand{\abs}[1]{\left| #1 \right|}
-\newcommand{\cis}[1]{\left( \cos\left( #1 \right) + i \sin\left( #1 \right) \right)}
-\newcommand{\sgn}{\text{sgn}}
-\newcommand{\diff}{\mathrm{d}}
-\newcommand{\dx}{~\mathrm{d}x}
-\newcommand{\du}{~\mathrm{d}u}
-\newcommand{\dv}{~\mathrm{d}v}
-\newcommand{\dw}{~\mathrm{d}w}
-\newcommand{\dt}{~\mathrm{d}t}
-\newcommand{\dn}{~\mathrm{d}n}
-\newcommand{\dudx}{~\frac{\mathrm{d}u}{\mathrm{d}x}}
-\newcommand{\dudn}{~\frac{\mathrm{d}u}{\mathrm{d}n}}
-\newcommand{\dvdx}{~\frac{\mathrm{d}v}{\mathrm{d}x}}
-\newcommand{\dwdx}{~\frac{\mathrm{d}w}{\mathrm{d}x}}
-\newcommand{\dtdx}{~\frac{\mathrm{d}t}{\mathrm{d}x}}
-\newcommand{\ddx}{\frac{\mathrm{d}}{\mathrm{d}x}}
-\newcommand{\dFdx}{\frac{\mathrm{d}F}{\mathrm{d}x}}
-\newcommand{\dfdx}{\frac{\mathrm{d}f}{\mathrm{d}x}}
-\newcommand{\interval}[1]{\left[ #1 \right]}
-
-\newcolumntype{L}{>{$}l<{$}} % math-mode version of "l" column type
-\newcolumntype{R}{>{$}r<{$}} % math-mode version of "r" column type
-\newcolumntype{C}{>{$}c<{$}} % math-mode version of "c" column type
-\newcolumntype{P}{>{$}p<{$}} % math-mode version of "l" column type
-
-\begin{document}
-\maketitle
-\tableofcontents
-\newpage
-
-%\setcounter{section}{1}
-
-\section{Funktionen mehrerer Veränderlicher}
-
-\begin{defi}{Metrik}
-    Metriken definieren Abstände im $\R^n$.
-
-    Eine Funktion $d$ auf einem Vektorraum $V$ mit
-    $$
-        d :  V \times V \to \R, d(\vec{x}, \vec{y})
-    $$
-    heißt \emph{Metrik}, falls gilt
-    \begin{itemize}
-        \item $d(\vec{x}, \vec{y}) = 0 \iff \vec{x} = \vec{y}$
-        \item $d(\vec{x}, \vec{y}) \leq d(\vec{x}, \vec{z}) + d(\vec{y}, \vec{z}), \forall \vec{x}, \vec{y}, \vec{z} \in V$
-              (Dreiecksungleichung)
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Metriken}
-    \begin{itemize}
-        \item Summen-Metrik: $$\sum_{k=1}^n \abs{x_k - y_k}$$
-        \item euklid. Metrik: $$\sqrt{\sum_{k=1}^n \left( x_k - y_k \right)^2}$$
-        \item Maximum-Metrik: $$\max_{k \in \interval{1,n}} \abs{x_k - y_k}$$
-    \end{itemize}
-\end{example}
-
-\begin{defi}{Metrischer Raum}
-    Ein Vektorraum und eine Metrik heißen zusammen \emph{metrischer Raum}.
-\end{defi}
-
-\begin{bonus}{Zusammenhang Metrik \& Norm}
-    Jeder Vektorraum mit einer Metrik $d$ ist normierbar (d.h. dort gibt es eine Norm), falls
-    $$
-        d(a\vec{x}, 0) = \abs{a} d(\vec{x}, 0) \quad \text{und} \quad d(\vec{x}, \vec{y}) = d(\vec{x} -\vec{y}, 0)
-    $$
-
-    Eine Norm wird dann definiert gemäß
-    $$
-        \norm{\vec{x}} := d(\vec{x}, 0)
-    $$
-\end{bonus}
-
-\subsection{Mengen im $\R^n$}
-
-\begin{defi}{$\varepsilon$-Umgebung im $\R^n$}
-    Sei $\norm{\cdot}$ eine Norm im $\R^n$, dann heißt
-    $$
-        U_\varepsilon(\vec{x_0}) := \left\{ \vec{x} \mid \norm{\vec{x} - \vec{x_0}} < \varepsilon \right\}
-    $$
-    die $\varepsilon$-Umgebung von $\vec{x_0}$ bzgl. der Norm $\norm{\cdot}$.
-
-    Sei $D$ eine Menge und $\norm{\cdot}$ eine Norm.
-    Dann
-    \begin{itemize}
-        \item \ldots heißt $\vec{x_0}$ \emph{innerer Punkt} von $D$, falls $\forall \varepsilon > 0 : U_\varepsilon(\vec{x_0}) \in D$.
-        \item \ldots heißt $D$ \emph{offene Menge}, falls alle Punkte von $D$ innere Punkte sind.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Abgeschlossene Mengen}
-    Sei $D$ eine Menge und $\norm{\cdot}$ eine Norm.
-    Dann
-    \begin{itemize}
-        \item \ldots heißt $\vec{x_0}$ \emph{Häufungspunkt} von $D$, falls $\forall \varepsilon > 0$ $U_\varepsilon(\vec{x_0})$ einen Punkt $\vec{x} \neq \vec{x_0}$ enthält.
-        \item \ldots heißt $D$ \emph{abgeschlossene Menge}, falls sie alle Häufungspunkte von $D$ enthält.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Beschränktheit von Mengen}
-    Eine Menge $D \subset \R^n$ heißt \emph{beschränkt}, falls es ein $M \in \R$ gibt mit
-    $$
-        \norm{\vec{x}} < M \quad \forall\vec{x} \in D
-    $$
-
-    Existiert eine solche Schranke nicht, so heißt die Menge \emph{unbeschränkt}.
-\end{defi}
-
-\subsection{Folgen im $\R^n$}
-
-\begin{defi}{Folge}
-    Seien $\vec{x_1}, \vec{x_2}, \ldots, \vec{x_m} \in \R^n$, dann heißt $(\vec{x_n})$ \emph{Folge} im $\R^n$.
-\end{defi}
-
-\begin{defi}{Konvergenz}
-    $(\vec{x_n})$ heißt \emph{konvergent} gegen den \emph{Grenzwert} $\vec{x}$, falls $\forall \varepsilon >0, \exists n_0(\varepsilon)$, so dass $\forall n > n_0(\varepsilon)$ gilt:
-    $$
-        \norm{\vec{x_n} - \vec{x}} < \varepsilon
-    $$
-\end{defi}
-
-\begin{defi}{Cauchy-Folge}
-    $(\vec{x_n})$ heißt \emph{Cauchy-Folge} gegen $\vec{x}$, falls $\forall \varepsilon >0, \exists n_0(\varepsilon)$, so dass $\forall n,m > n_0(\varepsilon)$ gilt:
-    $$
-        \norm{\vec{x_m} - \vec{x_n}} < \varepsilon
-    $$
-
-    Jede Cauchy-Folge ist konvergent.
-\end{defi}
-
-\begin{defi}{Beschränktheit von Folgen}
-    Eine Folge heißt \emph{beschränkt}, wenn die Menge aller Folgenglieder in jeder Komponente beschränkt ist.
-\end{defi}
-
-\begin{defi}{Häufungspunkt}
-    $\vec{x} \in \R^n$ heißt \emph{Häufungspunkt} von $(\vec{x_n})$, falls $\forall \varepsilon > 0$ unendlich viele $\vec{x_i}$ in der $\varepsilon$-Umgebung von $\vec{x}$ liegen.
-
-    Jede unendliche beschränkte Folge ist genau dann konvergent, wenn sie genau einen Häufungs\- punkt besitzt.
-\end{defi}
-
-\begin{defi}{Bolzano-Weierstrass für Folgen}
-    Jede unendliche beschränkte Folge besitzt mindestens einen Häufungspunkt.
-
-    Jede unendliche beschränkte Folge besitzt mindestens eine konvergente Teilfolge.
-\end{defi}
-
-\subsection{Differenzierbarkeit im $\R^n$}
-
-\begin{defi}{Grenzwert im $\R^n$}
-    Wir bezeichnen mit dem Grenzwert
-    $$
-        g = \lim_{\vec{x} \to \vec{x_n}} f(\vec{x})
-    $$
-    den \emph{Grenzwert} jeder gegen $\vec{x_0}$ konvergenten Folge $(\vec{x_n})$, falls dieser existiert und damit insbesondere eindeutig ist.
-\end{defi}
-
-\begin{defi}{Stetigkeit}
-    Sei $U \subset \R^n$ offene Menge, $f : U \to \R, \ \vec{x_0} = \vektor{x_1 & \ldots & x_n}^T \in U$,
-    $f$ heißt in $\vec{x_0}$ \emph{stetig}, wenn
-    $$
-        \lim_{\vec{x} \to \vec{x_0}} f(\vec{x}) = f(\vec{x_0}) = f\left(\lim_{\vec{x} \to \vec{x_0}} \vec{x}\right),
-    $$
-    wobei $\lim_{\vec{x} \to \vec{x_0}} f(\vec{x_0})$ Grenzwert jeder gegen $\vec{x_0}$ konvergenten Folge $(\vec{x_n})$ ist.
-
-    Formal:
-    $$
-        \lim_{\vec{x} \to \vec{x_0}} f(\vec{x}) := \lim_{n \to \infty} f(\vec{x_n})
-    $$
-
-    $f$ heißt \emph{stetig in U}, wenn die Funktion für jedes $\vec{x_0} = \vektor{x_1 & \ldots & x_n}^T \in U$ stetig ist.
-
-    Stetigkeit bedeutet somit insbesondere Stetigkeit in allen Komponenten.
-\end{defi}
-
-\begin{example}{Stetigkeit}
-    Lassen sich folgende Funktionen im Nullpunkt stetig ergänzen und, wenn ja, wie?
-    \begin{enumerate}[a)]
-        \item $f(x,y) = \frac{xy^2}{x^2 + y^8}$
-        \item $f(x,y) = \frac{x^3 + x^2 - y^4 + y^2}{x^2 + y^2}$
-    \end{enumerate}
-
-    \exampleseparator
-
-    \begin{enumerate}[a)]
-        \item
-              Sei die Kurve $x = y^4$ gegeben.
-              Dann gilt:
-              $$
-                  \lim_{y\to 0} f(y) = \lim_{y\to 0} \frac{y^4y^2}{y^8+y^8} = \lim_{y\to 0} \frac{1}{2y^2} = \infty
-              $$
-              Damit ist $f$ im Nullpunkt nicht stetig.\qed
-        \item
-              $f$ ist genau dann \emph{stetig ergänzbar} im Nullpunkt, wenn $\lim_{(x,y) \to (0,0)} f(x,y)$ existiert.
-              $$
-                  \begin{aligned}
-                      \lim_{(x,y) \to (0,0)} f(x,y) & = \lim_{(x,y) \to (0,0)} \frac{x^3 + x^2 - y^4 + y^2}{x^2 + y^2}                                                                                    \\                                                                        \\
-                                                    & =  \lim_{r \to 0} \frac{r^3\cos^3(\varphi) + r^2\cos^2(\varphi) - r^4\sin^4(\varphi) + r^2\sin^2(\varphi)}{r^2\cos^2(\varphi) + r^2\sin^2(\varphi)} \\
-                                                    & =  \lim_{r \to 0} \frac{r\cos^3(\varphi) + \cos^2(\varphi) - r^2\sin^4(\varphi) + \sin^2(\varphi)}{\cos^2(\varphi) + \sin^2(\varphi)}               \\
-                                                    & =  \lim_{r \to 0} r\cos^3(\varphi) + \cos^2(\varphi) - r^2\sin^4(\varphi) + \sin^2(\varphi)                                                         \\
-                                                    & =  0 + 1 - 0 + 0 = 1
-                  \end{aligned}
-              $$
-
-              Damit ist $f$ im Nullpunkt stetig ergänzbar mit $f(0, 0) = 1$.\qed
-    \end{enumerate}
-\end{example}
-
-\begin{defi}{Gleichmäßige Stetigkeit}
-    Eine Funktion $f: D \subset \R^n \to \R$ heißt \emph{gleichmäßig stetig}, wenn es zu jedem $\varepsilon > 0$ ein $\delta = \delta(\varepsilon)$ (unabhängig von $\vec{x_0}$) gibt, so dass
-    $$
-        \abs{f(\vec{x}) - f(\vec{x_0})} < \epsilon, \ \forall \norm{\vec{x} - \vec{x_0}} < \delta
-    $$
-
-    Gleichmäßige Stetigkeit ist wegen der Unabhängigkeit von $\vec{x_0}$ insbesondere Stetigkeit im gesamten Definitionsbereich $D$.
-
-    Ist $f$ beschränkt und abgeschlossen, so ist $f$ gleichmäßig stetig.
-\end{defi}
-
-\begin{defi}{Lipschitz-Stetigkeit}
-    Eine Funktion $f : D \subset \R^n \to \R$ heißt \emph{Lipschitz-stetig}, wenn es eine Konstante $L$ gibt (unabhängig von $\vec{x_0}$), so dass
-    $$
-        \abs{f(\vec{x}) - f(\vec{x_0})} \leq L \norm{\vec{x} - \vec{x_0}}
-    $$
-
-    Ist in einer Norm $L < 1$, so heißt die Abbildung \emph{Kontraktion}.
-
-    Ist eine Funktion $f$ Lipschitz-stetige, so ist $f$ auf ihrem Definitionsbereich $D$ gleichmäßig stetig und in jedem Punkt stetig.
-\end{defi}
-
-\begin{bonus}{Nullstelle}
-    Ein Punkt $\vec{x_0} \in D$ heißt \emph{Nullstelle} einer Funktion $f$, falls $f(\vec{x_0}) = \vec{0}$.
-\end{bonus}
-
-\begin{defi}{Fixpunkt}
-    Ein Punkt $\vec{x^*}\in D$ heißt \emph{Fixpunkt} einer Funktion $\varphi$, falls $\varphi(\vec{x^*}) = \vec{x^*}$.
-\end{defi}
-
-\begin{defi}{Fixpunktsatz von Banach}
-    Sei $\varphi : D \subset \R^n \to \R^n$ mit
-    $$
-        \abs{\varphi(\vec{x}) - \varphi(\vec{y})} \leq L \norm{\vec{x} - \vec{y}} \quad \text{und} \quad L < 1,
-    $$
-    dann hat $\varphi$ \emph{genau einen Fixpunkt}.
-\end{defi}
-
-\subsubsection{Partielle Ableitungen}
-
-\begin{defi}{Partielle Ableitung}
-    Sei $U \subset \R^n$ offene Menge, $f : U \to \R, \ \vec{x_0} = \vektor{x_1 & \ldots & x_n}^T \in U$,
-    $f$ heißt in $\vec{x_0}$ \emph{partiell differenzierbar} nach $x_i$, wenn
-    $$
-        \frac{\partial f}{\partial x_i} = \lim_{h \to 0} \frac{f(x_1, \ldots, x_i + h, \ldots, x_n) - f(x_1, \ldots, x_n)}{h}
-    $$
-    existiert.
-    Der Wert $\frac{\partial f}{\partial x}$ heißt dann die \emph{partielle Ableitung} von $f$ nach $x_i$.
-
-    Eine Funktion heißt \emph{(partiell) differenzierbar}, wenn alle partiellen Ableitungen existieren.
-\end{defi}
-
-\begin{bonus}{Zusammenhang Differenzierbarkeit und Stetigkeit}
-    $f$ heißt \emph{stetig partiell differenzierbar}, wenn alle partiellen Ableitungen in $\vec{x_i}$ stetige Funktionen (und insbesondere beschränkt) sind.
-
-    Ist $f$ in $U$ partiell differenzierbar und in $\vec{x_0} \in U$ \emph{stetig partiell differenzierbar}, so ist $f$ in $\vec{x_0}$ stetig.
-\end{bonus}
-
-\begin{defi}{Gradient}
-    Sei $U \subset \R^n$ offene Menge, $F : U \to \R$ partiell differenzierbar, $\vec{x_0} = \vektor{x_1 & \ldots & x_n}^T \in U$, dann heißt
-    $$
-        \nabla f(x_1, \ldots, x_n) = \vektor{\frac{\partial f}{\partial x_1}(x_1, \ldots, x_n) \\ \vdots \\ \frac{\partial f}{\partial x_n}(x_1, \ldots, x_n)}
-    $$
-    der \emph{Gradient von f in} $\vec{x_0}$.
-\end{defi}
-
-\begin{bonus}{Rechenregeln für Gradienten}
-    Sei $U \subset \R^n$ offene Menge, $f, g : U \to \R$ differenzierbar.
-    Dann gilt:
-    $$
-        \begin{aligned}
-             & \nabla (f + g)    &  & = \nabla (f) + \nabla (g)                 \\
-             & \nabla (\alpha f) &  & = \alpha \cdot \nabla (f)                 \\
-             & \nabla (fg)       &  & = g \cdot \nabla (f) + f \cdot \nabla (g)
-        \end{aligned}
-    $$
-\end{bonus}
-
-\begin{example}{Gradient}
-    Berechnen Sie den Gradienten für $f(x, y, z) = x^3 + y^2 + z$ an der Stelle $(1, 2, 3)$.
-
-    \exampleseparator
-
-    Zuerst berechnen wie die partiellen Ableitungen $f_x$, $f_y$ und $f_z$:
-    $$
-        \begin{aligned}
-            f_x & = 3x^2 \\
-            f_y & = 2y   \\
-            f_z & = 1
-        \end{aligned}
-    $$
-
-    Damit erhalten wir dann den Gradienten $\nabla f$ an der Stelle $(1, 2, 3)$ mit:
-    $$
-        \nabla f(1, 2, 3) = \vektor{f_x(1, 2, 3) \\ f_y(1, 2, 3) \\ f_z(1, 2, 3)}
-        = \vektor{3 \\ 4 \\ 1}
-    $$\qed
-\end{example}
-
-\begin{defi}{Tangentialebene im $\R^3$}
-    Sei $z = f(x, y)$ eine stetig partiell differenzierbare Funktion in zwei Unbekannten und $z_0 = f(x_0, y_0)$ ein fester Punkt.
-
-    Dann ist die Tangentialebene im Punkt $(x_0, y_0, z_0)$ gegeben mit:
-    $$
-        T = \vektor{x_0 \\ y_0 \\ z_0} + \lambda \cdot \vec{v_1} + \mu \cdot \vec{v_2},
-    $$
-    wobei $\vec{v_1}$ und $\vec{v_2}$ verschiedene Tangentenvektoren sind.
-\end{defi}
-
-\begin{algo}{Tangentialebene im $\R^3$}
-    Betrachten wir die Tangenten entlang der Koordinatenachsen, so erhalten wir
-    $$
-        T = \vektor{x_0 \\ y_0 \\ z_0} + \lambda \vektor{1 \\ 0 \\ f_x(x_0, y_0)} + \mu \vektor{0 \\ 1 \\ f_y(x_0, y_0)}
-    $$
-    oder äquivalent
-    $$
-        T(x, y) = f(x_0, y_0) + f_x(x_0, y_0) (x-x_0) + f_y(x_0, y_0) (y-y_0)
-    $$
-\end{algo}
-
-\begin{bonus}{Tangentialebene im $\R^n$}
-    Die Tangentialebene im $\R^n$ einer Funktion $f$ in $\vec{x} \in \R^n$ an der Stelle $\vec{x_0} = \vektor{x_1 & \ldots & x_n}^T$ analog definiert durch
-    $$
-        T(\vec{x}) = f(\vec{x_0}) + \nabla f (\vec{x} - \vec{x_0})
-    $$
-\end{bonus}
-
-\begin{example}{Tangentialebene}
-    Gegeben sei die Funktion
-    $$
-        f(x, y) = (x^2 + y^2 -2)^2
-    $$
-    Geben Sie die Tangentialebene im Punkt $(x_0, y_0) = (0,2)$ an.
-
-    \exampleseparator
-
-    Zuerst berechnen wie die partiellen Ableitungen $f_x$ und $f_y$:
-    $$
-        \begin{aligned}
-            f_x & = 4x(x^2 + y^2 -2) \\
-            f_y & = 4y(x^2 + y^2 -2)
-        \end{aligned}
-    $$
-    $$
-        z_0 = f(x_0, y_0) = f(0, 2) = 4
-    $$
-    Damit ergibt sich dann die Tangentialebene von $f$ am Punkt $(0, 2)$ mit:
-    $$
-        \begin{aligned}
-            E     & = \vektor{x_0 \\ y_0 \\ z_0} + \lambda \vektor{1 \\ 0 \\ f_x(x_0, y_0)} + \mu \vektor{0 \\ 1 \\ f_y(x_0, y_0)} \\
-            \quad & = \vektor{0   \\ 2 \\ 4} + \lambda \vektor{1 \\ 0 \\ 0} + \mu \vektor{0 \\ 1 \\ 16}  \quad \lambda, \mu \in \R
-        \end{aligned}
-    $$\qed
-\end{example}
-
-\begin{defi}{Richtungsableitung}
-    Die Ableitung in Richtung des Vektors $\vec{v} = \vektor{v_1, \ldots, v_n}^T$ mit $\norm{\vec{v}} = 1$ heißt \emph{Richtungsableitung} $D_{\vec{v}}(f)$ von $f$ in Richtung von $\vec{v}$.
-    Es ist
-    $$
-        \begin{aligned}
-            \frac{\partial f}{\partial v} := D_{\vec{v}}(f) = & \lim_{h\to 0} \frac{f(\vec{x} + h\vec{v}) - f(\vec{x})}{h}                      \\
-            =                                                 & \lim_{h\to 0} \frac{f(x_1 + hv_1, \ldots, x_n + hv_n) - f(x_1, \ldots, x_n)}{h}
-        \end{aligned}
-    $$
-\end{defi}
-
-\begin{algo}{Richtungsableitung}
-    Sei $\vec{v} \in \R^n$ mit $\norm{\vec{v}} = 1$. Dann ist die Richtungsableitung von $f$ im Punkt $\vec{x_0}$ in Richtung $\vec{v}$ gegeben mit
-    $$
-        \frac{\partial f}{\partial v} = D_{\vec{v}}(f) = \scalarprod{\nabla (f(\vec{x_0})) , \vec{v}}
-    $$
-\end{algo}
-
-\begin{example}{Richtungsableitung}
-    Berechnen Sie die Richtungsableitung der Funktion
-    $$
-        f(x, y) = x^2y - y^3x + 1
-    $$
-    im Punkt $(x_0, y_0) = (1, 2)$
-    in Richtung des Vektors $\vec{w} = \vektor{3 \\ 2}$.
-
-    \exampleseparator
-
-    Die Richtungsableitung von $f$ im Punkt $(x_0, y_0)$ in Richtung $\vec{v}$ ($\norm{\vec{v}} = 1$) ist gegeben mit
-    $$
-        \begin{aligned}
-            D_{\vec{v}}(f) & = \scalarprod{\nabla f(x_0, y_0), \vec{v}}
-        \end{aligned}
-    $$
-
-    Zuerst berechnen wir die partiellen Ableitungen $f_x$ und $f_y$:
-    $$
-        \begin{aligned}
-            f_x = 2xy - y^3   & \implies f_x(x_0, y_0) = f_x(1, 2) = -4  \\
-            f_y = x^2 - 3y^2x & \implies f_y(x_0, y_0) = f_y(1, 2) = -11
-        \end{aligned}
-    $$
-
-    Sei nun $\vec{v} = \frac{\vec{w}}{\norm{\vec{w}}}$:
-    $$
-        \vec{v} = \frac{\vec{w}}{\norm{\vec{w}}} = \frac{1}{\sqrt{13}} \vektor{3  \\ 2}
-    $$
-    Damit können wir nun die Richtungsableitung wie folgt bilden:
-    $$
-        D_{\vec{v}}(f) = \scalarprod{\nabla f(x_0, y_0), \vec{v}} = \scalarprod{\vektor{-4                   \\ -11},  \frac{1}{\sqrt{13}} \vektor{3  \\ 2}}=  -\frac{34}{\sqrt{13}}
-    $$\qed
-\end{example}
-
-\begin{algo}{Extremster Anstieg}
-    Insgesamt gilt, falls wir nur die Richtung (ohne Normierung) betrachten:
-    $$
-        \vec{v} = \frac{\nabla f}{\norm{ \nabla f }} \quad \text{ist die Richtung des steilsten Anstiegs von} \ f
-    $$
-    $$
-        \vec{v} = -\frac{\nabla f}{\norm{ \nabla f }} \quad \text{ist die Richtung des steilsten Abstiegs von} \ f
-    $$
-\end{algo}
-
-
-\subsubsection{Das vollständige Differential}
-
-\begin{defi}{Vollständiges Differential}
-    Unter dem \emph{vollständigen Differential} der Funktion $z = f(x, y)$ im Punkt $(x_0, y_0)$ versteht man den Ausdruck
-    $$
-        \d z = f_x(x_0, y_0) \d x + f_y(x_0, y_0) \d y
-    $$
-\end{defi}
-
-\begin{algo}{Absoluter Fehler}
-    Es gilt für $z = f(x_1, \ldots, x_n)$ der \emph{absolute Fehler}:
-    $$
-        \Delta z_{\max} \leq \sum_{i=1}^n \abs{f_{x_i}} \cdot \abs{\Delta x_i}
-    $$
-\end{algo}
-
-\begin{algo}{Relativer Fehler}
-    Es gilt für $z = f(x, y) = c \cdot x^a \cdot y^b$ anhand der möglichen relativen Eingabefehler $\frac{\Delta x}{x}$ und $\frac{\Delta y}{y}$ der \emph{relative Fehler}:
-    $$
-        \frac{\Delta z}{z} \leq a \cdot \abs{\frac{\Delta x}{x}} + b \cdot \abs{\frac{\Delta y}{y}}
-    $$
-\end{algo}
-
-\begin{example}{Relativer Fehler}
-    Bei der Berechnung einer Fläche $f(x, y) = 5x^2 \cdot y$ werde ein relativer Messfehler von $10\%$ in $x$ und $3\%$ in $y$ gemacht.
-    Wie ist der relative Fehler des Ergebnisses?
-
-    \exampleseparator
-
-    $z := f(x, y) = 5x^2 \cdot y \qquad \left( c \cdot x^a \cdot y^b\right)$
-
-    Es ist der relative Fehler gegeben mit
-    $$
-        \frac{\Delta z}{z} \leq a \cdot \abs{\frac{\Delta x}{x}} + b \cdot \abs{\frac{\Delta y}{y}} = 2 \cdot 10\% + 1\cdot 3\% = 23\%
-    $$\qed
-\end{example}
-
-\begin{defi}{Kurve}
-    Seien $x(t)$ und $y(t)$ in $t$ stetige Funktionen.
-    Die Menge
-    $$
-        \left\{ (x, y) \mid x = x(t), \ y=y(t), \ t\in \R \right\}
-    $$
-    heißt \emph{Kurve}.
-    Die Darstellung $t\to \R^2$
-    $$
-        \vec{x}(t) = \vektor{x(t) \\ y(t)}
-    $$
-    heißt \emph{Parameterdarstellung der Kurve}.
-\end{defi}
-
-\begin{defi}{Kettenregel für Funktionen mit einem Parameter}
-    Sei $z = f(\vec{x}) = f(\vec{x}(t))$ und $\vec{x}(t)$ stetig in jeder Komponente $x_i$. Dann gilt:
-    $$
-        \frac{\d z}{\d t} = \sum_{i=1}^n \frac{\partial z}{\partial x_i} \cdot \frac{\d x_i}{\d t}
-    $$
-\end{defi}
-
-\begin{defi}{Kettenregel für Funktionen mit zwei Parametern}
-    Sei $z = f(\vec{x}) = f(\vec{x}(u,v))$ und $\vec{x}(u,v)$ stetig in jeder Komponente $x_i$. Dann gilt:
-    $$
-        \frac{\partial z}{\partial u} = \sum_{i=1}^n \frac{\partial z}{\partial x_i} \cdot \frac{\d x_i}{\d u}
-    $$
-    $$
-        \frac{\partial z}{\partial v} = \sum_{i=1}^n \frac{\partial z}{\partial x_i} \cdot \frac{\d x_i}{\d v}
-    $$
-\end{defi}
-
-\begin{defi}{Implizite Differentiation}
-    Seien $F(x, f(x)) = F(x, y)$ und $f(x) = y$ differenzierbar.
-    Gilt $F(x_0, y_0) = 0$, dann wird $y$ \emph{implizit differenziert} mit
-    $$
-        y' = -\frac{F_x(x_0, y_0)}{F_y(x_0, y_0)}
-    $$
-
-    Es gilt:
-    \begin{itemize}
-        \item Die implizite Differentiation kann insbesondere angewendet werden, wenn sich eine Funktion $F(x, y)=0$ nicht oder nicht einfach nach $y$ umstellen lässt.
-        \item Die Funktion muss ggf. auf die Form $F(x, y) = 0$ gebracht werden.
-        \item Es ist immer zu testen, ob der vorgegebene Punkt die Bedingung $F(x_0, y_0) = 0$ erfüllt.
-        \item Die Rechnung kann an einem beliebigen Punkt $(x_0, y_0)$ durchgeführt werden und somit auch eine Ableitungsfunktion berechnen.
-    \end{itemize}
-\end{defi}
-
-\subsubsection{Partielle Ableitungen höherer Ordnung}
-
-\begin{defi}{Satz von Schwarz}
-    Sind die partiellen Ableitungen $k$-ter Ordnung einer Funktion stetige Funktionen, so darf die Reihenfolge der Differentiation beliebig vertauscht werden.
-\end{defi}
-
-\begin{defi}{Divergenz}
-    Wir bezeichnen die \emph{Divergenz} einer Funktion $f$ mit
-    $$
-        \operatorname{div} f := \nabla \cdot f = \vektor{\frac{\partial}{\partial x_1} \\ \vdots \\ \frac{\partial}{\partial x_n}} \vektor{f_1(x_1, \ldots, x_n) \\ \vdots \\ f_n(x_1, \ldots, x_n)} = \sum_{i=1}^n \frac{\partial f_i(x_1, \ldots, x_n)}{\partial x_i}
-    $$
-\end{defi}
-
-\begin{defi}{Rotation}
-    Wir bezeichnen die \emph{Rotation} einer Funktion $f$ mit
-    $$
-        \operatorname{rot} f := \nabla \times f = \vektor{\frac{\partial}{\partial x_1} \\ \vdots \\ \frac{\partial}{\partial x_n}} \times \vektor{f_1(x_1, \ldots, x_n) \\ \vdots \\ f_n(x_1, \ldots, x_n)}
-    $$
-\end{defi}
-
-\begin{bonus}{Quellen und Senken}
-    Die Punkte mit $\operatorname{div} f > 0$ heißen \emph{Quellen} des Vektorfeldes, die mit $\operatorname{div} f < 0$ heißen \emph{Senken}.
-
-    Gilt stets $\operatorname{div} f = 0$, so heißt die Funktion \emph{quellenfrei}.
-
-    Gilt $\operatorname{rot} f = 0$, so heißt die Funktion \emph{wirbelfrei}.
-\end{bonus}
-
-\begin{defi}{Jacobi-Matrix}
-    Die Matrix
-    $$
-        J = \vektor{\frac{\partial f_1}{x_1} & \ldots & \frac{\partial f_1}{x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_n}{x_1} & \ldots & \frac{\partial f_n}{x_n}}
-    $$
-    heißt \emph{Jacobi-Matrix} von $f$.
-\end{defi}
-
-\subsubsection{Taylorentwicklung für $f(x, y)$}
-
-\begin{defi}{Quadratische Approximation}
-    Für $f(x, y)$ ist die \emph{quadratische Approximation} gegeben mit
-    $$
-        \begin{aligned}
-            f(x, y) \quad = \quad & f(x_0, y_0) + f_x(x_0, y_0) (x-x_0) + f_y(x_0, y_0) (y-y_0)                                                    \\
-            + \quad               & \frac{f_{xx}(x_0, y_0) (x-x_0)^2}{2} + f_{xy}(x_0, y_0) (x-x_0) (y-y_0) + \frac{f_{yy}(x_0, y_0) (y-y_0)^2}{2}
-        \end{aligned}
-    $$
-\end{defi}
-
-\subsubsection{Extremwerte ohne Nebenbedingungen}
-
-\begin{algo}{Lokale Extrema ohne Nebenbedingungen im $\R^2$}
-    \begin{enumerate}
-        \item Berechne $f_x(x,y)$ und $f_y(x, y)$ und suche diejenigen Stellen $(x_0, y_0)$ mit
-              $$
-                  f_x(x_0, y_0) = f_y(x_0, y_0) = 0
-              $$
-              Diese Stellen sind die \emph{Kandidaten} für lokale Extrema.
-        \item Berechne für jeden Kandidaten $(x_0, y_0)$ die Werte $f_{xx}(x_0, y_0)$, $f_{xy}(x_0, y_0)$ und $f_{yy}(x_0, y_0)$ und daraus den Wert
-              $$
-                  d := f_{xx}(x_0, y_0) \cdot f_{yy}(x_0, y_0) - \left(f_{xy}(x_0, y_0)\right)^2
-              $$
-        \item Dann gilt:
-              \subitem $f_{xx}(x_0, y_0) > 0 \ \land \ d > 0 \implies$ \emph{lokales Minimum}
-              \subitem $f_{xx}(x_0, y_0) < 0 \ \land \ d > 0 \implies$ \emph{lokales Maximum}
-              \subitem $d < 0 \implies$ \emph{Sattelpunkt}
-              \subitem $d = 0 \implies$ höhere Ableitung entscheidet
-    \end{enumerate}
-\end{algo}
-
-\begin{defi}{Hesse-Matrix im $\R^2$}
-    Die \emph{Hesse-Matrix} im $\R^2$ ist definiert mit
-    $$
-        H = \vektor{f_{xx}(x_0, y_0) & f_{xy}(x_0, y_0) \\ f_{xy}(x_0, y_0) & f_{yy}(x_0, y_0)}
-    $$
-
-    Ist $H$ \emph{positiv definit}, so liegt ein Minimum vor, ist $H$ \emph{negativ definit} ein Maximum und bei \emph{indefinitem} $H$ ein Sattelpunkt.
-
-    Es gilt:
-    \begin{itemize}
-        \item $H$ ist positiv definit $\iff f_{xx}(x_0, y_0) < 0 \ \land \det H > 0$
-        \item $H$ ist negativ definit $\iff f_{xx}(x_0, y_0) > 0 \ \land \det H > 0$
-        \item $H$ indefinit $\iff \det H < 0$
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Hesse-Matrix im $\R^n$}
-    Die \emph{Hesse-Matrix} im $\R^n$ ist definiert mit
-    $$
-        H = \vektor{\frac{\partial^2 f}{\partial x_1^2} & \ldots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial^2 f}{\partial x_n \partial x_1} & \ldots & \frac{\partial^2 f}{\partial x_n^2}}
-    $$
-
-    Ist $H$ \emph{positiv definit}, so liegt ein Minimum vor, ist $H$ \emph{negativ definit} ein Maximum und bei \emph{indefinitem} $H$ ein Sattelpunkt.
-
-    Es gilt:
-    \begin{itemize}
-        \item $H$ ist positiv definit $\iff$ alle \emph{Unterdeterminanten} (links oben beginnend) sind positiv
-        \item $H$ ist negativ definit $\iff$ alle \emph{Unterdeterminanten} (links oben beginnend) haben wechselndes Vorzeichen (beginnend mit negativem Vorzeichen)
-        \item $H$ indefinit $\iff$ sonst
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Lokale Extrema ohne Nebenbedingungen}
-    Untersuchen Sie die Funktion
-    $$
-        v(x, y, z) = xy - z^4 -2(x^2 + y^2 -z^2)
-    $$ auf lokale Extrema und Sattelpunkte.
-
-    \exampleseparator
-
-    $v(x, y, z) = xy - z^4 -2(x^2 + y^2 -z^2) = xy - z^4 -2x^2 -2y^2 + 2z^2$
-
-    Wir berechnen zuerst die potentiellen Kandidaten.
-    Für diese muss gelten
-    $$
-        \nabla v(x, y, z) = \vektor{v_x(x, y, z)      \\ v_y(x, y, z)\\ v_z(x, y, z)} = \vec{0}
-    $$
-    $$
-        \iff \vektor{ y -4x \\ x -4y \\ -4z^3 +4z} = \vektor{0 \\ 0 \\ 0} \iff \vektor{y \\ x \\ -z(z^2 +1)} = \vektor{4x \\ 4y \\ 0}
-    $$
-    Wir haben offensichtlich drei Gleichungen gegeben.
-
-    Wir erkennen aus \Rnum{3} direkt, dass $z \in \{-1, 0, 1\}$ gelten muss und aus \Rnum{2} und \Rnum{1}, dass $x = y = 0$.
-
-    Damit erhalten wir die drei Kandidatentupel:
-    \begin{itemize}
-        \item $(x_1, y_1, z_1) = (0, 0, -1)$,
-        \item $(x_2, y_2, z_2) = (0, 0, 0)$,
-        \item $(x_3, y_3, z_3) = (0, 0, 1)$.
-    \end{itemize}
-
-    Wir bilden nun die Hesse-Matrix:
-    $$
-        \begin{aligned}
-            f_{xx} = -4 \qquad         & f_{xy} = 1          &  & f_{xz} = 0         \\
-            f_{yx} = f_{xy} = 1 \qquad & f_{yy} = -4         &  & f_{yz} = 0         \\
-            f_{zx} = f_{xz} = 0 \qquad & f_{zy} = f_{yz} = 0 &  & f_{zz} = 12z^2 + 4
-        \end{aligned}
-    $$
-
-    $$
-        H = \vektor{f_{xx} & f_{xy} & f_{xz} \\ f_{yx} & f_{yy} & f_{yz} \\ f_{zx} & f_{zy} & f_{zz}} = \vektor{-4 & 1 & 0 \\ 1 & -4 & 0 \\ 0 & 0 & -12z^2 + 4}
-    $$
-
-    Es gilt für die Unterdeterminanten:
-    $$
-        \begin{aligned}
-            \det H_1 & = -4                                                                 \\
-            \det H_2 & = 15                                                                 \\
-            \det H   & = (-12z^2 + 4) \cdot \det H_2 = (-12z^2 + 4) \cdot 15 = -180z^2 + 60
-        \end{aligned}
-    $$
-
-    Es gilt weiterhin
-    $$
-        \det H \leq 0 \iff -180z^2 + 60 \leq 0 \iff z^2 \leq \frac{1}{3}
-    $$
-
-    Damit ist die Hesse-Matrix für alle $\abs{z} \leq \frac{1}{9}$ indefinit und sonst negativ definit.
-
-    Damit sind die Kandidatentupel $(x_1, y_1, z_1) = (0, 0, -1)$ und $(x_3, y_3, z_3) = (0, 0, 1)$ Maxima und $(x_2, y_2, z_2) = (0, 0, 0)$ ein Sattelpunkt. \qed
-\end{example}
-
-\subsubsection{Extremwerte mit Nebenbedingungen}
-
-\begin{defi}{Lagrange-Funktion}
-    Gegeben seien eine Funktion $f(x, y)$ und eine Nebenbedingung $g(x, y) = 0$.
-    Dann ist  die \emph{Lagrange-Funktion} gegeben mit
-    $$
-        L(x, y, \lambda) = f(x, y) + \lambda g(x, y)
-    $$
-
-    Es gilt damit:
-    $$
-        L_\lambda = g(x, y) \quad \land \quad g(x, y) = 0 \implies L(x,y,\lambda) = f(x, y)
-    $$
-\end{defi}
-
-\begin{algo}{Lokale Extrema mit Nebenbedingung im $\R^2$}
-    \begin{enumerate}
-        \item Berechne die Kandidaten wie in freien Optimierungen mit
-              $$
-                  \nabla (L) = \vec{0}
-              $$
-        \item Aufstellen der geränderten Hesse-Matrix für die drei Unbekannten mit
-              $$
-                  H = \vektor{L_{xx} & L_{xy} & g_x \\ L_{xy} & L_{yy} & g_y \\ g_x & g_y & 0}
-              $$
-        \item Dann gilt:
-              \subitem $\det H > 0 \implies$ \emph{Maximum}
-              \subitem $\det H < 0 \implies$ \emph{Minimum}
-              \subitem $\det H = 0 \implies$ keine Entscheidung möglich
-    \end{enumerate}
-\end{algo}
-
-\subsubsection{Parametrische Funktionen und Kurvenintegrale}
-
-\begin{defi}{Tangentenvektor}
-    Der \emph{Tangentenvektor} einer Kurve $\vec{x}(t)$ ist gegeben mit
-    $$
-        \vec{x'}(t) = \vektor{x_1'(t) \\ \vdots \\ x_n'(t)}
-    $$
-\end{defi}
-
-\begin{defi}{Tangente}
-    Die \emph{Tangente} einer Kurve $\vec{x}(t)$ ist gegeben mit
-    $$
-        T(t) = \vec{x}(t) + \lambda\vec{x'}(t)
-    $$
-\end{defi}
-
-\begin{defi}{Arbeitsintegral}
-    Seien die Kraft $F(\vec{x}(t))$ und ein Zeitintervall $t \in \interval{a,b}$, oder analog Start- und Endpunkte $\vec{A} = \vec{x}a)$ bzw. $\vec{B} = \vec{x}(b)$, gegeben.
-
-    Dann ist die \emph{Arbeit} gegeben mit
-    $$
-        W = \int^b_a F(\vec{x}(t)) \cdot \vec{x'}(t) \d t
-    $$
-\end{defi}
-
-\begin{example}{Arbeitsintegral}
-    Gegeben sei die Kurve $\vec{X}(t) = \vektor{t \\ t^2 \\ t^3}$.
-    Berechnen Sie die Arbeit im Vektorfeld
-    $$
-        \vec{F}(x, y, z) = \vektor{x+yz \\ y + xz \\ z + xy}
-    $$
-    entlang der Kurve.
-
-    \exampleseparator
-
-    Die Arbeit von Zeitpunkt $t=a$ bis Zeitpunkt $t=b$ ist gegeben mit
-    $$
-        W = \int^b_a \vec{F} (\vec{X}(t)) \cdot \vec{X}'(t) \dt
-    $$
-    Wir berechnen:
-    $$
-        \begin{aligned}
-            W =\quad & \int^b_a \vec{F} (\vec{X}(t)) \cdot \vec{X}'(t) \dt                                                                    \\
-            =\quad   & \int^b_a \vektor{t + t^5                                                                                               \\ t^2 + t^4 \\ 2t^3} \cdot \vektor{1 \\ 2t \\ 3t^2} \dt \\
-            =\quad   & \int^b_a \left( t + t^5 + 2t(t^4 + t^2) + 3t^2 \cdot 2t^3\right)  \dt                                                  \\
-            =\quad   & \int^b_a \left(9t^5 + 2t^3 + t\right) \dt                                                                              \\
-            =\quad   & \left[ \frac{3t^6}{2} + \frac{t^4}{2} + \frac{t^2}{2} \right]^b_a     = \frac{3(b^6 - a^6) + b^4 + b^2 - a^4 - a^2}{2}
-        \end{aligned}
-    $$\qed
-\end{example}
-
-\begin{defi}{Potentialfunktion}
-    Sei $f : \R^n \to \R^n$ stetig differenzierbar.
-    $f$ heißt \emph{Gradientenfeld}, wenn es eine skalare Funktion $V$ gibt, mit
-    $$
-        \nabla (V) = f
-    $$
-
-    Die Funktion $V$ heißt dann \emph{Potentialfunktion} von $f$ mit
-    $$
-        V = \int f
-    $$
-
-    Es gilt:
-    \begin{itemize}
-        \item Im $\R^2$:
-              $$
-                  \frac{\partial f_1}{\partial y} = \frac{\partial f_2}{x}
-              $$
-        \item Im $\R^3$:
-              $$
-                  \operatorname{rot} f = 0
-              $$
-        \item Im $\R^n$ für die Jacobimatrix $J$
-              $$
-                  J = J^T
-              $$
-    \end{itemize}
-\end{defi}
-
-\section{Mehrdimensionale Integration}
-
-\subsection{Doppelintegrale}
-
-\begin{defi}{Integral im $\R^2$}
-    Bezeichnet $A$ das Rechteck $\interval{x_0, x_1} \times \interval{y_0, y_1}$, so ist das \emph{Integral} von $f$ über das Gebiet $A$ gegeben mit
-    $$
-        \int^{x_1}_{x_0}\int^{y_1}_{y_0} f(x, y) \d y\d x = \int_A f \d A = \int\int_A f \d A
-    $$
-\end{defi}
-
-\begin{algo}{Integration über kartesische krummlinige Bereiche}
-    Seien eine \emph{obere} und eine \emph{untere Funktion} $f_u(x)$ und $f_v(x)$ gegeben und in der zweiten Dimension das Intervall $\interval{a,b}$, dann gilt für das Integral im entsprechenden Integrationsbereich
-    $$
-        \int_{x = a}^{b}\int_{y = f_u(x)}^{f_o(x)} f(x, y) \d y\d x
-    $$
-\end{algo}
-
-\begin{algo}{Flächeninhalt einer Grundfläche eines kartesischen krummlinigen Bereiches}
-    Der Flächeninhalt $F$ einer Grundfläche $A$ ergibt sich durch Integration mit $f(x, y) = 1$, also
-    $$
-        F = \int_A 1 \d A
-    $$
-\end{algo}
-
-\begin{example}{Integration über kartesische krummlinige Bereiche}
-    Berechnen Sie das Volumen der Funktion $f(x, y) = x+y$ über die Fläche
-    $$
-        A = \{(x, y) \in \R^2 \mid 1 \leq x^2 + 4y^2, x^2 + y^2 \leq 1, x \geq 0, y\geq 0\}
-    $$
-    Skizzieren Sie zunächst die Fläche.
-
-    \exampleseparator
-
-    \begin{center}
-        \begin{tikzpicture}[scale=1]
-            \begin{axis}[
-                    width=15cm,
-                    xmin=-1.5,xmax=1.5,
-                    xtick distance=1,
-                    xlabel = $x$,
-                    ymin=-1.5,ymax=1.5,
-                    ytick distance=1,
-                    ylabel = $y$,
-                    axis equal,
-                    grid=both,
-                    axis lines = middle,
-                    disabledatascaling
-                ]
-                %\draw [name path=A] (axis cs:0,-2) arc[start angle=-90, end angle=90, radius={transformdirectionx(2)}];
-                %\draw [name path=B] (axis cs:0,-3) arc[start angle=-90, end angle=90, radius={transformdirectionx(3)}];
-
-                \draw [name path=A1] (axis cs:1,0) arc[start angle=0, end angle=180, radius={transformdirectionx(1)}];
-                \draw [name path=A2] (axis cs:-1,0) arc[start angle=180, end angle=360, radius={transformdirectionx(1)}];
-                %\draw [name path=B] (axis cs:0,0) circle [x radius=1, y radius=1/4];
-
-                \draw [name path=B1] (axis cs:1,0) arc(0:180:1 and 1/2);
-                \draw [name path=B2] (axis cs:-1,0) arc(180:360:1 and 1/2);
-
-                \tikzfillbetween[of=A1 and B1, soft clip={domain=0:1}]{red, opacity=0.75};
-                %\tikzfillbetween[of=A2 and B2]{red, opacity=0.5};
-            \end{axis}
-        \end{tikzpicture}
-    \end{center}
-
-    Wir sehen, dass die Ellipsengleichung die untere und die Kreisgleichung die obere Schranke bilden.
-    Damit formen wir unser Integrationsgebiet wie folgt um:
-    $$
-        A = \left\{(x, y) \in \R^2 \mid 0 \leq x \leq 1, \frac{\sqrt{1-x^2}}{2} \leq y \leq \sqrt{1-x^2} \right\}
-    $$
-\end{example}
-
-\begin{example}{Integration über kartesische krummlinige Bereiche (Fortsetzung)}
-    Dann können wir wie folgt die Fläche berechnen:
-    $$
-        \begin{aligned}
-            \int\int_A (x+y) \d x \d y & = \int^1_0\int^{\sqrt{1-x^2}}_{\frac{\sqrt{1-x^2}}{2}} (x+y) \d y \d x                                                                                                       \\
-                                       & = \int^1_0 \left[xy + \frac{y^2}{2}\right]^{\sqrt{1-x^2}}_{\frac{\sqrt{1-x^2}}{2}}  \d x                                                                                     \\
-                                       & = \int^1_0 \left(x\sqrt{1-x^2} + \frac{1-x^2}{2} - \left( \frac{x\sqrt{1-x^2}}{2} - \frac{1-x^2}{8}\right)\right)  \d x                                                      \\
-                                       & = \int^1_0 \left(\frac{x\sqrt{1-x^2}}{2} + \frac{3(1-x^2)}{8}\right)  \d x                                                                                                   \\
-                                       & = \frac{1}{2}\int^1_0 x\sqrt{1-x^2} \d x + \frac{3}{8} \int^1_0 (1-x^2) \d x                                                                                                 \\
-                                       & \overset{\footnote{$u = 1-x^2 \implies \frac{\d u}{\d x} = -2x \iff \d x = -\frac{\d u}{2x}$}}{=} -\frac{1}{4}\int^1_{x=0} \sqrt{u} \d u + \frac{3}{8} \int^1_0 (1-x^2) \d x \\
-                                       & = -\frac{1}{4} \left[ \frac{2\sqrt{1-x^2}}{3} \right]^1_{0} + \frac{3}{8} \int^1_0 (1-x^2) \d x                                                                              \\
-                                       & = \frac{1}{6} + \frac{3}{8} \int^1_0 (1-x^2) \d x                                                                                                                            \\
-                                       & = \frac{1}{6} + \frac{3}{8} \left[ x-\frac{x^3}{3} \right]^1_0                                                                                                               \\
-                                       & = \frac{1}{6} + \frac{3}{8} \left( 1-\frac{1}{3} \right)                                                                                                                     \\
-                                       & = \frac{5}{12}                                                                                                                                                               \\
-        \end{aligned}
-    $$\qed
-\end{example}
-
-\begin{algo}{Schwerpunkt einer Grundfläche eines homogenen Gebietes}
-    Der Schwerpunkt mit den Schwerpunktskoordinaten $(x_s, y_s)$ einer Fläche mit homogener Dichte ergibt sich mit der Flächenmaßzahl $F$ aus
-    $$
-        x_s = \frac{1}{F}\int_A x \d A \quad \land \quad y_s = \frac{1}{F}\int_A y \d A
-    $$
-\end{algo}
-
-\begin{algo}{Masse einer Grundfläche eines inhomogenen Gebietes}
-    Wird die spezifische Dichte eines Stoffes in der Koordinate $(x, y)$ gegeben durch $\rho(x, y)$, so lässt sich die Masse einer Fläche $A$ berechnen mit
-    $$
-        M = \int_A  \rho(x, y) \d A
-    $$
-\end{algo}
-
-\begin{algo}{Integration in Polarkoordinaten}
-    Bei der Umwandlung der kartesischen Koordinaten $(x, y)$ in \emph{Polarkoordinaten} umwandeln, gilt
-    $$
-        f(x, y) = f(r\cos\phi, r\sin\phi)\quad \land \quad \d y \d x = r \d r \d \phi
-    $$
-
-    Und dann insgesamt für die Integration:
-    $$
-        \int_A f(x, y) \d y \d x = \int_A f(r \cos\phi, r\sin\phi)r\d r\d\phi
-    $$
-\end{algo}
-
-\begin{algo}{Uneigentliche Integrale mithilfe von Polarkoordinaten}
-    Der Übergang zu Polarkoordinaten kann bei der Berechnung von uneigentlichen zweidimensionalen Integralen behilflich sein.
-    Dabei gilt:
-    $$
-        \int_{x=-\infty}^\infty\int_{y=-\infty}^\infty f(x, y) \d y \d x = \int_{\phi = 0}^{2\pi} \int_{r = 0}^\infty f(r\cos\phi, r\sin\phi)r\d r\d\phi
-    $$
-\end{algo}
-
-\begin{example}{Uneigentliche Integrale mithilfe von Polarkoordinaten}
-    Berechnen Sie das folgende Integral
-    $$
-        \int_A x\cdot y \d A
-    $$
-    über dem Integrationsgebiet $A$ gegeben durch die Ungleichungen
-    $$
-        -2 \leq y \leq 2, \quad x \geq 0, \quad x^2 + y^2 \leq 4
-    $$
-    \begin{enumerate}[a)]
-        \item in kartesischen Koordinaten,
-        \item in Polarkoordinaten.
-    \end{enumerate}
-
-    \exampleseparator
-
-    \begin{enumerate}[a)]
-        \item
-              Es gilt:
-              $$
-                  \begin{aligned}
-                      \int_A x\cdot y \d A & = \int_{-2}^2 \int^{\sqrt{4-y^2}}_0 x\cdot y \d x \d y             \\
-                                           & = \int_{-2}^2 y \left[ \frac{x^2}{2} \right]^{\sqrt{4-y^2}}_0 \d y \\
-                                           & = \int_{-2}^2 \frac{y(4-y^2)}{2} \d y                              \\
-                                           & = \frac{1}{2}\int_{-2}^2 (4y-y^3) \d y                             \\
-                                           & = \frac{1}{2}\int_{-2}^2 (4y-y^3) \d y                             \\
-                                           & = \frac{1}{2}\left[2y^2-\frac{y^4}{4}\right]_{0}^2                 \\
-                                           & = 0
-                  \end{aligned}
-              $$\qed
-    \end{enumerate}
-\end{example}
-
-
-\begin{example}{Uneigentliche Integrale mithilfe von Polarkoordinaten (Fortsetzung)}
-    \begin{enumerate}[a)]
-        \setcounter{enumi}{1}
-        \item
-              Es gilt:
-              $$
-                  \begin{aligned}
-                      \int_A x\cdot y \d A & = \int^\frac{\pi}{2}_{-\frac{\pi}{2}} \int^2_0 r^3\cos\phi\sin\phi \d r \d \phi                                                                                             \\
-                                           & = \int^\frac{\pi}{2}_{-\frac{\pi}{2}} \cos\phi\sin\phi \int^2_0 r^3 \d r \d \phi                                                                                            \\
-                                           & = \int^\frac{\pi}{2}_{-\frac{\pi}{2}} \cos\phi\sin\phi \left[\frac{r^4}{4}\right]^2_0 \d \phi                                                                               \\
-                                           & = 4\int^\frac{\pi}{2}_{-\frac{\pi}{2}} \cos\phi\sin\phi \d \phi                                                                                                             \\
-                                           & \overset{\footnote{$u = \cos\phi \implies \frac{\d u}{\d \phi} = -\sin\phi \iff \d \phi = -\frac{\d u}{\sin \phi}$}}{=} -4\int^\frac{\pi}{2}_{\phi = -\frac{\pi}{2}} u \d u \\
-                                           & = -4 \left[ \frac{\cos^2\phi}{2} \right]^\frac{\pi}{2}_{-\frac{\pi}{2}}                                                                                                     \\
-                                           & = 0
-                  \end{aligned}
-              $$\qed
-    \end{enumerate}
-\end{example}
-\subsection{Dreifachintegrale}
-
-\begin{defi}{Dreifachintegral}
-    Bezeichnet $V$ den Quader $\interval{x_0, x_1} \times \interval{y_0, y_1} \times \interval{z_0, z_1}$, so ist das \emph{Dreifachintegral} von $f$ über das Gebiet $V$ gegeben mit
-    $$
-        \int^{x_1}_{x_0}\int^{y_1}_{y_0}\int^{z_1}_{z_0} f(x, y, z) \d z\d y\d x = \int_A f \d A = \int\int\int_A f \d A
-    $$
-\end{defi}
-
-\begin{bonus}{Volumenberechnung im $\R^3$}
-    Die Berechnung eines Volumen $V$ über den Bereich $V'$ im $\R^3$ geschieht völlig analog zum $\R^2$:
-    $$
-        V = \int_{V'} 1 \d V'
-    $$
-\end{bonus}
-
-\begin{bonus}{Schwerpunktberechnung im $\R^3$}
-    Die Berechnung des Schwerpunktes $(x_s, y_s, z_s)$ mit Volumen $V$ über den Bereich $V'$ im $\R^3$ geschieht völlig analog zum $\R^2$:
-    $$
-        x_s = \frac{1}{V}\int_{V'} x \d V' \quad \land \quad y_s = \frac{1}{V}\int_{V'} y \d V' \quad \land \quad z_s = \frac{1}{V}\int_{V'} z \d V'
-    $$
-\end{bonus}
-
-\begin{bonus}{Rechnen mit Kugelkoordinaten}
-    Der Übergang zu Kugelkoordinaten kann bei der Berechnung von dreidimensionalen Integralen behilflich sein.
-    Dabei gilt:
-    $$
-        \int\int\int f(x,y,z) \d z\d y\d x = \int\int\int f(r\cos\phi\sin\theta, r\sin\phi\sin\theta, r\cos\theta) \abs{r^2\sin\theta} \d\theta\d\phi\d r
-    $$
-\end{bonus}
-
-\section{(*) Wachstums- und Zerfallsprozesse}
-
-\subsection{Ungebremstes Wachstum}
-
-\begin{defi}{Diskretes ungebremstes Wachstum}
-    Gegeben sei ein Wachstum $k$ innerhalb einer (beliebigen) Zeiteinheit $\Delta t_0$, eine Startpopulation $y_0$ und eine Änderungsrate
-    $$
-        \Delta y = k\cdot y
-    $$
-    dann ist die Lösungsfunktion
-    $$
-        \boxed{y_n = y_0\cdot (1+k)^n}
-    $$
-    wobei $y_n = y(n\cdot \Delta t_0)$ den Zustand nach $n$ Zeitschritten der Länge $\Delta t_0$ angibt.
-\end{defi}
-
-\begin{bonus}{Diskretes ungebremstes Wachstum für Zeitteile}s
-    Gegeben sei ein Wachstum $k$ innerhalb einer (beliebigen) Zeiteinheit $\Delta t_0 = 1$, eine Startpopulation $y_0$ und eine Änderungsrate
-    $$
-        \Delta y = k_{\Delta t_0}\cdot y
-    $$
-
-    Betrachten wir nun einen \emph{Zeitteil} $\Delta t$, dann ist das modifizierte Modell
-    $$
-        \Delta y = y_n - y_{n-1} = k_{\Delta t}\cdot  y_{n-1}\cdot  \Delta t
-    $$
-    mit der Lösung
-    $$
-        \boxed{y_n = y_0\cdot (1 + k_{\Delta t} \cdot \Delta t)^n}
-    $$
-    wobei $y_n = y(n\cdot \Delta t)$ den Zustand nach $n$ Zeitschritten der Länge $\Delta t$ angibt.
-
-    Die Lösung dieses Modells wird auch als \emph{diskrete Evolutionsgleichung des ungebremsten Wachstums} bezeichnet.
-\end{bonus}
-
-\begin{defi}{Kontinuierliches Modell der Evolutionsgleichung}
-    Zur Lösung der Modellgleichung
-    $$
-        \lim_{\Delta t \to 0} \frac{\Delta y}{\Delta t} = k\cdot y
-    $$
-    mit $y(0) = y_0$ und $k$ (kontinuierliches) Wachstum, so ist die \emph{kontinuierliche} Lösungsfunktion
-    $$
-        \boxed{y(t) = y_o \cdot e^{kt}}
-    $$
-    und wegen $\Delta t \to 0$ ist dies gleichbedeutend zu
-    $$
-        y'(t) = k \cdot y(t) \ \text{mit} \ y(0) = 0
-    $$
-
-    Ein solches Problem heißt \emph{Differentialgleichung mit Anfangswert} oder \emph{Anfangswertproblem}.
-\end{defi}
-
-\subsection{Gebremstes Wachstum - Störung erster Ordnung}
-
-\begin{defi}{Diskretes Modell des Wachstums mit Störung erster Ordnung}
-    Gegeben sei ein Wachstum $k$ innerhalb einer (beliebigen) Zeiteinheit $\Delta t_0$, eine Startpopulation $y(0) = y_0$, $\Delta t$ ein Zeitteil, $a$ die \emph{Abnahme pro Zeiteinheit} und eine Änderungsrate
-    $$
-        \Delta y = (k\cdot y - a) \cdot \Delta t
-    $$
-    dann ist die Lösungsfunktion
-    $$
-        \boxed{y_n = \left( y(0) - \frac{a}{k} \right) \cdot \left( 1 + k \cdot \Delta t \right)^n + \frac{a}{k}}
-    $$
-\end{defi}
-
-\begin{defi}{Kontinuierliches Modell des Wachstums mit Störung erster Ordnung}
-    Zur Lösung der Modellgleichung
-    $$
-        \lim_{\Delta t \to 0} \frac{\Delta y}{\Delta t} = k\cdot y - a
-    $$
-    mit $y(0) = y_0$, $k$ (kontinuierliches) Wachstum und $a$ \emph{kontinuierliche Abnahme} pro Zeiteinheit, ist die \emph{kontinuierliche} Lösungsfunktion
-    $$
-        \boxed{y(t) = \left( y(0) - \frac{a}{k} \right) \cdot e^{kt} + \frac{a}{k}}
-    $$
-    und wegen $\Delta t \to 0$ ist dies gleichbedeutend zu
-    $$
-        y'(t) = k \cdot y(t) - a
-    $$
-\end{defi}
-
-\begin{defi}{Stationäre Lösung}
-    Die konstanten Werte, ermittelt durch $\Delta y = 0$, heißen \emph{stationäre Lösungen} $y_s$.
-
-    Für Wachstumsmodelle mit Störung erster Ordnung gilt:
-    $$
-        y_s = \frac{a}{k}
-    $$
-\end{defi}
-
-\subsection{Logistisches Wachstum - Störung zweiter Ordnung}
-
-\begin{defi}{Diskretes Modell des Wachstums mit Störung zweiter Ordnung}
-    Gegeben sei ein Wachstum $k$ innerhalb einer (beliebigen) Zeiteinheit $\Delta t_0$, eine Startpopulation $y(0) = y_0$, $\Delta t$ ein Zeitteil, $R$ \emph{Oberschranke der verfügbaren Ressourcen} und eine Änderungsrate
-    $$
-        \Delta y = (k\cdot y \cdot (R-y)) \cdot \Delta t
-    $$
-    dann ist die Lösungsfunktion
-    $$
-        \boxed{y_n = \frac{R}{\frac{R-y_0}{y_0} \cdot (1 + R \cdot k \cdot \Delta t)^{-n} + 1}}
-    $$
-\end{defi}
-
-\begin{defi}{Kontinuierliches Modell des Wachstums mit Störung zweiter Ordnung}
-    Zur Lösung der Modellgleichung
-    $$
-        \lim_{\Delta t \to 0} \frac{\Delta y}{\Delta t} = k\cdot y \cdot (R-y)
-    $$
-    mit $y(0) = y_0$, $k$ (kontinuierliches) Wachstum und $R$ \emph{Oberschranke der verfügbaren Ressourcen}, ist die \emph{kontinuierliche} Lösungsfunktion
-    $$
-        \boxed{y(t) = \frac{R}{\frac{R-y_0}{y_0} \cdot e^{-Rkt} + 1}}
-    $$
-    und wegen $\Delta t \to 0$ ist dies gleichbedeutend zu
-    $$
-        y'(t) = k \cdot y(t) \cdot (R-y(t))
-    $$
-\end{defi}
-
-\section{Gewöhnliche Differentialgleichungen}
-
-\begin{defi}{Gewöhnliche Differentialgleichung $n$-ter Ordnung}
-    Eine Gleichung der Form
-    $$
-        y^{(n)} = f(x, y, y', y'', \ldots, y^{(n-1)})
-    $$
-    heißt \emph{(explizite) gewöhnliche Differentialgleichung n-ter Ordnung}.
-
-    Ist die Gleichung in der Form
-    $$
-        f(x, y, y', y'', \ldots, y^{(n)}) = 0
-    $$
-    gegeben, so heißt die Differentialgleichung \emph{implizit}.
-
-    Erfüllt $y(x)$ die Differentialgleichung, so heißt $y$ \emph{allgemeine Lösung der Differentialgleichung}.
-\end{defi}
-
-\begin{defi}{Anfangswertproblem}
-    Die Vorgabe einer expliziten Differentialgleichung und der Werte
-    $$
-        x_0, \quad y(x_0) = y_0, \quad y'(x_0) = y_1, \quad \ldots, \quad y^{(n-1)}(x_0) = y_{n-1}
-    $$
-    heißt \emph{Anfangswertproblem}.
-
-    Erfüllt $y(x)$ das Anfangswertproblem, so heißt $y$ \emph{spezielle Lösung des Anfangswertproblems}.
-\end{defi}
-
-\subsection{Lösungsverfahren für Differentialgleichungen erster Ordnung}
-
-\begin{algo}{Trennung der Variablen}
-    Gegeben: Differentialgleichung der Form
-    $$
-        \boxed{y' = f(x) \cdot g(y)} \quad \iff \quad \frac{\d y}{\d x} = f(x) \cdot g(y)
-    $$
-    \begin{enumerate}
-        \item $x$ und $y$ wie folgt trennen:
-              $$
-                  \frac{1}{g(y)} \d y = f(x) \d x
-              $$
-        \item Integration liefert:
-              $$
-                  \int \frac{1}{g(y)} \d y = \int f(x) \d x
-              $$
-        \item Umstellen nach $y$ liefert die Lösung der Differentialgleichung
-    \end{enumerate}
-\end{algo}
-
-\begin{example}{Trennung der Variablen}
-    Berechnen Sie die allgemeine Lösung der Differentialgleichung
-    $$
-        y' + (1+x)\cdot y = 0\quad \iff \quad y' = -y\cdot (1+x)
-    $$
-    \exampleseparator
-
-    $$
-        \begin{aligned}
-                       & \frac{\d y}{\d x}      &  & = -y \cdot (1+x)                        \\
-            \iff \quad & -\frac{1}{y} \d y      &  & = (1+x) \d x                            \\
-            \iff \quad & \int -\frac{1}{y} \d y &  & = \int (1+x) \d                         \\
-            \iff \quad & - \ln\abs{y} - c_2     &  & = x + \frac{x^2}{2} + c_1               \\
-            \iff \quad & y                      &  & = e^{-(c_1 + c_2)}e^{-\frac{x}{2}(x+2)} \\
-            \iff \quad & y                      &  & = ce^{-\frac{x}{2}(x+2)}                \\
-        \end{aligned}
-    $$\qed
-\end{example}
-
-\begin{algo}{Substitution}
-    \begin{itemize}
-        \item Differentialgleichung vom Typ
-              $$
-                  \boxed{y' = f(ax + by + c)}
-              $$
-              \begin{enumerate}
-                  \item Substituiere $z = ax + by + c$
-                  \item Es ergibt sich
-                        $$
-                            y = \frac{z -ax - c}{b} \quad \implies \quad y' = \frac{z' - a}{b}
-                        $$
-                        bzw.
-                        $$
-                            z' = a + bf(z)
-                        $$
-                  \item Lösen mithile von \emph{Trennung der Variablen} (\emph{Tipp:} Dividieren durch rechte Seite)
-                  \item Rücksubstitution in $y = \frac{z -ax - c}{b}$ ergibt die Lösung
-              \end{enumerate}
-        \item Differentialgleichung vom Typ
-              $$
-                  \boxed{y' = f\left(\frac{x}{y}\right)}
-              $$
-              \begin{enumerate}
-                  \item Substituiere $z = \frac{x}{y}$
-                  \item Es ergibt sich (Produktregel!)
-                        $$
-                            y = z \cdot x \quad \implies \quad y' = z + z' \cdot x
-                        $$
-                        bzw.
-                        $$
-                            z' = \frac{f(z) - z}{x} \quad \iff \quad z + z' \cdot x = f(z)
-                        $$
-                  \item Lösen mithile von \emph{Trennung der Variablen}
-                  \item Rücksubstitution in $y = z \cdot x$ ergibt die allgemeine Lösung
-              \end{enumerate}
-    \end{itemize}
-\end{algo}
-
-\begin{example}{Substitution}
-    Lösen Sie die folgende Differentialgleichung mit Hilfe einer geeigneten Substitution ($x \neq 0$):
-    $$
-        y' = \frac{1}{\sin\left(\frac{y}{x}\right)} + \frac{y}{x}
-    $$
-    \exampleseparator
-
-    Sei $u = \frac{y}{x}$ ($\implies u' = \frac{xy' - y}{x^2} \iff y' = u + xu'$). Dann gilt:
-
-    $$
-        \begin{aligned}
-                       & y'                  &  & = \frac{1}{\sin\left(\frac{y}{x}\right)} + \frac{y}{x} \\
-            \iff \quad & u + xu'             &  & = \frac{1}{\sin u} + u                                 \\
-            \iff \quad & xu'                 &  & = \frac{1}{\sin u}                                     \\
-            \iff \quad & \frac{x \d u}{\d x} &  & = \frac{1}{\sin u}                                     \\
-            \iff \quad & \sin u \d u         &  & = \frac{1}{x} \d x                                     \\
-            \iff \quad & \int \sin u \d u    &  & = \int \frac{1}{x} \d x                                \\
-            \iff \quad & -\cos (u) + c_2     &  & = \ln\abs{x} + c_1                                     \\
-            \iff \quad & \cos (u)            &  & = -\ln\abs{x} - c_1 + c_2                              \\
-            \iff \quad & u                   &  & = \arccos(-\ln\abs{x} - c_1 + c_2)                     \\
-            \iff \quad & \frac{y}{x}         &  & = \arccos(-\ln\abs{x} - c_1 + c_2)                     \\
-            \iff \quad & y                   &  & = x\arccos(c - \ln\abs{x})                             \\
-        \end{aligned}
-    $$\qed
-\end{example}
-
-\begin{defi}{Lineare Differentialgleichung}
-    Die Gleichung
-    $$
-        y' + f(x) \cdot y = 0
-    $$
-    heißt \emph{linear homogene Differentialgleichung} 1. Ordung.
-
-    Die Gleichung
-    $$
-        y' + f(x) \cdot y = g(x)
-    $$
-    heißt \emph{linear inhomogene Differentialgleichung} 1. Ordung und
-    $g(x)$ heißt \emph{Störfunktion}.
-
-    Das zugehörige Anfangswertproblem heißt \emph{lineares Anfangswertproblem}.
-\end{defi}
-
-\begin{algo}{Lösen von linearen homogenen Differentialgleichungen 1. Ordnung}
-    Für eine Gleichung
-    $$
-        \boxed{y' + f(x)\cdot y = 0}
-    $$
-    ist die allgemeine Lösung
-    $$
-        y = ce^{\int -f(x) \d x}
-    $$
-
-    $c$ wird dann durch Einsetzen eines Anfangswertes berechnet.
-\end{algo}
-
-\begin{algo}{Variation der Konstanten}
-    Gegeben: Differentialgleichung der Form
-    $$
-        \boxed{y' + f(x)\cdot y = g(x)}
-    $$
-    \begin{enumerate}
-        \item Löse homogene Differentialgleichung mit
-              $$
-                  y = ce^{\int - f(x) \d x}
-              $$
-        \item Ersetze $c$ durch $c(x)$
-        \item Berechne $y'$
-        \item Vergleiche $y'$ mit ursprünglicher Störfunktion
-        \item Bestimme aus der Differentialgleichung die Lösung für $c(x)$ (enthält neue Konstante!)
-        \item Einsetzen in
-              $$
-                  y = c(x) \cdot e^{\int - f(x) \d x}
-              $$
-              ergibt die allgemeine Lösung
-    \end{enumerate}
-\end{algo}
-
-\begin{example}{Variation der Konstanten}
-    Berechnen Sie die allgemeine Lösung der Differentialgleichung
-    $$
-        (x-2) \cdot y' = y + 2(x-2)^3
-    $$
-    \exampleseparator
-
-    Umwandeln in allgemeine Darstellung:
-    $$
-        (x-2) \cdot y' = y + 2(x-2)^3 \quad \iff \quad y' = \frac{y}{x-2} + 2(x-2)^2 \quad \iff \quad y' - \frac{1}{x-2}\cdot y = 2(x-2)^2
-    $$
-    Lösen der homogenen Gleichung:
-    $$
-        \begin{aligned}
-                       & y'_h - \frac{1}{x-2}\cdot y_h &  & = 0                         \\
-            \iff \quad & y'_h                          &  & = \frac{1}{x-2}\cdot y_h    \\
-            \iff \quad & \frac{1}{y_h} \d y_h          &  & = \frac{1}{x-2}\d x         \\
-            \iff \quad & \int \frac{1}{y_h} \d y_h     &  & = \int \frac{1}{x-2}\d x    \\
-            \iff \quad & \ln(y_h) + c_2                &  & = \ln (x-2) + c_1           \\
-            \iff \quad & (y_h)                         &  & = e^{\ln (x-2) + c_1 - c_2} \\
-            \iff \quad & y_h                           &  & = c(x-2)                    \\
-        \end{aligned}
-    $$
-
-    Lösen der Störfunktion:
-    $$
-        \begin{aligned}
-                           & y  &  & = c(x) \cdot (x-2)  \\
-            \implies \quad & y' &  & = c'(x)(x-2) + c(x)
-        \end{aligned}
-    $$
-    $$
-        \begin{aligned}
-                       & y' - \frac{1}{x-2}\cdot y                                                                  &  & = 2(x-2)^2                   \\
-            \iff \quad & \underbrace{c'(x)(x-2) + c(x)}_{y'} - \frac{1}{x-2}\cdot \underbrace{c(x) \cdot (x-2)}_{y} &  & = 2(x-2)^2                   \\
-            \iff \quad & c'(x)(x-2)                                                                                 &  & = 2(x-2)^2                   \\
-            \iff \quad & c'(x)                                                                                      &  & = 2(x-2)                     \\
-            \iff \quad & \int 1 \d c                                                                                &  & = 2\int x\d x - 4\int 1 \d x \\
-            \iff \quad & c(x)                                                                                       &  & = x^2 - 4x + c_1
-        \end{aligned}
-    $$
-
-    Damit erhalten wir insgesamt:
-    $$
-        y = (x^2 - 4x + c)(x-2) = c(x-2) + (x-4)(x-2)x
-    $$\qed
-\end{example}
-
-\begin{defi}{Superpositionsprinzip (inhomogene lineare Differentialgleichungen)}
-    Die Lösung einer \emph{inhomogenen linearen Differentialgleichung} setzt sich zusammen aus der allgemeinen Lösung der homogenen Differentialgleichung $y_h$ und einer partikulären Lösung der \emph{inhomogenen Differentialgleichung} $y_p$
-    $$
-        y = y_h + y_p
-    $$
-\end{defi}
-
-\begin{algo}{Ansatz vom Typ der rechten Seite}
-    Man rät eine Lösung, indem man einen Ansatz für $y_p$ vom Typ der Störfunktion $g(x)$ wählt:
-
-    \begin{center}
-        \begin{tabular}{c | c l}
-            Störfunktion $g(x)$            & Ansatz für $y_p$                                                                        \\
-            \hline
-            $c_0$                          & $\lambda_0$                                        & \rdelim\}{3}{3mm}[polynomiell]     \\
-            $c_0 + c_1x$                   & $\lambda_0 + \lambda_1 x$                                                               \\
-            $c_0 + c_1x + \ldots + c_nx^n$ & $\lambda_0 + \lambda_1 x + \ldots + \lambda_nx^n$                                       \\
-            \hline
-            $c_0e^{ax}$                    & $\lambda_0 e^{ax}$                                 & \rdelim\}{4}{3mm}[exponentiell]    \\
-            $c_0e^{ax}$                    & $\lambda_0 xe^{ax}$                                                                     \\
-            $c_0e^{ax}$                    & $\ldots$                                                                                \\
-            $c_0e^{ax}$                    & $\lambda_0 x^ne^{ax}$                                                                   \\
-            \hline
-            $c_0\sin(ax) + c_1\cos(ax)$    & $\lambda_0\sin(ax) + \lambda_1\cos(ax)$            & \rdelim\}{3}{3mm}[trigonometrisch] \\
-            $c_0e^{ax}\cdot \sin(bx)$      & $x\cdot (\lambda_1 \sin(bx) + \lambda_2 \cos(bx))$                                      \\
-            $c_0e^{ax}\cdot \cos(bx)$      & $x\cdot (\lambda_1 \sin(bx) + \lambda_2 \cos(bx))$                                      \\
-        \end{tabular}
-    \end{center}
-
-    \emph{Bemerkungen:}
-    \begin{itemize}
-        \item Bei einer Summe von mehreren Funktionstypen sollten entsprechend viele partikuläre Teillösungen berechnet werden. Die Summe dieser Teillösungen entspricht dann insgesamt der partikulären Lösung $y_p$.
-        \item Existiert für eine Störfunktion $g(x) = cx^ne^{ax}$ ein Term $\mu x^ne^{ax}$ bereits in der homogenen Lösung, wählt man als Ansatz für $y_p = \lambda x^{n+1}e^{ax}$ (siehe Beispiel).
-    \end{itemize}
-\end{algo}
-
-\begin{example}{Ansatz vom Typ der rechten Seite}
-    Berechnen Sie die allgemeine Lösung der linearen Differentialgleichung
-    $$
-        y'- y = 9e^x
-    $$
-    \exampleseparator
-
-    Lösen der homogenen Gleichung:
-    $$
-        y_h'- y_h = 0 \implies y_h = ce^{x}
-    $$
-
-    Mit der partikulären Lösung ($y_p = c_0xe^{x}$)
-    $$
-        y_p = c_0xe^x \implies y'_p = c_0(e^x + xe^x)
-    $$
-    gilt dann:
-    $$
-        \begin{aligned}
-                           & y'- y                     &  & = 9e^x \\
-            \iff \quad     & c_0(e^x + xe^x) - c_0xe^x &  & = 9e^x \\
-            \iff \quad     & c_0e^x(1 + x - x)         &  & = 9e^x \\
-            \implies \quad & c_0                       &  & = 9
-        \end{aligned}
-    $$
-
-    Und schlussendlich:
-    $$
-        y = y_h + y_p \implies y = ce^x + 9e^xx
-    $$\qed
-\end{example}
-
-\begin{algo}{Bernoulli-Differentialgleichung}
-    Gegeben: Differentialgleichung der Form
-    $$
-        \boxed{y' + f(x) \cdot y = g(x)\cdot y^\alpha}
-    $$
-    \begin{enumerate}
-        \item Substituiere
-              $$
-                  z = y^{1-\alpha} \quad \iff \quad y = z^{\frac{1}{1-\alpha}}
-              $$
-        \item Einsetzen in die Differentialgleichung ergibt
-              $$
-                  z' + (1-\alpha) \cdot f(x)\cdot z = g(x) \cdot (1-\alpha)
-              $$
-        \item Lösen der linearen Differentialgleichung
-        \item Rücksubstitution in
-              $$
-                  y = z^{\frac{1}{1-\alpha}}
-              $$
-              ergibt die allgemeine Lösung
-    \end{enumerate}
-\end{algo}
-
-\begin{defi}{Exakte Differentialgleichung}
-    Eine Differentialgleichung der Form
-    $$
-        p(x, y) + q(x, y) \cdot y' = 0 \quad \iff \quad p(x, y) \d x + q(x, y) \d y = 0
-    $$
-    mit
-    $$
-        p_x = q_y \ \text{\emph{(Integrabilitätsbedingung)}}
-    $$
-    heißt \emph{exakte Differentialgleichung}.
-\end{defi}
-
-\begin{algo}{Lösen von exakten Differentialgleichungen}
-    Gegeben: Differentialgleichung der Form
-    $$
-        \boxed{p(x, y) + q(x, y) \cdot y' = 0 \quad \iff \quad p(x, y) \d x + q(x, y) \d y = 0}
-    $$
-    \begin{enumerate}
-        \item Prüfen der Integrabilitätsbedingung
-              $$
-                  p_x = q_y
-              $$
-        \item Stammfunktion berechnen mit
-              $$
-                  \underbrace{F(x, y) = \int p \d x}_{(*)} \quad \text{oder} \quad \underbrace{F(x, y) = \int q \d y}_{(**)}
-              $$
-              \subitem Konstante $c$ ersetzen mit $c(y)$ $(*)$ bzw. $c(x)$ $(**)$
-        \item Differentiation von $F(x, y)$ nach $y$ $(*)$ bzw. nach $x$ $(**)$
-        \item Es ergibt sich
-              $$
-                  c(y)' = f(y) \quad \implies c(y) = \int f(y) \d y \quad (*)
-              $$
-              bzw.
-              $$
-                  c(x)' = f(x) \quad \implies c(x) = \int f(x) \d x \quad (**)
-              $$
-        \item Einsetzen ergibt die allgemeine Lösung
-    \end{enumerate}
-\end{algo}
-
-\begin{defi}{Integrierender Faktor (Euler-Multiplikator)}
-    $\mu(x, y)$ ist genau dann ein \emph{integrierender Faktor} oder \emph{Euler-Multiplikator} für eine Funktion
-    $$
-        p(x, y) + q(x, y) \cdot y' = 0 \quad \iff \quad p(x, y) \d x + q(x, y) \d y = 0
-    $$
-    wenn die Integrabilitätsbedingung
-    $$
-        \frac{\partial \mu p}{\partial y} = \frac{\partial \mu q}{\partial x}
-    $$
-    erfüllt wird.
-\end{defi}
-
-\begin{algo}{Lösen von Differentialgleichungen mithilfe eines integrierenden Faktors}
-    Gegeben: Differentialgleichung der Form
-    $$
-        \boxed{p(x, y) + q(x, y) \cdot y' = 0 \quad \iff \quad p(x, y) \d x + q(x, y) \d y = 0}
-    $$
-    bei der die \emph{Integrabilitätsbedingung nicht erfüllt} wird.
-
-    Wir betrachten hier nur integrierende Faktoren, die nur von $x$ bzw. nur von $y$ abhängig sind.
-
-    \begin{enumerate}
-        \item Integrierender Faktor ist gegeben mit
-              $$
-                  \underbrace{\mu(x) = e^{\int m(x) \d x}}_{(*)} \quad \text{oder} \quad \underbrace{\mu(y) = e^{\int m(y) \d y}}_{(**)}
-              $$
-              \subitem $(*)$ Untersuchen, ob $\mu$ nur von $x$ abhängt:
-              $$
-                  m(x) = \frac{p_y - q_x}{q}
-              $$
-              \subitem $(**)$ Untersuchen, ob $\mu$ nur von $y$ abhängt:
-              $$
-                  m(y) = \frac{q_x - p_y}{p}
-              $$
-        \item $m$ in entsprechende Formel für $\mu$ einsetzen
-        \item Einsetzen in die Differentialgleichung liefert
-              $$
-                  \mu p(x, y) + \mu q(x, y) \cdot y' = 0 \quad \iff \quad \mu p(x, y) \d x + \mu q(x, y) \d y = 0
-              $$
-        \item Prüfen der Integrabilitätsbedingung
-        \item Lösen der exakten Differentialgleichung
-    \end{enumerate}
-\end{algo}
-
-\begin{example}{Lösen von Differentialgleichungen mithilfe eines integrierenden Faktors}
-    Lösen Sie die Differentialgleichung
-    $$
-        (3xy + 2y^2) + (x^2 + 2xy) y' = 0
-    $$
-
-    \exampleseparator
-
-    Es gilt:
-    $$
-        (3xy + 2y^2) + (x^2 + 2xy) y' = 0 \quad \iff \quad \underbrace{(3xy + 2y^2)}_{p(x, y)}\d x + \underbrace{(x^2 + 2xy)}_{q(x, y)}\d y = 0
-    $$
-    Integrabilitätsbedingung:
-    $$
-        p_y = 3x + 4y \quad \neq \quad 2x + 2y = q_x \quad \lightning
-    $$
-
-    Integrierenden Faktor (Euler-Multiplikator) $\mu(x) = e^{\int m(x) \d x}$ bzw. $\mu(y) = e^{\int m(y) \d y}$ bestimmen:
-    \begin{itemize}
-        \item Untersuchung, ob $\mu$ nur von $y$ abhängt:
-              $$
-                  m = \frac{q_x - p_y}{p} = \frac{2x + 2y - \left(3x + 4y\right)}{3xy + 2y^2} = \frac{-x - 2y}{3xy + 2y^2} \quad \lightning
-              $$
-        \item Untersuchung, ob $\mu$ nur von $x$ abhängt:
-              $$
-                  m = \frac{p_y - q_x}{q} = \frac{3x + 4y - (2x + 2y)}{x^2 + 2xy} = \frac{x + 2y}{x^2 + 2xy} = \frac{x+2y}{x(x+2y)} = \frac{1}{x} \quad \checkmark
-              $$
-    \end{itemize}
-
-    Damit erhalten wir den integrierenden Faktor mit:
-    $$
-        \mu(x) = e^{\int \frac{1}{x} \d x} = cx \qquad (\text{sei} \ c = 1)
-    $$
-    Einsetzen in die DGL:
-    $$
-        \underbrace{\left(3x^2y + 2xy^2\right)}_{p(x, y)}\d x + \underbrace{\left(x^3 + 2x^2y\right)}_{q(x, y)}\d y = 0
-    $$
-    Integrabilitätsbedingung:
-    $$
-        p_y = 3x^2 + 4xy \quad = \quad 3x^2 + 4xy = q_x \quad \checkmark
-    $$
-    Wir wissen:
-    $$
-        \underbrace{F = \int q \d y = x^3y + x^2y^2 + c(x)}_{F_y = q} \implies \underbrace{3x^2y + 2xy^2 + c'(x) = 3x^2y + 2xy^2}_{F_x = p}  \implies  c(x) = c
-    $$
-
-    Und insgesamt gilt damit:
-    $$
-        F = x^3y + x^2y^2 + c
-    $$\qed
-\end{example}
-
-\subsection{Lösungsverfahren für Differentialgleichungen zweiter Ordnung}
-
-\begin{defi}{Charakteristische Gleichung}
-    Die Gleichung
-    $$
-        \alpha^2 + a\alpha + b = 0
-    $$
-    heißt die zur Differentialgleichung
-    $$
-        y'' + ay' + b = 0
-    $$
-    gehörende \emph{charakteristische Gleichung}.
-\end{defi}
-
-\begin{bonus}{Superpositionsprinzip (homogene lineare Differentialgleichungen)}
-    Sind $y_1(x)$ und $y_2(x)$ Lösungen einer \emph{homogenen linearen Differentialgleichung}, so ist auch jede \emph{Linearkombination}
-    $$
-        \lambda\cdot  y_1(x) + \mu\cdot  y_2(x)
-    $$
-    eine allgemeine Lösung der Differentialgleichung.
-\end{bonus}
-
-\begin{algo}{Lösen von linearen homogenen Differentialgleichungen 2. Ordnung}
-    Für eine Gleichung
-    $$
-        \boxed{y'' + ay' + by = 0}
-    $$
-    stelle man die charakteristische Gleichung auf, mit
-    $$
-        \alpha^2 + a\alpha + b = 0 \quad \implies \quad \alpha = -\frac{a}{2} \pm \sqrt{\left(\frac{a}{2}\right)^2 - b}
-    $$
-
-    Dann gilt mit $D = \left(\frac{a}{2}\right)^2 - b$ (Diskriminante):
-    \begin{itemize}
-        \item $D > 0$:
-              $$
-                  y_h = \lambda_1 e^{\alpha_1 x} + \lambda_2 e^{\alpha_2 x}
-              $$
-        \item $D = 0$:
-              $$
-                  y_h = (\lambda_1 + \lambda_2x)\cdot  e^{\alpha x}
-              $$
-        \item $D < 0$:
-              $$
-                  y_h = e^{\Re(\alpha)} \cdot \left( \lambda_1 \cos(\Im(\alpha)) + \lambda_2 \sin(\Im(\alpha)) \right) = e^{-\frac{a}{2}} \cdot \left( \lambda_1 \cos(\sqrt{-D}) + \lambda_2 \sin(\sqrt{-D}) \right)
-              $$
-    \end{itemize}
-
-    \emph{Bemerkung:}
-    \begin{itemize}
-        \item $\Re(\alpha)$ ist der Realteil der Nullstelle
-        \item $\Im(\alpha)$ ist der Imaginärteil der Nullstelle
-    \end{itemize}
-\end{algo}
-
-\begin{algo}{Lösen von linearen Differentialgleichungssystemen}
-    Gegeben: Differentialgleichungssystem der Form
-    \begin{equation}
-        y'  = ay + bz
-    \end{equation}
-    \begin{equation}
-        z'  = dy + cz
-    \end{equation}
-
-    \begin{enumerate}
-        \item Umstellen von (1) nach $z$ ergibt
-              $$
-                  z = \frac{y' - ay}{b}
-              $$
-        \item Differentiation von (1) und anschließendes Einsetzen von $z$ ergibt
-              $$
-                  y'' - (a + c) \cdot y' + (ac -bd) \cdot y = 0
-              $$
-        \item Lösen der homogenen Differentialgleichung mit der charakteristischen Gleichung
-              $$
-                  \alpha^2 - (a+c)\alpha + (ac-bd) = 0
-              $$
-              ergibt dann die allgemeine Lösung für $y$
-        \item Einsetzen von $y$ (und $y'$) in
-              $$
-                  z =  \frac{y' - ay}{b}
-              $$
-              ergibt die allgemeine Lösung für $z$
-    \end{enumerate}
-\end{algo}
-
-\begin{example}{Lösen von linearen Differentialgleichungssystemen}
-    Lösen Sie folgendes Differentialgleichungssystem:
-    $$
-        \begin{aligned}
-            y' & = y + 2z          \\
-            z' & = 2y + z - 2e^{x}
-        \end{aligned}
-    $$
-
-    \exampleseparator
-
-    Wir leiten $y'$ ab:
-    $$
-        \begin{aligned}
-                       & y' = y + 2z \quad \iff \quad z = \frac{y'- y}{2} \\
-            \iff \quad & y'' - y'  - 2z' = 0
-        \end{aligned}
-    $$
-    Einsetzen von $z'$:
-    $$
-        y'' - y'  - 2z' = 0 \quad \iff \quad  y'' - y'  - 4y -2z + 4e^{x} = 0
-    $$
-    Einsetzen von $z$:
-    $$
-        \begin{aligned}
-                       & y'' - y'  - 4y -2z + 4e^{x} = 0 \\
-            \iff \quad & y'' - 2y'  - 3y  = -4e^{x}
-        \end{aligned}
-    $$
-
-    Lösung der homogenen Gleichung:
-    $$
-        \begin{aligned}
-                           & y'' - 2y'  - 3y  = 0                          \\
-            \implies \quad & \alpha^2 - 2\alpha - 3 = 0                    \\
-            \implies \quad & \alpha = 1 \pm \sqrt{\left( -1 \right)^2 + 3} \\
-            \iff \quad     & \alpha = 1 \pm 2                              \\
-            \implies \quad & y_h = \lambda_1e^{-x} + \lambda_2e^{3x}
-        \end{aligned}
-    $$
-
-    Berechnen der partikulären Lösung:
-    $$
-        y_p = ce^x \quad \implies \quad y'_p = ce^x \quad \implies \quad y''_p = ce^x
-    $$
-    $$
-        \begin{aligned}
-                           & y''_p - 2y'_p  - 3y_p &  & = -4e^{x} \\
-            \iff \quad     & ce^x - 2ce^x  - 3ce^x &  & = -4e^{x} \\
-            \iff \quad     & -4ce^x                &  & = -4e^{x} \\
-            \implies \quad & c = 1
-        \end{aligned}
-    $$
-    Dann gilt insgesamt:
-    $$
-        y = y_h + y_p = \lambda_1e^{-x} + \lambda_2e^{3x} + e^x
-    $$
-    und
-    $$
-        z = \frac{y'- y}{2} = \frac{\left( -\lambda_1e^{-x} + 3\lambda_2e^{3x} + e^x \right) - \left( \lambda_1e^{-x} + \lambda_2e^{3x} + e^x \right)}{2} = \lambda_2e^{3x} - \lambda_1e^{-x}
-    $$\qed
-\end{example}
-
-\printindex
-\printindex[Beispiele]
-
-\end{document}
+\documentclass[german]{../spicker}
+
+\usepackage{amsmath}
+\usepackage{polynom}
+\usepackage{array}   % for \newcolumntype macro
+\usepackage{tikz}
+\usepackage{pgfplots}
+\usepackage{multirow,bigdelim}
+\usepgfplotslibrary{fillbetween}
+
+\title{Analysis 2}
+\author{Patrick Gustav Blaneck}
+\makeindex[intoc]
+\makeindex[intoc, name=Beispiele,title=Beispiele]
+
+\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
+\newcommand{\vektor}[1]{\begin{pmatrix*}[c] #1 \end{pmatrix*}}
+\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
+
+\renewcommand{\d}{\,\mathrm{d}}
+
+\renewcommand{\abs}[1]{\left| #1 \right|}
+\newcommand{\cis}[1]{\left( \cos\left( #1 \right) + i \sin\left( #1 \right) \right)}
+\newcommand{\sgn}{\text{sgn}}
+\newcommand{\diff}{\mathrm{d}}
+\newcommand{\dx}{~\mathrm{d}x}
+\newcommand{\du}{~\mathrm{d}u}
+\newcommand{\dv}{~\mathrm{d}v}
+\newcommand{\dw}{~\mathrm{d}w}
+\newcommand{\dt}{~\mathrm{d}t}
+\newcommand{\dn}{~\mathrm{d}n}
+\newcommand{\dudx}{~\frac{\mathrm{d}u}{\mathrm{d}x}}
+\newcommand{\dudn}{~\frac{\mathrm{d}u}{\mathrm{d}n}}
+\newcommand{\dvdx}{~\frac{\mathrm{d}v}{\mathrm{d}x}}
+\newcommand{\dwdx}{~\frac{\mathrm{d}w}{\mathrm{d}x}}
+\newcommand{\dtdx}{~\frac{\mathrm{d}t}{\mathrm{d}x}}
+\newcommand{\ddx}{\frac{\mathrm{d}}{\mathrm{d}x}}
+\newcommand{\dFdx}{\frac{\mathrm{d}F}{\mathrm{d}x}}
+\newcommand{\dfdx}{\frac{\mathrm{d}f}{\mathrm{d}x}}
+\newcommand{\interval}[1]{\left[ #1 \right]}
+
+\newcolumntype{L}{>{$}l<{$}} % math-mode version of "l" column type
+\newcolumntype{R}{>{$}r<{$}} % math-mode version of "r" column type
+\newcolumntype{C}{>{$}c<{$}} % math-mode version of "c" column type
+\newcolumntype{P}{>{$}p<{$}} % math-mode version of "l" column type
+
+\begin{document}
+\maketitle
+\tableofcontents
+\newpage
+
+%\setcounter{section}{1}
+
+\section{Funktionen mehrerer Veränderlicher}
+
+\begin{defi}{Metrik}
+    Metriken definieren Abstände im $\R^n$.
+
+    Eine Funktion $d$ auf einem Vektorraum $V$ mit
+    $$
+        d :  V \times V \to \R, d(\vec{x}, \vec{y})
+    $$
+    heißt \emph{Metrik}, falls gilt
+    \begin{itemize}
+        \item $d(\vec{x}, \vec{y}) = 0 \iff \vec{x} = \vec{y}$
+        \item $d(\vec{x}, \vec{y}) \leq d(\vec{x}, \vec{z}) + d(\vec{y}, \vec{z}), \forall \vec{x}, \vec{y}, \vec{z} \in V$
+              (Dreiecksungleichung)
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Metriken}
+    \begin{itemize}
+        \item Summen-Metrik: $$\sum_{k=1}^n \abs{x_k - y_k}$$
+        \item euklid. Metrik: $$\sqrt{\sum_{k=1}^n \left( x_k - y_k \right)^2}$$
+        \item Maximum-Metrik: $$\max_{k \in \interval{1,n}} \abs{x_k - y_k}$$
+    \end{itemize}
+\end{example}
+
+\begin{defi}{Metrischer Raum}
+    Ein Vektorraum und eine Metrik heißen zusammen \emph{metrischer Raum}.
+\end{defi}
+
+\begin{bonus}{Zusammenhang Metrik \& Norm}
+    Jeder Vektorraum mit einer Metrik $d$ ist normierbar (d.h. dort gibt es eine Norm), falls
+    $$
+        d(a\vec{x}, 0) = \abs{a} d(\vec{x}, 0) \quad \text{und} \quad d(\vec{x}, \vec{y}) = d(\vec{x} -\vec{y}, 0)
+    $$
+
+    Eine Norm wird dann definiert gemäß
+    $$
+        \norm{\vec{x}} := d(\vec{x}, 0)
+    $$
+\end{bonus}
+
+\subsection{Mengen im $\R^n$}
+
+\begin{defi}{$\varepsilon$-Umgebung im $\R^n$}
+    Sei $\norm{\cdot}$ eine Norm im $\R^n$, dann heißt
+    $$
+        U_\varepsilon(\vec{x_0}) := \left\{ \vec{x} \mid \norm{\vec{x} - \vec{x_0}} < \varepsilon \right\}
+    $$
+    die $\varepsilon$-Umgebung von $\vec{x_0}$ bzgl. der Norm $\norm{\cdot}$.
+
+    Sei $D$ eine Menge und $\norm{\cdot}$ eine Norm.
+    Dann
+    \begin{itemize}
+        \item \ldots heißt $\vec{x_0}$ \emph{innerer Punkt} von $D$, falls $\forall \varepsilon > 0 : U_\varepsilon(\vec{x_0}) \in D$.
+        \item \ldots heißt $D$ \emph{offene Menge}, falls alle Punkte von $D$ innere Punkte sind.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Abgeschlossene Mengen}
+    Sei $D$ eine Menge und $\norm{\cdot}$ eine Norm.
+    Dann
+    \begin{itemize}
+        \item \ldots heißt $\vec{x_0}$ \emph{Häufungspunkt} von $D$, falls $\forall \varepsilon > 0$ $U_\varepsilon(\vec{x_0})$ einen Punkt $\vec{x} \neq \vec{x_0}$ enthält.
+        \item \ldots heißt $D$ \emph{abgeschlossene Menge}, falls sie alle Häufungspunkte von $D$ enthält.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Beschränktheit von Mengen}
+    Eine Menge $D \subset \R^n$ heißt \emph{beschränkt}, falls es ein $M \in \R$ gibt mit
+    $$
+        \norm{\vec{x}} < M \quad \forall\vec{x} \in D
+    $$
+
+    Existiert eine solche Schranke nicht, so heißt die Menge \emph{unbeschränkt}.
+\end{defi}
+
+\subsection{Folgen im $\R^n$}
+
+\begin{defi}{Folge}
+    Seien $\vec{x_1}, \vec{x_2}, \ldots, \vec{x_m} \in \R^n$, dann heißt $(\vec{x_n})$ \emph{Folge} im $\R^n$.
+\end{defi}
+
+\begin{defi}{Konvergenz}
+    $(\vec{x_n})$ heißt \emph{konvergent} gegen den \emph{Grenzwert} $\vec{x}$, falls $\forall \varepsilon >0, \exists n_0(\varepsilon)$, so dass $\forall n > n_0(\varepsilon)$ gilt:
+    $$
+        \norm{\vec{x_n} - \vec{x}} < \varepsilon
+    $$
+\end{defi}
+
+\begin{defi}{Cauchy-Folge}
+    $(\vec{x_n})$ heißt \emph{Cauchy-Folge} gegen $\vec{x}$, falls $\forall \varepsilon >0, \exists n_0(\varepsilon)$, so dass $\forall n,m > n_0(\varepsilon)$ gilt:
+    $$
+        \norm{\vec{x_m} - \vec{x_n}} < \varepsilon
+    $$
+
+    Jede Cauchy-Folge ist konvergent.
+\end{defi}
+
+\begin{defi}{Beschränktheit von Folgen}
+    Eine Folge heißt \emph{beschränkt}, wenn die Menge aller Folgenglieder in jeder Komponente beschränkt ist.
+\end{defi}
+
+\begin{defi}{Häufungspunkt}
+    $\vec{x} \in \R^n$ heißt \emph{Häufungspunkt} von $(\vec{x_n})$, falls $\forall \varepsilon > 0$ unendlich viele $\vec{x_i}$ in der $\varepsilon$-Umgebung von $\vec{x}$ liegen.
+
+    Jede unendliche beschränkte Folge ist genau dann konvergent, wenn sie genau einen Häufungs\- punkt besitzt.
+\end{defi}
+
+\begin{defi}{Bolzano-Weierstrass für Folgen}
+    Jede unendliche beschränkte Folge besitzt mindestens einen Häufungspunkt.
+
+    Jede unendliche beschränkte Folge besitzt mindestens eine konvergente Teilfolge.
+\end{defi}
+
+\subsection{Differenzierbarkeit im $\R^n$}
+
+\begin{defi}{Grenzwert im $\R^n$}
+    Wir bezeichnen mit dem Grenzwert
+    $$
+        g = \lim_{\vec{x} \to \vec{x_n}} f(\vec{x})
+    $$
+    den \emph{Grenzwert} jeder gegen $\vec{x_0}$ konvergenten Folge $(\vec{x_n})$, falls dieser existiert und damit insbesondere eindeutig ist.
+\end{defi}
+
+\begin{defi}{Stetigkeit}
+    Sei $U \subset \R^n$ offene Menge, $f : U \to \R, \ \vec{x_0} = \vektor{x_1 & \ldots & x_n}^T \in U$,
+    $f$ heißt in $\vec{x_0}$ \emph{stetig}, wenn
+    $$
+        \lim_{\vec{x} \to \vec{x_0}} f(\vec{x}) = f(\vec{x_0}) = f\left(\lim_{\vec{x} \to \vec{x_0}} \vec{x}\right),
+    $$
+    wobei $\lim_{\vec{x} \to \vec{x_0}} f(\vec{x_0})$ Grenzwert jeder gegen $\vec{x_0}$ konvergenten Folge $(\vec{x_n})$ ist.
+
+    Formal:
+    $$
+        \lim_{\vec{x} \to \vec{x_0}} f(\vec{x}) := \lim_{n \to \infty} f(\vec{x_n})
+    $$
+
+    $f$ heißt \emph{stetig in U}, wenn die Funktion für jedes $\vec{x_0} = \vektor{x_1 & \ldots & x_n}^T \in U$ stetig ist.
+
+    Stetigkeit bedeutet somit insbesondere Stetigkeit in allen Komponenten.
+\end{defi}
+
+\begin{example}{Stetigkeit}
+    Lassen sich folgende Funktionen im Nullpunkt stetig ergänzen und, wenn ja, wie?
+    \begin{enumerate}[a)]
+        \item $f(x,y) = \frac{xy^2}{x^2 + y^8}$
+        \item $f(x,y) = \frac{x^3 + x^2 - y^4 + y^2}{x^2 + y^2}$
+    \end{enumerate}
+
+    \exampleseparator
+
+    \begin{enumerate}[a)]
+        \item
+              Sei die Kurve $x = y^4$ gegeben.
+              Dann gilt:
+              $$
+                  \lim_{y\to 0} f(y) = \lim_{y\to 0} \frac{y^4y^2}{y^8+y^8} = \lim_{y\to 0} \frac{1}{2y^2} = \infty
+              $$
+              Damit ist $f$ im Nullpunkt nicht stetig.\qed
+        \item
+              $f$ ist genau dann \emph{stetig ergänzbar} im Nullpunkt, wenn $\lim_{(x,y) \to (0,0)} f(x,y)$ existiert.
+              $$
+                  \begin{aligned}
+                      \lim_{(x,y) \to (0,0)} f(x,y) & = \lim_{(x,y) \to (0,0)} \frac{x^3 + x^2 - y^4 + y^2}{x^2 + y^2}                                                                                    \\                                                                        \\
+                                                    & =  \lim_{r \to 0} \frac{r^3\cos^3(\varphi) + r^2\cos^2(\varphi) - r^4\sin^4(\varphi) + r^2\sin^2(\varphi)}{r^2\cos^2(\varphi) + r^2\sin^2(\varphi)} \\
+                                                    & =  \lim_{r \to 0} \frac{r\cos^3(\varphi) + \cos^2(\varphi) - r^2\sin^4(\varphi) + \sin^2(\varphi)}{\cos^2(\varphi) + \sin^2(\varphi)}               \\
+                                                    & =  \lim_{r \to 0} r\cos^3(\varphi) + \cos^2(\varphi) - r^2\sin^4(\varphi) + \sin^2(\varphi)                                                         \\
+                                                    & =  0 + 1 - 0 + 0 = 1
+                  \end{aligned}
+              $$
+
+              Damit ist $f$ im Nullpunkt stetig ergänzbar mit $f(0, 0) = 1$.\qed
+    \end{enumerate}
+\end{example}
+
+\begin{defi}{Gleichmäßige Stetigkeit}
+    Eine Funktion $f: D \subset \R^n \to \R$ heißt \emph{gleichmäßig stetig}, wenn es zu jedem $\varepsilon > 0$ ein $\delta = \delta(\varepsilon)$ (unabhängig von $\vec{x_0}$) gibt, so dass
+    $$
+        \abs{f(\vec{x}) - f(\vec{x_0})} < \epsilon, \ \forall \norm{\vec{x} - \vec{x_0}} < \delta
+    $$
+
+    Gleichmäßige Stetigkeit ist wegen der Unabhängigkeit von $\vec{x_0}$ insbesondere Stetigkeit im gesamten Definitionsbereich $D$.
+
+    Ist $f$ beschränkt und abgeschlossen, so ist $f$ gleichmäßig stetig.
+\end{defi}
+
+\begin{defi}{Lipschitz-Stetigkeit}
+    Eine Funktion $f : D \subset \R^n \to \R$ heißt \emph{Lipschitz-stetig}, wenn es eine Konstante $L$ gibt (unabhängig von $\vec{x_0}$), so dass
+    $$
+        \abs{f(\vec{x}) - f(\vec{x_0})} \leq L \norm{\vec{x} - \vec{x_0}}
+    $$
+
+    Ist in einer Norm $L < 1$, so heißt die Abbildung \emph{Kontraktion}.
+
+    Ist eine Funktion $f$ Lipschitz-stetige, so ist $f$ auf ihrem Definitionsbereich $D$ gleichmäßig stetig und in jedem Punkt stetig.
+\end{defi}
+
+\begin{bonus}{Nullstelle}
+    Ein Punkt $\vec{x_0} \in D$ heißt \emph{Nullstelle} einer Funktion $f$, falls $f(\vec{x_0}) = \vec{0}$.
+\end{bonus}
+
+\begin{defi}{Fixpunkt}
+    Ein Punkt $\vec{x^*}\in D$ heißt \emph{Fixpunkt} einer Funktion $\varphi$, falls $\varphi(\vec{x^*}) = \vec{x^*}$.
+\end{defi}
+
+\begin{defi}{Fixpunktsatz von Banach}
+    Sei $\varphi : D \subset \R^n \to \R^n$ mit
+    $$
+        \abs{\varphi(\vec{x}) - \varphi(\vec{y})} \leq L \norm{\vec{x} - \vec{y}} \quad \text{und} \quad L < 1,
+    $$
+    dann hat $\varphi$ \emph{genau einen Fixpunkt}.
+\end{defi}
+
+\subsubsection{Partielle Ableitungen}
+
+\begin{defi}{Partielle Ableitung}
+    Sei $U \subset \R^n$ offene Menge, $f : U \to \R, \ \vec{x_0} = \vektor{x_1 & \ldots & x_n}^T \in U$,
+    $f$ heißt in $\vec{x_0}$ \emph{partiell differenzierbar} nach $x_i$, wenn
+    $$
+        \frac{\partial f}{\partial x_i} = \lim_{h \to 0} \frac{f(x_1, \ldots, x_i + h, \ldots, x_n) - f(x_1, \ldots, x_n)}{h}
+    $$
+    existiert.
+    Der Wert $\frac{\partial f}{\partial x}$ heißt dann die \emph{partielle Ableitung} von $f$ nach $x_i$.
+
+    Eine Funktion heißt \emph{(partiell) differenzierbar}, wenn alle partiellen Ableitungen existieren.
+\end{defi}
+
+\begin{bonus}{Zusammenhang Differenzierbarkeit und Stetigkeit}
+    $f$ heißt \emph{stetig partiell differenzierbar}, wenn alle partiellen Ableitungen in $\vec{x_i}$ stetige Funktionen (und insbesondere beschränkt) sind.
+
+    Ist $f$ in $U$ partiell differenzierbar und in $\vec{x_0} \in U$ \emph{stetig partiell differenzierbar}, so ist $f$ in $\vec{x_0}$ stetig.
+\end{bonus}
+
+\begin{defi}{Gradient}
+    Sei $U \subset \R^n$ offene Menge, $F : U \to \R$ partiell differenzierbar, $\vec{x_0} = \vektor{x_1 & \ldots & x_n}^T \in U$, dann heißt
+    $$
+        \nabla f(x_1, \ldots, x_n) = \vektor{\frac{\partial f}{\partial x_1}(x_1, \ldots, x_n) \\ \vdots \\ \frac{\partial f}{\partial x_n}(x_1, \ldots, x_n)}
+    $$
+    der \emph{Gradient von f in} $\vec{x_0}$.
+\end{defi}
+
+\begin{bonus}{Rechenregeln für Gradienten}
+    Sei $U \subset \R^n$ offene Menge, $f, g : U \to \R$ differenzierbar.
+    Dann gilt:
+    $$
+        \begin{aligned}
+             & \nabla (f + g)    &  & = \nabla (f) + \nabla (g)                 \\
+             & \nabla (\alpha f) &  & = \alpha \cdot \nabla (f)                 \\
+             & \nabla (fg)       &  & = g \cdot \nabla (f) + f \cdot \nabla (g)
+        \end{aligned}
+    $$
+\end{bonus}
+
+\begin{example}{Gradient}
+    Berechnen Sie den Gradienten für $f(x, y, z) = x^3 + y^2 + z$ an der Stelle $(1, 2, 3)$.
+
+    \exampleseparator
+
+    Zuerst berechnen wie die partiellen Ableitungen $f_x$, $f_y$ und $f_z$:
+    $$
+        \begin{aligned}
+            f_x & = 3x^2 \\
+            f_y & = 2y   \\
+            f_z & = 1
+        \end{aligned}
+    $$
+
+    Damit erhalten wir dann den Gradienten $\nabla f$ an der Stelle $(1, 2, 3)$ mit:
+    $$
+        \nabla f(1, 2, 3) = \vektor{f_x(1, 2, 3) \\ f_y(1, 2, 3) \\ f_z(1, 2, 3)}
+        = \vektor{3 \\ 4 \\ 1}
+    $$\qed
+\end{example}
+
+\begin{defi}{Tangentialebene im $\R^3$}
+    Sei $z = f(x, y)$ eine stetig partiell differenzierbare Funktion in zwei Unbekannten und $z_0 = f(x_0, y_0)$ ein fester Punkt.
+
+    Dann ist die Tangentialebene im Punkt $(x_0, y_0, z_0)$ gegeben mit:
+    $$
+        T = \vektor{x_0 \\ y_0 \\ z_0} + \lambda \cdot \vec{v_1} + \mu \cdot \vec{v_2},
+    $$
+    wobei $\vec{v_1}$ und $\vec{v_2}$ verschiedene Tangentenvektoren sind.
+\end{defi}
+
+\begin{algo}{Tangentialebene im $\R^3$}
+    Betrachten wir die Tangenten entlang der Koordinatenachsen, so erhalten wir
+    $$
+        T = \vektor{x_0 \\ y_0 \\ z_0} + \lambda \vektor{1 \\ 0 \\ f_x(x_0, y_0)} + \mu \vektor{0 \\ 1 \\ f_y(x_0, y_0)}
+    $$
+    oder äquivalent
+    $$
+        T(x, y) = f(x_0, y_0) + f_x(x_0, y_0) (x-x_0) + f_y(x_0, y_0) (y-y_0)
+    $$
+\end{algo}
+
+\begin{bonus}{Tangentialebene im $\R^n$}
+    Die Tangentialebene im $\R^n$ einer Funktion $f$ in $\vec{x} \in \R^n$ an der Stelle $\vec{x_0} = \vektor{x_1 & \ldots & x_n}^T$ analog definiert durch
+    $$
+        T(\vec{x}) = f(\vec{x_0}) + \nabla f (\vec{x} - \vec{x_0})
+    $$
+\end{bonus}
+
+\begin{example}{Tangentialebene}
+    Gegeben sei die Funktion
+    $$
+        f(x, y) = (x^2 + y^2 -2)^2
+    $$
+    Geben Sie die Tangentialebene im Punkt $(x_0, y_0) = (0,2)$ an.
+
+    \exampleseparator
+
+    Zuerst berechnen wie die partiellen Ableitungen $f_x$ und $f_y$:
+    $$
+        \begin{aligned}
+            f_x & = 4x(x^2 + y^2 -2) \\
+            f_y & = 4y(x^2 + y^2 -2)
+        \end{aligned}
+    $$
+    $$
+        z_0 = f(x_0, y_0) = f(0, 2) = 4
+    $$
+    Damit ergibt sich dann die Tangentialebene von $f$ am Punkt $(0, 2)$ mit:
+    $$
+        \begin{aligned}
+            E     & = \vektor{x_0 \\ y_0 \\ z_0} + \lambda \vektor{1 \\ 0 \\ f_x(x_0, y_0)} + \mu \vektor{0 \\ 1 \\ f_y(x_0, y_0)} \\
+            \quad & = \vektor{0   \\ 2 \\ 4} + \lambda \vektor{1 \\ 0 \\ 0} + \mu \vektor{0 \\ 1 \\ 16}  \quad \lambda, \mu \in \R
+        \end{aligned}
+    $$\qed
+\end{example}
+
+\begin{defi}{Richtungsableitung}
+    Die Ableitung in Richtung des Vektors $\vec{v} = \vektor{v_1, \ldots, v_n}^T$ mit $\norm{\vec{v}} = 1$ heißt \emph{Richtungsableitung} $D_{\vec{v}}(f)$ von $f$ in Richtung von $\vec{v}$.
+    Es ist
+    $$
+        \begin{aligned}
+            \frac{\partial f}{\partial v} := D_{\vec{v}}(f) = & \lim_{h\to 0} \frac{f(\vec{x} + h\vec{v}) - f(\vec{x})}{h}                      \\
+            =                                                 & \lim_{h\to 0} \frac{f(x_1 + hv_1, \ldots, x_n + hv_n) - f(x_1, \ldots, x_n)}{h}
+        \end{aligned}
+    $$
+\end{defi}
+
+\begin{algo}{Richtungsableitung}
+    Sei $\vec{v} \in \R^n$ mit $\norm{\vec{v}} = 1$. Dann ist die Richtungsableitung von $f$ im Punkt $\vec{x_0}$ in Richtung $\vec{v}$ gegeben mit
+    $$
+        \frac{\partial f}{\partial v} = D_{\vec{v}}(f) = \scalarprod{\nabla (f(\vec{x_0})) , \vec{v}}
+    $$
+\end{algo}
+
+\begin{example}{Richtungsableitung}
+    Berechnen Sie die Richtungsableitung der Funktion
+    $$
+        f(x, y) = x^2y - y^3x + 1
+    $$
+    im Punkt $(x_0, y_0) = (1, 2)$
+    in Richtung des Vektors $\vec{w} = \vektor{3 \\ 2}$.
+
+    \exampleseparator
+
+    Die Richtungsableitung von $f$ im Punkt $(x_0, y_0)$ in Richtung $\vec{v}$ ($\norm{\vec{v}} = 1$) ist gegeben mit
+    $$
+        \begin{aligned}
+            D_{\vec{v}}(f) & = \scalarprod{\nabla f(x_0, y_0), \vec{v}}
+        \end{aligned}
+    $$
+
+    Zuerst berechnen wir die partiellen Ableitungen $f_x$ und $f_y$:
+    $$
+        \begin{aligned}
+            f_x = 2xy - y^3   & \implies f_x(x_0, y_0) = f_x(1, 2) = -4  \\
+            f_y = x^2 - 3y^2x & \implies f_y(x_0, y_0) = f_y(1, 2) = -11
+        \end{aligned}
+    $$
+
+    Sei nun $\vec{v} = \frac{\vec{w}}{\norm{\vec{w}}}$:
+    $$
+        \vec{v} = \frac{\vec{w}}{\norm{\vec{w}}} = \frac{1}{\sqrt{13}} \vektor{3  \\ 2}
+    $$
+    Damit können wir nun die Richtungsableitung wie folgt bilden:
+    $$
+        D_{\vec{v}}(f) = \scalarprod{\nabla f(x_0, y_0), \vec{v}} = \scalarprod{\vektor{-4                   \\ -11},  \frac{1}{\sqrt{13}} \vektor{3  \\ 2}}=  -\frac{34}{\sqrt{13}}
+    $$\qed
+\end{example}
+
+\begin{algo}{Extremster Anstieg}
+    Insgesamt gilt, falls wir nur die Richtung (ohne Normierung) betrachten:
+    $$
+        \vec{v} = \frac{\nabla f}{\norm{ \nabla f }} \quad \text{ist die Richtung des steilsten Anstiegs von} \ f
+    $$
+    $$
+        \vec{v} = -\frac{\nabla f}{\norm{ \nabla f }} \quad \text{ist die Richtung des steilsten Abstiegs von} \ f
+    $$
+\end{algo}
+
+
+\subsubsection{Das vollständige Differential}
+
+\begin{defi}{Vollständiges Differential}
+    Unter dem \emph{vollständigen Differential} der Funktion $z = f(x, y)$ im Punkt $(x_0, y_0)$ versteht man den Ausdruck
+    $$
+        \d z = f_x(x_0, y_0) \d x + f_y(x_0, y_0) \d y
+    $$
+\end{defi}
+
+\begin{algo}{Absoluter Fehler}
+    Es gilt für $z = f(x_1, \ldots, x_n)$ der \emph{absolute Fehler}:
+    $$
+        \Delta z_{\max} \leq \sum_{i=1}^n \abs{f_{x_i}} \cdot \abs{\Delta x_i}
+    $$
+\end{algo}
+
+\begin{algo}{Relativer Fehler}
+    Es gilt für $z = f(x, y) = c \cdot x^a \cdot y^b$ anhand der möglichen relativen Eingabefehler $\frac{\Delta x}{x}$ und $\frac{\Delta y}{y}$ der \emph{relative Fehler}:
+    $$
+        \frac{\Delta z}{z} \leq a \cdot \abs{\frac{\Delta x}{x}} + b \cdot \abs{\frac{\Delta y}{y}}
+    $$
+\end{algo}
+
+\begin{example}{Relativer Fehler}
+    Bei der Berechnung einer Fläche $f(x, y) = 5x^2 \cdot y$ werde ein relativer Messfehler von $10\%$ in $x$ und $3\%$ in $y$ gemacht.
+    Wie ist der relative Fehler des Ergebnisses?
+
+    \exampleseparator
+
+    $z := f(x, y) = 5x^2 \cdot y \qquad \left( c \cdot x^a \cdot y^b\right)$
+
+    Es ist der relative Fehler gegeben mit
+    $$
+        \frac{\Delta z}{z} \leq a \cdot \abs{\frac{\Delta x}{x}} + b \cdot \abs{\frac{\Delta y}{y}} = 2 \cdot 10\% + 1\cdot 3\% = 23\%
+    $$\qed
+\end{example}
+
+\begin{defi}{Kurve}
+    Seien $x(t)$ und $y(t)$ in $t$ stetige Funktionen.
+    Die Menge
+    $$
+        \left\{ (x, y) \mid x = x(t), \ y=y(t), \ t\in \R \right\}
+    $$
+    heißt \emph{Kurve}.
+    Die Darstellung $t\to \R^2$
+    $$
+        \vec{x}(t) = \vektor{x(t) \\ y(t)}
+    $$
+    heißt \emph{Parameterdarstellung der Kurve}.
+\end{defi}
+
+\begin{defi}{Kettenregel für Funktionen mit einem Parameter}
+    Sei $z = f(\vec{x}) = f(\vec{x}(t))$ und $\vec{x}(t)$ stetig in jeder Komponente $x_i$. Dann gilt:
+    $$
+        \frac{\d z}{\d t} = \sum_{i=1}^n \frac{\partial z}{\partial x_i} \cdot \frac{\d x_i}{\d t}
+    $$
+\end{defi}
+
+\begin{defi}{Kettenregel für Funktionen mit zwei Parametern}
+    Sei $z = f(\vec{x}) = f(\vec{x}(u,v))$ und $\vec{x}(u,v)$ stetig in jeder Komponente $x_i$. Dann gilt:
+    $$
+        \frac{\partial z}{\partial u} = \sum_{i=1}^n \frac{\partial z}{\partial x_i} \cdot \frac{\partial x_i}{\partial u}
+    $$
+    $$
+        \frac{\partial z}{\partial v} = \sum_{i=1}^n \frac{\partial z}{\partial x_i} \cdot \frac{\partial x_i}{\partial v}
+    $$
+\end{defi}
+
+\begin{defi}{Implizite Differentiation}
+    Seien $F(x, f(x)) = F(x, y)$ und $f(x) = y$ differenzierbar.
+    Gilt $F(x_0, y_0) = 0$, dann wird $y$ \emph{implizit differenziert} mit
+    $$
+        y' = -\frac{F_x(x_0, y_0)}{F_y(x_0, y_0)}
+    $$
+
+    Es gilt:
+    \begin{itemize}
+        \item Die implizite Differentiation kann insbesondere angewendet werden, wenn sich eine Funktion $F(x, y)=0$ nicht oder nicht einfach nach $y$ umstellen lässt.
+        \item Die Funktion muss ggf. auf die Form $F(x, y) = 0$ gebracht werden.
+        \item Es ist immer zu testen, ob der vorgegebene Punkt die Bedingung $F(x_0, y_0) = 0$ erfüllt.
+        \item Die Rechnung kann an einem beliebigen Punkt $(x_0, y_0)$ durchgeführt werden und somit auch eine Ableitungsfunktion berechnen.
+    \end{itemize}
+\end{defi}
+
+\subsubsection{Partielle Ableitungen höherer Ordnung}
+
+\begin{defi}{Satz von Schwarz}
+    Sind die partiellen Ableitungen $k$-ter Ordnung einer Funktion stetige Funktionen, so darf die Reihenfolge der Differentiation beliebig vertauscht werden.
+\end{defi}
+
+\begin{defi}{Divergenz}
+    Wir bezeichnen die \emph{Divergenz} einer Funktion $f$ mit
+    $$
+        \operatorname{div} f := \nabla \cdot f = \vektor{\frac{\partial}{\partial x_1} \\ \vdots \\ \frac{\partial}{\partial x_n}} \vektor{f_1(x_1, \ldots, x_n) \\ \vdots \\ f_n(x_1, \ldots, x_n)} = \sum_{i=1}^n \frac{\partial f_i(x_1, \ldots, x_n)}{\partial x_i}
+    $$
+\end{defi}
+
+\begin{defi}{Rotation}
+    Wir bezeichnen die \emph{Rotation} einer Funktion $f$ mit
+    $$
+        \operatorname{rot} f := \nabla \times f = \vektor{\frac{\partial}{\partial x_1} \\ \vdots \\ \frac{\partial}{\partial x_n}} \times \vektor{f_1(x_1, \ldots, x_n) \\ \vdots \\ f_n(x_1, \ldots, x_n)}
+    $$
+\end{defi}
+
+\begin{bonus}{Quellen und Senken}
+    Die Punkte mit $\operatorname{div} f > 0$ heißen \emph{Quellen} des Vektorfeldes, die mit $\operatorname{div} f < 0$ heißen \emph{Senken}.
+
+    Gilt stets $\operatorname{div} f = 0$, so heißt die Funktion \emph{quellenfrei}.
+
+    Gilt $\operatorname{rot} f = 0$, so heißt die Funktion \emph{wirbelfrei}.
+\end{bonus}
+
+\begin{defi}{Jacobi-Matrix}
+    Die Matrix
+    $$
+        J = \vektor{\frac{\partial f_1}{\partial x_1} & \ldots & \frac{\partial f_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_n}{\partial x_1} & \ldots & \frac{\partial f_n}{\partial x_n}}
+    $$
+    heißt \emph{Jacobi-Matrix} von $f$.
+\end{defi}
+
+\subsubsection{Taylorentwicklung für $f(x, y)$}
+
+\begin{defi}{Quadratische Approximation}
+    Für $f(x, y)$ ist die \emph{quadratische Approximation} gegeben mit
+    $$
+        \begin{aligned}
+            f(x, y) \quad = \quad & f(x_0, y_0) + f_x(x_0, y_0) (x-x_0) + f_y(x_0, y_0) (y-y_0)                                                    \\
+            + \quad               & \frac{f_{xx}(x_0, y_0) (x-x_0)^2}{2} + f_{xy}(x_0, y_0) (x-x_0) (y-y_0) + \frac{f_{yy}(x_0, y_0) (y-y_0)^2}{2}
+        \end{aligned}
+    $$
+\end{defi}
+
+\subsubsection{Extremwerte ohne Nebenbedingungen}
+
+\begin{algo}{Lokale Extrema ohne Nebenbedingungen im $\R^2$}
+    \begin{enumerate}
+        \item Berechne $f_x(x,y)$ und $f_y(x, y)$ und suche diejenigen Stellen $(x_0, y_0)$ mit
+              $$
+                  f_x(x_0, y_0) = f_y(x_0, y_0) = 0
+              $$
+              Diese Stellen sind die \emph{Kandidaten} für lokale Extrema.
+        \item Berechne für jeden Kandidaten $(x_0, y_0)$ die Werte $f_{xx}(x_0, y_0)$, $f_{xy}(x_0, y_0)$ und $f_{yy}(x_0, y_0)$ und daraus den Wert
+              $$
+                  d := f_{xx}(x_0, y_0) \cdot f_{yy}(x_0, y_0) - \left(f_{xy}(x_0, y_0)\right)^2
+              $$
+        \item Dann gilt:
+              \subitem $f_{xx}(x_0, y_0) > 0 \ \land \ d > 0 \implies$ \emph{lokales Minimum}
+              \subitem $f_{xx}(x_0, y_0) < 0 \ \land \ d > 0 \implies$ \emph{lokales Maximum}
+              \subitem $d < 0 \implies$ \emph{Sattelpunkt}
+              \subitem $d = 0 \implies$ höhere Ableitung entscheidet
+    \end{enumerate}
+\end{algo}
+
+\begin{defi}{Hesse-Matrix im $\R^2$}
+    Die \emph{Hesse-Matrix} im $\R^2$ ist definiert mit
+    $$
+        H = \vektor{f_{xx}(x_0, y_0) & f_{xy}(x_0, y_0) \\ f_{xy}(x_0, y_0) & f_{yy}(x_0, y_0)}
+    $$
+
+    Ist $H$ \emph{positiv definit}, so liegt ein Minimum vor, ist $H$ \emph{negativ definit} ein Maximum und bei \emph{indefinitem} $H$ ein Sattelpunkt.
+
+    Es gilt:
+    \begin{itemize}
+        \item $H$ ist positiv definit $\iff f_{xx}(x_0, y_0) > 0 \ \land \det H > 0$
+        \item $H$ ist negativ definit $\iff f_{xx}(x_0, y_0) < 0 \ \land \det H > 0$
+        \item $H$ indefinit $\iff \det H < 0$
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Hesse-Matrix im $\R^n$}
+    Die \emph{Hesse-Matrix} im $\R^n$ ist definiert mit
+    $$
+        H = \vektor{\frac{\partial^2 f}{\partial x_1^2} & \ldots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial^2 f}{\partial x_n \partial x_1} & \ldots & \frac{\partial^2 f}{\partial x_n^2}}
+    $$
+
+    Ist $H$ \emph{positiv definit}, so liegt ein Minimum vor, ist $H$ \emph{negativ definit} ein Maximum und bei \emph{indefinitem} $H$ ein Sattelpunkt.
+
+    Es gilt:
+    \begin{itemize}
+        \item $H$ ist positiv definit $\iff$ alle \emph{Unterdeterminanten} (links oben beginnend) sind positiv
+        \item $H$ ist negativ definit $\iff$ alle \emph{Unterdeterminanten} (links oben beginnend) haben wechselndes Vorzeichen (beginnend mit negativem Vorzeichen)
+        \item $H$ indefinit $\iff$ sonst
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Lokale Extrema ohne Nebenbedingungen}
+    Untersuchen Sie die Funktion
+    $$
+        v(x, y, z) = xy - z^4 -2(x^2 + y^2 -z^2)
+    $$ auf lokale Extrema und Sattelpunkte.
+
+    \exampleseparator
+
+    $v(x, y, z) = xy - z^4 -2(x^2 + y^2 -z^2) = xy - z^4 -2x^2 -2y^2 + 2z^2$
+
+    Wir berechnen zuerst die potentiellen Kandidaten.
+    Für diese muss gelten
+    $$
+        \nabla v(x, y, z) = \vektor{v_x(x, y, z)      \\ v_y(x, y, z)\\ v_z(x, y, z)} = \vec{0}
+    $$
+    $$
+        \iff \vektor{ y -4x \\ x -4y \\ -4z^3 +4z} = \vektor{0 \\ 0 \\ 0} \iff \vektor{y \\ x \\ -z(z^2 +1)} = \vektor{4x \\ 4y \\ 0}
+    $$
+    Wir haben offensichtlich drei Gleichungen gegeben.
+
+    Wir erkennen aus \Rnum{3} direkt, dass $z \in \{-1, 0, 1\}$ gelten muss und aus \Rnum{2} und \Rnum{1}, dass $x = y = 0$.
+
+    Damit erhalten wir die drei Kandidatentupel:
+    \begin{itemize}
+        \item $(x_1, y_1, z_1) = (0, 0, -1)$,
+        \item $(x_2, y_2, z_2) = (0, 0, 0)$,
+        \item $(x_3, y_3, z_3) = (0, 0, 1)$.
+    \end{itemize}
+
+    Wir bilden nun die Hesse-Matrix:
+    $$
+        \begin{aligned}
+            f_{xx} = -4 \qquad         & f_{xy} = 1          &  & f_{xz} = 0         \\
+            f_{yx} = f_{xy} = 1 \qquad & f_{yy} = -4         &  & f_{yz} = 0         \\
+            f_{zx} = f_{xz} = 0 \qquad & f_{zy} = f_{yz} = 0 &  & f_{zz} = 12z^2 + 4
+        \end{aligned}
+    $$
+
+    $$
+        H = \vektor{f_{xx} & f_{xy} & f_{xz} \\ f_{yx} & f_{yy} & f_{yz} \\ f_{zx} & f_{zy} & f_{zz}} = \vektor{-4 & 1 & 0 \\ 1 & -4 & 0 \\ 0 & 0 & -12z^2 + 4}
+    $$
+
+    Es gilt für die Unterdeterminanten:
+    $$
+        \begin{aligned}
+            \det H_1 & = -4                                                                 \\
+            \det H_2 & = 15                                                                 \\
+            \det H   & = (-12z^2 + 4) \cdot \det H_2 = (-12z^2 + 4) \cdot 15 = -180z^2 + 60
+        \end{aligned}
+    $$
+
+    Es gilt weiterhin
+    $$
+        \det H \leq 0 \iff -180z^2 + 60 \leq 0 \iff z^2 \leq \frac{1}{3}
+    $$
+
+    Damit ist die Hesse-Matrix für alle $\abs{z} \leq \frac{1}{9}$ indefinit und sonst negativ definit.
+
+    Damit sind die Kandidatentupel $(x_1, y_1, z_1) = (0, 0, -1)$ und $(x_3, y_3, z_3) = (0, 0, 1)$ Maxima und $(x_2, y_2, z_2) = (0, 0, 0)$ ein Sattelpunkt. \qed
+\end{example}
+
+\subsubsection{Extremwerte mit Nebenbedingungen}
+
+\begin{defi}{Lagrange-Funktion}
+    Gegeben seien eine Funktion $f(x, y)$ und eine Nebenbedingung $g(x, y) = 0$.
+    Dann ist  die \emph{Lagrange-Funktion} gegeben mit
+    $$
+        L(x, y, \lambda) = f(x, y) + \lambda g(x, y)
+    $$
+
+    Es gilt damit:
+    $$
+        L_\lambda = g(x, y) \quad \land \quad g(x, y) = 0 \implies L(x,y,\lambda) = f(x, y)
+    $$
+\end{defi}
+
+\begin{algo}{Lokale Extrema mit Nebenbedingung im $\R^2$}
+    \begin{enumerate}
+        \item Berechne die Kandidaten wie in freien Optimierungen mit
+              $$
+                  \nabla (L) = \vec{0}
+              $$
+        \item Aufstellen der geränderten Hesse-Matrix für die drei Unbekannten mit
+              $$
+                  H = \vektor{L_{xx} & L_{xy} & g_x \\ L_{xy} & L_{yy} & g_y \\ g_x & g_y & 0}
+              $$
+        \item Dann gilt:
+              \subitem $\det H > 0 \implies$ \emph{Maximum}
+              \subitem $\det H < 0 \implies$ \emph{Minimum}
+              \subitem $\det H = 0 \implies$ keine Entscheidung möglich
+    \end{enumerate}
+\end{algo}
+
+\subsubsection{Parametrische Funktionen und Kurvenintegrale}
+
+\begin{defi}{Tangentenvektor}
+    Der \emph{Tangentenvektor} einer Kurve $\vec{x}(t)$ ist gegeben mit
+    $$
+        \vec{x'}(t) = \vektor{x_1'(t) \\ \vdots \\ x_n'(t)}
+    $$
+\end{defi}
+
+\begin{defi}{Tangente}
+    Die \emph{Tangente} einer Kurve $\vec{x}(t)$ ist gegeben mit
+    $$
+        T(t) = \vec{x}(t) + \lambda\vec{x'}(t)
+    $$
+\end{defi}
+
+\begin{defi}{Arbeitsintegral}
+    Seien die Kraft $F(\vec{x}(t))$ und ein Zeitintervall $t \in \interval{a,b}$, oder analog Start- und Endpunkte $\vec{A} = \vec{x}a)$ bzw. $\vec{B} = \vec{x}(b)$, gegeben.
+
+    Dann ist die \emph{Arbeit} gegeben mit
+    $$
+        W = \int^b_a F(\vec{x}(t)) \cdot \vec{x'}(t) \d t
+    $$
+\end{defi}
+
+\begin{example}{Arbeitsintegral}
+    Gegeben sei die Kurve $\vec{X}(t) = \vektor{t \\ t^2 \\ t^3}$.
+    Berechnen Sie die Arbeit im Vektorfeld
+    $$
+        \vec{F}(x, y, z) = \vektor{x+yz \\ y + xz \\ z + xy}
+    $$
+    entlang der Kurve.
+
+    \exampleseparator
+
+    Die Arbeit von Zeitpunkt $t=a$ bis Zeitpunkt $t=b$ ist gegeben mit
+    $$
+        W = \int^b_a \vec{F} (\vec{X}(t)) \cdot \vec{X}'(t) \dt
+    $$
+    Wir berechnen:
+    $$
+        \begin{aligned}
+            W =\quad & \int^b_a \vec{F} (\vec{X}(t)) \cdot \vec{X}'(t) \dt                                                                    \\
+            =\quad   & \int^b_a \vektor{t + t^5                                                                                               \\ t^2 + t^4 \\ 2t^3} \cdot \vektor{1 \\ 2t \\ 3t^2} \dt \\
+            =\quad   & \int^b_a \left( t + t^5 + 2t(t^4 + t^2) + 3t^2 \cdot 2t^3\right)  \dt                                                  \\
+            =\quad   & \int^b_a \left(9t^5 + 2t^3 + t\right) \dt                                                                              \\
+            =\quad   & \left[ \frac{3t^6}{2} + \frac{t^4}{2} + \frac{t^2}{2} \right]^b_a     = \frac{3(b^6 - a^6) + b^4 + b^2 - a^4 - a^2}{2}
+        \end{aligned}
+    $$\qed
+\end{example}
+
+\begin{defi}{Potentialfunktion}
+    Sei $f : \R^n \to \R^n$ stetig differenzierbar.
+    $f$ heißt \emph{Gradientenfeld}, wenn es eine skalare Funktion $V$ gibt, mit
+    $$
+        \nabla (V) = f
+    $$
+
+    Die Funktion $V$ heißt dann \emph{Potentialfunktion} von $f$ mit
+    $$
+        V = \int f
+    $$
+
+    Es gilt:
+    \begin{itemize}
+        \item Im $\R^2$:
+              $$
+                  \frac{\partial f_1}{\partial y} = \frac{\partial f_2}{\partial x}
+              $$
+        \item Im $\R^3$:
+              $$
+                  \operatorname{rot} f = 0
+              $$
+        \item Im $\R^n$ für die Jacobimatrix $J$
+              $$
+                  J = J^T
+              $$
+    \end{itemize}
+\end{defi}
+
+\section{Mehrdimensionale Integration}
+
+\subsection{Doppelintegrale}
+
+\begin{defi}{Integral im $\R^2$}
+    Bezeichnet $A$ das Rechteck $\interval{x_0, x_1} \times \interval{y_0, y_1}$, so ist das \emph{Integral} von $f$ über das Gebiet $A$ gegeben mit
+    $$
+        \int^{x_1}_{x_0}\int^{y_1}_{y_0} f(x, y) \d y\d x = \int_A f \d A = \int\int_A f \d A
+    $$
+\end{defi}
+
+\begin{algo}{Integration über kartesische krummlinige Bereiche}
+    Seien eine \emph{obere} und eine \emph{untere Funktion} $f_u(x)$ und $f_v(x)$ gegeben und in der zweiten Dimension das Intervall $\interval{a,b}$, dann gilt für das Integral im entsprechenden Integrationsbereich
+    $$
+        \int_{x = a}^{b}\int_{y = f_u(x)}^{f_o(x)} f(x, y) \d y\d x
+    $$
+\end{algo}
+
+\begin{algo}{Flächeninhalt einer Grundfläche eines kartesischen krummlinigen Bereiches}
+    Der Flächeninhalt $F$ einer Grundfläche $A$ ergibt sich durch Integration mit $f(x, y) = 1$, also
+    $$
+        F = \int_A 1 \d A
+    $$
+\end{algo}
+
+\begin{example}{Integration über kartesische krummlinige Bereiche}
+    Berechnen Sie das Volumen der Funktion $f(x, y) = x+y$ über die Fläche
+    $$
+        A = \{(x, y) \in \R^2 \mid 1 \leq x^2 + 4y^2, x^2 + y^2 \leq 1, x \geq 0, y\geq 0\}
+    $$
+    Skizzieren Sie zunächst die Fläche.
+
+    \exampleseparator
+
+    \begin{center}
+        \begin{tikzpicture}[scale=1]
+            \begin{axis}[
+                    width=15cm,
+                    xmin=-1.5,xmax=1.5,
+                    xtick distance=1,
+                    xlabel = $x$,
+                    ymin=-1.5,ymax=1.5,
+                    ytick distance=1,
+                    ylabel = $y$,
+                    axis equal,
+                    grid=both,
+                    axis lines = middle,
+                    disabledatascaling
+                ]
+                %\draw [name path=A] (axis cs:0,-2) arc[start angle=-90, end angle=90, radius={transformdirectionx(2)}];
+                %\draw [name path=B] (axis cs:0,-3) arc[start angle=-90, end angle=90, radius={transformdirectionx(3)}];
+
+                \draw [name path=A1] (axis cs:1,0) arc[start angle=0, end angle=180, radius={transformdirectionx(1)}];
+                \draw [name path=A2] (axis cs:-1,0) arc[start angle=180, end angle=360, radius={transformdirectionx(1)}];
+                %\draw [name path=B] (axis cs:0,0) circle [x radius=1, y radius=1/4];
+
+                \draw [name path=B1] (axis cs:1,0) arc(0:180:1 and 1/2);
+                \draw [name path=B2] (axis cs:-1,0) arc(180:360:1 and 1/2);
+
+                \tikzfillbetween[of=A1 and B1, soft clip={domain=0:1}]{red, opacity=0.75};
+                %\tikzfillbetween[of=A2 and B2]{red, opacity=0.5};
+            \end{axis}
+        \end{tikzpicture}
+    \end{center}
+
+    Wir sehen, dass die Ellipsengleichung die untere und die Kreisgleichung die obere Schranke bilden.
+    Damit formen wir unser Integrationsgebiet wie folgt um:
+    $$
+        A = \left\{(x, y) \in \R^2 \mid 0 \leq x \leq 1, \frac{\sqrt{1-x^2}}{2} \leq y \leq \sqrt{1-x^2} \right\}
+    $$
+\end{example}
+
+\begin{example}{Integration über kartesische krummlinige Bereiche (Fortsetzung)}
+    Dann können wir wie folgt die Fläche berechnen:
+    $$
+        \begin{aligned}
+            \int\int_A (x+y) \d x \d y & = \int^1_0\int^{\sqrt{1-x^2}}_{\frac{\sqrt{1-x^2}}{2}} (x+y) \d y \d x                                                                                                       \\
+                                       & = \int^1_0 \left[xy + \frac{y^2}{2}\right]^{\sqrt{1-x^2}}_{\frac{\sqrt{1-x^2}}{2}}  \d x                                                                                     \\
+                                       & = \int^1_0 \left(x\sqrt{1-x^2} + \frac{1-x^2}{2} - \left( \frac{x\sqrt{1-x^2}}{2} - \frac{1-x^2}{8}\right)\right)  \d x                                                      \\
+                                       & = \int^1_0 \left(\frac{x\sqrt{1-x^2}}{2} + \frac{3(1-x^2)}{8}\right)  \d x                                                                                                   \\
+                                       & = \frac{1}{2}\int^1_0 x\sqrt{1-x^2} \d x + \frac{3}{8} \int^1_0 (1-x^2) \d x                                                                                                 \\
+                                       & \overset{\footnote{$u = 1-x^2 \implies \frac{\d u}{\d x} = -2x \iff \d x = -\frac{\d u}{2x}$}}{=} -\frac{1}{4}\int^1_{x=0} \sqrt{u} \d u + \frac{3}{8} \int^1_0 (1-x^2) \d x \\
+                                       & = -\frac{1}{4} \left[ \frac{2\sqrt{1-x^2}}{3} \right]^1_{0} + \frac{3}{8} \int^1_0 (1-x^2) \d x                                                                              \\
+                                       & = \frac{1}{6} + \frac{3}{8} \int^1_0 (1-x^2) \d x                                                                                                                            \\
+                                       & = \frac{1}{6} + \frac{3}{8} \left[ x-\frac{x^3}{3} \right]^1_0                                                                                                               \\
+                                       & = \frac{1}{6} + \frac{3}{8} \left( 1-\frac{1}{3} \right)                                                                                                                     \\
+                                       & = \frac{5}{12}                                                                                                                                                               \\
+        \end{aligned}
+    $$\qed
+\end{example}
+
+\begin{algo}{Schwerpunkt einer Grundfläche eines homogenen Gebietes}
+    Der Schwerpunkt mit den Schwerpunktskoordinaten $(x_s, y_s)$ einer Fläche mit homogener Dichte ergibt sich mit der Flächenmaßzahl $F$ aus
+    $$
+        x_s = \frac{1}{F}\int_A x \d A \quad \land \quad y_s = \frac{1}{F}\int_A y \d A
+    $$
+\end{algo}
+
+\begin{algo}{Masse einer Grundfläche eines inhomogenen Gebietes}
+    Wird die spezifische Dichte eines Stoffes in der Koordinate $(x, y)$ gegeben durch $\rho(x, y)$, so lässt sich die Masse einer Fläche $A$ berechnen mit
+    $$
+        M = \int_A  \rho(x, y) \d A
+    $$
+\end{algo}
+
+\begin{algo}{Integration in Polarkoordinaten}
+    Bei der Umwandlung der kartesischen Koordinaten $(x, y)$ in \emph{Polarkoordinaten} umwandeln, gilt
+    $$
+        f(x, y) = f(r\cos\phi, r\sin\phi)\quad \land \quad \d y \d x = r \d r \d \phi
+    $$
+
+    Und dann insgesamt für die Integration:
+    $$
+        \int_A f(x, y) \d y \d x = \int_A f(r \cos\phi, r\sin\phi)r\d r\d\phi
+    $$
+\end{algo}
+
+\begin{algo}{Uneigentliche Integrale mithilfe von Polarkoordinaten}
+    Der Übergang zu Polarkoordinaten kann bei der Berechnung von uneigentlichen zweidimensionalen Integralen behilflich sein.
+    Dabei gilt:
+    $$
+        \int_{x=-\infty}^\infty\int_{y=-\infty}^\infty f(x, y) \d y \d x = \int_{\phi = 0}^{2\pi} \int_{r = 0}^\infty f(r\cos\phi, r\sin\phi)r\d r\d\phi
+    $$
+\end{algo}
+
+\begin{example}{Uneigentliche Integrale mithilfe von Polarkoordinaten}
+    Berechnen Sie das folgende Integral
+    $$
+        \int_A x\cdot y \d A
+    $$
+    über dem Integrationsgebiet $A$ gegeben durch die Ungleichungen
+    $$
+        -2 \leq y \leq 2, \quad x \geq 0, \quad x^2 + y^2 \leq 4
+    $$
+    \begin{enumerate}[a)]
+        \item in kartesischen Koordinaten,
+        \item in Polarkoordinaten.
+    \end{enumerate}
+
+    \exampleseparator
+
+    \begin{enumerate}[a)]
+        \item
+              Es gilt:
+              $$
+                  \begin{aligned}
+                      \int_A x\cdot y \d A & = \int_{-2}^2 \int^{\sqrt{4-y^2}}_0 x\cdot y \d x \d y             \\
+                                           & = \int_{-2}^2 y \left[ \frac{x^2}{2} \right]^{\sqrt{4-y^2}}_0 \d y \\
+                                           & = \int_{-2}^2 \frac{y(4-y^2)}{2} \d y                              \\
+                                           & = \frac{1}{2}\int_{-2}^2 (4y-y^3) \d y                             \\
+                                           & = \frac{1}{2}\int_{-2}^2 (4y-y^3) \d y                             \\
+                                           & = \frac{1}{2}\left[2y^2-\frac{y^4}{4}\right]_{0}^2                 \\
+                                           & = 0
+                  \end{aligned}
+              $$\qed
+    \end{enumerate}
+\end{example}
+
+
+\begin{example}{Uneigentliche Integrale mithilfe von Polarkoordinaten (Fortsetzung)}
+    \begin{enumerate}[a)]
+        \setcounter{enumi}{1}
+        \item
+              Es gilt:
+              $$
+                  \begin{aligned}
+                      \int_A x\cdot y \d A & = \int^\frac{\pi}{2}_{-\frac{\pi}{2}} \int^2_0 r^3\cos\phi\sin\phi \d r \d \phi                                                                                             \\
+                                           & = \int^\frac{\pi}{2}_{-\frac{\pi}{2}} \cos\phi\sin\phi \int^2_0 r^3 \d r \d \phi                                                                                            \\
+                                           & = \int^\frac{\pi}{2}_{-\frac{\pi}{2}} \cos\phi\sin\phi \left[\frac{r^4}{4}\right]^2_0 \d \phi                                                                               \\
+                                           & = 4\int^\frac{\pi}{2}_{-\frac{\pi}{2}} \cos\phi\sin\phi \d \phi                                                                                                             \\
+                                           & \overset{\footnote{$u = \cos\phi \implies \frac{\d u}{\d \phi} = -\sin\phi \iff \d \phi = -\frac{\d u}{\sin \phi}$}}{=} -4\int^\frac{\pi}{2}_{\phi = -\frac{\pi}{2}} u \d u \\
+                                           & = -4 \left[ \frac{\cos^2\phi}{2} \right]^\frac{\pi}{2}_{-\frac{\pi}{2}}                                                                                                     \\
+                                           & = 0
+                  \end{aligned}
+              $$\qed
+    \end{enumerate}
+\end{example}
+\subsection{Dreifachintegrale}
+
+\begin{defi}{Dreifachintegral}
+    Bezeichnet $V$ den Quader $\interval{x_0, x_1} \times \interval{y_0, y_1} \times \interval{z_0, z_1}$, so ist das \emph{Dreifachintegral} von $f$ über das Gebiet $V$ gegeben mit
+    $$
+        \int^{x_1}_{x_0}\int^{y_1}_{y_0}\int^{z_1}_{z_0} f(x, y, z) \d z\d y\d x = \int_A f \d A = \int\int\int_A f \d A
+    $$
+\end{defi}
+
+\begin{bonus}{Volumenberechnung im $\R^3$}
+    Die Berechnung eines Volumen $V$ über den Bereich $V'$ im $\R^3$ geschieht völlig analog zum $\R^2$:
+    $$
+        V = \int_{V'} 1 \d V'
+    $$
+\end{bonus}
+
+\begin{bonus}{Schwerpunktberechnung im $\R^3$}
+    Die Berechnung des Schwerpunktes $(x_s, y_s, z_s)$ mit Volumen $V$ über den Bereich $V'$ im $\R^3$ geschieht völlig analog zum $\R^2$:
+    $$
+        x_s = \frac{1}{V}\int_{V'} x \d V' \quad \land \quad y_s = \frac{1}{V}\int_{V'} y \d V' \quad \land \quad z_s = \frac{1}{V}\int_{V'} z \d V'
+    $$
+\end{bonus}
+
+\begin{bonus}{Rechnen mit Kugelkoordinaten}
+    Der Übergang zu Kugelkoordinaten kann bei der Berechnung von dreidimensionalen Integralen behilflich sein.
+    Dabei gilt:
+    $$
+        \int\int\int f(x,y,z) \d z\d y\d x = \int\int\int f(r\cos\phi\sin\theta, r\sin\phi\sin\theta, r\cos\theta) \abs{r^2\sin\theta} \d\theta\d\phi\d r
+    $$
+\end{bonus}
+
+\section{(*) Wachstums- und Zerfallsprozesse}
+
+\subsection{Ungebremstes Wachstum}
+
+\begin{defi}{Diskretes ungebremstes Wachstum}
+    Gegeben sei ein Wachstum $k$ innerhalb einer (beliebigen) Zeiteinheit $\Delta t_0$, eine Startpopulation $y_0$ und eine Änderungsrate
+    $$
+        \Delta y = k\cdot y
+    $$
+    dann ist die Lösungsfunktion
+    $$
+        \boxed{y_n = y_0\cdot (1+k)^n}
+    $$
+    wobei $y_n = y(n\cdot \Delta t_0)$ den Zustand nach $n$ Zeitschritten der Länge $\Delta t_0$ angibt.
+\end{defi}
+
+\begin{bonus}{Diskretes ungebremstes Wachstum für Zeitteile}s
+    Gegeben sei ein Wachstum $k$ innerhalb einer (beliebigen) Zeiteinheit $\Delta t_0 = 1$, eine Startpopulation $y_0$ und eine Änderungsrate
+    $$
+        \Delta y = k_{\Delta t_0}\cdot y
+    $$
+
+    Betrachten wir nun einen \emph{Zeitteil} $\Delta t$, dann ist das modifizierte Modell
+    $$
+        \Delta y = y_n - y_{n-1} = k_{\Delta t}\cdot  y_{n-1}\cdot  \Delta t
+    $$
+    mit der Lösung
+    $$
+        \boxed{y_n = y_0\cdot (1 + k_{\Delta t} \cdot \Delta t)^n}
+    $$
+    wobei $y_n = y(n\cdot \Delta t)$ den Zustand nach $n$ Zeitschritten der Länge $\Delta t$ angibt.
+
+    Die Lösung dieses Modells wird auch als \emph{diskrete Evolutionsgleichung des ungebremsten Wachstums} bezeichnet.
+\end{bonus}
+
+\begin{defi}{Kontinuierliches Modell der Evolutionsgleichung}
+    Zur Lösung der Modellgleichung
+    $$
+        \lim_{\Delta t \to 0} \frac{\Delta y}{\Delta t} = k\cdot y
+    $$
+    mit $y(0) = y_0$ und $k$ (kontinuierliches) Wachstum, so ist die \emph{kontinuierliche} Lösungsfunktion
+    $$
+        \boxed{y(t) = y_o \cdot e^{kt}}
+    $$
+    und wegen $\Delta t \to 0$ ist dies gleichbedeutend zu
+    $$
+        y'(t) = k \cdot y(t) \ \text{mit} \ y(0) = 0
+    $$
+
+    Ein solches Problem heißt \emph{Differentialgleichung mit Anfangswert} oder \emph{Anfangswertproblem}.
+\end{defi}
+
+\subsection{Gebremstes Wachstum - Störung erster Ordnung}
+
+\begin{defi}{Diskretes Modell des Wachstums mit Störung erster Ordnung}
+    Gegeben sei ein Wachstum $k$ innerhalb einer (beliebigen) Zeiteinheit $\Delta t_0$, eine Startpopulation $y(0) = y_0$, $\Delta t$ ein Zeitteil, $a$ die \emph{Abnahme pro Zeiteinheit} und eine Änderungsrate
+    $$
+        \Delta y = (k\cdot y - a) \cdot \Delta t
+    $$
+    dann ist die Lösungsfunktion
+    $$
+        \boxed{y_n = \left( y(0) - \frac{a}{k} \right) \cdot \left( 1 + k \cdot \Delta t \right)^n + \frac{a}{k}}
+    $$
+\end{defi}
+
+\begin{defi}{Kontinuierliches Modell des Wachstums mit Störung erster Ordnung}
+    Zur Lösung der Modellgleichung
+    $$
+        \lim_{\Delta t \to 0} \frac{\Delta y}{\Delta t} = k\cdot y - a
+    $$
+    mit $y(0) = y_0$, $k$ (kontinuierliches) Wachstum und $a$ \emph{kontinuierliche Abnahme} pro Zeiteinheit, ist die \emph{kontinuierliche} Lösungsfunktion
+    $$
+        \boxed{y(t) = \left( y(0) - \frac{a}{k} \right) \cdot e^{kt} + \frac{a}{k}}
+    $$
+    und wegen $\Delta t \to 0$ ist dies gleichbedeutend zu
+    $$
+        y'(t) = k \cdot y(t) - a
+    $$
+\end{defi}
+
+\begin{defi}{Stationäre Lösung}
+    Die konstanten Werte, ermittelt durch $\Delta y = 0$, heißen \emph{stationäre Lösungen} $y_s$.
+
+    Für Wachstumsmodelle mit Störung erster Ordnung gilt:
+    $$
+        y_s = \frac{a}{k}
+    $$
+\end{defi}
+
+\subsection{Logistisches Wachstum - Störung zweiter Ordnung}
+
+\begin{defi}{Diskretes Modell des Wachstums mit Störung zweiter Ordnung}
+    Gegeben sei ein Wachstum $k$ innerhalb einer (beliebigen) Zeiteinheit $\Delta t_0$, eine Startpopulation $y(0) = y_0$, $\Delta t$ ein Zeitteil, $R$ \emph{Oberschranke der verfügbaren Ressourcen} und eine Änderungsrate
+    $$
+        \Delta y = (k\cdot y \cdot (R-y)) \cdot \Delta t
+    $$
+    dann ist die Lösungsfunktion
+    $$
+        \boxed{y_n = \frac{R}{\frac{R-y_0}{y_0} \cdot (1 + R \cdot k \cdot \Delta t)^{-n} + 1}}
+    $$
+\end{defi}
+
+\begin{defi}{Kontinuierliches Modell des Wachstums mit Störung zweiter Ordnung}
+    Zur Lösung der Modellgleichung
+    $$
+        \lim_{\Delta t \to 0} \frac{\Delta y}{\Delta t} = k\cdot y \cdot (R-y)
+    $$
+    mit $y(0) = y_0$, $k$ (kontinuierliches) Wachstum und $R$ \emph{Oberschranke der verfügbaren Ressourcen}, ist die \emph{kontinuierliche} Lösungsfunktion
+    $$
+        \boxed{y(t) = \frac{R}{\frac{R-y_0}{y_0} \cdot e^{-Rkt} + 1}}
+    $$
+    und wegen $\Delta t \to 0$ ist dies gleichbedeutend zu
+    $$
+        y'(t) = k \cdot y(t) \cdot (R-y(t))
+    $$
+\end{defi}
+
+\section{Gewöhnliche Differentialgleichungen}
+
+\begin{defi}{Gewöhnliche Differentialgleichung $n$-ter Ordnung}
+    Eine Gleichung der Form
+    $$
+        y^{(n)} = f(x, y, y', y'', \ldots, y^{(n-1)})
+    $$
+    heißt \emph{(explizite) gewöhnliche Differentialgleichung n-ter Ordnung}.
+
+    Ist die Gleichung in der Form
+    $$
+        f(x, y, y', y'', \ldots, y^{(n)}) = 0
+    $$
+    gegeben, so heißt die Differentialgleichung \emph{implizit}.
+
+    Erfüllt $y(x)$ die Differentialgleichung, so heißt $y$ \emph{allgemeine Lösung der Differentialgleichung}.
+\end{defi}
+
+\begin{defi}{Anfangswertproblem}
+    Die Vorgabe einer expliziten Differentialgleichung und der Werte
+    $$
+        x_0, \quad y(x_0) = y_0, \quad y'(x_0) = y_1, \quad \ldots, \quad y^{(n-1)}(x_0) = y_{n-1}
+    $$
+    heißt \emph{Anfangswertproblem}.
+
+    Erfüllt $y(x)$ das Anfangswertproblem, so heißt $y$ \emph{spezielle Lösung des Anfangswertproblems}.
+\end{defi}
+
+\subsection{Lösungsverfahren für Differentialgleichungen erster Ordnung}
+
+\begin{algo}{Trennung der Variablen}
+    Gegeben: Differentialgleichung der Form
+    $$
+        \boxed{y' = f(x) \cdot g(y)} \quad \iff \quad \frac{\d y}{\d x} = f(x) \cdot g(y)
+    $$
+    \begin{enumerate}
+        \item $x$ und $y$ wie folgt trennen:
+              $$
+                  \frac{1}{g(y)} \d y = f(x) \d x
+              $$
+        \item Integration liefert:
+              $$
+                  \int \frac{1}{g(y)} \d y = \int f(x) \d x
+              $$
+        \item Umstellen nach $y$ liefert die Lösung der Differentialgleichung
+    \end{enumerate}
+\end{algo}
+
+\begin{example}{Trennung der Variablen}
+    Berechnen Sie die allgemeine Lösung der Differentialgleichung
+    $$
+        y' + (1+x)\cdot y = 0\quad \iff \quad y' = -y\cdot (1+x)
+    $$
+    \exampleseparator
+
+    $$
+        \begin{aligned}
+                       & \frac{\d y}{\d x}      &  & = -y \cdot (1+x)                        \\
+            \iff \quad & -\frac{1}{y} \d y      &  & = (1+x) \d x                            \\
+            \iff \quad & \int -\frac{1}{y} \d y &  & = \int (1+x) \d                         \\
+            \iff \quad & - \ln\abs{y} - c_2     &  & = x + \frac{x^2}{2} + c_1               \\
+            \iff \quad & y                      &  & = e^{-(c_1 + c_2)}e^{-\frac{x}{2}(x+2)} \\
+            \iff \quad & y                      &  & = ce^{-\frac{x}{2}(x+2)}                \\
+        \end{aligned}
+    $$\qed
+\end{example}
+
+\begin{algo}{Substitution}
+    \begin{itemize}
+        \item Differentialgleichung vom Typ
+              $$
+                  \boxed{y' = f(ax + by + c)}
+              $$
+              \begin{enumerate}
+                  \item Substituiere $z = ax + by + c$
+                  \item Es ergibt sich
+                        $$
+                            y = \frac{z -ax - c}{b} \quad \implies \quad y' = \frac{z' - a}{b}
+                        $$
+                        bzw.
+                        $$
+                            z' = a + bf(z)
+                        $$
+                  \item Lösen mithile von \emph{Trennung der Variablen} (\emph{Tipp:} Dividieren durch rechte Seite)
+                  \item Rücksubstitution in $y = \frac{z -ax - c}{b}$ ergibt die Lösung
+              \end{enumerate}
+        \item Differentialgleichung vom Typ
+              $$
+                  \boxed{y' = f\left(\frac{y}{x}\right)}
+              $$
+              \begin{enumerate}
+                  \item Substituiere $z = \frac{y}{x}$
+                  \item Es ergibt sich (Produktregel!)
+                        $$
+                            y = z \cdot x \quad \implies \quad y' = z + z' \cdot x
+                        $$
+                        bzw.
+                        $$
+                            z' = \frac{f(z) - z}{x} \quad \iff \quad z + z' \cdot x = f(z)
+                        $$
+                  \item Lösen mithile von \emph{Trennung der Variablen}
+                  \item Rücksubstitution in $y = z \cdot x$ ergibt die allgemeine Lösung
+              \end{enumerate}
+    \end{itemize}
+\end{algo}
+
+\begin{example}{Substitution}
+    Lösen Sie die folgende Differentialgleichung mit Hilfe einer geeigneten Substitution ($x \neq 0$):
+    $$
+        y' = \frac{1}{\sin\left(\frac{y}{x}\right)} + \frac{y}{x}
+    $$
+    \exampleseparator
+
+    Sei $u = \frac{y}{x}$ ($\implies u' = \frac{xy' - y}{x^2} \iff y' = u + xu'$). Dann gilt:
+
+    $$
+        \begin{aligned}
+                       & y'                  &  & = \frac{1}{\sin\left(\frac{y}{x}\right)} + \frac{y}{x} \\
+            \iff \quad & u + xu'             &  & = \frac{1}{\sin u} + u                                 \\
+            \iff \quad & xu'                 &  & = \frac{1}{\sin u}                                     \\
+            \iff \quad & \frac{x \d u}{\d x} &  & = \frac{1}{\sin u}                                     \\
+            \iff \quad & \sin u \d u         &  & = \frac{1}{x} \d x                                     \\
+            \iff \quad & \int \sin u \d u    &  & = \int \frac{1}{x} \d x                                \\
+            \iff \quad & -\cos (u) + c_2     &  & = \ln\abs{x} + c_1                                     \\
+            \iff \quad & \cos (u)            &  & = -\ln\abs{x} - c_1 + c_2                              \\
+            \iff \quad & u                   &  & = \arccos(-\ln\abs{x} - c_1 + c_2)                     \\
+            \iff \quad & \frac{y}{x}         &  & = \arccos(-\ln\abs{x} - c_1 + c_2)                     \\
+            \iff \quad & y                   &  & = x\arccos(c - \ln\abs{x})                             \\
+        \end{aligned}
+    $$\qed
+\end{example}
+
+\begin{defi}{Lineare Differentialgleichung}
+    Die Gleichung
+    $$
+        y' + f(x) \cdot y = 0
+    $$
+    heißt \emph{linear homogene Differentialgleichung} 1. Ordung.
+
+    Die Gleichung
+    $$
+        y' + f(x) \cdot y = g(x)
+    $$
+    heißt \emph{linear inhomogene Differentialgleichung} 1. Ordung und
+    $g(x)$ heißt \emph{Störfunktion}.
+
+    Das zugehörige Anfangswertproblem heißt \emph{lineares Anfangswertproblem}.
+\end{defi}
+
+\begin{algo}{Lösen von linearen homogenen Differentialgleichungen 1. Ordnung}
+    Für eine Gleichung
+    $$
+        \boxed{y' + f(x)\cdot y = 0}
+    $$
+    ist die allgemeine Lösung
+    $$
+        y = ce^{\int -f(x) \d x}
+    $$
+
+    $c$ wird dann durch Einsetzen eines Anfangswertes berechnet.
+\end{algo}
+
+\begin{algo}{Variation der Konstanten}
+    Gegeben: Differentialgleichung der Form
+    $$
+        \boxed{y' + f(x)\cdot y = g(x)}
+    $$
+    \begin{enumerate}
+        \item Löse homogene Differentialgleichung mit
+              $$
+                  y = ce^{\int - f(x) \d x}
+              $$
+        \item Ersetze $c$ durch $c(x)$
+        \item Berechne $y'$
+        \item Vergleiche $y'$ mit ursprünglicher Störfunktion
+        \item Bestimme aus der Differentialgleichung die Lösung für $c(x)$ (enthält neue Konstante!)
+        \item Einsetzen in
+              $$
+                  y = c(x) \cdot e^{\int - f(x) \d x}
+              $$
+              ergibt die allgemeine Lösung
+    \end{enumerate}
+\end{algo}
+
+\begin{example}{Variation der Konstanten}
+    Berechnen Sie die allgemeine Lösung der Differentialgleichung
+    $$
+        (x-2) \cdot y' = y + 2(x-2)^3
+    $$
+    \exampleseparator
+
+    Umwandeln in allgemeine Darstellung:
+    $$
+        (x-2) \cdot y' = y + 2(x-2)^3 \quad \iff \quad y' = \frac{y}{x-2} + 2(x-2)^2 \quad \iff \quad y' - \frac{1}{x-2}\cdot y = 2(x-2)^2
+    $$
+    Lösen der homogenen Gleichung:
+    $$
+        \begin{aligned}
+                       & y'_h - \frac{1}{x-2}\cdot y_h &  & = 0                         \\
+            \iff \quad & y'_h                          &  & = \frac{1}{x-2}\cdot y_h    \\
+            \iff \quad & \frac{1}{y_h} \d y_h          &  & = \frac{1}{x-2}\d x         \\
+            \iff \quad & \int \frac{1}{y_h} \d y_h     &  & = \int \frac{1}{x-2}\d x    \\
+            \iff \quad & \ln(y_h) + c_2                &  & = \ln (x-2) + c_1           \\
+            \iff \quad & (y_h)                         &  & = e^{\ln (x-2) + c_1 - c_2} \\
+            \iff \quad & y_h                           &  & = c(x-2)                    \\
+        \end{aligned}
+    $$
+
+    Lösen der Störfunktion:
+    $$
+        \begin{aligned}
+                           & y  &  & = c(x) \cdot (x-2)  \\
+            \implies \quad & y' &  & = c'(x)(x-2) + c(x)
+        \end{aligned}
+    $$
+    $$
+        \begin{aligned}
+                       & y' - \frac{1}{x-2}\cdot y                                                                  &  & = 2(x-2)^2                   \\
+            \iff \quad & \underbrace{c'(x)(x-2) + c(x)}_{y'} - \frac{1}{x-2}\cdot \underbrace{c(x) \cdot (x-2)}_{y} &  & = 2(x-2)^2                   \\
+            \iff \quad & c'(x)(x-2)                                                                                 &  & = 2(x-2)^2                   \\
+            \iff \quad & c'(x)                                                                                      &  & = 2(x-2)                     \\
+            \iff \quad & \int 1 \d c                                                                                &  & = 2\int x\d x - 4\int 1 \d x \\
+            \iff \quad & c(x)                                                                                       &  & = x^2 - 4x + c_1
+        \end{aligned}
+    $$
+
+    Damit erhalten wir insgesamt:
+    $$
+        y = (x^2 - 4x + c)(x-2) = c(x-2) + (x-4)(x-2)x
+    $$\qed
+\end{example}
+
+\begin{defi}{Superpositionsprinzip (inhomogene lineare Differentialgleichungen)}
+    Die Lösung einer \emph{inhomogenen linearen Differentialgleichung} setzt sich zusammen aus der allgemeinen Lösung der homogenen Differentialgleichung $y_h$ und einer partikulären Lösung der \emph{inhomogenen Differentialgleichung} $y_p$
+    $$
+        y = y_h + y_p
+    $$
+\end{defi}
+
+\begin{algo}{Ansatz vom Typ der rechten Seite}
+    Man rät eine Lösung, indem man einen Ansatz für $y_p$ vom Typ der Störfunktion $g(x)$ wählt:
+
+    \begin{center}
+        \begin{tabular}{c | c l}
+            Störfunktion $g(x)$            & Ansatz für $y_p$                                                                        \\
+            \hline
+            $c_0$                          & $\lambda_0$                                        & \rdelim\}{3}{3mm}[polynomiell]     \\
+            $c_0 + c_1x$                   & $\lambda_0 + \lambda_1 x$                                                               \\
+            $c_0 + c_1x + \ldots + c_nx^n$ & $\lambda_0 + \lambda_1 x + \ldots + \lambda_nx^n$                                       \\
+            \hline
+            $c_0e^{ax}$                    & $\lambda_0 e^{ax}$                                 & \rdelim\}{4}{3mm}[exponentiell]    \\
+            $c_0e^{ax}$                    & $\lambda_0 xe^{ax}$                                                                     \\
+            $c_0e^{ax}$                    & $\ldots$                                                                                \\
+            $c_0e^{ax}$                    & $\lambda_0 x^ne^{ax}$                                                                   \\
+            \hline
+            $c_0\sin(ax) + c_1\cos(ax)$    & $\lambda_0\sin(ax) + \lambda_1\cos(ax)$            & \rdelim\}{3}{3mm}[trigonometrisch] \\
+            $c_0e^{ax}\cdot \sin(bx)$      & $x\cdot (\lambda_1 \sin(bx) + \lambda_2 \cos(bx))$                                      \\
+            $c_0e^{ax}\cdot \cos(bx)$      & $x\cdot (\lambda_1 \sin(bx) + \lambda_2 \cos(bx))$                                      \\
+        \end{tabular}
+    \end{center}
+
+    \emph{Bemerkungen:}
+    \begin{itemize}
+        \item Bei einer Summe von mehreren Funktionstypen sollten entsprechend viele partikuläre Teillösungen berechnet werden. Die Summe dieser Teillösungen entspricht dann insgesamt der partikulären Lösung $y_p$.
+        \item Existiert für eine Störfunktion $g(x) = cx^ne^{ax}$ ein Term $\mu x^ne^{ax}$ bereits in der homogenen Lösung, wählt man als Ansatz für $y_p = \lambda x^{n+1}e^{ax}$ (siehe Beispiel).
+    \end{itemize}
+\end{algo}
+
+\begin{example}{Ansatz vom Typ der rechten Seite}
+    Berechnen Sie die allgemeine Lösung der linearen Differentialgleichung
+    $$
+        y'- y = 9e^x
+    $$
+    \exampleseparator
+
+    Lösen der homogenen Gleichung:
+    $$
+        y_h'- y_h = 0 \implies y_h = ce^{x}
+    $$
+
+    Mit der partikulären Lösung ($y_p = c_0xe^{x}$)
+    $$
+        y_p = c_0xe^x \implies y'_p = c_0(e^x + xe^x)
+    $$
+    gilt dann:
+    $$
+        \begin{aligned}
+                           & y'- y                     &  & = 9e^x \\
+            \iff \quad     & c_0(e^x + xe^x) - c_0xe^x &  & = 9e^x \\
+            \iff \quad     & c_0e^x(1 + x - x)         &  & = 9e^x \\
+            \implies \quad & c_0                       &  & = 9
+        \end{aligned}
+    $$
+
+    Und schlussendlich:
+    $$
+        y = y_h + y_p \implies y = ce^x + 9e^xx
+    $$\qed
+\end{example}
+
+\begin{algo}{Bernoulli-Differentialgleichung}
+    Gegeben: Differentialgleichung der Form
+    $$
+        \boxed{y' + f(x) \cdot y = g(x)\cdot y^\alpha}
+    $$
+    \begin{enumerate}
+        \item Substituiere
+              $$
+                  z = y^{1-\alpha} \quad \iff \quad y = z^{\frac{1}{1-\alpha}}
+              $$
+        \item Einsetzen in die Differentialgleichung ergibt
+              $$
+                  z' + (1-\alpha) \cdot f(x)\cdot z = g(x) \cdot (1-\alpha)
+              $$
+        \item Lösen der linearen Differentialgleichung
+        \item Rücksubstitution in
+              $$
+                  y = z^{\frac{1}{1-\alpha}}
+              $$
+              ergibt die allgemeine Lösung
+    \end{enumerate}
+\end{algo}
+
+\begin{defi}{Exakte Differentialgleichung}
+    Eine Differentialgleichung der Form
+    $$
+        p(x, y) + q(x, y) \cdot y' = 0 \quad \iff \quad p(x, y) \d x + q(x, y) \d y = 0
+    $$
+    mit
+    $$
+        p_y = q_x \ \text{\emph{(Integrabilitätsbedingung)}}
+    $$
+    heißt \emph{exakte Differentialgleichung}.
+\end{defi}
+
+\begin{algo}{Lösen von exakten Differentialgleichungen}
+    Gegeben: Differentialgleichung der Form
+    $$
+        \boxed{p(x, y) + q(x, y) \cdot y' = 0 \quad \iff \quad p(x, y) \d x + q(x, y) \d y = 0}
+    $$
+    \begin{enumerate}
+        \item Prüfen der Integrabilitätsbedingung
+              $$
+                  p_x = q_y
+              $$
+        \item Stammfunktion berechnen mit
+              $$
+                  \underbrace{F(x, y) = \int p \d x}_{(*)} \quad \text{oder} \quad \underbrace{F(x, y) = \int q \d y}_{(**)}
+              $$
+              \subitem Konstante $c$ ersetzen mit $c(y)$ $(*)$ bzw. $c(x)$ $(**)$
+        \item Differentiation von $F(x, y)$ nach $y$ $(*)$ bzw. nach $x$ $(**)$
+        \item Es ergibt sich
+              $$
+                  c(y)' = f(y) \quad \implies c(y) = \int f(y) \d y \quad (*)
+              $$
+              bzw.
+              $$
+                  c(x)' = f(x) \quad \implies c(x) = \int f(x) \d x \quad (**)
+              $$
+        \item Einsetzen ergibt die allgemeine Lösung
+    \end{enumerate}
+\end{algo}
+
+\begin{defi}{Integrierender Faktor (Euler-Multiplikator)}
+    $\mu(x, y)$ ist genau dann ein \emph{integrierender Faktor} oder \emph{Euler-Multiplikator} für eine Funktion
+    $$
+        p(x, y) + q(x, y) \cdot y' = 0 \quad \iff \quad p(x, y) \d x + q(x, y) \d y = 0
+    $$
+    wenn die Integrabilitätsbedingung
+    $$
+        \frac{\partial \mu p}{\partial y} = \frac{\partial \mu q}{\partial x}
+    $$
+    erfüllt wird.
+\end{defi}
+
+\begin{algo}{Lösen von Differentialgleichungen mithilfe eines integrierenden Faktors}
+    Gegeben: Differentialgleichung der Form
+    $$
+        \boxed{p(x, y) + q(x, y) \cdot y' = 0 \quad \iff \quad p(x, y) \d x + q(x, y) \d y = 0}
+    $$
+    bei der die \emph{Integrabilitätsbedingung nicht erfüllt} wird.
+
+    Wir betrachten hier nur integrierende Faktoren, die nur von $x$ bzw. nur von $y$ abhängig sind.
+
+    \begin{enumerate}
+        \item Integrierender Faktor ist gegeben mit
+              $$
+                  \underbrace{\mu(x) = e^{\int m(x) \d x}}_{(*)} \quad \text{oder} \quad \underbrace{\mu(y) = e^{\int m(y) \d y}}_{(**)}
+              $$
+              \subitem $(*)$ Untersuchen, ob $\mu$ nur von $x$ abhängt:
+              $$
+                  m(x) = \frac{p_y - q_x}{q}
+              $$
+              \subitem $(**)$ Untersuchen, ob $\mu$ nur von $y$ abhängt:
+              $$
+                  m(y) = \frac{q_x - p_y}{p}
+              $$
+        \item $m$ in entsprechende Formel für $\mu$ einsetzen
+        \item Einsetzen in die Differentialgleichung liefert
+              $$
+                  \mu p(x, y) + \mu q(x, y) \cdot y' = 0 \quad \iff \quad \mu p(x, y) \d x + \mu q(x, y) \d y = 0
+              $$
+        \item Prüfen der Integrabilitätsbedingung
+        \item Lösen der exakten Differentialgleichung
+    \end{enumerate}
+\end{algo}
+
+\begin{example}{Lösen von Differentialgleichungen mithilfe eines integrierenden Faktors}
+    Lösen Sie die Differentialgleichung
+    $$
+        (3xy + 2y^2) + (x^2 + 2xy) y' = 0
+    $$
+
+    \exampleseparator
+
+    Es gilt:
+    $$
+        (3xy + 2y^2) + (x^2 + 2xy) y' = 0 \quad \iff \quad \underbrace{(3xy + 2y^2)}_{p(x, y)}\d x + \underbrace{(x^2 + 2xy)}_{q(x, y)}\d y = 0
+    $$
+    Integrabilitätsbedingung:
+    $$
+        p_y = 3x + 4y \quad \neq \quad 2x + 2y = q_x \quad \lightning
+    $$
+
+    Integrierenden Faktor (Euler-Multiplikator) $\mu(x) = e^{\int m(x) \d x}$ bzw. $\mu(y) = e^{\int m(y) \d y}$ bestimmen:
+    \begin{itemize}
+        \item Untersuchung, ob $\mu$ nur von $y$ abhängt:
+              $$
+                  m = \frac{q_x - p_y}{p} = \frac{2x + 2y - \left(3x + 4y\right)}{3xy + 2y^2} = \frac{-x - 2y}{3xy + 2y^2} \quad \lightning
+              $$
+        \item Untersuchung, ob $\mu$ nur von $x$ abhängt:
+              $$
+                  m = \frac{p_y - q_x}{q} = \frac{3x + 4y - (2x + 2y)}{x^2 + 2xy} = \frac{x + 2y}{x^2 + 2xy} = \frac{x+2y}{x(x+2y)} = \frac{1}{x} \quad \checkmark
+              $$
+    \end{itemize}
+
+    Damit erhalten wir den integrierenden Faktor mit:
+    $$
+        \mu(x) = e^{\int \frac{1}{x} \d x} = cx \qquad (\text{sei} \ c = 1)
+    $$
+    Einsetzen in die DGL:
+    $$
+        \underbrace{\left(3x^2y + 2xy^2\right)}_{p(x, y)}\d x + \underbrace{\left(x^3 + 2x^2y\right)}_{q(x, y)}\d y = 0
+    $$
+    Integrabilitätsbedingung:
+    $$
+        p_y = 3x^2 + 4xy \quad = \quad 3x^2 + 4xy = q_x \quad \checkmark
+    $$
+    Wir wissen:
+    $$
+        \underbrace{F = \int q \d y = x^3y + x^2y^2 + c(x)}_{F_y = q} \implies \underbrace{3x^2y + 2xy^2 + c'(x) = 3x^2y + 2xy^2}_{F_x = p}  \implies  c(x) = c
+    $$
+
+    Und insgesamt gilt damit:
+    $$
+        F = x^3y + x^2y^2 + c
+    $$\qed
+\end{example}
+
+\subsection{Lösungsverfahren für Differentialgleichungen zweiter Ordnung}
+
+\begin{defi}{Charakteristische Gleichung}
+    Die Gleichung
+    $$
+        \alpha^2 + a\alpha + b = 0
+    $$
+    heißt die zur Differentialgleichung
+    $$
+        y'' + ay' + b = 0
+    $$
+    gehörende \emph{charakteristische Gleichung}.
+\end{defi}
+
+\begin{bonus}{Superpositionsprinzip (homogene lineare Differentialgleichungen)}
+    Sind $y_1(x)$ und $y_2(x)$ Lösungen einer \emph{homogenen linearen Differentialgleichung}, so ist auch jede \emph{Linearkombination}
+    $$
+        \lambda\cdot  y_1(x) + \mu\cdot  y_2(x)
+    $$
+    eine allgemeine Lösung der Differentialgleichung.
+\end{bonus}
+
+\begin{algo}{Lösen von linearen homogenen Differentialgleichungen 2. Ordnung}
+    Für eine Gleichung
+    $$
+        \boxed{y'' + ay' + by = 0}
+    $$
+    stelle man die charakteristische Gleichung auf, mit
+    $$
+        \alpha^2 + a\alpha + b = 0 \quad \implies \quad \alpha = -\frac{a}{2} \pm \sqrt{\left(\frac{a}{2}\right)^2 - b}
+    $$
+
+    Dann gilt mit $D = \left(\frac{a}{2}\right)^2 - b$ (Diskriminante):
+    \begin{itemize}
+        \item $D > 0$:
+              $$
+                  y_h = \lambda_1 e^{\alpha_1 x} + \lambda_2 e^{\alpha_2 x}
+              $$
+        \item $D = 0$:
+              $$
+                  y_h = (\lambda_1 + \lambda_2x)\cdot  e^{\alpha x}
+              $$
+        \item $D < 0$:
+              $$
+                  y_h = e^{\Re(\alpha)} \cdot \left( \lambda_1 \cos(\Im(\alpha)) + \lambda_2 \sin(\Im(\alpha)) \right) = e^{-\frac{a}{2}} \cdot \left( \lambda_1 \cos(\sqrt{-D}) + \lambda_2 \sin(\sqrt{-D}) \right)
+              $$
+    \end{itemize}
+
+    \emph{Bemerkung:}
+    \begin{itemize}
+        \item $\Re(\alpha)$ ist der Realteil der Nullstelle
+        \item $\Im(\alpha)$ ist der Imaginärteil der Nullstelle
+    \end{itemize}
+\end{algo}
+
+\begin{algo}{Lösen von linearen Differentialgleichungssystemen}
+    Gegeben: Differentialgleichungssystem der Form
+    \begin{equation}
+        y'  = ay + bz
+    \end{equation}
+    \begin{equation}
+        z'  = dy + cz
+    \end{equation}
+
+    \begin{enumerate}
+        \item Umstellen von (1) nach $z$ ergibt
+              $$
+                  z = \frac{y' - ay}{b}
+              $$
+        \item Differentiation von (1) und anschließendes Einsetzen von $z$ ergibt
+              $$
+                  y'' - (a + c) \cdot y' + (ac -bd) \cdot y = 0
+              $$
+        \item Lösen der homogenen Differentialgleichung mit der charakteristischen Gleichung
+              $$
+                  \alpha^2 - (a+c)\alpha + (ac-bd) = 0
+              $$
+              ergibt dann die allgemeine Lösung für $y$
+        \item Einsetzen von $y$ (und $y'$) in
+              $$
+                  z =  \frac{y' - ay}{b}
+              $$
+              ergibt die allgemeine Lösung für $z$
+    \end{enumerate}
+\end{algo}
+
+\begin{example}{Lösen von linearen Differentialgleichungssystemen}
+    Lösen Sie folgendes Differentialgleichungssystem:
+    $$
+        \begin{aligned}
+            y' & = y + 2z          \\
+            z' & = 2y + z - 2e^{x}
+        \end{aligned}
+    $$
+
+    \exampleseparator
+
+    Wir leiten $y'$ ab:
+    $$
+        \begin{aligned}
+                       & y' = y + 2z \quad \iff \quad z = \frac{y'- y}{2} \\
+            \iff \quad & y'' - y'  - 2z' = 0
+        \end{aligned}
+    $$
+    Einsetzen von $z'$:
+    $$
+        y'' - y'  - 2z' = 0 \quad \iff \quad  y'' - y'  - 4y -2z + 4e^{x} = 0
+    $$
+    Einsetzen von $z$:
+    $$
+        \begin{aligned}
+                       & y'' - y'  - 4y -2z + 4e^{x} = 0 \\
+            \iff \quad & y'' - 2y'  - 3y  = -4e^{x}
+        \end{aligned}
+    $$
+
+    Lösung der homogenen Gleichung:
+    $$
+        \begin{aligned}
+                           & y'' - 2y'  - 3y  = 0                          \\
+            \implies \quad & \alpha^2 - 2\alpha - 3 = 0                    \\
+            \implies \quad & \alpha = 1 \pm \sqrt{\left( -1 \right)^2 + 3} \\
+            \iff \quad     & \alpha = 1 \pm 2                              \\
+            \implies \quad & y_h = \lambda_1e^{-x} + \lambda_2e^{3x}
+        \end{aligned}
+    $$
+
+    Berechnen der partikulären Lösung:
+    $$
+        y_p = ce^x \quad \implies \quad y'_p = ce^x \quad \implies \quad y''_p = ce^x
+    $$
+    $$
+        \begin{aligned}
+                           & y''_p - 2y'_p  - 3y_p &  & = -4e^{x} \\
+            \iff \quad     & ce^x - 2ce^x  - 3ce^x &  & = -4e^{x} \\
+            \iff \quad     & -4ce^x                &  & = -4e^{x} \\
+            \implies \quad & c = 1
+        \end{aligned}
+    $$
+    Dann gilt insgesamt:
+    $$
+        y = y_h + y_p = \lambda_1e^{-x} + \lambda_2e^{3x} + e^x
+    $$
+    und
+    $$
+        z = \frac{y'- y}{2} = \frac{\left( -\lambda_1e^{-x} + 3\lambda_2e^{3x} + e^x \right) - \left( \lambda_1e^{-x} + \lambda_2e^{3x} + e^x \right)}{2} = \lambda_2e^{3x} - \lambda_1e^{-x}
+    $$\qed
+\end{example}
+
+\printindex
+\printindex[Beispiele]
+
+\end{document}
diff --git a/itg/itg.tex b/itg/itg.tex
index 6a77b9896f06e4d2bc02654aac086aba882f8da1..9553190fe49e47363f10fe26a6a96ba467fb8580 100644
--- a/itg/itg.tex
+++ b/itg/itg.tex
@@ -1,1544 +1,1544 @@
-\documentclass[german]{../spicker}
-
-\usepackage{amsmath}
-
-\usepackage{graphicx}
-\usepackage{tabularx, multirow}
-
-\title{IT-Grundlagen}
-\author{Patrick Gustav Blaneck}
-\makeindex[intoc]
-\makeindex[intoc, name=Beispiele,title=Beispiele]
-
-\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
-\newcommand{\vektor}[1]{\begin{pmatrix*}[r] #1 \end{pmatrix*}}
-\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
-\newcommand{\dx}{~\mathrm{d}x}
-
-\newenvironment{allintypewriter}{\ttfamily}{\par}
-\newcommand*{\ditto}{\texttt{\char`\"}}
-
-\begin{document}
-\maketitle
-In dieser Zusammenfassung werden Inhalte aus dem ITG-Skript von Bastian Küppers verwendet.
-\tableofcontents
-\newpage
-
-%\setcounter{section}{1}
-
-\section{Codierung}
-\subsection{Stellenwertsysteme}
-
-\begin{defi}{Stellenwertsystem}
-    Allgemein lässt sich der Wert einer Zahl in einem Stellenwertsystem zur Basis $B$ wie folgt ausdrücken ($d_i$ ist der Wert der $i$-ten Stelle, $r$ der Exponent der höchtswertigen Stelle):
-    $$
-        n_b = \sum^r_{i=0} B^i \cdot d_i
-    $$
-\end{defi}
-
-\begin{algo}{Dezimal $\to$ Binär, Hexadezimal, $\ldots$}
-    Sei $B = 2$ für Umrechnung ins Binärsystem, bzw. $B =16$ für das Hexadezimalsystem.
-
-    Es gilt für eine umzurechnende Zahl $z$:
-
-    $$
-        \begin{aligned}
-            z : B       & = z_0 \quad     &  & \text{Rest } r_0     \\
-            z_0 : B     & = z_1 \quad     &  & \text{Rest } r_1     \\
-            z_1 : B     & = z_2 \quad     &  & \text{Rest } r_2     \\
-                        & \ldots          &  &                      \\
-            z_{n-2} : B & = z_{n-1} \quad &  & \text{Rest } r_{n-1} \\
-            z_{n-1} : B & = 0 \quad       &  & \text{Rest } r_n
-        \end{aligned}
-    $$
-
-    Damit gilt dann: $(z)_{10} = (r_nr_{n-1}\ldots r_2r_1r_0)_B$ (also gelesen von \emph{unten nach oben}).\qed
-\end{algo}
-
-\begin{algo}{Binär $\to$ Hexadezimal}
-    Sei eine Binärzahl $b$ gegeben mit $n \in 4\N$ Bits.
-
-    Dann kann $b$ wie folgt in eine Hexadezimalzahl $h$ mit $m = \frac{n}{4}$ Zeichen umgeformt werden:
-
-    $$
-        \underbrace{b_{n-1}b_{n-2}b_{n-3}b_{n-4}}_{h_{m-1}} ~ \ldots ~ \underbrace{b_7b_6b_5b_4}_{h_1} ~ \underbrace{b_3b_2b_1b_0}_{h_0}
-    $$
-
-    Erinnerung: 4 Bits können binär nur 16 mögliche Werte annehmen!
-\end{algo}
-
-\newpage
-\subsection{Zahlendarstellungen}
-
-\begin{defi}{Einerkomplement}
-    Das \emph{Einerkomplement} einer Binärzahl wird gebildet, indem man alle Bits negiert.
-
-    Das erste Bit gibt dabei das Vorzeichen an.
-
-    Nachteile: Doppelte Darstellung der Null, Subtraktion lässt sich nicht auf Addition mit einer negativen Zahl zurückführen
-\end{defi}
-
-\begin{defi}{Zweierkomplement}
-    Das \emph{Zweierkomplement} einer Binärzahl wird gebildet, indem man das Einerkomplement bildet und zusätzlich $1$ addiert.
-
-    Das erste Bit gibt dabei das Vorzeichen an.
-
-    Vorteile: Subtraktion entspricht Addition mit einer negativen Zahl, keine doppelte Null
-\end{defi}
-
-\begin{defi}{Binäre Festkommazahlen}
-    Die Umwandlung des ganzzahligen Anteils einer (dezimalen) Festkommazahl erfolgt analog zu ganzen Zahlen.
-
-    Zusätzlich werden aber die Nachkommastellen mit entsprechend negativen Exponenten weiter \glqq verrechnet\grqq.
-\end{defi}
-
-\begin{defi}{Gleitkommazahlen nach \emph{IEEE 754}}
-    Die Darstellung einer Gleitkommazahl
-    $$
-        x = s \cdot m \cdot b^e
-    $$
-    besteht aus
-    \begin{itemize}
-        \item Vorzeichen $s$ (1 Bit)
-        \item Mantisse $m$ ($p$ Bits, $p_{\text{float}} = 23$, $p_{\text{double}} = 52$)
-        \item Basis $b$ (bei normalisierten Gleitkommazahlen nach IEEE ist $b = 2$)
-        \item Exponent $e$ ($r$ Bits, $r_{\text{float}} = 8$, $r_{\text{double}} = 11$)
-    \end{itemize}
-\end{defi}
-
-\begin{algo}{Umrechnung in \emph{IEEE 754}}
-    \begin{itemize}
-        \item Umwandeln einer Dezimalzahl in eine \emph{binäre Festkommazahl} ohne Vorzeichen.
-        \item Normalisieren der \emph{Mantisse}:\\
-              Das Komma wird $n$ Stellen nach links verschoben, so dass dort nur noch eine 1 als ganzzahliger Anteil vorhanden ist. ($n$ ist bei Verschieben nach rechts negativ!)\\
-              $M$ ist dann der \emph{Nachkommateil}.
-        \item Bestimmen des \emph{Exponenten}: $E = (\text{bias } + n)_2$ (bias ist meist $127$, wenn nicht anders gegeben)
-        \item Bestimmen des \emph{Vorzeichenbits} $s$
-        \item Zusammensetzen der Gleitkommazahl
-              $$
-                  s \mid E \mid M
-              $$
-    \end{itemize}
-\end{algo}
-
-\subsection{Zeichendarstellungen}
-
-\begin{defi}{UTF-8 Codierung}
-    \begin{tabular}{| c | r | c |}
-        \hline
-        Unicode-Bereich       & \multicolumn{1}{|c|}{UTF-8-Codierung}   & Möglichkeiten        \\
-        \hline
-        0000 0000 - 0000 007F & 0xxx xxxx                               & 128 (7 Bits)         \\
-        0000 0080 - 0000 07FF & 110x xxxx 10xx xxxx                     & 2.048 (11 Bits)      \\
-        0000 0800 - 0000 FFFF & 1110 xxxx 10xx xxxx 10xx xxxx           & 65.536  (16 Bits)    \\
-        0001 0000 - 0010 FFFF & 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx & 2.097.152  (21 Bits) \\
-        \hline
-    \end{tabular}
-\end{defi}
-
-\subsection{Spezielle Codierungen}
-
-\begin{algo}{Huffman-Codierung}
-    \begin{enumerate}
-        \item Schreibe Buchstaben mit Auftrittshäufigkeiten als \glqq Wald\grqq.
-        \item Fasse die beiden Bäume mit der geringsten Auftrittshäufigkeiten zu einem neuen Baum zusammen, dabei werden die Auftrittshäufigkeiten addiert.
-        \item Wiederhole, bis nur noch ein Baum existiert.
-        \item Codierung eines Buchstaben entspricht dann dem \emph{Pfad} zum entsprechenden Blatt mit \glqq links\grqq $\to$ 0, \glqq rechts\grqq $\to$ 1
-    \end{enumerate}
-
-    Mittlere Codelänge:
-    $$
-        L(C) = \frac{\#\text{Bits der verschlüsselten Nachricht}}{\#{\text{Zeichen der verschlüsselten Nachricht}}}
-    $$
-\end{algo}
-
-\begin{defi}{Hamming-Codierung}
-    Bei der Hamming-Codierung werden Paritätsinformationen zu Daten hinzugefügt, um so mögliche Übertragungsfehler zu erkennen.
-
-    Hamming-Codewörter haben die Länge $N = 2^k-1$, wobei $k$ Paritätsbits enthalten sind.
-    Die Bits werden der Einfachheit halber bei Eins beginnend durchnummeriert.
-    Die Paritätsbits stehen an den Stellen, deren Index eine 2er-Potenz ist.
-
-    Sind $p_1, p_2, \ldots, p_k$ Paritätsbits, $d_1, d_2, \ldots, d_{N-k}$ Bits des Datenwortes und $c_1, c_2, \ldots, c_N$ die Bits des zu bildenden Codewortes, hat ein Codewort des so konstruierten Hamming-Codes die folgende Form:
-
-    \begin{tabular}{| c | c | c || c | c | c | c || c | c | c | c | c | c | c | c || c | c | c |}
-        \hline
-        $c_1$ & $c_2$ & $c_3$ & $c_4$ & $c_5$ & $c_6$ & $c_7$ & $c_8$ & $c_9$ & $c_{10}$ & $c_{11}$ & $c_{12}$ & $c_{13}$ & $c_{14}$ & $c_{15}$ & $c_{16}$ & $c_{17}$ & \ldots \\
-        \hline
-        $p_0$ & $p_1$ & $d_1$ & $p_2$ & $d_2$ & $d_3$ & $d_4$ & $p_3$ & $d_5$ & $d_6$    & $d_7$    & $d_8$    & $d_9$    & $d_{10}$ & $d_{11}$ & $p_4$    & $d_{12}$ & \ldots \\
-        \hline
-    \end{tabular}\\
-
-    Dabei wird jedem Paritätsbit eine spezielle Bitmaske zugewiesen:
-
-    \begin{tabular}{| c || c | c | c || c | c | c | c || c | c | c | c | c | c | c | c || c |}
-        \hline
-                       & $c_1$ & $c_2$ & $c_3$ & $c_4$ & $c_5$ & $c_6$ & $c_7$ & $c_8$ & $c_9$ & $c_{10}$ & $c_{11}$ & $c_{12}$ & $c_{13}$ & $c_{14}$ & $c_{15}$ & \ldots \\
-        \hline
-        Bitmaske $p_0$ & $p_0$ & $p_1$ & 1     & $p_2$ & 1     & 0     & 1     & $p_3$ & 1     & 0        & 1        & 0        & 1        & 0        & 1        & \ldots \\
-        Bitmaske $p_1$ & $p_0$ & $p_1$ & 1     & $p_2$ & 0     & 1     & 1     & $p_3$ & 0     & 1        & 1        & 0        & 0        & 1        & 1        & \ldots \\
-        Bitmaske $p_2$ & $p_0$ & $p_1$ & 0     & $p_2$ & 1     & 1     & 1     & $p_3$ & 0     & 0        & 0        & 1        & 1        & 1        & 1        & \ldots \\
-        Bitmaske $p_3$ & $p_0$ & $p_1$ & 0     & $p_2$ & 0     & 0     & 0     & $p_3$ & 1     & 1        & 1        & 1        & 1        & 1        & 1        & \ldots \\
-        \hline
-    \end{tabular}\\
-
-    Damit gilt:
-    $$
-        \begin{aligned}
-            c_1 = p_0 & = c_3 \oplus c_5 \oplus c_7 \oplus c_9 \oplus c_{11} \oplus c_{13} \oplus c_{15} \oplus \ldots    \\
-                      & \iff \text{jedes ungerade Datenbit}                                                               \\
-            c_2 = p_1 & = c_3 \oplus c_6 \oplus c_7 \oplus c_{10} \oplus c_{11} \oplus c_{14} \oplus c_{15} \oplus \ldots \\
-                      & \iff \text{ein Datenbit rechts von $p_1$, zwei überspringen, zwei einberechnen, $\ldots$}         \\
-            c_4 = p_2 & = c_5 \oplus c_6 \oplus c_7 \oplus c_{12} \oplus c_{13} \oplus c_{14} \oplus c_{15} \oplus \ldots \\
-                      & \iff \text{drei Datenbit rechts von $p_2$, vier überspringen, vier einberechnen, $\ldots$}
-        \end{aligned}
-    $$
-\end{defi}
-
-\begin{algo}{Fehlererkennung beim Hamming-Code}
-    Situation: Empfangen eines Hamming-codierten Datensatzes
-
-    \begin{enumerate}
-        \item Erneutes Berechnen der \emph{Paritätsbits}
-        \item Erkennen, welche neu berechneten Paritätsbits $p'_i$ \emph{verschieden} sind zu den empfangenen Paritätsbits $p_i$
-        \item Bitfehler ist in dem Datenbit passiert, in dem gilt:
-              \subitem $p_i = p'_i \implies$ Bitmaske für $p_i$ ist $0$
-              \subitem $p_i \neq p'_i \implies$ Bitmaske für $p_i$ ist $1$
-    \end{enumerate}
-
-    Es wird angenommen, dass nur ein Bitfehler in den Datenbits passiert ist.
-
-    Anmerkung: Ist lediglich ein Paritätsbit verschieden, dann ist ein Übertragungsfehler in dem betreffenden Paritätsbit selbst aufgetreten, da alle Datenbits zur Berechnung von mindestens zwei Paritätsbits verwendet werden.
-\end{algo}
-
-\section{Formale Sprachen}
-\subsection{Backus-Naur-Form}
-
-\begin{defi}{(kontextfreie) Grammatik}
-    Eine (kontextfreie) Grammatik $G$ ist ein 4-Tupel $\{N, T, \Sigma, P\}$ mit folgenden Eigenschaften:
-    \begin{itemize}
-        \item $N$ ist eine endliche Menge von \emph{Nichtterminalsymbolen},
-        \item $T$ ist eine endliche Menge von \emph{Terminalsymbolen},
-        \item ein \emph{Startsymbol} $\Sigma \in N$,
-        \item eine endliche Menge an Produktionsregeln $P \subset N \times T^*$.
-    \end{itemize}
-    Es gilt $N \cap M = \emptyset$. $^*$ bezeichnet die Kleensche Hülle.
-
-    Anmerkung: Die Notation verhält sich in der Vorlesung sehr anders als in den meisten Quellen.
-\end{defi}
-
-\begin{defi}{Backus-Naur-Form}
-    In der \emph{Backus-Naur-Form} werden Symbole durch eine Zuweisung definiert.\\
-    Diese wird durch den Operator \texttt{:=} dargestellt.
-
-    \begin{itemize}
-        \item Dabei gilt weiterhin, dass in der Zuweisung eines \emph{Nichtterminalsymbols} mindestens ein weiteres Symbol auftauchen muss und
-        \item bei der Zuweisung eines \emph{Terminalsymbols} nur Zeichen des Alphabets.
-        \item Bei einer Zuweisung können mehrere Symbole oder Zeichen(-ketten) des Alphabets verbunden werden.
-        \item Durch ein Leerzeichen (\glqq ~~~\grqq, \texttt{space}) wird eine \texttt{und}-Verknüpfung definiert,
-        \item durch einen senkrechten Stricht (\glqq ~$\mid$~\grqq, \texttt{pipe}) wird eine \texttt{oder}-Zuweisung definiert.
-        \item Zur logischen Gliederung der Verknüpfungen können Klammern verwendet werden.
-        \item Es ist ebenfalls möglich Kardinalitäten für Symbole zu definieren:
-              \subitem Geschweifte Klammern \texttt{\{\}} definieren dabei eine \emph{beliebige Wiederholung} und
-              \subitem eckige Klammern \texttt{[]} definieren ein \emph{einmaliges Auftreten}.
-              \subitem In beiden Fällen ist das Weglassen des Symbols ebenfalls möglich.
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Backus-Naur-Form}
-    \begin{allintypewriter}
-        \begin{tabular}{rl}
-            Satz        & := Subjekt Verb Präposition Nomen Ende                       \\
-            Subjekt     & := Nomen                                                     \\
-            Nomen       & := Artikel Substantiv                                        \\
-            Artikel     & := \ditto der\ditto | \ditto die\ditto | \ditto das\ditto    \\
-            Substantiv  & := \ditto Mann\ditto | \ditto Frau\ditto | \ditto Haus\ditto \\
-            Verb        & := \ditto geht\ditto                                         \\
-            Präposition & := \ditto in\ditto                                           \\
-            Ende        & := \ditto .\ditto
-        \end{tabular}
-    \end{allintypewriter}
-\end{example}
-
-\subsection{Programmiersprachen}
-
-\begin{defi}{Compiler}
-    Das Programm, welches den
-    menschenlesbaren \emph{Quellcode} anhand der Regeln der zugrundeliegenden Grammatik
-    interpretiert und in maschinenlesbare Anweisungen überführt, wird \emph{Compiler} genannt.
-
-    Die maschinenlesbaren Anweisungen können dabei entweder direkt in eine
-    maschinenspezifische Binärfolge umgewandelt werden, oder in einen sogenannten
-    \emph{Bytecode}.
-
-    Im zweiten Fall kann der Bytecode,
-    auch Zwischencode genannt, noch an beliebigen Prozessortypen angepasst werden,
-    muss dafür aber vor der Ausführung erneut bearbeitet werden.
-
-    Bei der Kompilierung eines Programms werden zwei Phasen durchlaufen:
-    \begin{enumerate}
-        \item \textbf{Analysephase}, in der der Quellcode analysiert und auf Fehler geprüft wird:
-              \subitem \underline{\emph{Lexer} (lexikalischer Scanner)}: \\
-              Quellcode wird in einzelne Teile (\emph{Tokens}) zerlegt und klassifiziert (z.B. als \emph{Schlüsselwörter} oder \emph{Bezeichner}).\\
-              Der Lexer erkennt hier z.B. falsch benannte Variablen.
-              \subitem \underline{\emph{Parser} (syntaktische Analyse)}: \\
-              Vom Lexer erzeugte \emph{Tokens} werden dem \emph{Parser} übergeben.
-              Der Parser überprüft den Quellcode auf Fehler und setzt ihn bei Fehlerfreiheit in einen \emph{Syntaxbaum} (AST) um.\\
-              Hier werden Fehler wie fehlende Semikolons oder falsche genutzte Operatoren erkannt.
-              \subitem \underline{\emph{Semantische Analyse}}: \\
-              Hier wird z.B. kontrolliert, ob eine verwendete Variable auch vorher deklariert wurde, oder ob Quell- und Zieltyp einer Anweisung übereinstimmen. Dabei erzeugte Metadaten werden in den AST integriert.
-              In diesem Schritt werden generell semantische Fehler erkannt, d.h. Anweisungen, die korrekt aussehen, aber fehlerhaft sind.
-              \\
-        \item \textbf{Synthesephase}, in der Binär- bzw. Bytecode erzeugt wird:
-              \subitem \underline{\emph{Zwischencodeerzeugung}}: \\
-              Hier wird plattformunabhängiger Bytecode erzeugt, der als Grundlage für den nächsten Schritt dient.
-              \subitem \underline{\emph{Optimierung}}: \\
-              Während der Optimierung wird versucht die Performanz des erzeugten Programms zu steigern.
-              \subitem \underline{\emph{Codegenerierung}}: \\
-              Hier wird aus dem optimierten Zwischencode der \emph{Binärcode} erzeugt.
-    \end{enumerate}
-\end{defi}
-
-\begin{bonus}{Ahead-of-Time Compiler}
-    Bei dieser Variante wird der gesamte Quellcode \emph{in einem Rutsch}
-    in Binär- oder Bytecode übersetzt. Das kann mitunter dazu führen, dass die Kompilierung
-    sehr lange dauert.
-\end{bonus}
-
-\begin{bonus}{Just-in-Time Compiler}
-    Daher haben sich mit der Zeit auch sogenannte \emph{Just-in-
-        Time Compiler} etablieren können, die nur einen kleinen Teil des Quellcodes direkt
-    übersetzen und weitere Teile des Quellcodes erst dann übersetzen, \emph{wenn sie bei der
-        Programmausführung benötigt werden}.
-\end{bonus}
-
-\begin{defi}{Linker}
-    Nachdem der Compiler den Binärcode erzeugt hat, muss der \emph{Linker} daraus noch
-    ein lauffähiges Programm erstellen. Das ist insbesondere der Fall, wenn es mehrere
-    Dateien mit Quellcode gibt.
-
-    Dies geschieht indem der Binärcode zu den verschiedenen
-    Quellcodedateien, der nun in sogenannten \emph{Objektdateien} vorliegt, zusammengefügt wird. Dabei werden beispielsweise symbolische Adressen aus mehreren
-    Quellcodemodulen und externen Bibliotheken so angepasst, dass sie zusammen
-    passen.
-
-    Dabei wird zwischen \emph{statischem Linken} und \emph{dynamischen Linken} unterschieden:
-
-    Beim \textbf{statischen Linken} werden alle verfügbaren Objektdateien zu \emph{einer
-        einzigen, ausführbaren Programmdatei} gelinkt.
-    \begin{itemize}
-        \item Vorteil: keine externen Abhängigkeiten, Programm auf jedem geeigneten System ohne Weiteres lauffähig
-        \item Nachteil: nicht mehr möglich, einzelne Programmteile auszutauschen ohne den Linkvorgang vollständig zu wiederholen,
-    \end{itemize}
-    Beim \textbf{dynamischen Linken} werden Funktions- und Variablenadressen erst zur Laufzeit aufgelöst, sodass externe Bibliotheken
-    einfach in Form von \emph{Dynamically Linked Libraries} (DLLs) bzw. \emph{Shared Objects} (SOs) angesprochen werden können. Da DLLs bzw. SOs als existierend
-    vorausgesetzt werden, wird das fertige Programm bei dynamischem Linken kleiner.
-    \begin{itemize}
-        \item Vorteil: mehrere Programme können dieselbe externe Bibliothek verwenden, ohne dass der benötigte Code mehrfach in einzelne Programme integriert werden muss.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Interpreter}
-    \emph{Interpreter} zeichnen sich dadurch aus, dass der Quellcode nicht einmalig in Binärcode übersetzt wird, sondern bei jeder Programmausführung schrittweise abgearbeitet wird.
-    \begin{itemize}
-        \item Vorteile: einfache Portabilität, dynamischere Quellcodeverwaltung
-        \item Nachteile: deutlich langsamere Ausführungsgeschwindigkeit, keine Optimierungen an Programmstruktur möglich
-    \end{itemize}
-\end{defi}
-
-\section{Rechnerarchitekturen}
-\subsection{Von-Neumann-Architektur}
-
-\begin{defi}{Von-Neumann-Architektur}
-    Im Grundsatz besteht die Architektur aus drei Komponenten: \emph{CPU}, \emph{Speicher} und \emph{I/O Einheit}.
-
-    Die einzelnen Komponenten sind über Datenleitungen, sogenannte \emph{Busse}, verbunden.
-    \begin{center}
-        \includegraphics[]{images/von_neumann.pdf}
-    \end{center}
-\end{defi}
-
-\begin{defi}{CPU}
-    Die \emph{CPU} (\emph{Central Processing Unit}, Prozessor) ist sozusagen das Gehirn des Computers.
-    Die CPU besteht im Wesentlichen aus drei Teilen, dem \emph{Leitwerk} und
-    dem \emph{Rechenwerk} und den \emph{Registern}, welche direkt zur Abarbeitung von Befehlen
-    benötigte Daten und berechnete Ergebnisse aufnehmen können.
-
-    Das \emph{Leitwerk} steuert die Ausführung des Binärcodes, das \emph{Rechenwerk} führt anfallende Rechenoperationen aus.
-\end{defi}
-
-\begin{bonus}{Aufbau Rechenoperationen}
-    \begin{itemize}
-        \item \emph{Operationsteil}: codiert konkreten Befehl
-        \item \emph{Operanden}: stellen z.B. Summanden einer Operation, oder Adresse einer Variablen dar
-    \end{itemize}
-\end{bonus}
-
-\begin{bonus}{Abarbeitung von Befehlen}
-    Jeder Befehl durchläuft bei der Abarbeitung in der CPU folgende Schritte:
-    \begin{itemize}
-        \item \emph{Instruction Fetch (IF)} : Befehl lesen
-        \item \emph{Instruction Decode (ID)} : Befehl decodieren
-        \item \emph{Fetch Operands (FO)} : Operanden laden
-        \item \emph{Execute (EX)} : Befehl ausführen
-        \item \emph{Writeback (WB)} : Ergebnis schreiben
-    \end{itemize}
-
-    \begin{center}
-        \includegraphics[]{images/befehlsabarbeitung.pdf}
-    \end{center}
-\end{bonus}
-
-\begin{defi}{Prozessorarchitekturen}
-    \textbf{CISC} (\emph{Complex Instruction Set Computer}):\\
-    Eine CISC CPU zeichnet sich durch einen \emph{komplexen Befehlssatz} in Form von \emph{Microcode} und dem Vorhandensein nur \emph{weniger Register} aus.
-
-    \textbf{RISC} (\emph{Reduced Instruction Set Computer}):\\
-    eine RISC CPU nur über \emph{wenige, in Hardware realisierte Befehle} und \emph{viele Prozessorregister}.
-\end{defi}
-
-\begin{defi}{Pipelining}
-    In einer \emph{RISC CPU}, die nur wenige und elementare Befehle verwendet, kann dafür
-    gesorgt werden, dass alle Teilschritte, deren \emph{parallele Verarbeitung} das Pipelining
-    ermöglicht, gleich lange dauern. Nur deswegen kann das Konzept des Pipelinings
-    erfolgreich umgesetzt werden.
-
-    Das ist bei einer \emph{CISC CPU} aufgrund der vielen
-    und teils sehr komplexen Befehle \emph{nicht} möglich.
-\end{defi}
-
-\begin{example}{Pipelining}
-    5-Stage-Pipeline:
-    \begin{itemize}
-        \item Instruction Fetch (\textbf{IF}): Befehl lesen
-        \item Instruction Decode (\textbf{ID}) : Befehl decodieren
-        \item Execute (\textbf{EX}) : Ausführen
-        \item Memory Access (\textbf{MEM}) : Ausführen
-        \item Writeback (\textbf{WB}) : Ergebnis schreiben
-    \end{itemize}
-
-    \begin{center}
-        \begin{tabular}{| c || m{0.05\textwidth} | m{0.05\textwidth} | m{0.05\textwidth} | m{0.05\textwidth} | m{0.05\textwidth} | m{0.05\textwidth} |}
-            \hline
-            Instr. 1    & \texttt{IF}            & \texttt{ID}            & \texttt{EX}            & \texttt{MEM}           & \texttt{WB}            &                        \\
-            \hline
-            Instr. 2    &                        & \texttt{IF}            & \texttt{ID}            & \texttt{EX}            & \texttt{MEM}           & \texttt{WB}            \\
-            \hline
-            Instr. 3    &                        &                        & \texttt{IF}            & \texttt{ID}            & \texttt{EX}            & \texttt{MEM}           \\
-            \hline
-            Instr. 4    &                        &                        &                        & \texttt{IF}            & \texttt{ID}            & \texttt{EX}            \\
-            \hline
-            Instr. 5    &                        &                        &                        &                        & \texttt{IF}            & \texttt{ID}            \\
-            \hline
-            \hline
-            Clock Cycle & \multicolumn{1}{c|}{1} & \multicolumn{1}{c|}{2} & \multicolumn{1}{c|}{3} & \multicolumn{1}{c|}{4} & \multicolumn{1}{c|}{5} & \multicolumn{1}{c|}{6} \\
-            \hline
-        \end{tabular}
-    \end{center}
-\end{example}
-
-\begin{defi}{ROM}
-    Der \emph{ROM} ist ein Festwertspeicher, der - prinzipiell - \emph{nur gelesen} werden kann und die Firmware des Computers gespeichert hat.
-
-    Im ROM liegt das sogenannte \emph{BIOS} (\emph{basic input output system}) bzw. moderner \emph{UEFI}
-    (\emph{unified extensible firmware interface}).
-    Die im ROM abgelegten Informationen stellen die Firmware des
-    Rechners dar. Diese Firmware sorgt dafür, dass der Computer nach dem Einschalten
-    in die Lage versetzt wird, grundlegende Hardwarekomponenten zu verwalten.
-\end{defi}
-
-\begin{defi}{RAM}
-    Der \emph{RAM},
-    auch \emph{Hauptspeicher} genannt, ist ein Speicher mit \emph{wahlfreiem Zugriff}, der seinen
-    Inhalt jedoch bei Verlust der Betriebsspannung \emph{verliert}. Im RAM werden Informationen
-    abgelegt, die ein \emph{Programm zur Laufzeit} benötigt.
-
-    Sollen Daten
-    über das Ende des Programms hinaus gespeichert werden, müssen sie über die
-    \emph{I/O-Einheit} auf einen anderen Speicher geschrieben werden.
-\end{defi}
-
-\begin{defi}{Cache}
-    \emph{Cache} ist \emph{schneller} als RAM, kann aber nur \emph{weniger Speicherkapazität} zur Verfügung stellen.
-
-    Das bedeutet, dass der Cache nur kleine Datenmengen, sogenannte \emph{Cacheblocks}, aus dem Hauptspeicher vorhalten kann.
-    Diese haben eine definierte Größe und können dann schneller in die CPU geldaden werden, als das aus dem RAM möglich wäre.
-\end{defi}
-
-\begin{defi}{Lokalität}
-    \textbf{Zeitliche Lokalität}:\\
-    Es ist, bei entsprechender Programmierung, sehr wahrscheinlich, dass
-    auf eine Speicherzelle nicht nur einmal, sondern in kurzer Zeit \emph{mehrmals zugegriffen}
-    wird.
-
-    \textbf{Örtliche Lokalität}:\\
-    Es ist, bei entsprechender Programmierung, sehr wahrscheinlich, dass nach
-    dem Zugriff auf eine bestimmte Speicherzelle auch ein \emph{Zugriff in deren unmittelbarer
-        \glqq Nachbarschaft\grqq} stattfindet.
-\end{defi}
-
-\begin{bonus}{Aufbau eines Caches}
-    \begin{center}
-        \includegraphics[]{images/cache_aufbau.pdf}
-    \end{center}
-
-    Aus der Abbildung ist ersichtlich, dass der Cache selbst ebenenweise organisiert ist.
-
-    Im Regelfall sind mindestens die Ebenen L1 und L2 vorhanden, oftmals sogar noch
-    eine dritte Ebene L3. Dabei ist in jedem Fall der L1-Cache in die CPU integriert,
-    häufig auch noch der L2-Cache.
-
-    Beginnend beim
-    L3-Cache werden die Cachelevel mit größerer Nähe zur CPU jeweils kleiner und
-    schneller. Dieser Aufbau soll die Frage nach der Auswahl der Daten, die im Cache
-    vorgehalten werden, vereinfachen. Es ist also möglich einen relativ großen Datenbestand
-    im L3-Cache vorzuhalten, der schneller ist als der Hauptspeicher. Von dort
-    aus kann dann wiederum eine Teilmenge der Daten im noch schnelleren L2-Cache
-    vorgehalten werden, usw.
-
-    Liegen benötigte Daten nicht im L1-Cache, welcher Daten bzw. Befehle schlussendlich an die CPU liefert, ist aufgrund der Lokalität und
-    des Aufbaus des Caches die Wahrscheinlichkeit hoch, dass die benötigten Daten
-    nicht aus dem langsamen Hauptspeicher geladen werden müssen, sondern sich in
-    einem der niedrigeren Cache-Level finden und damit immer noch vergleichsweise
-    schnell zur Verfügung gestellt werden können.
-\end{bonus}
-
-\begin{bonus}{Interner Aufbau eines Cachelevels}
-    \begin{center}
-        \includegraphics[]{images/cache_level.pdf}
-    \end{center}
-
-    Zu jedem Cacheblock wird die Startadresse des Blocks im RAM gespeichert, diese
-    Information wird \emph{Tag} genannt.
-
-    Wird von der CPU eine Anfrage an den Speicher
-    gestellt, wird zunächst anhand des Tags unter Zuhilfenahme des Komparators geprüft, ob der angefragte Datensatz im Cache liegt. Dabei wird auch geprüft, ob eine
-    angefragte Speicheradresse innerhalb eines Cacheblocks liegt. Das ist möglich, da
-    der Tag sowie die Größe des Cacheblocks bekannt sind.
-
-    Ist dies nicht der Fall, wird
-    die Anfrage an ein niedrigeres Cachelevel bzw. den RAM weitergereicht.
-
-    Außerdem
-    werden zu jedem Cacheblock Statusbits gespeichert, die beispielsweise angeben ob
-    sich der Cacheblock verändert hat (\emph{dirty bit}), seit er in den Cache geladen wurden,
-    oder ob ein Platz im Cache mit einem gültigen Cacheblock belegt ist (\emph{invalid bit}).
-\end{bonus}
-
-\begin{defi}{Organisation der Tags}
-    Die \emph{Blöcke} (Cache-Lines) eines Caches können in so genannte \emph{Sätze} zusammengefasst werden.
-    Für eine bestimmte Adresse ist dann immer nur einer der Sätze zuständig.
-    Innerhalb eines \emph{Satzes} bedienen alle Blöcke also nur einen \emph{Teil} aller vorhandenen Adressen.
-
-    Im Folgenden stehe die Variable $m$ für die \emph{Gesamtanzahl der Cacheblöcke} und $n$ für die \emph{Anzahl der Blöcke pro Satz}, die so genannte \emph{Assoziativität}.
-    Dann besteht der Cache also aus $\frac {m}{n}$ Sätzen.
-
-    \textbf{Direkt abgebildet} (\emph{DM}, \emph{direct mapped}, $n=1$):\\
-    Es gibt pro Cacheblock nur eine einzige Möglichkeit, wo dieser
-    platziert werden kann.
-
-    Daher kann es allerdings vorkommen, dass ein Cacheblock
-    nicht platziert werden kann, obwohl noch Platz im Cache wäre.
-
-    \textbf{Vollassoziativ} (\emph{FA}, \emph{fully associative}, $n=m$):\\
-    Ein Cacheblock kann beliebige auf freie Plätze im Cache zugeordnet
-    werden.
-
-    Bei einer Speicheranfrage müssen allerdings alle gespeicherten
-    Tags durchsucht werden.
-
-    \textbf{Satzassoziativ} (\emph{SA}, \emph{set associative}, $2\leq n \leq \frac{m}{2}$):\\
-    Der verfügbare Platz wird in Gruppen unterteilt. Wie bei einem
-    DA Cache gibt es nur eine Gruppe, in der ein Cacheblock platziert werden kann;
-    wie bei einem VA Cache kann der Cacheblock innerhalb dieser Gruppe frei platziert
-    werden.
-\end{defi}
-
-\begin{defi}{Cache-Lesezugriffe}
-    Findet ein Lesezugriff auf Speicherzelle $A$ statt, wird geprüft, ob Speicherzelle $A$ bereits im Cache liegt.
-    \begin{itemize}
-        \item \textbf{$A$ liegt im Cache} (\emph{cache hit}):\\
-              Datensatz kann direkt aus dem Cache gelesen werden.
-        \item \textbf{$A$ liegt nicht im Cache} (\emph{cache miss}):\\
-              Datensatz muss aus dem Hauptspeicher in den Cache geladen werden, danach wird der Datensatz gelesen.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Schreibmodi eines Cache}
-    \begin{itemize}
-        \item \textbf{write-through} (\emph{WT}):\\
-              Datensatz wird im Cache und direkt im Hauptspeicher aktualisiert.
-
-              \emph{Vorteile}: keine Probleme mit Datenkonsistenz im Hauptspeicher\\
-              \emph{Nachteile}: hoher Aufwand für Schreiboperationen
-        \item \textbf{write-back} (\emph{WB}):\\
-              Datensatz wird im Cache aktualisiert und erst dann in den Hauptspeicher geschrieben, wenn der entsprechende Cacheblock aus dem Cache verdrängt wird.
-
-              \emph{Vorteile}: niedrige Belastund der Systembusse, keine Wartezyklen\\
-              \emph{Nachteile}: fehlende Datenkonsistenz
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Cache-Schreibzugriffe}
-    Findet ein Schreibzugriff auf Speicherzelle $A$ statt, wird geprüft, ob Speicherzelle $A$ bereits im Cache liegt.
-    \begin{itemize}
-        \item \textbf{$A$ liegt im Cache} (\emph{cache hit}):\\
-              Datensatz wird im Cache (und im Hauptspeicher) aktualisiert.
-        \item \textbf{$A$ liegt nicht im Cache} (\emph{cache miss}):\\
-              Datensatz wird im Hauptspeicher geschrieben, Inhalt des Caches wird nicht verändert.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Cache Misses}
-    \begin{itemize}
-        \item \textbf{Capacity Miss}:
-              \subitem - tritt auf, wenn Datensatz bereits im Cache war, aber \emph{bereits verdrängt} wurde
-              \subitem (aufgrund mangelnder Kapazität)
-              \subitem - hauptsächlich bei VA Caches
-        \item \textbf{Compulsory Miss}:
-              \subitem - tritt auf, wenn ein Datensatz das \emph{erste Mal} verwendet wird
-              \subitem - unabhängig vom Typ des Caches
-        \item \textbf{Conflict Miss}:
-              \subitem - tritt auf, wenn Datensatz bereits im Cache war, aber \emph{bereits verdrängt} wurde
-              \subitem (weil ein anderer Cacheblock an entsprechende Stelle gelagert werden sollte)
-              \subitem - vor allem bei DA Caches
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{RAID}
-    \textbf{RAID}: \textbf{R}edundant \textbf{A}rray of \textbf{I}ndependent \textbf{D}isks
-
-    Ein \emph{RAID} besteht aus mindestens zwei Festplatten und zielt auf die \emph{Verbesserung einer Eigenschaft ab}:
-    \begin{itemize}
-        \item Erhöhung der Ausfallsicherheit
-        \item Steigerung der Datentransferrate
-        \item Erweiterung der Speicherkapazität
-        \item Möglichkeit des Austauschs von Festplatten im laufenden Betrieb
-        \item Kostenreduktion durch Einsatz mehrerer kostengünstiger Festplatten
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{RAID-Level}
-    Die genaue Funktionsweise des RAID wird durch das sogenannte \emph{RAID-Level} angegeben.
-
-    \begin{itemize}
-        \item \textbf{RAID 0}:
-              \subitem - höhere Transferraten durch \emph{Striping}
-              \subitem - Daten werden auf mehrere Festplatten verteilt
-              \subitem - beim Lesen und Schreiben können mehrere Festplatten parallel verwendet werden
-              \subitem \emph{Nachteil}: fällt eine Festplatte aus, sind meist alle Daten verloren
-        \item \textbf{RAID 1}:
-              \subitem - erhöhte Ausfallsicherheit durch \emph{Mirroring}
-              \subitem - Daten in gleicher Weise auf mehrere Festplatten gleichzeitig abgelegt
-              \subitem - einzelne Daten \emph{können} auch parallel von mehreren Festplatten gelesen werden
-              \subitem \emph{Nachteil}: wird eine Datei gelöscht, wird sie auf allen Platten gelöscht (kein Backup!)
-        \item \textbf{RAID 5}:
-              \subitem - versucht Vorteile von RAID 0 und RAID 1 zu vereinen
-              \subitem - höhere Ausfallsicherheit bei höherer Datentransferrate
-              \subitem - besteht aus mindestens drei Festplatten
-              \subitem - Verwendet Variante von \emph{Striping}:
-              \subsubitem - nicht auf alle $n$ Festplatten verteilt
-              \subsubitem - auf allen Festplatten Paritätsinformationen zu Daten auf anderen $n-1$ Platten
-              \subsubitem - kann Ausfall einer Festplatte kompensieren
-    \end{itemize}
-
-
-    \begin{center}
-        \includegraphics[]{images/raid0.pdf}
-
-        \includegraphics[]{images/raid1.pdf}
-
-        \includegraphics[]{images/raid5.pdf}
-    \end{center}
-
-    Merhere RAID-Systeme eines Typs können auch zu einem RAID-System zusammengefasst werden (z.B. \emph{RAID 100}, \emph{RAID 01}, \emph{RAID 10}, \ldots).
-\end{defi}
-
-\begin{bonus}{HDD, SSD}
-    \textbf{HDD} (Hard Disk Drive, \emph{Festplatte}):
-    \begin{itemize}
-        \item Gehäuse der Festplatte beinhaltet mehrere, auf einer Achse übereinander montierten, runden Platten, welche mit einer magnetisierbaren Schicht überzogen sind
-        \item Schreib-/Leseköpfe werden durch einen zentralen Kamm über die Platten bewegt
-        \item \glqq Landing Zone\grqq zum Parken der Köpfe (Berührung $\to$ Datenverlust)
-        \item Platten rotieren mit konstanter Umdrehungszahl (5400-15000 rpm)
-        \item Kenngrößen:
-              \subitem - kontinuierliche Übertragungsrate (\emph{sustained data rate})
-              \subitem - mittlere Zugriffszeit (\emph{(data) access time}), bestehend aus:
-              \subsubitem - Spurwechselzeit (\emph{seek time})
-              \subsubitem - Latenzzeit (\emph{latency})
-              \subsubitem - Kommando-Latenz (\emph{controller overhead})
-    \end{itemize}
-
-
-    \textbf{SSD} (Solid State Drive):
-    \begin{itemize}
-        \item keine mechanischen Bauteile
-        \item niedriger Energieverbrauch
-        \item hoher Datendurchsatz
-        \item hoher Preis pro Speichereinheit
-    \end{itemize}
-\end{bonus}
-
-\begin{bonus}{Daten- und Adressbus}
-    Einzelne Komponenten sind über Leitungen, sogenannte \emph{Busse} verbunden.
-    \begin{itemize}
-        \item \emph{Datenbus} (bi-direktional)
-        \item \emph{Adressbus} (uni-direktional, leitet Adressanfragen der CPU an RAM oder Cache weiter)
-    \end{itemize}
-\end{bonus}
-
-\subsection{Parallele Rechnerarchitekturen}
-
-\begin{defi}{Flynn'sche Klassifikation (Flynn'sche Taxonomie)}
-    \begin{center}
-        \includegraphics[]{images/flynn.pdf}
-    \end{center}
-
-    \begin{itemize}
-        \item \emph{SISD} entspricht der Von-Neumann-Architektur
-        \item \emph{MIMD} entspricht dem heutigen Mehrprozessorsystem
-        \item \emph{SIMD} entspricht dem Aufbau einer Grafikkarte (genutzt in HPC)
-        \item \emph{MISD} eher ungebräuchlich.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Shared-Memory Systeme}
-    Ein \emph{Shared-Memory System} teilt den vorhandenen RAM unter den verfügbaren Prozessorenkernen auf.
-    Das bedeutet, dass Daten zwischen den einzelnen Prozessorkernen \emph{implizit über den RAM} verteilt werden können, da
-    jeder Kern Zugriff auf den RAM hat.
-
-    \textbf{SMP} (\emph{symmetric multi processing}) skaliert vergleichweise schlecht.
-    Das liegt daran, dass an die vorhandene Basis der Von-Neumann-Architektur einfach
-    weitere Prozessorkerne angeschlossen werden. Da sich diese Prozessorkerne
-    nun aber das vorhandene Bus-System teilen müssen, entsteht an dieser Stelle ein
-    \emph{Flaschenhals}.
-
-    \textbf{ccNUMA} (\emph{cache-coherent non-uniform memory architecture}) soll dieses Problem, speziell im Bereich HPC, beheben.
-    Dabei wird der vorhandene Hauptspeicher auf mehrere Memory-Controller aufgeteilt.
-    Jeder Prozessor ist dann an einen eigenen Memory-Controller angeschlossen.
-    Dabei kann grundsätzlich weiterhin jeder Kern auf den gesamten RAM zugreifen.
-    Es kann nur sein, dass der Zugriff länger dauert, wenn der betreffende Teil des RAMs von einem anderen Memory-Controller verwaltet wird.
-\end{defi}
-
-\begin{defi}{Distributed-Memory System}
-    Ein \emph{Distributed-Memory System} verbindet mehrere
-    \emph{unabhängige Recheneinheiten}, sodass Daten \emph{explizit} über eine Netzwerkverbindung
-    zwischen dieses Recheneinheiten verteilt werden müssen.
-
-    Dieser Ansatz skaliert sehr gut, d.h. es ist
-    ohne Weiteres möglich weitere Recheneinheiten anzuschließen, ohne die Gesamtperformance
-    des Systems zu beeinträchtigen
-\end{defi}
-
-\begin{bonus}{Speedup und Effizienz}
-    \emph{Speed Up} und \emph{Effizienz} beurteilen die Güte paralleler Programmausführung, indem sie \emph{Zeitersparnis} und die \emph{Anzahl der verwendeten Prozessorkerne} in Relation setzen.
-
-    Sei $T(p)$ die Zeit zur Programmausführung bei Verwendung von $p$ CPUs. Dann sind der \emph{Speed Up} $S(p)$ und die Effizienz $E(p)$ definiert wie folgt:
-    $$
-        S(p) = \frac{T(1)}{T(p)} \qquad  \qquad E(p) = \frac{S(p)}{p}
-    $$
-    Der \emph{Speed Up} gibt an, wieviel schneller die Programmausführung ist.
-    Die Effizienz gibt an, wie gut die verwendeten Prozessorkerne genutzt worden sind.
-
-    Im Idealfall ist $S(p) = p$ und $E(p) = 1$.
-\end{bonus}
-
-\begin{bonus}{Amdahl's Law}
-    Nach Amdahl wird der Geschwindigkeitszuwachs vor allem durch den sequentiellen Anteil des Problems beschränkt, da sich dessen Ausführungszeit durch Parallelisierung nicht verringern lässt.
-
-    Der \emph{Speed Up} nach Amdahl ist wie folgt definiert ($f \in (0, 1]$: serieller Teil des Programms):
-    $$
-        S(p) = \frac{T(1)}{f \cdot T(1) + (1-f) \cdot \frac{T(1)}{p}} = \frac{1}{f + \frac{1-f}{p}}
-    $$
-\end{bonus}
-
-\section{Betriebssysteme}
-
-\begin{defi}{Betriebssystem}
-    Das \emph{Betriebssystem} liegt als Softwareschicht zwischen dem Rechner bzw. der \\ \emph{Software-Hardwareschnittstelle}, die das BIOS zur Verfügung stellt, und den Anwenderprogrammen.
-    Das heißt, dass ein Endnutzer nur mit dem Betriebssystem, den vom Betriebssystem bereitgestellten Dienstprogrammen und den Anwenderprogrammen in Kontakt kommt.
-
-    \begin{center}
-        \includegraphics[]{images/betriebssysteme.pdf}
-    \end{center}
-\end{defi}
-
-\begin{bonus}{Anforderungen an ein Betriebssystem}
-    \begin{itemize}
-        \item Hohe Zuverlässigkeit und Leistung
-        \item Einfache Bedienbarkeit und Wartbarkeit
-        \item Niedrige Kosten
-    \end{itemize}
-\end{bonus}
-
-\begin{bonus}{Batchsysteme}
-    \emph{Batchsysteme} sind dazu gedacht, Rechenaufgaben ohne Nutzereingabe abzuarbeiten.
-    Dazu gibt es eine \emph{Job Queue}, in welche Aufgaben eingestellt werden.
-    Diese Aufgaben werden dann bearbeitet und die Ergebnisse an den Nutzer ausgegeben.
-\end{bonus}
-
-\begin{bonus}{Dialogsysteme}
-    \emph{Dialogsysteme} sind auf eine Interaktion mit dem Benutzer ausgelegt.
-    Sie sind die wohl geläufigste Form von Betriebssystemen, da diese Form auf z.B. Desktop-Computern eingesetzt wird.
-
-    Dialogsysteme werden noch einmal unterteilt in \emph{Single User}- und \emph{Multi-User-Systeme}.
-\end{bonus}
-
-\begin{bonus}{Echtzeitsysteme}
-    \emph{Echtzeitsysteme} sind reaktive Systeme, die mit Hilfe von Sensoren Ereignisse registrieren und anhand von Aktoren darauf reagieren.
-    Dabei ist die zeitliche Abfolge bzw. die Dauer der Ausführung von Interesse.
-\end{bonus}
-
-\subsection{Prozess}
-
-\begin{defi}{Prozess}
-    Ein \emph{Prozess} ist die Abstraktion eines in Ausführung befindelichen Programms.
-
-    Er besteht aus den \emph{Programmbefehlen} und dem \emph{Prozesskontext}.
-
-    Der \emph{Prozesskontext} besteht aus dem privaten Adressraum des Prozessors, geöffneten Streams und abhängigen Prozessen.
-\end{defi}
-
-\begin{defi}{Prozesszustände}
-    \begin{center}
-        \includegraphics[]{images/prozesszustaende.pdf}
-    \end{center}
-    \begin{enumerate}
-        \item Der Prozess muss auf ein externes Ereignis warten.
-        \item Die Zeitscheibe des Prozesses ist abgelaufen, oder ein höher priorisierter Prozess muss ausgeführt werden.
-        \item Der Prozess bekommt eine neue Zeitscheibe zugeteilt.
-        \item Das externe Ereignis, auf das der Prozess gewartet hat, ist eingetreten.
-    \end{enumerate}
-\end{defi}
-
-\begin{bonus}{Multitasking}
-    \textbf{Preemptives Multitasking}:
-    \begin{itemize}
-        \item Betriebssystem entscheidet, wann welcher Prozess zur Ausführung kommt
-        \item Benutzer erhält Eindruck von Parallelität
-    \end{itemize}
-
-    \textbf{Kooperatives Multitasking}:
-    \begin{itemize}
-        \item Prozess bestimmt selbst, wann er den Prozessor abgibt
-        \item \emph{Nachteile}
-              \subitem - z.B. Endlosschleifen können das gesamte System zum Absturz bringen
-              \subitem - das Betriebssystem kann nicht berechnen, wann der Prozessor wieder frei ist
-    \end{itemize}
-\end{bonus}
-
-\begin{defi}{Scheduling}
-    Die Zuteilung von Zeitscheiben wird \emph{Scheduling} genannt und ist der Kern der Prozessverwaltung.
-    Das Scheduling sollte dabei jederzeit die folgenden Eigenschaften erfüllen:
-    \begin{itemize}
-        \item \emph{Fairness}: Jeder Prozess erhält einen gerechten Anteil der CPU-Zeit.
-        \item \emph{Effizienz}: Die CPU und andere Ressourcen sind möglichst vollständig ausgelastet.
-    \end{itemize}
-\end{defi}
-
-\begin{bonus}{Priorität}
-    \textbf{Statische Priorität}:
-    \begin{itemize}
-        \item Jeder Prozess erhält beim Start eine \emph{feste Priorität}
-        \item Prozess mit \emph{höchster Priorität} bekommt als nächstes eine Zeitscheibe zugeteilt
-        \item Oft in Echtzeitsystemen verwendet
-    \end{itemize}
-
-    \textbf{Dynamische Priorität}:
-    \begin{itemize}
-        \item Jeder Prozess erhält beim Start eine \emph{Anfangspriorität}
-        \item Prozess mit \emph{höchster Priorität} bekommt als nächstes eine Zeitscheibe zugeteilt
-        \item Prioritäten der Prozesse werden \emph{dynamisch geändert}
-    \end{itemize}
-\end{bonus}
-
-\begin{algo}{Scheduling: FIFO (First In First Out)}
-    Prozesse werden nach \emph{Reihenfolge} ihres Einfügens in die \emph{Job-Queue} bearbeitet.
-    \begin{itemize}
-        \item Zuteilung der CPU findet nur statt, wenn laufender Prozess wartet oder sich beendet
-        \item Jeder Prozess kommt garantiert an die Reihe
-        \item Kurze Prozesse müssen unter Umständen sehr lange warten, bis sie ausgeführt werden
-    \end{itemize}
-\end{algo}
-
-\begin{algo}{Scheduling: SJF (Shortest Job First)}
-    Prozesse werden aufsteigend nach ihrer \emph{geschätzten Ausführungszeit} bearbeitet.
-    \begin{itemize}
-        \item Große Prozesse kommen möglicherweise nie an die Reihe, wenn stets kleinere dazukommen
-        \item Wartezeit auf das Ergebnis eines Prozesses sich in etwa proportional zur Ausführungszeit
-    \end{itemize}
-\end{algo}
-
-\begin{algo}{Scheduling: MLFQ (Multilevel Feedback Queue)}
-    Bei diesem Ansatz gibt \emph{mehrere FIFO-Queues}, denen jeweils
-    eine \emph{Priorität} zugeordnet ist.
-
-    Ein neuer Prozess wird immer in der Queue mit
-    \emph{höchster Priorität} eingeordnet.
-
-    Wird der Prozess während der ersten Zeitscheibe fertig,
-    so verlässt er das System.
-
-    Gibt er die CPU freiwillig ab, beispielsweise weil er
-    durch das Warten auf ein externes Ereignis blockiert wird, wird er, sobald er wieder
-    bereit ist, in \emph{dieselbe Queue wieder einsortiert} und dort weiter ausgeführt.
-
-    Verbraucht der Prozess seine Zeitscheibe vollständig, so wird er in die \emph{nächst-niedriger priorisierte FIFO-Queue} eingereiht. Dort gelten wieder dieselben Regeln wie vorher.
-
-    Verbraucht der Prozess immer weiter seine Zeitscheiben vollständig, kommt er
-    schließich in der \emph{am niedrigsten priorisierten Queue} an.
-    Dort verweilt er, bis er abgearbeitet wurde, d.h. es gibt \emph{keine Möglichkeit} wieder in höher priorisierte Queues
-    eingestuft zu werden.
-
-    Wieviele FIFO-Queues es gibt, ist vom konkreten Einsatzszenario abhängig.
-\end{algo}
-
-\subsection{Speicherverwaltung}
-
-\begin{defi}{Reale Speicherverwaltung}
-    Jedem Prozess wird ein zusammenhängener Block im Hauptspeicher zugeteilt.
-    Wird in diesem Kontext der Arbeitsspeicher direkt aus den Prozessen heraus adressiert, spricht man von \emph{realer Speicherverwaltung}.
-
-    Das bedeutet auch, dass die Größe des physikalisch vorhandenen Hauptspeichers die Anzahl der gleichzeitig ausführbaren Prozesse begrenzt.
-
-    \emph{Nachteile}:
-    \begin{itemize}
-        \item Es muss Platz für das \emph{gesamte Programm und die Daten} gefunden werden.
-        \item Es kannt nicht mehr Speicher genutzt werden, als \emph{physikalisch vorhanden}.
-        \item Anforderung, zusammenhängender Speicherblöcke zu finden, verschärft Problem der \emph{Fragmentierung}.
-    \end{itemize}
-\end{defi}
-
-\begin{bonus}{Fragmentierung}
-    \emph{Fragmentierung} passiert dann, wenn mehrere, kleine Blöcke im Hauptspeicher frei sind und unter der Prämisse, dass einem
-    Prozess ein zusammenhängender Block im Hauptspeicher zugeordnet werden
-    muss, dies eventuell zu einer Situation führt, in der kein neuer Prozess gestartet
-    werden kann, obwohl in Summe genügend Hauptspeicher frei wäre.
-\end{bonus}
-
-\begin{defi}{Swapping}
-    Beim \emph{Swapping} wird der
-    Hauptspeicherinhalt eines Prozesses auf den \emph{Hintergrundspeicher}, beispielsweise
-    eine Festplatte (HDD), \emph{ausgelagert}, um Platz für andere Prozesse zu schaffen.
-
-    Bekommt dann der Prozess, dessen Daten gerade auf dem Hintergrundspeicher liegen,
-    die CPU zugeteilt, müssen seine Daten \emph{erneut in den Hauptspeicher geladen werden},
-    wahrscheinlich nachdem die Daten eines anderen Prozesses ausgelagert wurden.
-\end{defi}
-
-\begin{defi}{Virtuelle Speicherverwaltung}
-    Jedem Prozess wird ein \emph{scheinbar zusammenhängender Speicherbereich} zur Verfügung gestellt.
-    Tatsächlich besteht der Speicher des Prozesses aus nicht zwangsläufig zusammenhängenden \emph{virtuelle Pages}.
-
-    Der Prozess kann seinen Speicher mit \emph{virtuellen Adressen} beginnend bei 0 adressieren.
-
-    Die Gesamtheit aller virtuellen Adressen wird als \emph{virtueller Adressraum} bezeichnet.
-\end{defi}
-
-\begin{defi}{Virtuelle Pages}
-    \emph{Virtuelle Pages} werden auf Blöcke im Hauptspeicher gleicher Größe abgebildet.
-
-    Hier kann auch \emph{Swapping} genutzt werden. In diesem Fall aber für einzelne Pages, nicht für den gesamten Hauptspeicherinhalt des Prozessors.
-\end{defi}
-
-\begin{defi}{Pagetable}
-    Beim Zugriff auf eine virtuelle Speicheradresse durch einen Prozess muss diese
-    Adresse in eine physikalische Adresse umgewandelt werden. Das geschieht anhand
-    der \emph{Pagetable}, die das Betriebssystem \emph{für jeden Prozess} erstellt und aktualisiert.
-
-    Da
-    die Pagetable virtuelle Pages auf physikalische Pages gleicher Größe abbildet, gibt es einen Teil der Adresse, der sogenannte \emph{Offset}, der die Position der Daten innerhalb
-    der Page angibt.
-
-    Abhängig von
-    der Größe der Pages besteht das Offset aus $m$ Bits.
-    Für eine Pagegröße von 1MB
-    werden beispielsweise 20 Bits als Offset benötigt.
-
-    Der Rest der Adresse, die Seitennummer,
-    muss dann anhand der Pagetable in die Basisadresse umgesetzt werden,
-    um die Adresse im physikalischen Speicher zu erhalten. Da die Seitennummer aus
-    $n$ Bits besteht, kann die Pagetable maximal $2^n$ Einträge enthalten.
-\end{defi}
-
-\begin{example}{Pagetable}
-    Die Länge einer Adresse sei 16 Bit, aufgeteilt in je 8 Bit für Offset und Seitennummer.
-
-    Es sei außerdem folgende Seitentabelle gegeben:
-
-    \begin{center}
-        \begin{tabular}{|c|c|c|}
-            \hline
-            \textbf{Eintrag} & \textbf{Gültig} & \textbf{Basisadresse} \\
-            \hline
-            00               & Nein            & -                     \\
-            01               & Ja              & 0x17                  \\
-            02               & Ja              & 0x20                  \\
-            03               & Ja              & 0x08                  \\
-            04               & Nein            & -                     \\
-            05               & Ja              & 0x10                  \\
-            \hline
-        \end{tabular}
-    \end{center}
-
-    Dann können virtuelle Adressen anhand dieser Pagetable wie folgt umgesetzt werden:
-
-    \begin{center}
-        \begin{tabular}{|c|c|}
-            \hline
-            \textbf{virtuelle Adresse} & \textbf{physikalische Adresse}      \\
-            \hline
-            0x083A                     & ungültig (Seite 8 existiert nicht)  \\
-            0x01FF                     & 0x17FF (Seite 1, Basisadresse 0x17) \\
-            0x0505                     & 0x1005 (Seite 5, Basisadresse 0x10) \\
-            0x043A                     & ungültig (Seite 4 ungültig)         \\
-            \hline
-        \end{tabular}
-    \end{center}
-
-    \emph{Hinweis}: Ist eine Adresse ungültig, wurde die dazugehörige Page in den Hintergrundspeicher ausgelagert. In diesem Fall muss die physikalische Page in den RAM geladen und die Pagetable aktualisiert werden.
-\end{example}
-
-\begin{bonus}{Paging on Demand}
-    Das Vorgehen, aktuell
-    unbenutzte Pages aus dem Hauptspeicher auf den Hintergrundspeicher auszulagern
-    wird auch als \emph{Paging on Demand} bezeichnet.
-    Das Ziel dabei ist, Arbeitsspeicher
-    für andere Prozesse freizugeben.
-
-    Dabei kann ein Prozess entweder Platz für eine
-    bestimmte Anzahl von physikalischen Pages zugewiesen bekommen, die sich im
-    Laufe der Prozessabarbeitung nicht ändert, oder es wird dynamisch anhand der aktuellen
-    Speicherauslastung entschieden, wieviel Platz ein Prozess belegen darf.
-\end{bonus}
-
-\begin{algo}{Speicherverwaltung: FIFO (First In First Out)}
-    Beim \emph{FIFO}-Verfahren wird
-    diejenige Page ausgelagert, welche sich schon am längsten im Hauptspeicher
-    befindet. Dazu muss in der Pagetable festgehalten werden, wann welche
-    Page in den Hauptspeicher geladen wurde.
-\end{algo}
-
-\begin{algo}{Speicherverwaltung: LRU/LFU (Least Recently / Frequently Used)}
-    Bei \emph{LRU}
-    wird mitgehalten, wieviele Ladevorgänge seit der letzten Benutzung einer
-    Page vorgenommen wurden. Das heißt, dass im Gegensatz zu FIFO, der
-    Kontrollzustand bei der Verwendung einer Page wieder auf \glqq 0\grqq gesetzt wird.
-\end{algo}
-
-\begin{example}{Speicherverwaltung}
-    Seitenanforderungen: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5
-
-    \textbf{FIFO-Strategie:}
-
-    \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
-        \hline
-        \multicolumn{1}{|c}{\textbf{Referenzfolge}} & \multicolumn{1}{c|}{} & 1                  & 2                  & 3                  & 4                  & 1                  & 2                  & 5                  & 1 & 2 & 3                  & 4                  & 5 \\
-        \hline
-        \hline
-        \multirow{3}{*}{\textbf{Arbeitsspeicher}}   & Page 1                & \textcolor{red}{1} & 1                  & 1                  & \textcolor{red}{4} & 4                  & 4                  & \textcolor{red}{5} & 5 & 5 & 5                  & 5                  & 5 \\
-                                                    & Page 2                &                    & \textcolor{red}{2} & 2                  & 2                  & \textcolor{red}{1} & 1                  & 1                  & 1 & 1 & \textcolor{red}{3} & 3                  & 3 \\
-                                                    & Page 3                &                    &                    & \textcolor{red}{3} & 3                  & 3                  & \textcolor{red}{2} & 2                  & 2 & 2 & 2                  & \textcolor{red}{4} & 4 \\
-        \hline
-        \hline
-        \multirow{3}{*}{\textbf{Kontrollzustand}}   & Page 1                & 0                  & 1                  & 2                  & 0                  & 1                  & 2                  & 0                  & 1 & 2 & 3                  & 4                  & 5 \\
-                                                    & Page 2                & -                  & 0                  & 1                  & 2                  & 0                  & 1                  & 2                  & 3 & 4 & 0                  & 1                  & 2 \\
-                                                    & Page 3                & -                  & -                  & 0                  & 1                  & 2                  & 0                  & 1                  & 2 & 3 & 4                  & 0                  & 1 \\
-        \hline
-    \end{tabular}
-
-    9 Einlagerungen
-
-    \textbf{LRU-Strategie:}
-
-    \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
-        \hline
-        \multicolumn{1}{|c}{\textbf{Referenzfolge}} & \multicolumn{1}{c|}{} & 1                  & 2                  & 3                  & 4                  & 1                  & 2                  & 5                  & 1 & 2 & 3                  & 4                  & 5                  \\
-        \hline
-        \hline
-        \multirow{3}{*}{\textbf{Arbeitsspeicher}}   & Page 1                & \textcolor{red}{1} & 1                  & 1                  & \textcolor{red}{4} & 4                  & 4                  & \textcolor{red}{5} & 5 & 5 & \textcolor{red}{3} & 3                  & 3                  \\
-                                                    & Page 2                &                    & \textcolor{red}{2} & 2                  & 2                  & \textcolor{red}{1} & 1                  & 1                  & 1 & 1 & 1                  & \textcolor{red}{4} & 4                  \\
-                                                    & Page 3                &                    &                    & \textcolor{red}{3} & 3                  & 3                  & \textcolor{red}{2} & 2                  & 2 & 2 & 2                  & 2                  & \textcolor{red}{5} \\
-        \hline
-        \hline
-        \multirow{3}{*}{\textbf{Kontrollzustand}}   & Page 1                & 0                  & 1                  & 2                  & 0                  & 1                  & 2                  & 0                  & 1 & 2 & 0                  & 1                  & 2                  \\
-                                                    & Page 2                & -                  & 0                  & 1                  & 2                  & 0                  & 1                  & 2                  & 0 & 1 & 2                  & 0                  & 1                  \\
-                                                    & Page 3                & -                  & -                  & 0                  & 1                  & 2                  & 0                  & 1                  & 2 & 0 & 1                  & 2                  & 0                  \\
-        \hline
-    \end{tabular}
-
-    10 Einlagerungen
-\end{example}
-
-\newpage
-\subsection{Dateisystemverwaltung}
-
-\begin{defi}{BIOS (Basic Input/Output System)}
-    Das \emph{BIOS}:
-    \begin{itemize}
-        \item ist die \emph{Firmware} bei x86-PCs
-        \item liegt im \emph{nichtflüchtigen Speicher} auf der Hauptplatine des PCs
-        \item leitet den \emph{Start} des \emph{Betriebssystems} ein
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{UEFI (Unified Extensible Firmware Interface)}
-    \emph{UEFI} ist die zentrale Schnittstelle zwischen:
-    \begin{itemize}
-        \item der \emph{Firmware}
-        \item den \emph{einzelnen Komponenten} eines Rechners
-        \item und dem \emph{Betriebssystem}
-    \end{itemize}
-\end{defi}
-
-\begin{bonus}{MBR (Master Boot Record)}
-    Der \emph{MBR} besteht aus insgesamt 512 Byte, die sich auf 446 Byte
-    für einen (optionalen) Bootloader, 64 Byte für die \emph{Partitionstabelle} und 2 Byte
-    für eine \emph{} (0xAA55) aufteilen. Die Magic Number dient dazu, einen
-    gültigen MBR zu identifizieren.
-
-    In der Partitionstabelle können maximal 4 Partitionen
-    definiert werden, d.h. die Festplatte kann in maximal 4 logische Einheiten aufgeteilt
-    werden.
-\end{bonus}
-
-\begin{bonus}{GPT (GUID Partition Table)}
-    Mit der Einführung von UEFI wurden auch die Limitierungen des
-    MBR aufgehoben und die GPT als Nachfolger definiert.
-
-    Die \emph{GPT} beinhaltet zu Beginn
-    aus Kompatibilitätsgründen einen MBR, sodass ein hybrider Betrieb möglich
-    ist. In der GPT können bis zu 128 Partitionen abgelegt werden.
-
-    Zur Absicherung der
-    GPT wird eine exakte Kopie der GPT am Ende des Datenträgers abgelegt.
-\end{bonus}
-
-\begin{defi}{Dateisystem}
-    Ein Dateisystem ist im Prinzip eine Ablageorganisation für Daten auf einem Datenträger des Computers.
-    Das Dateisystem muss sicherstellen,
-    dass Dateien \emph{lesend und schreibend geöffnet} und auch wieder \emph{geschlossen} werden
-    können. Das bedeutet, dass Dateinamen auf physikalische Adressen auf dem
-    Datenträger abgebildet werden müssen.
-
-    Spezielle Eigenschaften des Datenträgers
-    (Festplatte, USB-Stick, ...) müssen berücksichtigt werden.
-
-    Generell bieten
-    alle (modernen) Dateisysteme folgende Attribute:
-    \begin{itemize}
-        \item Dateiname
-        \item Ablageort (Ordner bzw. Verzeichnis)
-        \item Dateigröße
-        \item Zugriffsrecht
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Lineare Dateisysteme}
-    Bei linearen Dateisystemen werden Daten direkt hintereinander auf den Datenträger
-    geschrieben. Das bedeutet, dass wahlfreier Zugriff nicht möglich ist. Daher finden
-    diese Dateiysteme heutzutage nur noch Anwendung in Bereichen, in denen es nicht
-    primär auf Geschwindigkeit ankommt.
-\end{defi}
-
-\begin{defi}{Hierarchische Dateisysteme}
-    Daten werden auf hierarchischen Dateisystemen in einer Verzeichnisstruktur
-    abgelegt.
-
-    Diese Art von Dateisystem ist die wohl verbreiteste auf
-    modernen Computern und kann auf Festplatten, SSDs, USB-Sticks, SD-Karten und
-    sonstigen herkömmlichen Datenträgern verwendet werden.
-\end{defi}
-
-\begin{defi}{Netzwerkdateisysteme}
-    In Netzwerkdateisystemen wird entfernter
-    Speicher auf einem Server wie ein lokales Medium behandelt. Das Betriebssystem
-    muss dann die Zugriffe auf Dateien in Netzwerkkommunikation umwandeln.
-    Für den Nutzer
-    eines Betriebsystems stellt sich Netzwerkspeicher allerdings in der Regel wie ein
-    hierarchisches Dateisystem dar.
-\end{defi}
-
-\begin{bonus}{Sicherheitsaspekte}
-    \textbf{Paralleler Zugriff im Multitasking}:
-    \begin{itemize}
-        \item Bereitstellung von Locks für den Dateizugriff
-    \end{itemize}
-
-    \textbf{Stromausfall während einer Schreiboperation}:
-    \begin{itemize}
-        \item Es muss Datenkonsistenz gewährleistet werden
-        \item Atomare Operationen, welche entweder abgeschlossen oder ausstehend sind
-              \subitem $\to$ Journalingdateisysteme
-    \end{itemize}
-\end{bonus}
-
-\begin{defi}{Journalingdateisysteme}
-    Bei einem Journalingdateisystem werden alle Aktionen auf der Festplatte protokolliert
-    und erst als gültig aufgefasst, nachdem das Beenden der Aktion auf dem Dateisystem
-    im \emph{Journal} (Protokoll) vermerkt wurde.
-
-    \begin{itemize}
-        \item \emph{Metadatenjournaling}:
-              \subitem - Konsistenz des Dateisystems
-        \item \emph{Fulljournaling}:
-              \subitem - Konsistenz des Dateisystems
-              \subitem - Konsistenz der Dateiinhalte
-    \end{itemize}
-
-\end{defi}
-
-\section{Virtualisierung}
-
-\begin{defi}{Virtualisierung}
-    \emph{Virtualisierung} bezeichnet Methoden, die es erlauben, Ressourcen
-    eines Computers \emph{zusammenzufassen oder aufzuteilen}.
-
-    Dies wird erreicht, indem real existierende Hardware unter
-    Zuhilfenahme einer Softwareschicht zu virtueller Hardware \emph{abstrahiert} wird.
-
-    Dabei können mehrere Szenarien unterschieden werden:
-    \begin{itemize}
-        \item Partitionierung
-        \item Aggregation
-        \item Emulation
-        \item Isolation
-    \end{itemize}
-    \vspace{1em}
-    \begin{center}
-        \includegraphics[]{images/virtualisierung.pdf}
-    \end{center}
-\end{defi}
-
-\begin{defi}{Hypervisor / Virtual Machine Monitor (VMM)}
-    Der \emph{Hypervisor} ist ein Stück Soft- oder Hardware, das  die Umsetzung
-    zwischen der \emph{virtuellen Maschine} und der \emph{physikalischen Hardware} vornimmt.
-
-    \textbf{Typ-1-Hypervisor}:
-    \begin{itemize}
-        \item läuft direkt auf physikalischer Hardware
-    \end{itemize}
-
-    \textbf{Typ-2-Hypervisor}:
-    \begin{itemize}
-        \item läuft als Anwendung auf dem Hostsystem
-    \end{itemize}
-\end{defi}
-
-\subsection{Virtualisierungskonzepte}
-
-\begin{defi}{Paravirtualisierung}
-    \begin{itemize}
-        \item Funktionalitäten des Gast BS werden gezielt verändert (Kernel Anpassungen)
-        \item Gast-BS \glqq weiß\grqq, dass es sich in einer virtuellen Umgebung befindet
-        \item Gast-BS kann direkt mit dem Hypervisor interagieren, benötigt keine Hardware-Emulation
-    \end{itemize}
-
-    \emph{Vorteile}: gute Performance
-
-    \emph{Nachteile}: Gastsysteme nicht beliebig wählbar, hoher Aufwand für Kernel-Entwickler
-\end{defi}
-
-\begin{defi}{Hardware-unterstützte Virtualisierung}
-    \begin{itemize}
-        \item Neue Prozessortechnologien: CPUs besitzen Befehlssatz, der Virtualisierung unterstützt
-        \item Modifikation des Gast-BS soll vermieden werden, direkt durch Hardware gelöst
-        \item Hypervisor soll durch hardwarebasierte Speicherverwaltung entlastet werden
-    \end{itemize}
-
-    \emph{Vorteile}: Gast-BS muss nicht modifiziert werden, Gastsysteme frei wählbar
-
-    \emph{Nachteile}: kein gemeinsamer Standard, Virtualisierungsplattform muss Technologie unterstützen
-\end{defi}
-
-\begin{defi}{Hardware-Emulation}
-    \begin{itemize}
-        \item Innerhalb einer VM wird Standardhardware eines Rechners komplett oder teilweise simuliert
-        \item Emulator erzeugt Softwareschnittstellen, die vom Gast-BS angesprochen werden können
-        \item Emulator sorgt dafür, dass Befehle, die an simulierte Hardware gerichtet sind, für die physische Hardware des Hostsystems umgewandelt werden
-    \end{itemize}
-
-    \emph{Vorteile}: flexible Wahl der Gast-BS
-
-    \emph{Nachteile}: Performanceverlust durch hohen Virtualisierungsaufwand
-\end{defi}
-
-\begin{defi}{Betriebssystemvirtualisierung}
-    \begin{itemize}
-        \item Innerhalb des Host-BS werden Virtual Environments (VE) / Container erzeugt
-        \item In VE ist kein eigenständiges Betriebssystem installiert
-        \item Kernel-Bibliotheken und Geräte-Treiber des Hostsystems genutzt
-        \item Einige Individualdaten müssen für Container definiert werden \\ (z.B. Dateisystem, IP Adresse, Hostname)
-    \end{itemize}
-
-    \emph{Vorteile}: gute Performance, wenig Speicherbedarf
-
-    \emph{Nachteile}: keine freie Wahl des Gast-BS (gebunden an Hostsystem)
-\end{defi}
-
-\subsection{Cloud Computing}
-
-\begin{defi}{Cloud Computing}
-    \emph{Cloud Computing} ist im Wesentlichen ein Model um einen allgegenwärtigen,
-    bequemen, bedarfsgesteuerten Netzwerkzugang zu einem gemeinsamen Pool konfigurierbarer
-    Computer-Ressourcen zur Verfügung zu stellen. Zudem soll das Ganze
-    schnell und mit minimalem Verwaltungsaufwand und Interaktion mit dem Provider
-    funktionieren.
-\end{defi}
-
-\begin{defi}{Servicemodelle}
-    \textbf{Infrastructure as a Service} (IaaS):
-    \begin{itemize}
-        \item vom Anbieter verwaltete Infrastruktur
-        \item Nutzer muss verwendetes Betriebssystem und Software vollständig selbst verwalten
-    \end{itemize}
-
-    \textbf{Platform as a Service} (PaaS):
-    \begin{itemize}
-        \item virtuelle Plattform zur Verfügung gestellt (Betriebssystem, Entwicklungsplattform)
-        \item alles \glqq unterhalb\grqq der Plattform ist aber \emph{nicht} unter der Kontrolle des Nutzers
-    \end{itemize}
-
-    \textbf{Software as a Service} (SaaS):
-    \begin{itemize}
-        \item nur eine einzelne Anwendung zur Verfügung gestellt
-        \item alles \glqq unterhalb\grqq der Anwendung ist aber \emph{nicht} unter der Kontrolle des Nutzers
-    \end{itemize}
-\end{defi}
-
-\begin{bonus}{Charakterisken von Cloud Computing}
-    \begin{itemize}
-        \item Selbstverwaltung (On-demand self-service)
-        \item Breitband Internetzugang
-        \item Ressourcenbündelung
-        \item Elastizität
-        \item Leistungsmessung
-    \end{itemize}
-\end{bonus}
-
-\begin{defi}{Bereitstellungsmodelle}
-    \textbf{Private Cloud}:
-    \begin{itemize}
-        \item für eine ganz spezielle Nutzergruppe betrieben
-        \item kann auch von der Firma selbst verwaltet werden
-    \end{itemize}
-
-    \textbf{Community Cloud}:
-    \begin{itemize}
-        \item wird für verschiedene Nutzergruppen in einem bestimmten Kontext betrieben
-        \item in der Regel von einer der teilnehmenden Gruppen oder von externem Dienstleister bereitgestellt
-    \end{itemize}
-
-    \textbf{Public Cloud}:
-    \begin{itemize}
-        \item für beliebige Nutzer zur Verfügung steht
-        \item von beliebigem Anbieter betrieben
-    \end{itemize}
-
-    \textbf{Hybrid Cloud}:
-    \begin{itemize}
-        \item kombiniert mehrere der vorhergehenden Bereitstellungsmodelle
-        \item einzelnen Teile unabhängig voneinander, aber durch standardisierte Schnittstellen verbunden
-    \end{itemize}
-\end{defi}
-
-\section{Datenschutz und Sicherheit}
-\subsection{Datensicherheit}
-
-\begin{defi}{Kryptographie}
-    Kryptographie ist die Wissenschaft der Verschlüsselung von Informationen. Sie wird genutzt
-    um Informationen auf eine Art und Weise zu verändern, sodass ein Unbefugter
-    die Informationen nicht mehr lesen kann. Es soll nur dem tatsächlichen Adressaten
-    einer Nachricht möglich sein, diese auch zu lesen. Es geht also explizit nicht darum,
-    den Diebstahl von Informationen zu verhindern, sondern es geht darum, dass
-    entwendete Informationen nicht gelesen werden können.
-\end{defi}
-
-\begin{defi}{Transpositionschiffren}
-    Die Verschlüsselung wird durch Umordnung der Zeichen
-    im Klartext umgesetzt.
-\end{defi}
-
-\begin{defi}{Substitutionschiffren}
-    Die Verschlüsselung wird durch Ersetzung der Zeichen
-    im Klartext realisiert.
-
-    \textbf{Monoalphabetische Substitution}:
-    \begin{itemize}
-        \item Jedes Zeichen des Klartexts wird durch genau
-              ein eindeutiges Zeichen aus dem Geheimtextalphabet ersetzt, das für einen
-              gewählten Schlüssel immer gleich ist.
-    \end{itemize}
-
-    \textbf{Homophone Substitution}:
-    \begin{itemize}
-        \item Jedes Zeichen des Klartexts wird durch genau ein
-              anderes Zeichen aus einer eindeutigen Menge von Zeichen ersetzt, die für einen
-              gewählten Schlüssel immer gleich ist.
-    \end{itemize}
-
-    \textbf{Polyalphabetische Substitution}:
-    \begin{itemize}
-        \item Jedes Zeichen wird durch ein eindeutiges Zeichen
-              aus einem von mehreren geheimen Alphabeten ersetzt, die für einen gewählten
-              Schlüssel immer gleich sind. Die Alphabete werden dabei immer der Reihe nach
-              verwendet.
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Cäsar Chiffre}
-    Im einfachsten Fall beinhalten $\mathfrak{P}$ und $\mathfrak{S}$ dieselben Zeichen und sind nur gegeneinander
-    um $k$ Zeichen verschoben. Diese Variante einer \emph{monoalphabetischen Substitutionschiffre} wird \emph{Cäsar Chiffre} genannt.
-
-    Alice wählt für die Verschlüsselung $k = 10$ und erhält damit die folgenden Alphabete:
-
-    \begin{center}
-        $\mathfrak{P}$: \texttt{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}\\
-        $\mathfrak{S}$: \texttt{J K L M N O P Q R S T U V W X Y Z A B C D E F G H I}\\
-    \end{center}
-
-    Da Alice $k = 10$ gewählt hat, beginnt das Geheimtextalphabet mit \texttt{J}, dem
-    zehnten Buchstaben des Alphabets. Die Verschlüsselung führt Alice durch,
-    indem sie jeden Buchstaben ihres Klartexts durch den entsprechenden Buchstaben
-    aus dem Geheimtextalphabet ersetzt.Werden die beiden Alphabete wie
-    weiter oben aufgeschrieben, ist das einfach der Buchstabe im Geheimtextalphabet
-    der direkt unter dem Buchstaben im Klartextalphabet steht. Damit ergibt
-    sich für die Nachricht \texttt{HALLO} der Geheimtext \texttt{QJUUX}. Bob kann den
-    Geheimtext dann entschlüsseln, indem er wiederum beide Alphabete untereinander
-    schreibt und jedem Buchstaben aus dem Geheimtext den zugehörigen
-    Buchstaben aus dem Klartextalphabet zuorndet, der dann genau darüber steht.
-\end{example}
-
-\begin{example}{Vigenère Chiffre}
-    Eine bekannte \emph{polyalphabetische Substitutionschiffre} ist die \emph{Vigenère Chiffre}.
-    Sie funktioniert im Prinzip wie die Cäsar-Chiffre, verwendet also verschobene
-    lateinische Alphabete zur Verschlüsselung. Wie viele Alphabete und wie
-    jedes von ihnen verschoben, wird durch den Schlüssel $k$ bestimmt, der in diesem
-    Fall ein Wort ist. Es gibt also soviele geheime Alphabete, wie es Zeichen
-    in $k$ gibt und jedes dieser Alphabete ist verschoben, so dass das $i$-te Alphabet
-    mit dem $i$-ten Zeichen von $k$ beginnt.
-    Alice wählt das Schlüsselwort $k = EDV$. Damit ergeben sich Klartext- und
-    Geheimalphabete wie folgt:
-
-    \begin{center}
-        $\mathfrak{P}$: \texttt{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}\\
-        $\mathfrak{S}_1$: \texttt{E F G H I J K L M N O P Q R S T U V W X Y Z A B C D}\\
-        $\mathfrak{S}_2$: \texttt{D E F G H I J K L M N O P Q R S T U V W X Y Z A B C}\\
-        $\mathfrak{S}_3$: \texttt{V W X Y Z A B C D E F G H I J K L M N O P Q R S T U}\\
-    \end{center}
-
-    Damit kann Alice den Klartext $M =$ \texttt{HALLOHALLO} verschlüsseln, indem Sie
-    die Buchstaben des Klartexts wie bei der Cäsar Chiffre zuordnet und dabei die
-    drei Geheimtextalphabete reihum verwendet. Da der Klartext mehr Zeichen
-    enthält, als es Geheimtextalphabete gibt, fängt sie nach jeweils drei Zeichen
-    wieder beim ersten Geheimtextalphabet an. Somit ergibt sich der Geheimtext
-    $C =$ \texttt{LDGPRCEOGS}.
-\end{example}
-
-\begin{defi}{Moderne Verschlüsselungsverfahren}
-    Moderne Verschlüsselungsverfahren werden, im Gegensatz zu klassischen Verfahren,
-    nicht mehr auf Zeichen einer natürlichen Sprache angewandt. Stattdessen werden
-    Zahlen bzw. Bits als Grundlage der Operationen verwendet. Damit können
-    beliebige Daten verschlüsselt werden, nicht mehr nur Text. Damit sind moderne
-    Verschlüsselungsverfahren den Anforderungen der heutigen digitalen Gesellschaft
-    gewachsen.
-
-    \textbf{Symmetrische Verfahren}:
-    \begin{itemize}
-        \item denselben Schlüssel zur Ver- und Entschlüsselung
-        \item Problem des Schlüsselaustauschs
-        \item Vertraulichkeit, aber keine zur Sicherstellung von Authentifizierung und Integrität
-        \item[$\to$] Blockchiffren
-            \subitem -  zu verschlüsselnde Daten in $m$ Blöcke derselben Größe aufgeteilt
-            \subitem -  einfachster Fall: jeder der zuvor erzeugten Blöcke $m_i$ mit Schlüssel $k$
-            \subitem zu verschlüsseltem Block $c_i$ derselben Größe übersetzt
-        \item[$\to$] Stromchiffren
-            \subitem -  Klartext wird bitweise anhand eines Schlüsselstroms verschlüsselt
-            \subitem - Schlüsselstrom und Geheimtext haben dieselbe Länge wie der Klartext
-    \end{itemize}
-
-    \textbf{Asymmetrische Verfahren}:
-    \begin{itemize}
-        \item Die meisten asymmetrischen Verfahren basieren auf mathematischen Problemen, die nicht effizient zu lösen sind.
-        \item
-    \end{itemize}
-\end{defi}
-
-\begin{algo}{RSA Verschlüsselung}
-    RSA basiert auf der Faktorisierung ganzes Zahlen, für die es keinen bekannten
-    effizienten Algorithmus gibt. Dabei geht es darum, eine Zahl in ihre Primfaktoren
-    zu zerlegen.
-
-    Da beide Schlüssel des Schlüsselpaars zusammen funktionieren sollen, müssen sie
-    nach einer festen Vorschrift erzeugt werden:
-    \begin{enumerate}
-        \item Wähle zwei Primzahlen $p, q$ mit $p \neq q$
-        \item Berechne $N = p \cdot q$
-        \item Berechne $\varphi(N) = (p-1)\cdot (q-1)$
-        \item Wähle ein $e$, das teilerfremd zu $\varphi(N)$ ist mit $1 < e < \varphi(N)$
-        \item Berechne $d$, sodass $e \cdot d \equiv 1 \mod \varphi(N)$
-    \end{enumerate}
-
-    Nach dieser Prozedur ist $(e,N)$ der \emph{public key} und $(d,N)$ der \emph{private Key}. Damit
-    kann nun jeder Nachricht $M \in \N, 1 < M < N$ anhand folgender Formel verschlüsselt
-    werden:
-    $$
-        C = M^e \mod N
-    $$
-
-    Die Entschlüsselung der verschlüsselten Nachricht $C$ kann dann anhand einer ähnlichen Formel durchgeführt werden:
-    $$
-        M = C^d \mod N
-    $$
-\end{algo}
-
-\begin{example}{RSA Verschlüsselung}
-    Damit Alice Bob eine Nachricht schreiben kann, muss Bob zunächst seinen \emph{public Key} zur Vefügung stellen.
-
-    Zur Erzeugung seines Schlüsselpaars wählt Bob die Primzahlen $p=13$ und $q=17$.
-    Damit ergibt sich $N = 221$ und $\varphi(N) = 192$.
-    Anschließend wählt Bob $e=5$ und berechnet damit $d=77$.
-    Damit kann Bob $(5, 221)$ als seinen \emph{public Key} an Alice geben und $(77, 221)$ behält er als \emph{private Key} für sich.
-
-    Alice hat nun Bobs \emph{public Key} und möchte damit die Nachricht $M = 42$ verschlüsseln.
-    Dazu berechnet Sie $C = 42^5 \mod 221 = 9$ und schickt die verschlüsselte Nachricht anschließend an Bob.
-
-    Bob kann nun mit seinem \emph{private Key} die erhaltene Nachricht entschlüsseln und erhält $M = 9^77 \mod 221 = 42$.
-\end{example}
-
-\begin{defi}{Digitale Signatur}
-    Um auch \emph{Authentifizierung}
-    und \emph{Integritat} herstellen zu können, muss eine digitale Signatur verwendet
-    werden. Dazu braucht es zunachst eine \emph{Hashfunktion}, die eine Art Fingerabdruck
-    der Nachricht erzeugt.
-
-    Nachdem mit der Hashfunktion der Hashwert der Nachricht berechnet wurde, wird
-    dieser mit dem \emph{private Key} des Senders verschlüsselt.
-
-    Danach berechnet
-    der Empfänger selbst den Hashwert der empfangen Nachricht. Stimmen der
-    selbst berechnete Hashwert und der entschlüsselte Hashwert überein ist die \emph{Integrität} der Nachricht sichergestellt. Da zudem das Entschlüsseln des Hashwertes mit
-    dem öffentlichen Schlüssel des Senders funktioniert hat, ist der Sender authentifiziert,
-    da dessen privater Schlüssel zur Erstellung der digitalen Signatur verwendet
-    wurde.
-
-    Es ist also notwendig, dass sich Sender und Empfanger vorab auf eine
-    Hashfunktion einigen. Zusatzlich ist wichtig zu beachten, dass eine Digitale Signatur
-    \emph{keine Vertraulichkeit} herstellt, dazu muss die Nachricht zusatzlich verschlüsselt
-    werden.
-\end{defi}
-
-\begin{defi}{Hybride Chiffren}
-    Die Kombination von symmetrischen und asymmetrischen
-    Chiffren nennt man \emph{hybride Chiffren}.
-
-    \begin{itemize}
-        \item verhältnismäßig kurzer Schlüssel einer Blockchiffre wird asymmetrisch verschlüsselt und zum Empfänger einer Nachricht transportiert
-        \item Kommunikation selbst läuft symmetrisch verschlüsselt ab
-        \item Kombination erzielt guten Kompromiss zwischen Sicherheit und Rechenaufwand
-    \end{itemize}
-\end{defi}
-
-\printindex
-\printindex[Beispiele]
-\end{document}
+\documentclass[german]{../spicker}
+
+\usepackage{amsmath}
+
+\usepackage{graphicx}
+\usepackage{tabularx, multirow}
+
+\title{IT-Grundlagen}
+\author{Patrick Gustav Blaneck}
+\makeindex[intoc]
+\makeindex[intoc, name=Beispiele,title=Beispiele]
+
+\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
+\newcommand{\vektor}[1]{\begin{pmatrix*}[r] #1 \end{pmatrix*}}
+\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
+\newcommand{\dx}{~\mathrm{d}x}
+
+\newenvironment{allintypewriter}{\ttfamily}{\par}
+\newcommand*{\ditto}{\texttt{\char`\"}}
+
+\begin{document}
+\maketitle
+In dieser Zusammenfassung werden Inhalte aus dem ITG-Skript von Bastian Küppers verwendet.
+\tableofcontents
+\newpage
+
+%\setcounter{section}{1}
+
+\section{Codierung}
+\subsection{Stellenwertsysteme}
+
+\begin{defi}{Stellenwertsystem}
+    Allgemein lässt sich der Wert einer Zahl in einem Stellenwertsystem zur Basis $B$ wie folgt ausdrücken ($d_i$ ist der Wert der $i$-ten Stelle, $r$ der Exponent der höchtswertigen Stelle):
+    $$
+        n_b = \sum^r_{i=0} B^i \cdot d_i
+    $$
+\end{defi}
+
+\begin{algo}{Dezimal $\to$ Binär, Hexadezimal, $\ldots$}
+    Sei $B = 2$ für Umrechnung ins Binärsystem, bzw. $B =16$ für das Hexadezimalsystem.
+
+    Es gilt für eine umzurechnende Zahl $z$:
+
+    $$
+        \begin{aligned}
+            z : B       & = z_0 \quad     &  & \text{Rest } r_0     \\
+            z_0 : B     & = z_1 \quad     &  & \text{Rest } r_1     \\
+            z_1 : B     & = z_2 \quad     &  & \text{Rest } r_2     \\
+                        & \ldots          &  &                      \\
+            z_{n-2} : B & = z_{n-1} \quad &  & \text{Rest } r_{n-1} \\
+            z_{n-1} : B & = 0 \quad       &  & \text{Rest } r_n
+        \end{aligned}
+    $$
+
+    Damit gilt dann: $(z)_{10} = (r_nr_{n-1}\ldots r_2r_1r_0)_B$ (also gelesen von \emph{unten nach oben}).\qed
+\end{algo}
+
+\begin{algo}{Binär $\to$ Hexadezimal}
+    Sei eine Binärzahl $b$ gegeben mit $n \in 4\N$ Bits.
+
+    Dann kann $b$ wie folgt in eine Hexadezimalzahl $h$ mit $m = \frac{n}{4}$ Zeichen umgeformt werden:
+
+    $$
+        \underbrace{b_{n-1}b_{n-2}b_{n-3}b_{n-4}}_{h_{m-1}} ~ \ldots ~ \underbrace{b_7b_6b_5b_4}_{h_1} ~ \underbrace{b_3b_2b_1b_0}_{h_0}
+    $$
+
+    Erinnerung: 4 Bits können binär nur 16 mögliche Werte annehmen!
+\end{algo}
+
+\newpage
+\subsection{Zahlendarstellungen}
+
+\begin{defi}{Einerkomplement}
+    Das \emph{Einerkomplement} einer Binärzahl wird gebildet, indem man alle Bits negiert.
+
+    Das erste Bit gibt dabei das Vorzeichen an.
+
+    Nachteile: Doppelte Darstellung der Null, Subtraktion lässt sich nicht auf Addition mit einer negativen Zahl zurückführen
+\end{defi}
+
+\begin{defi}{Zweierkomplement}
+    Das \emph{Zweierkomplement} einer Binärzahl wird gebildet, indem man das Einerkomplement bildet und zusätzlich $1$ addiert.
+
+    Das erste Bit gibt dabei das Vorzeichen an.
+
+    Vorteile: Subtraktion entspricht Addition mit einer negativen Zahl, keine doppelte Null
+\end{defi}
+
+\begin{defi}{Binäre Festkommazahlen}
+    Die Umwandlung des ganzzahligen Anteils einer (dezimalen) Festkommazahl erfolgt analog zu ganzen Zahlen.
+
+    Zusätzlich werden aber die Nachkommastellen mit entsprechend negativen Exponenten weiter \glqq verrechnet\grqq.
+\end{defi}
+
+\begin{defi}{Gleitkommazahlen nach \emph{IEEE 754}}
+    Die Darstellung einer Gleitkommazahl
+    $$
+        x = s \cdot m \cdot b^e
+    $$
+    besteht aus
+    \begin{itemize}
+        \item Vorzeichen $s$ (1 Bit)
+        \item Mantisse $m$ ($p$ Bits, $p_{\text{float}} = 23$, $p_{\text{double}} = 52$)
+        \item Basis $b$ (bei normalisierten Gleitkommazahlen nach IEEE ist $b = 2$)
+        \item Exponent $e$ ($r$ Bits, $r_{\text{float}} = 8$, $r_{\text{double}} = 11$)
+    \end{itemize}
+\end{defi}
+
+\begin{algo}{Umrechnung in \emph{IEEE 754}}
+    \begin{itemize}
+        \item Umwandeln einer Dezimalzahl in eine \emph{binäre Festkommazahl} ohne Vorzeichen.
+        \item Normalisieren der \emph{Mantisse}:\\
+              Das Komma wird $n$ Stellen nach links verschoben, so dass dort nur noch eine 1 als ganzzahliger Anteil vorhanden ist. ($n$ ist bei Verschieben nach rechts negativ!)\\
+              $M$ ist dann der \emph{Nachkommateil}.
+        \item Bestimmen des \emph{Exponenten}: $E = (\text{bias } + n)_2$ (bias ist meist $127$, wenn nicht anders gegeben)
+        \item Bestimmen des \emph{Vorzeichenbits} $s$
+        \item Zusammensetzen der Gleitkommazahl
+              $$
+                  s \mid E \mid M
+              $$
+    \end{itemize}
+\end{algo}
+
+\subsection{Zeichendarstellungen}
+
+\begin{defi}{UTF-8 Codierung}
+    \begin{tabular}{| c | r | c |}
+        \hline
+        Unicode-Bereich       & \multicolumn{1}{|c|}{UTF-8-Codierung}   & Möglichkeiten        \\
+        \hline
+        0000 0000 - 0000 007F & 0xxx xxxx                               & 128 (7 Bits)         \\
+        0000 0080 - 0000 07FF & 110x xxxx 10xx xxxx                     & 2.048 (11 Bits)      \\
+        0000 0800 - 0000 FFFF & 1110 xxxx 10xx xxxx 10xx xxxx           & 65.536  (16 Bits)    \\
+        0001 0000 - 0010 FFFF & 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx & 2.097.152  (21 Bits) \\
+        \hline
+    \end{tabular}
+\end{defi}
+
+\subsection{Spezielle Codierungen}
+
+\begin{algo}{Huffman-Codierung}
+    \begin{enumerate}
+        \item Schreibe Buchstaben mit Auftrittshäufigkeiten als \glqq Wald\grqq.
+        \item Fasse die beiden Bäume mit der geringsten Auftrittshäufigkeiten zu einem neuen Baum zusammen, dabei werden die Auftrittshäufigkeiten addiert.
+        \item Wiederhole, bis nur noch ein Baum existiert.
+        \item Codierung eines Buchstaben entspricht dann dem \emph{Pfad} zum entsprechenden Blatt mit \glqq links\grqq $\to$ 0, \glqq rechts\grqq $\to$ 1
+    \end{enumerate}
+
+    Mittlere Codelänge:
+    $$
+        L(C) = \frac{\#\text{Bits der verschlüsselten Nachricht}}{\#{\text{Zeichen der verschlüsselten Nachricht}}}
+    $$
+\end{algo}
+
+\begin{defi}{Hamming-Codierung}
+    Bei der Hamming-Codierung werden Paritätsinformationen zu Daten hinzugefügt, um so mögliche Übertragungsfehler zu erkennen.
+
+    Hamming-Codewörter haben die Länge $N = 2^k-1$, wobei $k$ Paritätsbits enthalten sind.
+    Die Bits werden der Einfachheit halber bei Eins beginnend durchnummeriert.
+    Die Paritätsbits stehen an den Stellen, deren Index eine 2er-Potenz ist.
+
+    Sind $p_1, p_2, \ldots, p_k$ Paritätsbits, $d_1, d_2, \ldots, d_{N-k}$ Bits des Datenwortes und $c_1, c_2, \ldots, c_N$ die Bits des zu bildenden Codewortes, hat ein Codewort des so konstruierten Hamming-Codes die folgende Form:
+
+    \begin{tabular}{| c | c | c || c | c | c | c || c | c | c | c | c | c | c | c || c | c | c |}
+        \hline
+        $c_1$ & $c_2$ & $c_3$ & $c_4$ & $c_5$ & $c_6$ & $c_7$ & $c_8$ & $c_9$ & $c_{10}$ & $c_{11}$ & $c_{12}$ & $c_{13}$ & $c_{14}$ & $c_{15}$ & $c_{16}$ & $c_{17}$ & \ldots \\
+        \hline
+        $p_0$ & $p_1$ & $d_1$ & $p_2$ & $d_2$ & $d_3$ & $d_4$ & $p_3$ & $d_5$ & $d_6$    & $d_7$    & $d_8$    & $d_9$    & $d_{10}$ & $d_{11}$ & $p_4$    & $d_{12}$ & \ldots \\
+        \hline
+    \end{tabular}\\
+
+    Dabei wird jedem Paritätsbit eine spezielle Bitmaske zugewiesen:
+
+    \begin{tabular}{| c || c | c | c || c | c | c | c || c | c | c | c | c | c | c | c || c |}
+        \hline
+                       & $c_1$ & $c_2$ & $c_3$ & $c_4$ & $c_5$ & $c_6$ & $c_7$ & $c_8$ & $c_9$ & $c_{10}$ & $c_{11}$ & $c_{12}$ & $c_{13}$ & $c_{14}$ & $c_{15}$ & \ldots \\
+        \hline
+        Bitmaske $p_0$ & $p_0$ & $p_1$ & 1     & $p_2$ & 1     & 0     & 1     & $p_3$ & 1     & 0        & 1        & 0        & 1        & 0        & 1        & \ldots \\
+        Bitmaske $p_1$ & $p_0$ & $p_1$ & 1     & $p_2$ & 0     & 1     & 1     & $p_3$ & 0     & 1        & 1        & 0        & 0        & 1        & 1        & \ldots \\
+        Bitmaske $p_2$ & $p_0$ & $p_1$ & 0     & $p_2$ & 1     & 1     & 1     & $p_3$ & 0     & 0        & 0        & 1        & 1        & 1        & 1        & \ldots \\
+        Bitmaske $p_3$ & $p_0$ & $p_1$ & 0     & $p_2$ & 0     & 0     & 0     & $p_3$ & 1     & 1        & 1        & 1        & 1        & 1        & 1        & \ldots \\
+        \hline
+    \end{tabular}\\
+
+    Damit gilt:
+    $$
+        \begin{aligned}
+            c_1 = p_0 & = c_3 \oplus c_5 \oplus c_7 \oplus c_9 \oplus c_{11} \oplus c_{13} \oplus c_{15} \oplus \ldots    \\
+                      & \iff \text{jedes ungerade Datenbit}                                                               \\
+            c_2 = p_1 & = c_3 \oplus c_6 \oplus c_7 \oplus c_{10} \oplus c_{11} \oplus c_{14} \oplus c_{15} \oplus \ldots \\
+                      & \iff \text{ein Datenbit rechts von $p_1$, zwei überspringen, zwei einberechnen, $\ldots$}         \\
+            c_4 = p_2 & = c_5 \oplus c_6 \oplus c_7 \oplus c_{12} \oplus c_{13} \oplus c_{14} \oplus c_{15} \oplus \ldots \\
+                      & \iff \text{drei Datenbit rechts von $p_2$, vier überspringen, vier einberechnen, $\ldots$}
+        \end{aligned}
+    $$
+\end{defi}
+
+\begin{algo}{Fehlererkennung beim Hamming-Code}
+    Situation: Empfangen eines Hamming-codierten Datensatzes
+
+    \begin{enumerate}
+        \item Erneutes Berechnen der \emph{Paritätsbits}
+        \item Erkennen, welche neu berechneten Paritätsbits $p'_i$ \emph{verschieden} sind zu den empfangenen Paritätsbits $p_i$
+        \item Bitfehler ist in dem Datenbit passiert, in dem gilt:
+              \subitem $p_i = p'_i \implies$ Bitmaske für $p_i$ ist $0$
+              \subitem $p_i \neq p'_i \implies$ Bitmaske für $p_i$ ist $1$
+    \end{enumerate}
+
+    Es wird angenommen, dass nur ein Bitfehler in den Datenbits passiert ist.
+
+    Anmerkung: Ist lediglich ein Paritätsbit verschieden, dann ist ein Übertragungsfehler in dem betreffenden Paritätsbit selbst aufgetreten, da alle Datenbits zur Berechnung von mindestens zwei Paritätsbits verwendet werden.
+\end{algo}
+
+\section{Formale Sprachen}
+\subsection{Backus-Naur-Form}
+
+\begin{defi}{(kontextfreie) Grammatik}
+    Eine (kontextfreie) Grammatik $G$ ist ein 4-Tupel $\{N, T, \Sigma, P\}$ mit folgenden Eigenschaften:
+    \begin{itemize}
+        \item $N$ ist eine endliche Menge von \emph{Nichtterminalsymbolen},
+        \item $T$ ist eine endliche Menge von \emph{Terminalsymbolen},
+        \item ein \emph{Startsymbol} $\Sigma \in N$,
+        \item eine endliche Menge an Produktionsregeln $P \subset N \times T^*$.
+    \end{itemize}
+    Es gilt $N \cap M = \emptyset$. $^*$ bezeichnet die Kleensche Hülle.
+
+    Anmerkung: Die Notation verhält sich in der Vorlesung sehr anders als in den meisten Quellen.
+\end{defi}
+
+\begin{defi}{Backus-Naur-Form}
+    In der \emph{Backus-Naur-Form} werden Symbole durch eine Zuweisung definiert.\\
+    Diese wird durch den Operator \texttt{:=} dargestellt.
+
+    \begin{itemize}
+        \item Dabei gilt weiterhin, dass in der Zuweisung eines \emph{Nichtterminalsymbols} mindestens ein weiteres Symbol auftauchen muss und
+        \item bei der Zuweisung eines \emph{Terminalsymbols} nur Zeichen des Alphabets.
+        \item Bei einer Zuweisung können mehrere Symbole oder Zeichen(-ketten) des Alphabets verbunden werden.
+        \item Durch ein Leerzeichen (\glqq ~~~\grqq, \texttt{space}) wird eine \texttt{und}-Verknüpfung definiert,
+        \item durch einen senkrechten Stricht (\glqq ~$\mid$~\grqq, \texttt{pipe}) wird eine \texttt{oder}-Zuweisung definiert.
+        \item Zur logischen Gliederung der Verknüpfungen können Klammern verwendet werden.
+        \item Es ist ebenfalls möglich Kardinalitäten für Symbole zu definieren:
+              \subitem Geschweifte Klammern \texttt{\{\}} definieren dabei eine \emph{beliebige Wiederholung} und
+              \subitem eckige Klammern \texttt{[]} definieren ein \emph{einmaliges Auftreten}.
+              \subitem In beiden Fällen ist das Weglassen des Symbols ebenfalls möglich.
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Backus-Naur-Form}
+    \begin{allintypewriter}
+        \begin{tabular}{rl}
+            Satz        & := Subjekt Verb Präposition Nomen Ende                       \\
+            Subjekt     & := Nomen                                                     \\
+            Nomen       & := Artikel Substantiv                                        \\
+            Artikel     & := \ditto der\ditto | \ditto die\ditto | \ditto das\ditto    \\
+            Substantiv  & := \ditto Mann\ditto | \ditto Frau\ditto | \ditto Haus\ditto \\
+            Verb        & := \ditto geht\ditto                                         \\
+            Präposition & := \ditto in\ditto                                           \\
+            Ende        & := \ditto .\ditto
+        \end{tabular}
+    \end{allintypewriter}
+\end{example}
+
+\subsection{Programmiersprachen}
+
+\begin{defi}{Compiler}
+    Das Programm, welches den
+    menschenlesbaren \emph{Quellcode} anhand der Regeln der zugrundeliegenden Grammatik
+    interpretiert und in maschinenlesbare Anweisungen überführt, wird \emph{Compiler} genannt.
+
+    Die maschinenlesbaren Anweisungen können dabei entweder direkt in eine
+    maschinenspezifische Binärfolge umgewandelt werden, oder in einen sogenannten
+    \emph{Bytecode}.
+
+    Im zweiten Fall kann der Bytecode,
+    auch Zwischencode genannt, noch an beliebigen Prozessortypen angepasst werden,
+    muss dafür aber vor der Ausführung erneut bearbeitet werden.
+
+    Bei der Kompilierung eines Programms werden zwei Phasen durchlaufen:
+    \begin{enumerate}
+        \item \textbf{Analysephase}, in der der Quellcode analysiert und auf Fehler geprüft wird:
+              \subitem \underline{\emph{Lexer} (lexikalischer Scanner)}: \\
+              Quellcode wird in einzelne Teile (\emph{Tokens}) zerlegt und klassifiziert (z.B. als \emph{Schlüsselwörter} oder \emph{Bezeichner}).\\
+              Der Lexer erkennt hier z.B. falsch benannte Variablen.
+              \subitem \underline{\emph{Parser} (syntaktische Analyse)}: \\
+              Vom Lexer erzeugte \emph{Tokens} werden dem \emph{Parser} übergeben.
+              Der Parser überprüft den Quellcode auf Fehler und setzt ihn bei Fehlerfreiheit in einen \emph{Syntaxbaum} (AST) um.\\
+              Hier werden Fehler wie fehlende Semikolons oder falsche genutzte Operatoren erkannt.
+              \subitem \underline{\emph{Semantische Analyse}}: \\
+              Hier wird z.B. kontrolliert, ob eine verwendete Variable auch vorher deklariert wurde, oder ob Quell- und Zieltyp einer Anweisung übereinstimmen. Dabei erzeugte Metadaten werden in den AST integriert.
+              In diesem Schritt werden generell semantische Fehler erkannt, d.h. Anweisungen, die korrekt aussehen, aber fehlerhaft sind.
+              \\
+        \item \textbf{Synthesephase}, in der Binär- bzw. Bytecode erzeugt wird:
+              \subitem \underline{\emph{Zwischencodeerzeugung}}: \\
+              Hier wird plattformunabhängiger Bytecode erzeugt, der als Grundlage für den nächsten Schritt dient.
+              \subitem \underline{\emph{Optimierung}}: \\
+              Während der Optimierung wird versucht die Performanz des erzeugten Programms zu steigern.
+              \subitem \underline{\emph{Codegenerierung}}: \\
+              Hier wird aus dem optimierten Zwischencode der \emph{Binärcode} erzeugt.
+    \end{enumerate}
+\end{defi}
+
+\begin{bonus}{Ahead-of-Time Compiler}
+    Bei dieser Variante wird der gesamte Quellcode \emph{in einem Rutsch}
+    in Binär- oder Bytecode übersetzt. Das kann mitunter dazu führen, dass die Kompilierung
+    sehr lange dauert.
+\end{bonus}
+
+\begin{bonus}{Just-in-Time Compiler}
+    Daher haben sich mit der Zeit auch sogenannte \emph{Just-in-
+        Time Compiler} etablieren können, die nur einen kleinen Teil des Quellcodes direkt
+    übersetzen und weitere Teile des Quellcodes erst dann übersetzen, \emph{wenn sie bei der
+        Programmausführung benötigt werden}.
+\end{bonus}
+
+\begin{defi}{Linker}
+    Nachdem der Compiler den Binärcode erzeugt hat, muss der \emph{Linker} daraus noch
+    ein lauffähiges Programm erstellen. Das ist insbesondere der Fall, wenn es mehrere
+    Dateien mit Quellcode gibt.
+
+    Dies geschieht indem der Binärcode zu den verschiedenen
+    Quellcodedateien, der nun in sogenannten \emph{Objektdateien} vorliegt, zusammengefügt wird. Dabei werden beispielsweise symbolische Adressen aus mehreren
+    Quellcodemodulen und externen Bibliotheken so angepasst, dass sie zusammen
+    passen.
+
+    Dabei wird zwischen \emph{statischem Linken} und \emph{dynamischen Linken} unterschieden:
+
+    Beim \textbf{statischen Linken} werden alle verfügbaren Objektdateien zu \emph{einer
+        einzigen, ausführbaren Programmdatei} gelinkt.
+    \begin{itemize}
+        \item Vorteil: keine externen Abhängigkeiten, Programm auf jedem geeigneten System ohne Weiteres lauffähig
+        \item Nachteil: nicht mehr möglich, einzelne Programmteile auszutauschen ohne den Linkvorgang vollständig zu wiederholen,
+    \end{itemize}
+    Beim \textbf{dynamischen Linken} werden Funktions- und Variablenadressen erst zur Laufzeit aufgelöst, sodass externe Bibliotheken
+    einfach in Form von \emph{Dynamically Linked Libraries} (DLLs) bzw. \emph{Shared Objects} (SOs) angesprochen werden können. Da DLLs bzw. SOs als existierend
+    vorausgesetzt werden, wird das fertige Programm bei dynamischem Linken kleiner.
+    \begin{itemize}
+        \item Vorteil: mehrere Programme können dieselbe externe Bibliothek verwenden, ohne dass der benötigte Code mehrfach in einzelne Programme integriert werden muss.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Interpreter}
+    \emph{Interpreter} zeichnen sich dadurch aus, dass der Quellcode nicht einmalig in Binärcode übersetzt wird, sondern bei jeder Programmausführung schrittweise abgearbeitet wird.
+    \begin{itemize}
+        \item Vorteile: einfache Portabilität, dynamischere Quellcodeverwaltung
+        \item Nachteile: deutlich langsamere Ausführungsgeschwindigkeit, keine Optimierungen an Programmstruktur möglich
+    \end{itemize}
+\end{defi}
+
+\section{Rechnerarchitekturen}
+\subsection{Von-Neumann-Architektur}
+
+\begin{defi}{Von-Neumann-Architektur}
+    Im Grundsatz besteht die Architektur aus drei Komponenten: \emph{CPU}, \emph{Speicher} und \emph{I/O Einheit}.
+
+    Die einzelnen Komponenten sind über Datenleitungen, sogenannte \emph{Busse}, verbunden.
+    \begin{center}
+        \includegraphics[]{images/von_neumann.pdf}
+    \end{center}
+\end{defi}
+
+\begin{defi}{CPU}
+    Die \emph{CPU} (\emph{Central Processing Unit}, Prozessor) ist sozusagen das Gehirn des Computers.
+    Die CPU besteht im Wesentlichen aus drei Teilen, dem \emph{Leitwerk} und
+    dem \emph{Rechenwerk} und den \emph{Registern}, welche direkt zur Abarbeitung von Befehlen
+    benötigte Daten und berechnete Ergebnisse aufnehmen können.
+
+    Das \emph{Leitwerk} steuert die Ausführung des Binärcodes, das \emph{Rechenwerk} führt anfallende Rechenoperationen aus.
+\end{defi}
+
+\begin{bonus}{Aufbau Rechenoperationen}
+    \begin{itemize}
+        \item \emph{Operationsteil}: codiert konkreten Befehl
+        \item \emph{Operanden}: stellen z.B. Summanden einer Operation, oder Adresse einer Variablen dar
+    \end{itemize}
+\end{bonus}
+
+\begin{bonus}{Abarbeitung von Befehlen}
+    Jeder Befehl durchläuft bei der Abarbeitung in der CPU folgende Schritte:
+    \begin{itemize}
+        \item \emph{Instruction Fetch (IF)} : Befehl lesen
+        \item \emph{Instruction Decode (ID)} : Befehl decodieren
+        \item \emph{Fetch Operands (FO)} : Operanden laden
+        \item \emph{Execute (EX)} : Befehl ausführen
+        \item \emph{Writeback (WB)} : Ergebnis schreiben
+    \end{itemize}
+
+    \begin{center}
+        \includegraphics[]{images/befehlsabarbeitung.pdf}
+    \end{center}
+\end{bonus}
+
+\begin{defi}{Prozessorarchitekturen}
+    \textbf{CISC} (\emph{Complex Instruction Set Computer}):\\
+    Eine CISC CPU zeichnet sich durch einen \emph{komplexen Befehlssatz} in Form von \emph{Microcode} und dem Vorhandensein nur \emph{weniger Register} aus.
+
+    \textbf{RISC} (\emph{Reduced Instruction Set Computer}):\\
+    eine RISC CPU nur über \emph{wenige, in Hardware realisierte Befehle} und \emph{viele Prozessorregister}.
+\end{defi}
+
+\begin{defi}{Pipelining}
+    In einer \emph{RISC CPU}, die nur wenige und elementare Befehle verwendet, kann dafür
+    gesorgt werden, dass alle Teilschritte, deren \emph{parallele Verarbeitung} das Pipelining
+    ermöglicht, gleich lange dauern. Nur deswegen kann das Konzept des Pipelinings
+    erfolgreich umgesetzt werden.
+
+    Das ist bei einer \emph{CISC CPU} aufgrund der vielen
+    und teils sehr komplexen Befehle \emph{nicht} möglich.
+\end{defi}
+
+\begin{example}{Pipelining}
+    5-Stage-Pipeline:
+    \begin{itemize}
+        \item Instruction Fetch (\textbf{IF}): Befehl lesen
+        \item Instruction Decode (\textbf{ID}) : Befehl decodieren
+        \item Execute (\textbf{EX}) : Ausführen
+        \item Memory Access (\textbf{MEM}) : Ausführen
+        \item Writeback (\textbf{WB}) : Ergebnis schreiben
+    \end{itemize}
+
+    \begin{center}
+        \begin{tabular}{| c || m{0.05\textwidth} | m{0.05\textwidth} | m{0.05\textwidth} | m{0.05\textwidth} | m{0.05\textwidth} | m{0.05\textwidth} |}
+            \hline
+            Instr. 1    & \texttt{IF}            & \texttt{ID}            & \texttt{EX}            & \texttt{MEM}           & \texttt{WB}            &                        \\
+            \hline
+            Instr. 2    &                        & \texttt{IF}            & \texttt{ID}            & \texttt{EX}            & \texttt{MEM}           & \texttt{WB}            \\
+            \hline
+            Instr. 3    &                        &                        & \texttt{IF}            & \texttt{ID}            & \texttt{EX}            & \texttt{MEM}           \\
+            \hline
+            Instr. 4    &                        &                        &                        & \texttt{IF}            & \texttt{ID}            & \texttt{EX}            \\
+            \hline
+            Instr. 5    &                        &                        &                        &                        & \texttt{IF}            & \texttt{ID}            \\
+            \hline
+            \hline
+            Clock Cycle & \multicolumn{1}{c|}{1} & \multicolumn{1}{c|}{2} & \multicolumn{1}{c|}{3} & \multicolumn{1}{c|}{4} & \multicolumn{1}{c|}{5} & \multicolumn{1}{c|}{6} \\
+            \hline
+        \end{tabular}
+    \end{center}
+\end{example}
+
+\begin{defi}{ROM}
+    Der \emph{ROM} ist ein Festwertspeicher, der - prinzipiell - \emph{nur gelesen} werden kann und die Firmware des Computers gespeichert hat.
+
+    Im ROM liegt das sogenannte \emph{BIOS} (\emph{basic input output system}) bzw. moderner \emph{UEFI}
+    (\emph{unified extensible firmware interface}).
+    Die im ROM abgelegten Informationen stellen die Firmware des
+    Rechners dar. Diese Firmware sorgt dafür, dass der Computer nach dem Einschalten
+    in die Lage versetzt wird, grundlegende Hardwarekomponenten zu verwalten.
+\end{defi}
+
+\begin{defi}{RAM}
+    Der \emph{RAM},
+    auch \emph{Hauptspeicher} genannt, ist ein Speicher mit \emph{wahlfreiem Zugriff}, der seinen
+    Inhalt jedoch bei Verlust der Betriebsspannung \emph{verliert}. Im RAM werden Informationen
+    abgelegt, die ein \emph{Programm zur Laufzeit} benötigt.
+
+    Sollen Daten
+    über das Ende des Programms hinaus gespeichert werden, müssen sie über die
+    \emph{I/O-Einheit} auf einen anderen Speicher geschrieben werden.
+\end{defi}
+
+\begin{defi}{Cache}
+    \emph{Cache} ist \emph{schneller} als RAM, kann aber nur \emph{weniger Speicherkapazität} zur Verfügung stellen.
+
+    Das bedeutet, dass der Cache nur kleine Datenmengen, sogenannte \emph{Cacheblocks}, aus dem Hauptspeicher vorhalten kann.
+    Diese haben eine definierte Größe und können dann schneller in die CPU geldaden werden, als das aus dem RAM möglich wäre.
+\end{defi}
+
+\begin{defi}{Lokalität}
+    \textbf{Zeitliche Lokalität}:\\
+    Es ist, bei entsprechender Programmierung, sehr wahrscheinlich, dass
+    auf eine Speicherzelle nicht nur einmal, sondern in kurzer Zeit \emph{mehrmals zugegriffen}
+    wird.
+
+    \textbf{Örtliche Lokalität}:\\
+    Es ist, bei entsprechender Programmierung, sehr wahrscheinlich, dass nach
+    dem Zugriff auf eine bestimmte Speicherzelle auch ein \emph{Zugriff in deren unmittelbarer
+        \glqq Nachbarschaft\grqq} stattfindet.
+\end{defi}
+
+\begin{bonus}{Aufbau eines Caches}
+    \begin{center}
+        \includegraphics[]{images/cache_aufbau.pdf}
+    \end{center}
+
+    Aus der Abbildung ist ersichtlich, dass der Cache selbst ebenenweise organisiert ist.
+
+    Im Regelfall sind mindestens die Ebenen L1 und L2 vorhanden, oftmals sogar noch
+    eine dritte Ebene L3. Dabei ist in jedem Fall der L1-Cache in die CPU integriert,
+    häufig auch noch der L2-Cache.
+
+    Beginnend beim
+    L3-Cache werden die Cachelevel mit größerer Nähe zur CPU jeweils kleiner und
+    schneller. Dieser Aufbau soll die Frage nach der Auswahl der Daten, die im Cache
+    vorgehalten werden, vereinfachen. Es ist also möglich einen relativ großen Datenbestand
+    im L3-Cache vorzuhalten, der schneller ist als der Hauptspeicher. Von dort
+    aus kann dann wiederum eine Teilmenge der Daten im noch schnelleren L2-Cache
+    vorgehalten werden, usw.
+
+    Liegen benötigte Daten nicht im L1-Cache, welcher Daten bzw. Befehle schlussendlich an die CPU liefert, ist aufgrund der Lokalität und
+    des Aufbaus des Caches die Wahrscheinlichkeit hoch, dass die benötigten Daten
+    nicht aus dem langsamen Hauptspeicher geladen werden müssen, sondern sich in
+    einem der niedrigeren Cache-Level finden und damit immer noch vergleichsweise
+    schnell zur Verfügung gestellt werden können.
+\end{bonus}
+
+\begin{bonus}{Interner Aufbau eines Cachelevels}
+    \begin{center}
+        \includegraphics[]{images/cache_level.pdf}
+    \end{center}
+
+    Zu jedem Cacheblock wird die Startadresse des Blocks im RAM gespeichert, diese
+    Information wird \emph{Tag} genannt.
+
+    Wird von der CPU eine Anfrage an den Speicher
+    gestellt, wird zunächst anhand des Tags unter Zuhilfenahme des Komparators geprüft, ob der angefragte Datensatz im Cache liegt. Dabei wird auch geprüft, ob eine
+    angefragte Speicheradresse innerhalb eines Cacheblocks liegt. Das ist möglich, da
+    der Tag sowie die Größe des Cacheblocks bekannt sind.
+
+    Ist dies nicht der Fall, wird
+    die Anfrage an ein niedrigeres Cachelevel bzw. den RAM weitergereicht.
+
+    Außerdem
+    werden zu jedem Cacheblock Statusbits gespeichert, die beispielsweise angeben ob
+    sich der Cacheblock verändert hat (\emph{dirty bit}), seit er in den Cache geladen wurden,
+    oder ob ein Platz im Cache mit einem gültigen Cacheblock belegt ist (\emph{invalid bit}).
+\end{bonus}
+
+\begin{defi}{Organisation der Tags}
+    Die \emph{Blöcke} (Cache-Lines) eines Caches können in so genannte \emph{Sätze} zusammengefasst werden.
+    Für eine bestimmte Adresse ist dann immer nur einer der Sätze zuständig.
+    Innerhalb eines \emph{Satzes} bedienen alle Blöcke also nur einen \emph{Teil} aller vorhandenen Adressen.
+
+    Im Folgenden stehe die Variable $m$ für die \emph{Gesamtanzahl der Cacheblöcke} und $n$ für die \emph{Anzahl der Blöcke pro Satz}, die so genannte \emph{Assoziativität}.
+    Dann besteht der Cache also aus $\frac {m}{n}$ Sätzen.
+
+    \textbf{Direkt abgebildet} (\emph{DM}, \emph{direct mapped}, $n=1$):\\
+    Es gibt pro Cacheblock nur eine einzige Möglichkeit, wo dieser
+    platziert werden kann.
+
+    Daher kann es allerdings vorkommen, dass ein Cacheblock
+    nicht platziert werden kann, obwohl noch Platz im Cache wäre.
+
+    \textbf{Vollassoziativ} (\emph{FA}, \emph{fully associative}, $n=m$):\\
+    Ein Cacheblock kann beliebige auf freie Plätze im Cache zugeordnet
+    werden.
+
+    Bei einer Speicheranfrage müssen allerdings alle gespeicherten
+    Tags durchsucht werden.
+
+    \textbf{Satzassoziativ} (\emph{SA}, \emph{set associative}, $2\leq n \leq \frac{m}{2}$):\\
+    Der verfügbare Platz wird in Gruppen unterteilt. Wie bei einem
+    DA Cache gibt es nur eine Gruppe, in der ein Cacheblock platziert werden kann;
+    wie bei einem VA Cache kann der Cacheblock innerhalb dieser Gruppe frei platziert
+    werden.
+\end{defi}
+
+\begin{defi}{Cache-Lesezugriffe}
+    Findet ein Lesezugriff auf Speicherzelle $A$ statt, wird geprüft, ob Speicherzelle $A$ bereits im Cache liegt.
+    \begin{itemize}
+        \item \textbf{$A$ liegt im Cache} (\emph{cache hit}):\\
+              Datensatz kann direkt aus dem Cache gelesen werden.
+        \item \textbf{$A$ liegt nicht im Cache} (\emph{cache miss}):\\
+              Datensatz muss aus dem Hauptspeicher in den Cache geladen werden, danach wird der Datensatz gelesen.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Schreibmodi eines Cache}
+    \begin{itemize}
+        \item \textbf{write-through} (\emph{WT}):\\
+              Datensatz wird im Cache und direkt im Hauptspeicher aktualisiert.
+
+              \emph{Vorteile}: keine Probleme mit Datenkonsistenz im Hauptspeicher\\
+              \emph{Nachteile}: hoher Aufwand für Schreiboperationen
+        \item \textbf{write-back} (\emph{WB}):\\
+              Datensatz wird im Cache aktualisiert und erst dann in den Hauptspeicher geschrieben, wenn der entsprechende Cacheblock aus dem Cache verdrängt wird.
+
+              \emph{Vorteile}: niedrige Belastund der Systembusse, keine Wartezyklen\\
+              \emph{Nachteile}: fehlende Datenkonsistenz
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Cache-Schreibzugriffe}
+    Findet ein Schreibzugriff auf Speicherzelle $A$ statt, wird geprüft, ob Speicherzelle $A$ bereits im Cache liegt.
+    \begin{itemize}
+        \item \textbf{$A$ liegt im Cache} (\emph{cache hit}):\\
+              Datensatz wird im Cache (und im Hauptspeicher) aktualisiert.
+        \item \textbf{$A$ liegt nicht im Cache} (\emph{cache miss}):\\
+              Datensatz wird im Hauptspeicher geschrieben, Inhalt des Caches wird nicht verändert.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Cache Misses}
+    \begin{itemize}
+        \item \textbf{Capacity Miss}:
+              \subitem - tritt auf, wenn Datensatz bereits im Cache war, aber \emph{bereits verdrängt} wurde
+              \subitem (aufgrund mangelnder Kapazität)
+              \subitem - hauptsächlich bei VA Caches
+        \item \textbf{Compulsory Miss}:
+              \subitem - tritt auf, wenn ein Datensatz das \emph{erste Mal} verwendet wird
+              \subitem - unabhängig vom Typ des Caches
+        \item \textbf{Conflict Miss}:
+              \subitem - tritt auf, wenn Datensatz bereits im Cache war, aber \emph{bereits verdrängt} wurde
+              \subitem (weil ein anderer Cacheblock an entsprechende Stelle gelagert werden sollte)
+              \subitem - vor allem bei DA Caches
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{RAID}
+    \textbf{RAID}: \textbf{R}edundant \textbf{A}rray of \textbf{I}ndependent \textbf{D}isks
+
+    Ein \emph{RAID} besteht aus mindestens zwei Festplatten und zielt auf die \emph{Verbesserung einer Eigenschaft ab}:
+    \begin{itemize}
+        \item Erhöhung der Ausfallsicherheit
+        \item Steigerung der Datentransferrate
+        \item Erweiterung der Speicherkapazität
+        \item Möglichkeit des Austauschs von Festplatten im laufenden Betrieb
+        \item Kostenreduktion durch Einsatz mehrerer kostengünstiger Festplatten
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{RAID-Level}
+    Die genaue Funktionsweise des RAID wird durch das sogenannte \emph{RAID-Level} angegeben.
+
+    \begin{itemize}
+        \item \textbf{RAID 0}:
+              \subitem - höhere Transferraten durch \emph{Striping}
+              \subitem - Daten werden auf mehrere Festplatten verteilt
+              \subitem - beim Lesen und Schreiben können mehrere Festplatten parallel verwendet werden
+              \subitem \emph{Nachteil}: fällt eine Festplatte aus, sind meist alle Daten verloren
+        \item \textbf{RAID 1}:
+              \subitem - erhöhte Ausfallsicherheit durch \emph{Mirroring}
+              \subitem - Daten in gleicher Weise auf mehrere Festplatten gleichzeitig abgelegt
+              \subitem - einzelne Daten \emph{können} auch parallel von mehreren Festplatten gelesen werden
+              \subitem \emph{Nachteil}: wird eine Datei gelöscht, wird sie auf allen Platten gelöscht (kein Backup!)
+        \item \textbf{RAID 5}:
+              \subitem - versucht Vorteile von RAID 0 und RAID 1 zu vereinen
+              \subitem - höhere Ausfallsicherheit bei höherer Datentransferrate
+              \subitem - besteht aus mindestens drei Festplatten
+              \subitem - Verwendet Variante von \emph{Striping}:
+              \subsubitem - nicht auf alle $n$ Festplatten verteilt
+              \subsubitem - auf allen Festplatten Paritätsinformationen zu Daten auf anderen $n-1$ Platten
+              \subsubitem - kann Ausfall einer Festplatte kompensieren
+    \end{itemize}
+
+
+    \begin{center}
+        \includegraphics[]{images/raid0.pdf}
+
+        \includegraphics[]{images/raid1.pdf}
+
+        \includegraphics[]{images/raid5.pdf}
+    \end{center}
+
+    Merhere RAID-Systeme eines Typs können auch zu einem RAID-System zusammengefasst werden (z.B. \emph{RAID 100}, \emph{RAID 01}, \emph{RAID 10}, \ldots).
+\end{defi}
+
+\begin{bonus}{HDD, SSD}
+    \textbf{HDD} (Hard Disk Drive, \emph{Festplatte}):
+    \begin{itemize}
+        \item Gehäuse der Festplatte beinhaltet mehrere, auf einer Achse übereinander montierten, runden Platten, welche mit einer magnetisierbaren Schicht überzogen sind
+        \item Schreib-/Leseköpfe werden durch einen zentralen Kamm über die Platten bewegt
+        \item \glqq Landing Zone\grqq zum Parken der Köpfe (Berührung $\to$ Datenverlust)
+        \item Platten rotieren mit konstanter Umdrehungszahl (5400-15000 rpm)
+        \item Kenngrößen:
+              \subitem - kontinuierliche Übertragungsrate (\emph{sustained data rate})
+              \subitem - mittlere Zugriffszeit (\emph{(data) access time}), bestehend aus:
+              \subsubitem - Spurwechselzeit (\emph{seek time})
+              \subsubitem - Latenzzeit (\emph{latency})
+              \subsubitem - Kommando-Latenz (\emph{controller overhead})
+    \end{itemize}
+
+
+    \textbf{SSD} (Solid State Drive):
+    \begin{itemize}
+        \item keine mechanischen Bauteile
+        \item niedriger Energieverbrauch
+        \item hoher Datendurchsatz
+        \item hoher Preis pro Speichereinheit
+    \end{itemize}
+\end{bonus}
+
+\begin{bonus}{Daten- und Adressbus}
+    Einzelne Komponenten sind über Leitungen, sogenannte \emph{Busse} verbunden.
+    \begin{itemize}
+        \item \emph{Datenbus} (bi-direktional)
+        \item \emph{Adressbus} (uni-direktional, leitet Adressanfragen der CPU an RAM oder Cache weiter)
+    \end{itemize}
+\end{bonus}
+
+\subsection{Parallele Rechnerarchitekturen}
+
+\begin{defi}{Flynn'sche Klassifikation (Flynn'sche Taxonomie)}
+    \begin{center}
+        \includegraphics[]{images/flynn.pdf}
+    \end{center}
+
+    \begin{itemize}
+        \item \emph{SISD} entspricht der Von-Neumann-Architektur
+        \item \emph{MIMD} entspricht dem heutigen Mehrprozessorsystem
+        \item \emph{SIMD} entspricht dem Aufbau einer Grafikkarte (genutzt in HPC)
+        \item \emph{MISD} eher ungebräuchlich.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Shared-Memory Systeme}
+    Ein \emph{Shared-Memory System} teilt den vorhandenen RAM unter den verfügbaren Prozessorenkernen auf.
+    Das bedeutet, dass Daten zwischen den einzelnen Prozessorkernen \emph{implizit über den RAM} verteilt werden können, da
+    jeder Kern Zugriff auf den RAM hat.
+
+    \textbf{SMP} (\emph{symmetric multi processing}) skaliert vergleichweise schlecht.
+    Das liegt daran, dass an die vorhandene Basis der Von-Neumann-Architektur einfach
+    weitere Prozessorkerne angeschlossen werden. Da sich diese Prozessorkerne
+    nun aber das vorhandene Bus-System teilen müssen, entsteht an dieser Stelle ein
+    \emph{Flaschenhals}.
+
+    \textbf{ccNUMA} (\emph{cache-coherent non-uniform memory architecture}) soll dieses Problem, speziell im Bereich HPC, beheben.
+    Dabei wird der vorhandene Hauptspeicher auf mehrere Memory-Controller aufgeteilt.
+    Jeder Prozessor ist dann an einen eigenen Memory-Controller angeschlossen.
+    Dabei kann grundsätzlich weiterhin jeder Kern auf den gesamten RAM zugreifen.
+    Es kann nur sein, dass der Zugriff länger dauert, wenn der betreffende Teil des RAMs von einem anderen Memory-Controller verwaltet wird.
+\end{defi}
+
+\begin{defi}{Distributed-Memory System}
+    Ein \emph{Distributed-Memory System} verbindet mehrere
+    \emph{unabhängige Recheneinheiten}, sodass Daten \emph{explizit} über eine Netzwerkverbindung
+    zwischen dieses Recheneinheiten verteilt werden müssen.
+
+    Dieser Ansatz skaliert sehr gut, d.h. es ist
+    ohne Weiteres möglich weitere Recheneinheiten anzuschließen, ohne die Gesamtperformance
+    des Systems zu beeinträchtigen
+\end{defi}
+
+\begin{bonus}{Speedup und Effizienz}
+    \emph{Speed Up} und \emph{Effizienz} beurteilen die Güte paralleler Programmausführung, indem sie \emph{Zeitersparnis} und die \emph{Anzahl der verwendeten Prozessorkerne} in Relation setzen.
+
+    Sei $T(p)$ die Zeit zur Programmausführung bei Verwendung von $p$ CPUs. Dann sind der \emph{Speed Up} $S(p)$ und die Effizienz $E(p)$ definiert wie folgt:
+    $$
+        S(p) = \frac{T(1)}{T(p)} \qquad  \qquad E(p) = \frac{S(p)}{p}
+    $$
+    Der \emph{Speed Up} gibt an, wieviel schneller die Programmausführung ist.
+    Die Effizienz gibt an, wie gut die verwendeten Prozessorkerne genutzt worden sind.
+
+    Im Idealfall ist $S(p) = p$ und $E(p) = 1$.
+\end{bonus}
+
+\begin{bonus}{Amdahl's Law}
+    Nach Amdahl wird der Geschwindigkeitszuwachs vor allem durch den sequentiellen Anteil des Problems beschränkt, da sich dessen Ausführungszeit durch Parallelisierung nicht verringern lässt.
+
+    Der \emph{Speed Up} nach Amdahl ist wie folgt definiert ($f \in (0, 1]$: serieller Teil des Programms):
+    $$
+        S(p) = \frac{T(1)}{f \cdot T(1) + (1-f) \cdot \frac{T(1)}{p}} = \frac{1}{f + \frac{1-f}{p}}
+    $$
+\end{bonus}
+
+\section{Betriebssysteme}
+
+\begin{defi}{Betriebssystem}
+    Das \emph{Betriebssystem} liegt als Softwareschicht zwischen dem Rechner bzw. der \\ \emph{Software-Hardwareschnittstelle}, die das BIOS zur Verfügung stellt, und den Anwenderprogrammen.
+    Das heißt, dass ein Endnutzer nur mit dem Betriebssystem, den vom Betriebssystem bereitgestellten Dienstprogrammen und den Anwenderprogrammen in Kontakt kommt.
+
+    \begin{center}
+        \includegraphics[]{images/betriebssysteme.pdf}
+    \end{center}
+\end{defi}
+
+\begin{bonus}{Anforderungen an ein Betriebssystem}
+    \begin{itemize}
+        \item Hohe Zuverlässigkeit und Leistung
+        \item Einfache Bedienbarkeit und Wartbarkeit
+        \item Niedrige Kosten
+    \end{itemize}
+\end{bonus}
+
+\begin{bonus}{Batchsysteme}
+    \emph{Batchsysteme} sind dazu gedacht, Rechenaufgaben ohne Nutzereingabe abzuarbeiten.
+    Dazu gibt es eine \emph{Job Queue}, in welche Aufgaben eingestellt werden.
+    Diese Aufgaben werden dann bearbeitet und die Ergebnisse an den Nutzer ausgegeben.
+\end{bonus}
+
+\begin{bonus}{Dialogsysteme}
+    \emph{Dialogsysteme} sind auf eine Interaktion mit dem Benutzer ausgelegt.
+    Sie sind die wohl geläufigste Form von Betriebssystemen, da diese Form auf z.B. Desktop-Computern eingesetzt wird.
+
+    Dialogsysteme werden noch einmal unterteilt in \emph{Single User}- und \emph{Multi-User-Systeme}.
+\end{bonus}
+
+\begin{bonus}{Echtzeitsysteme}
+    \emph{Echtzeitsysteme} sind reaktive Systeme, die mit Hilfe von Sensoren Ereignisse registrieren und anhand von Aktoren darauf reagieren.
+    Dabei ist die zeitliche Abfolge bzw. die Dauer der Ausführung von Interesse.
+\end{bonus}
+
+\subsection{Prozess}
+
+\begin{defi}{Prozess}
+    Ein \emph{Prozess} ist die Abstraktion eines in Ausführung befindelichen Programms.
+
+    Er besteht aus den \emph{Programmbefehlen} und dem \emph{Prozesskontext}.
+
+    Der \emph{Prozesskontext} besteht aus dem privaten Adressraum des Prozessors, geöffneten Streams und abhängigen Prozessen.
+\end{defi}
+
+\begin{defi}{Prozesszustände}
+    \begin{center}
+        \includegraphics[]{images/prozesszustaende.pdf}
+    \end{center}
+    \begin{enumerate}
+        \item Der Prozess muss auf ein externes Ereignis warten.
+        \item Die Zeitscheibe des Prozesses ist abgelaufen, oder ein höher priorisierter Prozess muss ausgeführt werden.
+        \item Der Prozess bekommt eine neue Zeitscheibe zugeteilt.
+        \item Das externe Ereignis, auf das der Prozess gewartet hat, ist eingetreten.
+    \end{enumerate}
+\end{defi}
+
+\begin{bonus}{Multitasking}
+    \textbf{Preemptives Multitasking}:
+    \begin{itemize}
+        \item Betriebssystem entscheidet, wann welcher Prozess zur Ausführung kommt
+        \item Benutzer erhält Eindruck von Parallelität
+    \end{itemize}
+
+    \textbf{Kooperatives Multitasking}:
+    \begin{itemize}
+        \item Prozess bestimmt selbst, wann er den Prozessor abgibt
+        \item \emph{Nachteile}
+              \subitem - z.B. Endlosschleifen können das gesamte System zum Absturz bringen
+              \subitem - das Betriebssystem kann nicht berechnen, wann der Prozessor wieder frei ist
+    \end{itemize}
+\end{bonus}
+
+\begin{defi}{Scheduling}
+    Die Zuteilung von Zeitscheiben wird \emph{Scheduling} genannt und ist der Kern der Prozessverwaltung.
+    Das Scheduling sollte dabei jederzeit die folgenden Eigenschaften erfüllen:
+    \begin{itemize}
+        \item \emph{Fairness}: Jeder Prozess erhält einen gerechten Anteil der CPU-Zeit.
+        \item \emph{Effizienz}: Die CPU und andere Ressourcen sind möglichst vollständig ausgelastet.
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{Priorität}
+    \textbf{Statische Priorität}:
+    \begin{itemize}
+        \item Jeder Prozess erhält beim Start eine \emph{feste Priorität}
+        \item Prozess mit \emph{höchster Priorität} bekommt als nächstes eine Zeitscheibe zugeteilt
+        \item Oft in Echtzeitsystemen verwendet
+    \end{itemize}
+
+    \textbf{Dynamische Priorität}:
+    \begin{itemize}
+        \item Jeder Prozess erhält beim Start eine \emph{Anfangspriorität}
+        \item Prozess mit \emph{höchster Priorität} bekommt als nächstes eine Zeitscheibe zugeteilt
+        \item Prioritäten der Prozesse werden \emph{dynamisch geändert}
+    \end{itemize}
+\end{bonus}
+
+\begin{algo}{Scheduling: FIFO (First In First Out)}
+    Prozesse werden nach \emph{Reihenfolge} ihres Einfügens in die \emph{Job-Queue} bearbeitet.
+    \begin{itemize}
+        \item Zuteilung der CPU findet nur statt, wenn laufender Prozess wartet oder sich beendet
+        \item Jeder Prozess kommt garantiert an die Reihe
+        \item Kurze Prozesse müssen unter Umständen sehr lange warten, bis sie ausgeführt werden
+    \end{itemize}
+\end{algo}
+
+\begin{algo}{Scheduling: SJF (Shortest Job First)}
+    Prozesse werden aufsteigend nach ihrer \emph{geschätzten Ausführungszeit} bearbeitet.
+    \begin{itemize}
+        \item Große Prozesse kommen möglicherweise nie an die Reihe, wenn stets kleinere dazukommen
+        \item Wartezeit auf das Ergebnis eines Prozesses sich in etwa proportional zur Ausführungszeit
+    \end{itemize}
+\end{algo}
+
+\begin{algo}{Scheduling: MLFQ (Multilevel Feedback Queue)}
+    Bei diesem Ansatz gibt \emph{mehrere FIFO-Queues}, denen jeweils
+    eine \emph{Priorität} zugeordnet ist.
+
+    Ein neuer Prozess wird immer in der Queue mit
+    \emph{höchster Priorität} eingeordnet.
+
+    Wird der Prozess während der ersten Zeitscheibe fertig,
+    so verlässt er das System.
+
+    Gibt er die CPU freiwillig ab, beispielsweise weil er
+    durch das Warten auf ein externes Ereignis blockiert wird, wird er, sobald er wieder
+    bereit ist, in \emph{dieselbe Queue wieder einsortiert} und dort weiter ausgeführt.
+
+    Verbraucht der Prozess seine Zeitscheibe vollständig, so wird er in die \emph{nächst-niedriger priorisierte FIFO-Queue} eingereiht. Dort gelten wieder dieselben Regeln wie vorher.
+
+    Verbraucht der Prozess immer weiter seine Zeitscheiben vollständig, kommt er
+    schließich in der \emph{am niedrigsten priorisierten Queue} an.
+    Dort verweilt er, bis er abgearbeitet wurde, d.h. es gibt \emph{keine Möglichkeit} wieder in höher priorisierte Queues
+    eingestuft zu werden.
+
+    Wieviele FIFO-Queues es gibt, ist vom konkreten Einsatzszenario abhängig.
+\end{algo}
+
+\subsection{Speicherverwaltung}
+
+\begin{defi}{Reale Speicherverwaltung}
+    Jedem Prozess wird ein zusammenhängener Block im Hauptspeicher zugeteilt.
+    Wird in diesem Kontext der Arbeitsspeicher direkt aus den Prozessen heraus adressiert, spricht man von \emph{realer Speicherverwaltung}.
+
+    Das bedeutet auch, dass die Größe des physikalisch vorhandenen Hauptspeichers die Anzahl der gleichzeitig ausführbaren Prozesse begrenzt.
+
+    \emph{Nachteile}:
+    \begin{itemize}
+        \item Es muss Platz für das \emph{gesamte Programm und die Daten} gefunden werden.
+        \item Es kannt nicht mehr Speicher genutzt werden, als \emph{physikalisch vorhanden}.
+        \item Anforderung, zusammenhängender Speicherblöcke zu finden, verschärft Problem der \emph{Fragmentierung}.
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{Fragmentierung}
+    \emph{Fragmentierung} passiert dann, wenn mehrere, kleine Blöcke im Hauptspeicher frei sind und unter der Prämisse, dass einem
+    Prozess ein zusammenhängender Block im Hauptspeicher zugeordnet werden
+    muss, dies eventuell zu einer Situation führt, in der kein neuer Prozess gestartet
+    werden kann, obwohl in Summe genügend Hauptspeicher frei wäre.
+\end{bonus}
+
+\begin{defi}{Swapping}
+    Beim \emph{Swapping} wird der
+    Hauptspeicherinhalt eines Prozesses auf den \emph{Hintergrundspeicher}, beispielsweise
+    eine Festplatte (HDD), \emph{ausgelagert}, um Platz für andere Prozesse zu schaffen.
+
+    Bekommt dann der Prozess, dessen Daten gerade auf dem Hintergrundspeicher liegen,
+    die CPU zugeteilt, müssen seine Daten \emph{erneut in den Hauptspeicher geladen werden},
+    wahrscheinlich nachdem die Daten eines anderen Prozesses ausgelagert wurden.
+\end{defi}
+
+\begin{defi}{Virtuelle Speicherverwaltung}
+    Jedem Prozess wird ein \emph{scheinbar zusammenhängender Speicherbereich} zur Verfügung gestellt.
+    Tatsächlich besteht der Speicher des Prozesses aus nicht zwangsläufig zusammenhängenden \emph{virtuelle Pages}.
+
+    Der Prozess kann seinen Speicher mit \emph{virtuellen Adressen} beginnend bei 0 adressieren.
+
+    Die Gesamtheit aller virtuellen Adressen wird als \emph{virtueller Adressraum} bezeichnet.
+\end{defi}
+
+\begin{defi}{Virtuelle Pages}
+    \emph{Virtuelle Pages} werden auf Blöcke im Hauptspeicher gleicher Größe abgebildet.
+
+    Hier kann auch \emph{Swapping} genutzt werden. In diesem Fall aber für einzelne Pages, nicht für den gesamten Hauptspeicherinhalt des Prozessors.
+\end{defi}
+
+\begin{defi}{Pagetable}
+    Beim Zugriff auf eine virtuelle Speicheradresse durch einen Prozess muss diese
+    Adresse in eine physikalische Adresse umgewandelt werden. Das geschieht anhand
+    der \emph{Pagetable}, die das Betriebssystem \emph{für jeden Prozess} erstellt und aktualisiert.
+
+    Da
+    die Pagetable virtuelle Pages auf physikalische Pages gleicher Größe abbildet, gibt es einen Teil der Adresse, der sogenannte \emph{Offset}, der die Position der Daten innerhalb
+    der Page angibt.
+
+    Abhängig von
+    der Größe der Pages besteht das Offset aus $m$ Bits.
+    Für eine Pagegröße von 1MB
+    werden beispielsweise 20 Bits als Offset benötigt.
+
+    Der Rest der Adresse, die Seitennummer,
+    muss dann anhand der Pagetable in die Basisadresse umgesetzt werden,
+    um die Adresse im physikalischen Speicher zu erhalten. Da die Seitennummer aus
+    $n$ Bits besteht, kann die Pagetable maximal $2^n$ Einträge enthalten.
+\end{defi}
+
+\begin{example}{Pagetable}
+    Die Länge einer Adresse sei 16 Bit, aufgeteilt in je 8 Bit für Offset und Seitennummer.
+
+    Es sei außerdem folgende Seitentabelle gegeben:
+
+    \begin{center}
+        \begin{tabular}{|c|c|c|}
+            \hline
+            \textbf{Eintrag} & \textbf{Gültig} & \textbf{Basisadresse} \\
+            \hline
+            00               & Nein            & -                     \\
+            01               & Ja              & 0x17                  \\
+            02               & Ja              & 0x20                  \\
+            03               & Ja              & 0x08                  \\
+            04               & Nein            & -                     \\
+            05               & Ja              & 0x10                  \\
+            \hline
+        \end{tabular}
+    \end{center}
+
+    Dann können virtuelle Adressen anhand dieser Pagetable wie folgt umgesetzt werden:
+
+    \begin{center}
+        \begin{tabular}{|c|c|}
+            \hline
+            \textbf{virtuelle Adresse} & \textbf{physikalische Adresse}      \\
+            \hline
+            0x083A                     & ungültig (Seite 8 existiert nicht)  \\
+            0x01FF                     & 0x17FF (Seite 1, Basisadresse 0x17) \\
+            0x0505                     & 0x1005 (Seite 5, Basisadresse 0x10) \\
+            0x043A                     & ungültig (Seite 4 ungültig)         \\
+            \hline
+        \end{tabular}
+    \end{center}
+
+    \emph{Hinweis}: Ist eine Adresse ungültig, wurde die dazugehörige Page in den Hintergrundspeicher ausgelagert. In diesem Fall muss die physikalische Page in den RAM geladen und die Pagetable aktualisiert werden.
+\end{example}
+
+\begin{bonus}{Paging on Demand}
+    Das Vorgehen, aktuell
+    unbenutzte Pages aus dem Hauptspeicher auf den Hintergrundspeicher auszulagern
+    wird auch als \emph{Paging on Demand} bezeichnet.
+    Das Ziel dabei ist, Arbeitsspeicher
+    für andere Prozesse freizugeben.
+
+    Dabei kann ein Prozess entweder Platz für eine
+    bestimmte Anzahl von physikalischen Pages zugewiesen bekommen, die sich im
+    Laufe der Prozessabarbeitung nicht ändert, oder es wird dynamisch anhand der aktuellen
+    Speicherauslastung entschieden, wieviel Platz ein Prozess belegen darf.
+\end{bonus}
+
+\begin{algo}{Speicherverwaltung: FIFO (First In First Out)}
+    Beim \emph{FIFO}-Verfahren wird
+    diejenige Page ausgelagert, welche sich schon am längsten im Hauptspeicher
+    befindet. Dazu muss in der Pagetable festgehalten werden, wann welche
+    Page in den Hauptspeicher geladen wurde.
+\end{algo}
+
+\begin{algo}{Speicherverwaltung: LRU/LFU (Least Recently / Frequently Used)}
+    Bei \emph{LRU}
+    wird mitgehalten, wieviele Ladevorgänge seit der letzten Benutzung einer
+    Page vorgenommen wurden. Das heißt, dass im Gegensatz zu FIFO, der
+    Kontrollzustand bei der Verwendung einer Page wieder auf \glqq 0\grqq gesetzt wird.
+\end{algo}
+
+\begin{example}{Speicherverwaltung}
+    Seitenanforderungen: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5
+
+    \textbf{FIFO-Strategie:}
+
+    \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
+        \hline
+        \multicolumn{1}{|c}{\textbf{Referenzfolge}} & \multicolumn{1}{c|}{} & 1                  & 2                  & 3                  & 4                  & 1                  & 2                  & 5                  & 1 & 2 & 3                  & 4                  & 5 \\
+        \hline
+        \hline
+        \multirow{3}{*}{\textbf{Arbeitsspeicher}}   & Page 1                & \textcolor{red}{1} & 1                  & 1                  & \textcolor{red}{4} & 4                  & 4                  & \textcolor{red}{5} & 5 & 5 & 5                  & 5                  & 5 \\
+                                                    & Page 2                &                    & \textcolor{red}{2} & 2                  & 2                  & \textcolor{red}{1} & 1                  & 1                  & 1 & 1 & \textcolor{red}{3} & 3                  & 3 \\
+                                                    & Page 3                &                    &                    & \textcolor{red}{3} & 3                  & 3                  & \textcolor{red}{2} & 2                  & 2 & 2 & 2                  & \textcolor{red}{4} & 4 \\
+        \hline
+        \hline
+        \multirow{3}{*}{\textbf{Kontrollzustand}}   & Page 1                & 0                  & 1                  & 2                  & 0                  & 1                  & 2                  & 0                  & 1 & 2 & 3                  & 4                  & 5 \\
+                                                    & Page 2                & -                  & 0                  & 1                  & 2                  & 0                  & 1                  & 2                  & 3 & 4 & 0                  & 1                  & 2 \\
+                                                    & Page 3                & -                  & -                  & 0                  & 1                  & 2                  & 0                  & 1                  & 2 & 3 & 4                  & 0                  & 1 \\
+        \hline
+    \end{tabular}
+
+    9 Einlagerungen
+
+    \textbf{LRU-Strategie:}
+
+    \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
+        \hline
+        \multicolumn{1}{|c}{\textbf{Referenzfolge}} & \multicolumn{1}{c|}{} & 1                  & 2                  & 3                  & 4                  & 1                  & 2                  & 5                  & 1 & 2 & 3                  & 4                  & 5                  \\
+        \hline
+        \hline
+        \multirow{3}{*}{\textbf{Arbeitsspeicher}}   & Page 1                & \textcolor{red}{1} & 1                  & 1                  & \textcolor{red}{4} & 4                  & 4                  & \textcolor{red}{5} & 5 & 5 & \textcolor{red}{3} & 3                  & 3                  \\
+                                                    & Page 2                &                    & \textcolor{red}{2} & 2                  & 2                  & \textcolor{red}{1} & 1                  & 1                  & 1 & 1 & 1                  & \textcolor{red}{4} & 4                  \\
+                                                    & Page 3                &                    &                    & \textcolor{red}{3} & 3                  & 3                  & \textcolor{red}{2} & 2                  & 2 & 2 & 2                  & 2                  & \textcolor{red}{5} \\
+        \hline
+        \hline
+        \multirow{3}{*}{\textbf{Kontrollzustand}}   & Page 1                & 0                  & 1                  & 2                  & 0                  & 1                  & 2                  & 0                  & 1 & 2 & 0                  & 1                  & 2                  \\
+                                                    & Page 2                & -                  & 0                  & 1                  & 2                  & 0                  & 1                  & 2                  & 0 & 1 & 2                  & 0                  & 1                  \\
+                                                    & Page 3                & -                  & -                  & 0                  & 1                  & 2                  & 0                  & 1                  & 2 & 0 & 1                  & 2                  & 0                  \\
+        \hline
+    \end{tabular}
+
+    10 Einlagerungen
+\end{example}
+
+\newpage
+\subsection{Dateisystemverwaltung}
+
+\begin{defi}{BIOS (Basic Input/Output System)}
+    Das \emph{BIOS}:
+    \begin{itemize}
+        \item ist die \emph{Firmware} bei x86-PCs
+        \item liegt im \emph{nichtflüchtigen Speicher} auf der Hauptplatine des PCs
+        \item leitet den \emph{Start} des \emph{Betriebssystems} ein
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{UEFI (Unified Extensible Firmware Interface)}
+    \emph{UEFI} ist die zentrale Schnittstelle zwischen:
+    \begin{itemize}
+        \item der \emph{Firmware}
+        \item den \emph{einzelnen Komponenten} eines Rechners
+        \item und dem \emph{Betriebssystem}
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{MBR (Master Boot Record)}
+    Der \emph{MBR} besteht aus insgesamt 512 Byte, die sich auf 446 Byte
+    für einen (optionalen) Bootloader, 64 Byte für die \emph{Partitionstabelle} und 2 Byte
+    für eine \emph{} (0xAA55) aufteilen. Die Magic Number dient dazu, einen
+    gültigen MBR zu identifizieren.
+
+    In der Partitionstabelle können maximal 4 Partitionen
+    definiert werden, d.h. die Festplatte kann in maximal 4 logische Einheiten aufgeteilt
+    werden.
+\end{bonus}
+
+\begin{bonus}{GPT (GUID Partition Table)}
+    Mit der Einführung von UEFI wurden auch die Limitierungen des
+    MBR aufgehoben und die GPT als Nachfolger definiert.
+
+    Die \emph{GPT} beinhaltet zu Beginn
+    aus Kompatibilitätsgründen einen MBR, sodass ein hybrider Betrieb möglich
+    ist. In der GPT können bis zu 128 Partitionen abgelegt werden.
+
+    Zur Absicherung der
+    GPT wird eine exakte Kopie der GPT am Ende des Datenträgers abgelegt.
+\end{bonus}
+
+\begin{defi}{Dateisystem}
+    Ein Dateisystem ist im Prinzip eine Ablageorganisation für Daten auf einem Datenträger des Computers.
+    Das Dateisystem muss sicherstellen,
+    dass Dateien \emph{lesend und schreibend geöffnet} und auch wieder \emph{geschlossen} werden
+    können. Das bedeutet, dass Dateinamen auf physikalische Adressen auf dem
+    Datenträger abgebildet werden müssen.
+
+    Spezielle Eigenschaften des Datenträgers
+    (Festplatte, USB-Stick, ...) müssen berücksichtigt werden.
+
+    Generell bieten
+    alle (modernen) Dateisysteme folgende Attribute:
+    \begin{itemize}
+        \item Dateiname
+        \item Ablageort (Ordner bzw. Verzeichnis)
+        \item Dateigröße
+        \item Zugriffsrecht
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Lineare Dateisysteme}
+    Bei linearen Dateisystemen werden Daten direkt hintereinander auf den Datenträger
+    geschrieben. Das bedeutet, dass wahlfreier Zugriff nicht möglich ist. Daher finden
+    diese Dateiysteme heutzutage nur noch Anwendung in Bereichen, in denen es nicht
+    primär auf Geschwindigkeit ankommt.
+\end{defi}
+
+\begin{defi}{Hierarchische Dateisysteme}
+    Daten werden auf hierarchischen Dateisystemen in einer Verzeichnisstruktur
+    abgelegt.
+
+    Diese Art von Dateisystem ist die wohl verbreiteste auf
+    modernen Computern und kann auf Festplatten, SSDs, USB-Sticks, SD-Karten und
+    sonstigen herkömmlichen Datenträgern verwendet werden.
+\end{defi}
+
+\begin{defi}{Netzwerkdateisysteme}
+    In Netzwerkdateisystemen wird entfernter
+    Speicher auf einem Server wie ein lokales Medium behandelt. Das Betriebssystem
+    muss dann die Zugriffe auf Dateien in Netzwerkkommunikation umwandeln.
+    Für den Nutzer
+    eines Betriebsystems stellt sich Netzwerkspeicher allerdings in der Regel wie ein
+    hierarchisches Dateisystem dar.
+\end{defi}
+
+\begin{bonus}{Sicherheitsaspekte}
+    \textbf{Paralleler Zugriff im Multitasking}:
+    \begin{itemize}
+        \item Bereitstellung von Locks für den Dateizugriff
+    \end{itemize}
+
+    \textbf{Stromausfall während einer Schreiboperation}:
+    \begin{itemize}
+        \item Es muss Datenkonsistenz gewährleistet werden
+        \item Atomare Operationen, welche entweder abgeschlossen oder ausstehend sind
+              \subitem $\to$ Journalingdateisysteme
+    \end{itemize}
+\end{bonus}
+
+\begin{defi}{Journalingdateisysteme}
+    Bei einem Journalingdateisystem werden alle Aktionen auf der Festplatte protokolliert
+    und erst als gültig aufgefasst, nachdem das Beenden der Aktion auf dem Dateisystem
+    im \emph{Journal} (Protokoll) vermerkt wurde.
+
+    \begin{itemize}
+        \item \emph{Metadatenjournaling}:
+              \subitem - Konsistenz des Dateisystems
+        \item \emph{Fulljournaling}:
+              \subitem - Konsistenz des Dateisystems
+              \subitem - Konsistenz der Dateiinhalte
+    \end{itemize}
+
+\end{defi}
+
+\section{Virtualisierung}
+
+\begin{defi}{Virtualisierung}
+    \emph{Virtualisierung} bezeichnet Methoden, die es erlauben, Ressourcen
+    eines Computers \emph{zusammenzufassen oder aufzuteilen}.
+
+    Dies wird erreicht, indem real existierende Hardware unter
+    Zuhilfenahme einer Softwareschicht zu virtueller Hardware \emph{abstrahiert} wird.
+
+    Dabei können mehrere Szenarien unterschieden werden:
+    \begin{itemize}
+        \item Partitionierung
+        \item Aggregation
+        \item Emulation
+        \item Isolation
+    \end{itemize}
+    \vspace{1em}
+    \begin{center}
+        \includegraphics[]{images/virtualisierung.pdf}
+    \end{center}
+\end{defi}
+
+\begin{defi}{Hypervisor / Virtual Machine Monitor (VMM)}
+    Der \emph{Hypervisor} ist ein Stück Soft- oder Hardware, das  die Umsetzung
+    zwischen der \emph{virtuellen Maschine} und der \emph{physikalischen Hardware} vornimmt.
+
+    \textbf{Typ-1-Hypervisor}:
+    \begin{itemize}
+        \item läuft direkt auf physikalischer Hardware
+    \end{itemize}
+
+    \textbf{Typ-2-Hypervisor}:
+    \begin{itemize}
+        \item läuft als Anwendung auf dem Hostsystem
+    \end{itemize}
+\end{defi}
+
+\subsection{Virtualisierungskonzepte}
+
+\begin{defi}{Paravirtualisierung}
+    \begin{itemize}
+        \item Funktionalitäten des Gast BS werden gezielt verändert (Kernel Anpassungen)
+        \item Gast-BS \glqq weiß\grqq, dass es sich in einer virtuellen Umgebung befindet
+        \item Gast-BS kann direkt mit dem Hypervisor interagieren, benötigt keine Hardware-Emulation
+    \end{itemize}
+
+    \emph{Vorteile}: gute Performance
+
+    \emph{Nachteile}: Gastsysteme nicht beliebig wählbar, hoher Aufwand für Kernel-Entwickler
+\end{defi}
+
+\begin{defi}{Hardware-unterstützte Virtualisierung}
+    \begin{itemize}
+        \item Neue Prozessortechnologien: CPUs besitzen Befehlssatz, der Virtualisierung unterstützt
+        \item Modifikation des Gast-BS soll vermieden werden, direkt durch Hardware gelöst
+        \item Hypervisor soll durch hardwarebasierte Speicherverwaltung entlastet werden
+    \end{itemize}
+
+    \emph{Vorteile}: Gast-BS muss nicht modifiziert werden, Gastsysteme frei wählbar
+
+    \emph{Nachteile}: kein gemeinsamer Standard, Virtualisierungsplattform muss Technologie unterstützen
+\end{defi}
+
+\begin{defi}{Hardware-Emulation}
+    \begin{itemize}
+        \item Innerhalb einer VM wird Standardhardware eines Rechners komplett oder teilweise simuliert
+        \item Emulator erzeugt Softwareschnittstellen, die vom Gast-BS angesprochen werden können
+        \item Emulator sorgt dafür, dass Befehle, die an simulierte Hardware gerichtet sind, für die physische Hardware des Hostsystems umgewandelt werden
+    \end{itemize}
+
+    \emph{Vorteile}: flexible Wahl der Gast-BS
+
+    \emph{Nachteile}: Performanceverlust durch hohen Virtualisierungsaufwand
+\end{defi}
+
+\begin{defi}{Betriebssystemvirtualisierung}
+    \begin{itemize}
+        \item Innerhalb des Host-BS werden Virtual Environments (VE) / Container erzeugt
+        \item In VE ist kein eigenständiges Betriebssystem installiert
+        \item Kernel-Bibliotheken und Geräte-Treiber des Hostsystems genutzt
+        \item Einige Individualdaten müssen für Container definiert werden \\ (z.B. Dateisystem, IP Adresse, Hostname)
+    \end{itemize}
+
+    \emph{Vorteile}: gute Performance, wenig Speicherbedarf
+
+    \emph{Nachteile}: keine freie Wahl des Gast-BS (gebunden an Hostsystem)
+\end{defi}
+
+\subsection{Cloud Computing}
+
+\begin{defi}{Cloud Computing}
+    \emph{Cloud Computing} ist im Wesentlichen ein Model um einen allgegenwärtigen,
+    bequemen, bedarfsgesteuerten Netzwerkzugang zu einem gemeinsamen Pool konfigurierbarer
+    Computer-Ressourcen zur Verfügung zu stellen. Zudem soll das Ganze
+    schnell und mit minimalem Verwaltungsaufwand und Interaktion mit dem Provider
+    funktionieren.
+\end{defi}
+
+\begin{defi}{Servicemodelle}
+    \textbf{Infrastructure as a Service} (IaaS):
+    \begin{itemize}
+        \item vom Anbieter verwaltete Infrastruktur
+        \item Nutzer muss verwendetes Betriebssystem und Software vollständig selbst verwalten
+    \end{itemize}
+
+    \textbf{Platform as a Service} (PaaS):
+    \begin{itemize}
+        \item virtuelle Plattform zur Verfügung gestellt (Betriebssystem, Entwicklungsplattform)
+        \item alles \glqq unterhalb\grqq der Plattform ist aber \emph{nicht} unter der Kontrolle des Nutzers
+    \end{itemize}
+
+    \textbf{Software as a Service} (SaaS):
+    \begin{itemize}
+        \item nur eine einzelne Anwendung zur Verfügung gestellt
+        \item alles \glqq unterhalb\grqq der Anwendung ist aber \emph{nicht} unter der Kontrolle des Nutzers
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{Charakterisken von Cloud Computing}
+    \begin{itemize}
+        \item Selbstverwaltung (On-demand self-service)
+        \item Breitband Internetzugang
+        \item Ressourcenbündelung
+        \item Elastizität
+        \item Leistungsmessung
+    \end{itemize}
+\end{bonus}
+
+\begin{defi}{Bereitstellungsmodelle}
+    \textbf{Private Cloud}:
+    \begin{itemize}
+        \item für eine ganz spezielle Nutzergruppe betrieben
+        \item kann auch von der Firma selbst verwaltet werden
+    \end{itemize}
+
+    \textbf{Community Cloud}:
+    \begin{itemize}
+        \item wird für verschiedene Nutzergruppen in einem bestimmten Kontext betrieben
+        \item in der Regel von einer der teilnehmenden Gruppen oder von externem Dienstleister bereitgestellt
+    \end{itemize}
+
+    \textbf{Public Cloud}:
+    \begin{itemize}
+        \item für beliebige Nutzer zur Verfügung steht
+        \item von beliebigem Anbieter betrieben
+    \end{itemize}
+
+    \textbf{Hybrid Cloud}:
+    \begin{itemize}
+        \item kombiniert mehrere der vorhergehenden Bereitstellungsmodelle
+        \item einzelnen Teile unabhängig voneinander, aber durch standardisierte Schnittstellen verbunden
+    \end{itemize}
+\end{defi}
+
+\section{Datenschutz und Sicherheit}
+\subsection{Datensicherheit}
+
+\begin{defi}{Kryptographie}
+    Kryptographie ist die Wissenschaft der Verschlüsselung von Informationen. Sie wird genutzt
+    um Informationen auf eine Art und Weise zu verändern, sodass ein Unbefugter
+    die Informationen nicht mehr lesen kann. Es soll nur dem tatsächlichen Adressaten
+    einer Nachricht möglich sein, diese auch zu lesen. Es geht also explizit nicht darum,
+    den Diebstahl von Informationen zu verhindern, sondern es geht darum, dass
+    entwendete Informationen nicht gelesen werden können.
+\end{defi}
+
+\begin{defi}{Transpositionschiffren}
+    Die Verschlüsselung wird durch Umordnung der Zeichen
+    im Klartext umgesetzt.
+\end{defi}
+
+\begin{defi}{Substitutionschiffren}
+    Die Verschlüsselung wird durch Ersetzung der Zeichen
+    im Klartext realisiert.
+
+    \textbf{Monoalphabetische Substitution}:
+    \begin{itemize}
+        \item Jedes Zeichen des Klartexts wird durch genau
+              ein eindeutiges Zeichen aus dem Geheimtextalphabet ersetzt, das für einen
+              gewählten Schlüssel immer gleich ist.
+    \end{itemize}
+
+    \textbf{Homophone Substitution}:
+    \begin{itemize}
+        \item Jedes Zeichen des Klartexts wird durch genau ein
+              anderes Zeichen aus einer eindeutigen Menge von Zeichen ersetzt, die für einen
+              gewählten Schlüssel immer gleich ist.
+    \end{itemize}
+
+    \textbf{Polyalphabetische Substitution}:
+    \begin{itemize}
+        \item Jedes Zeichen wird durch ein eindeutiges Zeichen
+              aus einem von mehreren geheimen Alphabeten ersetzt, die für einen gewählten
+              Schlüssel immer gleich sind. Die Alphabete werden dabei immer der Reihe nach
+              verwendet.
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Cäsar Chiffre}
+    Im einfachsten Fall beinhalten $\mathfrak{P}$ und $\mathfrak{S}$ dieselben Zeichen und sind nur gegeneinander
+    um $k$ Zeichen verschoben. Diese Variante einer \emph{monoalphabetischen Substitutionschiffre} wird \emph{Cäsar Chiffre} genannt.
+
+    Alice wählt für die Verschlüsselung $k = 10$ und erhält damit die folgenden Alphabete:
+
+    \begin{center}
+        $\mathfrak{P}$: \texttt{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}\\
+        $\mathfrak{S}$: \texttt{J K L M N O P Q R S T U V W X Y Z A B C D E F G H I}\\
+    \end{center}
+
+    Da Alice $k = 10$ gewählt hat, beginnt das Geheimtextalphabet mit \texttt{J}, dem
+    zehnten Buchstaben des Alphabets. Die Verschlüsselung führt Alice durch,
+    indem sie jeden Buchstaben ihres Klartexts durch den entsprechenden Buchstaben
+    aus dem Geheimtextalphabet ersetzt.Werden die beiden Alphabete wie
+    weiter oben aufgeschrieben, ist das einfach der Buchstabe im Geheimtextalphabet
+    der direkt unter dem Buchstaben im Klartextalphabet steht. Damit ergibt
+    sich für die Nachricht \texttt{HALLO} der Geheimtext \texttt{QJUUX}. Bob kann den
+    Geheimtext dann entschlüsseln, indem er wiederum beide Alphabete untereinander
+    schreibt und jedem Buchstaben aus dem Geheimtext den zugehörigen
+    Buchstaben aus dem Klartextalphabet zuorndet, der dann genau darüber steht.
+\end{example}
+
+\begin{example}{Vigenère Chiffre}
+    Eine bekannte \emph{polyalphabetische Substitutionschiffre} ist die \emph{Vigenère Chiffre}.
+    Sie funktioniert im Prinzip wie die Cäsar-Chiffre, verwendet also verschobene
+    lateinische Alphabete zur Verschlüsselung. Wie viele Alphabete und wie
+    jedes von ihnen verschoben, wird durch den Schlüssel $k$ bestimmt, der in diesem
+    Fall ein Wort ist. Es gibt also soviele geheime Alphabete, wie es Zeichen
+    in $k$ gibt und jedes dieser Alphabete ist verschoben, so dass das $i$-te Alphabet
+    mit dem $i$-ten Zeichen von $k$ beginnt.
+    Alice wählt das Schlüsselwort $k = EDV$. Damit ergeben sich Klartext- und
+    Geheimalphabete wie folgt:
+
+    \begin{center}
+        $\mathfrak{P}$: \texttt{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}\\
+        $\mathfrak{S}_1$: \texttt{E F G H I J K L M N O P Q R S T U V W X Y Z A B C D}\\
+        $\mathfrak{S}_2$: \texttt{D E F G H I J K L M N O P Q R S T U V W X Y Z A B C}\\
+        $\mathfrak{S}_3$: \texttt{V W X Y Z A B C D E F G H I J K L M N O P Q R S T U}\\
+    \end{center}
+
+    Damit kann Alice den Klartext $M =$ \texttt{HALLOHALLO} verschlüsseln, indem Sie
+    die Buchstaben des Klartexts wie bei der Cäsar Chiffre zuordnet und dabei die
+    drei Geheimtextalphabete reihum verwendet. Da der Klartext mehr Zeichen
+    enthält, als es Geheimtextalphabete gibt, fängt sie nach jeweils drei Zeichen
+    wieder beim ersten Geheimtextalphabet an. Somit ergibt sich der Geheimtext
+    $C =$ \texttt{LDGPRCEOGS}.
+\end{example}
+
+\begin{defi}{Moderne Verschlüsselungsverfahren}
+    Moderne Verschlüsselungsverfahren werden, im Gegensatz zu klassischen Verfahren,
+    nicht mehr auf Zeichen einer natürlichen Sprache angewandt. Stattdessen werden
+    Zahlen bzw. Bits als Grundlage der Operationen verwendet. Damit können
+    beliebige Daten verschlüsselt werden, nicht mehr nur Text. Damit sind moderne
+    Verschlüsselungsverfahren den Anforderungen der heutigen digitalen Gesellschaft
+    gewachsen.
+
+    \textbf{Symmetrische Verfahren}:
+    \begin{itemize}
+        \item denselben Schlüssel zur Ver- und Entschlüsselung
+        \item Problem des Schlüsselaustauschs
+        \item Vertraulichkeit, aber keine zur Sicherstellung von Authentifizierung und Integrität
+        \item[$\to$] Blockchiffren
+            \subitem -  zu verschlüsselnde Daten in $m$ Blöcke derselben Größe aufgeteilt
+            \subitem -  einfachster Fall: jeder der zuvor erzeugten Blöcke $m_i$ mit Schlüssel $k$
+            \subitem zu verschlüsseltem Block $c_i$ derselben Größe übersetzt
+        \item[$\to$] Stromchiffren
+            \subitem -  Klartext wird bitweise anhand eines Schlüsselstroms verschlüsselt
+            \subitem - Schlüsselstrom und Geheimtext haben dieselbe Länge wie der Klartext
+    \end{itemize}
+
+    \textbf{Asymmetrische Verfahren}:
+    \begin{itemize}
+        \item Die meisten asymmetrischen Verfahren basieren auf mathematischen Problemen, die nicht effizient zu lösen sind.
+        \item
+    \end{itemize}
+\end{defi}
+
+\begin{algo}{RSA Verschlüsselung}
+    RSA basiert auf der Faktorisierung ganzes Zahlen, für die es keinen bekannten
+    effizienten Algorithmus gibt. Dabei geht es darum, eine Zahl in ihre Primfaktoren
+    zu zerlegen.
+
+    Da beide Schlüssel des Schlüsselpaars zusammen funktionieren sollen, müssen sie
+    nach einer festen Vorschrift erzeugt werden:
+    \begin{enumerate}
+        \item Wähle zwei Primzahlen $p, q$ mit $p \neq q$
+        \item Berechne $N = p \cdot q$
+        \item Berechne $\varphi(N) = (p-1)\cdot (q-1)$
+        \item Wähle ein $e$, das teilerfremd zu $\varphi(N)$ ist mit $1 < e < \varphi(N)$
+        \item Berechne $d$, sodass $e \cdot d \equiv 1 \mod \varphi(N)$
+    \end{enumerate}
+
+    Nach dieser Prozedur ist $(e,N)$ der \emph{public key} und $(d,N)$ der \emph{private Key}. Damit
+    kann nun jeder Nachricht $M \in \N, 1 < M < N$ anhand folgender Formel verschlüsselt
+    werden:
+    $$
+        C = M^e \mod N
+    $$
+
+    Die Entschlüsselung der verschlüsselten Nachricht $C$ kann dann anhand einer ähnlichen Formel durchgeführt werden:
+    $$
+        M = C^d \mod N
+    $$
+\end{algo}
+
+\begin{example}{RSA Verschlüsselung}
+    Damit Alice Bob eine Nachricht schreiben kann, muss Bob zunächst seinen \emph{public Key} zur Vefügung stellen.
+
+    Zur Erzeugung seines Schlüsselpaars wählt Bob die Primzahlen $p=13$ und $q=17$.
+    Damit ergibt sich $N = 221$ und $\varphi(N) = 192$.
+    Anschließend wählt Bob $e=5$ und berechnet damit $d=77$.
+    Damit kann Bob $(5, 221)$ als seinen \emph{public Key} an Alice geben und $(77, 221)$ behält er als \emph{private Key} für sich.
+
+    Alice hat nun Bobs \emph{public Key} und möchte damit die Nachricht $M = 42$ verschlüsseln.
+    Dazu berechnet Sie $C = 42^5 \mod 221 = 9$ und schickt die verschlüsselte Nachricht anschließend an Bob.
+
+    Bob kann nun mit seinem \emph{private Key} die erhaltene Nachricht entschlüsseln und erhält $M = 9^77 \mod 221 = 42$.
+\end{example}
+
+\begin{defi}{Digitale Signatur}
+    Um auch \emph{Authentifizierung}
+    und \emph{Integritat} herstellen zu können, muss eine digitale Signatur verwendet
+    werden. Dazu braucht es zunachst eine \emph{Hashfunktion}, die eine Art Fingerabdruck
+    der Nachricht erzeugt.
+
+    Nachdem mit der Hashfunktion der Hashwert der Nachricht berechnet wurde, wird
+    dieser mit dem \emph{private Key} des Senders verschlüsselt.
+
+    Danach berechnet
+    der Empfänger selbst den Hashwert der empfangen Nachricht. Stimmen der
+    selbst berechnete Hashwert und der entschlüsselte Hashwert überein ist die \emph{Integrität} der Nachricht sichergestellt. Da zudem das Entschlüsseln des Hashwertes mit
+    dem öffentlichen Schlüssel des Senders funktioniert hat, ist der Sender authentifiziert,
+    da dessen privater Schlüssel zur Erstellung der digitalen Signatur verwendet
+    wurde.
+
+    Es ist also notwendig, dass sich Sender und Empfanger vorab auf eine
+    Hashfunktion einigen. Zusatzlich ist wichtig zu beachten, dass eine Digitale Signatur
+    \emph{keine Vertraulichkeit} herstellt, dazu muss die Nachricht zusatzlich verschlüsselt
+    werden.
+\end{defi}
+
+\begin{defi}{Hybride Chiffren}
+    Die Kombination von symmetrischen und asymmetrischen
+    Chiffren nennt man \emph{hybride Chiffren}.
+
+    \begin{itemize}
+        \item verhältnismäßig kurzer Schlüssel einer Blockchiffre wird asymmetrisch verschlüsselt und zum Empfänger einer Nachricht transportiert
+        \item Kommunikation selbst läuft symmetrisch verschlüsselt ab
+        \item Kombination erzielt guten Kompromiss zwischen Sicherheit und Rechenaufwand
+    \end{itemize}
+\end{defi}
+
+\printindex
+\printindex[Beispiele]
+\end{document}
diff --git a/la1/la1.tex b/la1/la1.tex
index 5ba913ed0d6bcad766a60c51a5df0dea14eac7e2..ede3b910a12b1b2aa091e004b76165c857160211 100644
--- a/la1/la1.tex
+++ b/la1/la1.tex
@@ -1,669 +1,669 @@
-\documentclass[german]{../spicker}
-
-\usepackage{amsmath}
-\usepackage{polynom}
-
-\title{Lineare Algebra 1}
-\author{Patrick Gustav Blaneck}
-\makeindex[intoc]
-\makeindex[intoc, name=Beispiele,title=Beispiele]
-
-\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
-\newcommand{\vektor}[1]{\begin{pmatrix*}[r] #1 \end{pmatrix*}}
-\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
-\newcommand{\dx}{~\mathrm{d}x}
-
-\begin{document}
-\maketitle
-\tableofcontents
-\newpage
-
-%\setcounter{section}{1}
-
-\section{Analytische Geometrie}
-
-\subsection{Skalarprodukt und Norm}
-
-\begin{defi}{Skalarprodukt}
-    Eine Abbildung $\scalarprod{\cdot, \cdot}$ heißt Skalarprodukt, wenn folgende Bedingungen erfüllt sind:
-    \begin{itemize}
-        \item[\textbf{SP1}] Symmetrie: $\forall a, b \in \R^n: \scalarprod{a, b} = \scalarprod{b, a}$
-        \item[\textbf{SP2}] $\forall a, b, c \in \R^n: \scalarprod{a, b+c} = \scalarprod{a, b} + \scalarprod{a, c}$
-        \item[\textbf{SP3}] $\forall a \in \R^n: \scalarprod{\alpha a, b} = \alpha \scalarprod{a, b} = \scalarprod{a, \alpha b}$
-        \item[\textbf{SP4}] positive Definitheit: $\forall a \in \R^n \setminus \{0\}: \scalarprod{a, a} > 0 \land \scalarprod{0, 0} = 0$
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Euklidisches Skalarprodukt}
-    Für $a, b$ sei ihr \emph{euklidisches Skalarprodukt} $\scalarprod{a, b}$ definiert als
-    $$
-        \scalarprod{a, b} := \sum_{i=1}^n a_ib_i
-    $$
-\end{defi}
-
-\begin{defi}{Norm}
-    Eine Norm $\norm{a}$ hat folgende Eigenschaften:
-    \begin{itemize}
-        \item[\textbf{N0}] $\norm{a} \in \R$
-        \item[\textbf{N1}] $\norm{a} \geq 0$
-        \item[\textbf{N2}] $\norm{a} = 0 \iff a = 0$
-        \item[\textbf{N3}] $\forall \lambda \in \R : \norm{\lambda a} = \abs{\lambda} \norm{a}$
-        \item[\textbf{N4}] Dreiecksungleichung $\norm{a+b} \leq \norm{a} + \norm{b}$
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Euklidische Norm}
-    Einem Vektor $a$ wird die \emph{euklidische Norm} oder \emph{Standardnorm} $\norm{a}$ zugeordnet durch
-    $$
-        \norm{a} := \left(\sum_{i=1}^n a_i^2\right)^{\frac{1}{2}}
-    $$
-\end{defi}
-
-\begin{bonus}{Diskrete Minkowskische Ungleichung}
-    Für $p \geq 1$ definiert man die $\ell_p$-Norm durch
-    $$
-        \norm{a}_p := \left(\sum^n_{i=1} \abs{a_i}^p\right)^\frac{1}{p}
-    $$
-    \begin{itemize}
-        \item $p=1$: \emph{Betragssummennorm} oder \emph{Einsernorm}
-        \item $p=2$: euklidische Norm
-        \item $p=\infty$: \emph{Maximumnorm} pder $\ell_\infty$\emph{-Norm} ($\norm{a}_\infty = \max\{\abs{a_i}, \ldots, \abs{a_n}\}$)
-    \end{itemize}
-\end{bonus}
-
-\begin{defi}{Orthogonalität}
-    Seien $a,b \in \R^n$ und $\scalarprod{\cdot, \cdot}$ ein beliebiges Skalarprodukt.
-    Die Vektoren $a$ und $b$ stehen \emph{orthogonal} zueinander bzgl. $\scalarprod{\cdot, \cdot}$, Schreibweise $a \perp b$, wenn $\scalarprod{a, b} = 0$.
-\end{defi}
-
-\begin{algo}{Orthogonalen Vektor finden}
-    Wir betrachten den Vektor $a= (a_1, a_2)^T$.
-    Für den senkrechten Vektor $a'$ gilt: $(-a_2, a_1)^T$.
-\end{algo}
-
-\begin{bonus}{Satz des Pythagoras}
-    Seien $a,b \in \R^n$ mit $a \perp b$ und $\scalarprod{\cdot, \cdot}$ ein beliebiges Skalarprodukt.
-    Dann gilt:
-    $$
-        \norm{a + b}^2 = \norm{a}^2 + \norm{b}^2
-    $$
-\end{bonus}
-
-\begin{defi}{Orthogonale Projektion}
-    Seien $a, b$ zwei Vektoren und $b \neq 0$. Dann gilt für die orthogonale Projektion $p$ von $a$ in Richtung $b$:
-    $$
-        p_b(a) = \frac{\scalarprod{a, b}}{\scalarprod{b, b}} b
-    $$
-\end{defi}
-
-\begin{bonus}{Cauchy-Schwarzsche Ungleichung}
-    Für $a, b \in \R^n$ gilt:
-    $$
-        \abs{\scalarprod{a, b}} \leq \norm{a} \norm{b}
-    $$
-\end{bonus}
-
-\begin{defi}{Winkel zwischen Vektoren}
-    Seien $a, b\in \R^n\setminus \{0\}$.
-    Der Winkel zwischen $a$ und $b$, geschrieben $\angle (a, b)$, wird definiert als
-    $$
-        \angle (a, b) := \arccos \frac{\scalarprod{a, b}}{\norm{a} \norm{b}}
-    $$
-\end{defi}
-
-\begin{defi}{Vektorprodukt (Kreuzprodukt)}
-    Seien $a, b \in \R^n$. Dann heißt
-    $$
-        a \times b := \vektor{a_2b_3-a_3b_2 \\ a_3b_1-a_1b_3 \\ a_1b_2 - a_2b_1}
-    $$
-    das \emph{Vektorprodukt} oder \emph{Kreuzprodukt} von $a$ und $b$.
-\end{defi}
-
-\newpage
-\subsection{Geraden und Ebenen}
-
-\begin{defi}{Gerade (Punkt-Richtungsgleichung)}
-    Für einen \emph{Ortsvektor} oder \emph{Aufpunkt} $p$ und einen \emph{Richtungsvektor} $v \neq 0$ heißt
-    $$
-        x = p + \alpha v
-    $$
-    \emph{Punkt-Richtungsgleichung} einer \emph{Geraden} $G$.
-\end{defi}
-
-\begin{defi}{Gerade (Normalform in der Ebene)}
-    Sei $G$ eine Gerade in der Ebene, $p$ der Aufpunkt und $v$ der Richtungsvektor von $G$.\\
-    Gilt $n \perp v$, dann heißt
-    $$
-        \scalarprod{x,n} = \scalarprod{p, n} \iff n_1x_1 + n_2x_2 = c
-    $$
-    \emph{Normalform} von $G$.
-\end{defi}
-
-\begin{defi}{Ebene (Punkt-Richtungsgleichung)}
-    Seien $p, v, w \in \R^3, v\neq 0$ und $w \neq 0$, und seien $v$ und $w$ nicht parallel.
-    Dann heißt
-    $$
-        x = p + \alpha v + \beta w
-    $$
-    \emph{Punkt-Richtungsgleichung} einer \emph{Ebene} $E$.
-\end{defi}
-
-\begin{defi}{Ebene (Normalform)}
-    Sei $E$ eine Ebene im Raum, $p$ der Aufpunkt und $v, w$ Richtungsvektoren von $E$. \\
-    Gilt $n \perp v \land n \perp w$, dann heißt
-    $$
-        \scalarprod{x, n} = \scalarprod{p, n} \iff n_1x_1 + n_2x_2 + n_3x_3 = d
-    $$
-    \emph{Normalform} von $E$.
-\end{defi}
-
-
-\begin{defi}{Hessesche Normalform}
-    Sei $n$ ein Normalenvektor einer Gerade $G$ in der Ebene oder einer Ebene $E$ im Raum.
-    Gilt $\norm{n} = 1$, so heißt die damit gebildete Normalform \emph{Hessesche Normalform}.
-\end{defi}
-
-\begin{algo}{Normalform $\to$ Hessesche Normalform (Geraden und Ebenen)}
-    Man erhält die Hessesche Normalform aus einer beliebigen Normalform, indem man die Normalform durch $\norm{n}$ teilt:
-    $$
-        \frac{\scalarprod{x, n}}{\norm{n}} = \frac{\scalarprod{p, n}}{\norm{n}}
-    $$
-    Damit liegt der Normalvektor bis auf das Vorzeichen eindeutig fest.
-\end{algo}
-
-\begin{algo}{Punkt-Richtungsform $\to$ Normalform (Geraden)}
-    Sei eine Gerade $G$ gegeben durch $x = p + \alpha v$ mit $v = (v_1, v_2)^T$.
-    Einene Normalenvektor $n$ findet man durch
-    $$
-        n := \vektor{v_2 \\ -v_1}.
-    $$
-    Durch Ausrechnen von $\scalarprod{p, n}$ erhält man die rechte Seite der Normalform.
-\end{algo}
-
-\begin{algo}{Normalform $\to$ Punkt-Richtungsform (Geraden)}
-    Liegt die Gerade in der Normalform $ax_1 + bx_2 = c$ vor, wird ein Richtungsvektor $v \perp n \iff v \perp (a, b)^T$ benötigt.
-
-    Man kann hier $v = (b, -a)^T$ wählen. Einen Aufpunkt $p$ erhält man, indem man z.B. $x_1 = 0$ oder $x_2 = 0$ setzt und aus der parameterlosen Form die andere Komponente errechnet.
-\end{algo}
-
-\begin{algo}{Punkt-Richtungsform $\to$ Normalform (Ebenen)}
-    Um einen Normalenvektor $n$ für die Richtungsvektoren $v, w$ zu erhalten, kann man das Kreuzprodukt der beiden Richtungsvektoren berechnen.
-
-    Als Aufpunkt lässt sich jeder Punkt der Ebene verwenden, insbesondere der Vektor $p$ aus der Punkt-Richtungsform.
-\end{algo}
-
-\begin{algo}{Normalform $\to$ Punkt-Richtungsform (Ebenen)}
-    Aus der Normalgleichung $ax_1 + bx_2 + cx_3 = d$ liest man den Normalenvektor $n = (a, b, c)^T$ ab.
-    Mindestens eine Komponente $n_i$ von $n$ ist ungleich $0$.
-    Wir vertauschen $n_i$ mit einer anderen Komponente $n_j$ und verändern das Vorzeichen von $n_j$ im so erzeugten Vektor.
-
-    Weil es zwei Möglichkeiten gibt $i \neq j$ zu wählen, erhalten wir zwei Vektoren $v$ und $w$, mit $v \perp n$, $w\perp n$ und $v \neq 0 \neq w$ und $v \not \parallel w$.
-
-    Ein Aufpunkt lässt sich errechnen, indem man zwei der drei Koordinaten von $x = (x_1, x_2, x_3)^T$ z.B. den Wert 0 zuweist und dann aus der Normalform den Wert der fehlenden Koordinate errechnet.
-
-    Sollte dies nicht möglich sein, wähle man ein anderes Koordinatenpaar. Es gibt immer zwei Koordinaten in $x$, mit denen obige Rechnung möglich ist.
-
-\end{algo}
-
-\begin{defi}{Lagebeziehungen von Geraden und Ebenen}
-    Geraden:
-    \begin{itemize}
-        \item Zwei Geraden in $\R^2$ oder $\R^3$ heißen \emph{parallel}, wenn ihre Richtungsvektoren parallel sind.
-        \item Zwei sich schneidende Geraden heißen \emph{orthogonal}, wenn ihre Richtungsvektoren orthogonal sind.
-        \item Seien $G$ und $G'$ zwei sich schneidende Geraden mit Richtungsvektoren $v$ bzw. $v'$. Der Winkel zwischen den Geraden wird definiert durch
-              $$
-                  \angle (G, G') := \min \{\angle (v, v'), \angle (v', v)\} = \arccos \left(\frac{\abs{\scalarprod{v, v'}}}{\norm{v} \norm{v'}}\right)
-              $$
-    \end{itemize}
-
-    Ebenen:
-    \begin{itemize}
-        \item Zwei Ebenen heißen \emph{parallel}, wenn ihre Normalenvektoren parallel sind. Sie heißen \emph{orthogonal}, wenn ihre Normalenvektoren orthogonal sind.
-        \item Sei $E$ eine Ebene mit Normalenvektor $n$. Eine Gerade mit Richtungsvektoren $v$ heißt \emph{parallel} zur Ebene $E$, falls $v \perp n$.
-        \item Seien $n$ und $n'$ Normalenvektoren der beiden Ebenen $E$ und $E'$. Dann wird der Winkel $\angle (E, E')$ zwischen den beiden Ebenen erklärt durch
-              $$
-                  \angle (E, E') := \min \{\angle (n, n'), \angle (n', n)\} = \arccos \left(\frac{\abs{\scalarprod{n, n'}}}{\norm{n} \norm{n'}}\right)
-              $$
-    \end{itemize}
-\end{defi}
-
-\begin{algo}{Schnittmengen zwischen Geraden und Ebenen in $\R^2$ und $\R^3$}
-    \begin{enumerate}
-        \item Man sorgt eventuell durch Umrechnung dafür, dass das eine Objekt durch eine parameterlose (\emph{Normalgleichung}) und das andere durch eine parameterbehaftete Gleichung (\emph{Punkt-Richtungsgleichung}) beschrieben wird.
-        \item Man setzt die Parametergleichung in die parameterlose Gleichung ein und erhält Ausdrücke für den oder die Parameter.
-        \item Diese setzt man in die Parametergleichung ein und erhält eine Parametrisierung der Schnittmenge.
-    \end{enumerate}
-\end{algo}
-
-\begin{example}{Schnittmenge zwischen einer Gerade und einer Ebene}
-    Gegeben seien $p = (1, -1, 2)^T$, $q = (1, 1, 1)^T$ und $n = (1, 2, 3)^T$.
-    Gesucht wird der Schnittpunkt der Geraden $G$ durch $p$ in Richtung von $n$ mit der Ebene $E$ durch $q$ senkrecht zu $n$.
-    Man verwendet bei der Gleichsetzung für $E$ eine Normal- und für $G$ eine Parameterform, z.B.
-    $$
-        x = \vektor{x_1, x_2, x_3} = \vektor{1 \\ -1 \\ 2} + \alpha \cdot \vektor{1 \\ 2\\ 3}.
-    $$
-    Komponentenweise liest man daraus die Gleichungen
-    $$
-        x_1 = 1 + \alpha \qquad x_2 = -1+2\alpha \qquad x_3 = 2+3\alpha
-    $$
-    ab. Eine Normalform von $E$ lautet
-    $$
-        \scalarprod{x, n} = \scalarprod{q, n} \iff x_1 + 2x_2 + 3x_3 = 6.
-    $$
-    Einsetzen in die Normalgleichung liefert dann $\alpha = \frac{1}{14}$.
-    Den Schnittpunkt $s$ erhält man durch Ensetzen von $\alpha$ in die Parametergleichung:
-    $$
-        s = p + \alpha n = \left(\frac{15}{14}, -\frac{12}{14}, \frac{31}{14}\right)^T.
-    $$\qed
-\end{example}
-
-\begin{bonus}{Lotfußpunkt}
-    Sei $G$ eine Gerade mit Richtungsvektor $v$ und $q \notin G$.
-    Ein Punkt $q'\in G$ heißt \emph{Lotfußpunkt}, wenn $l := q=q' \perp G$ gilt, $l$ heißt \emph{Lot}, und der Abstand $d$ zwischen einem Punkt und einer Geraden in $\R^3$ wird definiert durch $d := \norm{l}$.
-\end{bonus}
-
-\begin{algo}{Abstandsberechnung (Punkte, Geraden und Hyperebenen)}
-    Abstandsberechnungen zwischen Punkten, Geraden und Hyperebenen lassen sich auf die Berechnung des Lotfußpunktes zurückführen:
-
-    \begin{enumerate}
-        \item Bestimme die Richtung $r$ des Lots.
-        \item Bestimme jeweils einen Punkt auf den beiden Objekten und (durch Differenzbildung) den Abstandsvektor $a$ zwischen den beiden Punkten (Aufpunkte!).
-        \item Das Lot $l$ ist die Projektion von $a$ auf $r$. Der gesuchte Abstand ist $d = \norm{l}$.
-    \end{enumerate}
-    $$
-        l = \frac{\scalarprod{a, r}}{\scalarprod{r, r}} r \qquad d = \frac{\abs{\scalarprod{a, r}}}{\scalarprod{r, r}} \norm{r} = \frac{\abs{\scalarprod{a, r}}}{\norm{r}}
-    $$
-
-    Tipps:
-    \begin{itemize}
-        \item Ist eine Hyperebene beteiligt, dann wählt man $r$ als Normalenvektor $n$ der Hyperebene.
-        \item Bei zwei Geraden in $\R^3$ muss $r$ senkrecht auf beiden Geraden stehen.
-        \item Bei nicht parallelen Geraden wählt man $r$ als Vektorprodukt der beiden Richtungsvektoren.
-        \item Der Abstand zweier paralleler Geraden lässt sich auf den Abstand eines Punkts zu einer Geraden zurückführen.
-    \end{itemize}
-\end{algo}
-
-\begin{algo}{Abstand Punkt-Gerade im $\R^3$}
-    \begin{enumerate}
-        \item $a = l + r$, also $l = a-r$
-        \item $r$ ist die Projektion von $a$ auf den Richtungsvektor der Geraden $v$, also
-              $$
-                  r = \frac{\scalarprod{a, v}}{\scalarprod{v, v}}v
-              $$
-        \item Zusammen ergibt sich
-              $$
-                  l = a - \frac{\scalarprod{a, v}}{\scalarprod{v, v}}v \qquad d = \norm{l}
-              $$
-    \end{enumerate}
-\end{algo}
-
-\newpage
-\subsection{Die Determinante im $\R^2$ und $\R^3$}
-\begin{defi}{Determinante}
-    Sei $A \in \R^{n\times n}$.
-    \begin{itemize}
-        \item[\textbf{n=1:}] $A = (a_1)$. Dann gilt
-            $$
-                \det(A) := a_1
-            $$
-        \item[\textbf{n=2:}] Sei $A = (a, b)$ mit den Spaltenvektoren $a, b \in \R^2$. Dann gilt
-            $$
-                \det A = \det(a, b) := a_1b_2 - b_1a_2
-            $$
-            Der Betrag der Determinanten entspricht genau der Fläche des von $a$ und $b$ aufgespannten Parallelogramms.
-        \item[\textbf{n=3:}]
-            $$
-                \det(a, b, c) = \det \vektor{a_1 & b_1 & c_1 \\ a_2 & b_2 & c_2 \\ a_3 & b_3 & c_3} = a_1b_2c_3 + b_1c_2a_3 + c_1a_2b_3 - a_1c_2b_3 - b_1a_2c_3-c_1b_2a_3
-            $$
-    \end{itemize}
-
-\end{defi}
-
-\begin{defi}{Spatprodukt}
-    Für drei Vektoren $a, b, c \in \R^3$ nennt man
-    $$
-        \scalarprod{a, b \times c} \in \R
-    $$
-    das \emph{Spatprodukt} der drei Vektoren $a, b, c$.
-
-    Die Vektoren $a, b, c$ bilden die Kanten eines Körpers im dreidimensionalen Raum, eines \emph{Parallelipeds} oder \emph{Spats}.
-
-    Es entspricht also der Betrag der Determinante dem Volumen des durch die drei Spaltenvektoren aufgespannten Spats.
-\end{defi}
-
-\begin{bonus}{Determinante (Alternative)}
-    Seien $a, b, c \in \R^3$, $\phi$ der Winkel zwischen $a$ und $b$ sowie $\psi$ der Winkel zwischen den Vektoren $a\times b$ und $c$. Dann gilt:
-    $$
-        \det (a, b, c) = \norm{a} \norm{b} \norm{c} \sin \phi \cos \psi
-    $$
-\end{bonus}
-
-\begin{defi}{Eigenschaften der Determinante}
-    Die Determinante hat folgende Eigenschaften.
-    \begin{itemize}
-        \item[\textbf{D1}] $\det(a, b, c) = \det(c, a, b) = \det(b, c, a)$
-        \item[\textbf{D2}] $\det(a, b, c) = - \det(b, a, c)$
-        \item[\textbf{D3}] $\det(a, a, c) = 0$
-        \item[\textbf{D4}] Für $\alpha \in R$ gilt $\det(\alpha a, b, c) = \alpha \det(a, b, c)$
-        \item[\textbf{D5}] $\det(a,b, c + d) = \det(a, b, c) + \det(a, b, d)$
-        \item[\textbf{D6}] $\det A = \det A^T$
-    \end{itemize}
-\end{defi}
-
-\begin{bonus}{Lösbarkeit linearer Gleichungssysteme}
-    Notwendig und hinreichend dafür, dass das lineare Gleichungssystem $LG$ eine eindeutige Lösung besitzt, ist die Bedingung
-    $$
-        \det(a, b, c) \neq 0
-    $$
-\end{bonus}
-
-\newpage
-\section{Algebraische Strukturen}
-\subsection{Gruppen}
-
-\begin{defi}{Gruppe}
-    Sei $M$ eine Menge, und $\circ: M \times M \to M$ eine \emph{Verknüpfung}.
-    $(M, \circ)$ heißt Gruppe, wenn gilt:
-    \begin{itemize}
-        \item[\textbf{G1}] (Assoziativität): Die Verknüpfung ist assoziativ, d.h. es gilt:
-            $$
-                \forall x, y, z \in M : (x \circ y) \circ z = x \circ (y \circ z)
-            $$
-        \item[\textbf{G2}] (Neutralelement:) Es existiert ein neutrales Element $e \in M$ so dass
-            $$
-                \forall x \in M : x \circ e = x
-            $$
-        \item[\textbf{G3}] (Inverses Element:) $\forall x \in M \exists x'$ mit
-            $$
-                x \circ x' = e
-            $$
-        \item Gilt für eine Gruppe $G = (M, \circ)$, dass $x \circ y = y\circ x, \forall x, y \in M$, dann heißt $G$ \emph{abelsche Gruppe} oder \emph{kommutative Gruppe}.
-    \end{itemize}
-
-    Auch muss implizit gelten:
-    \begin{itemize}
-        \item $x \circ y$ existiert $\forall x, y \in M$ und ist eindeutig festgelegt
-        \item $x \circ y \in M$
-    \end{itemize}
-    Ist dies der Fall, ist die Abbildung $\circ: M \times M \to M$ \emph{wohldefiniert}.
-\end{defi}
-
-\begin{defi}{Untergruppe}
-    Sei $G = (M, \circ)$ eine Gruppe und $M' \subseteq M$. Bildet $U = (M', \circ)$ eine Gruppe, so heißt $U$ \emph{Untergruppe} von $G$, Schreibweise $U \leq G$.
-
-    Für $G$ und $U$ wie oben gilt $U \leq G$ genau dann, wenn gilt:
-    \begin{enumerate}
-        \item $M'\neq \emptyset$
-        \item $\forall a, b \in M' : a\circ b \in M'$
-        \item $\forall a \in M': a^{-1} \in M$
-    \end{enumerate}
-\end{defi}
-
-\newpage
-\subsection{Körper}
-\begin{defi}{Körper}
-    Das Tripel $(\R, +, \cdot)$ hat folgende Eigenschaften:
-    \begin{enumerate}
-        \item $(\R, +)$ bildet eine abelsche Gruppe.
-        \item $(\R \setminus \{0\}, \cdot)$ bildet eine abelsche Gruppe.
-        \item Es gelten die \emph{Distributivgesetze}
-              $$
-                  \forall x, y, z \in \R : (x+y) \cdot z = (x\cdot z) + (x \cdot y) \text{ und } x \cdot (y + z) = (x \cdot y) + (x \cdot z)
-              $$
-              \emph{Jedes} Tripel $(M, \oplus, \odot)$, das die obigen drei Bedingungen erfüllt, wird \emph{Körper} genannt.
-    \end{enumerate}
-\end{defi}
-
-\newpage
-\subsection{Vektorräume}
-\begin{defi}{Vektorraum}
-    Sei $K$ ein beliebiger Körper.
-    Eine nicht-leere Menge $V$ zusammen mit den beiden Abbildungen
-    $$
-        \begin{aligned}
-                         & \oplus : V \times V \to V, \quad (x, y) \to x \oplus y \in V
-            \text{ und } & \odot : K \times V \to V, \quad (\lambda, x) \to \lambda \odot x \in V
-        \end{aligned}
-    $$
-    heißt \emph{Vektorraum über K} oder \emph{K-Vektorraum}, wenn folgende Axiome gelten:
-    \begin{itemize}
-        \item $(V, \oplus)$ ist eine kommutative Gruppe.
-        \item $\forall \lambda, \mu \in K$ und $x \in V$ gilt $\lambda \odot (\mu \odot x) = (\lambda\mu) \odot x$, wobei mit $\lambda\mu$ die Multiplikation aus $K$ gemeint ist.
-        \item $\forall x \in V$ gilt $1 \odot x = x$ ($1$ ist das neutrale Element der Multiplikation aus $K$)
-        \item $\forall \lambda \in K, x, y \in V$ gilt: $\lambda \odot (x \oplus y) = (\lambda x) \oplus (\lambda \odot y)$.
-        \item $\forall \lambda, \mu \in K, x \in V$ gilt $(\lambda + \mu) \odot x = (\lambda \odot x) \oplus (\lambda \odot x)$
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Untervektorraum}
-    Eine Teilmenge $U \subseteq V$ heißt \emph{Untervektorraum} oder \emph{Unterraum} von $V$, wenn $U \neq \emptyset$ und $\forall x, y \in U$ und alle $\lambda \in K$ gilt:
-    $$
-        \begin{aligned}
-             & x \oplus y \in U,      \\
-             & \lambda \odot x \in U.
-        \end{aligned}
-    $$
-\end{defi}
-
-\newpage
-\subsection{Lineare Unabhängigkeit, Basis, Dimension}
-
-Seien $v_1, \ldots, v_r \in V$ Vektoren eines $K$-Vektorraums $V$.
-
-\begin{defi}{Linearkombination}
-    Lässt sich $v\in V$ als Summe dieser Vektoren mit Vorfaktoren darstellen,
-    $$
-        v = \sum^r_{k=1} \lambda_kv_k
-    $$
-    heißt $v$ $Linearkombination$ von $v_1, \ldots, v_r$.
-\end{defi}
-
-\begin{defi}{Lineare Hülle}
-    Die Menge
-    $$
-        L(v_1, \ldots, v_r) := \left\{ \sum^r_{k=1} \lambda_kv_k \mid \lambda_i \in K \right\} \subseteq V
-    $$
-    aller Linearkombinationen heißt \emph{Lineare Hülle} von $v_1, \ldots, v_r$.
-\end{defi}
-
-\begin{defi}{Erzeugendensystem}
-    Sei $V$ ein $K$-Vektorraum und $(v_1, \ldots, v_n)$ ein $n$-Tupel von Vektoren in $V$.
-    Gilt $L(v_1, \ldots, v_n) = V$, nennt man $(v_1, \ldots, v_n)$ ein \emph{Erzeugendensystem} von $V$.
-
-    $V$ heißt \emph{endlich erzeugt}, wenn es endlich viele Vektoren $v_1, \ldots, v_r$ gibt, so dass  $L(v_1, \ldots, v_r) = V$, ansonsten \emph{nicht endlich erzeugt}.
-\end{defi}
-
-\begin{defi}{Lineare Unabhängigkeit}
-    Sei $V$ ein $K$-Vektorraum. Ein $r$-Tupel $(v_1, \ldots, v_r)$ von Vektoren in $V$ heißt \emph{linear unabhängig}, wenn aus $\lambda_1v_1 +\lambda_2v_2 + \ldots + \lambda_rv_r = 0$ stets folgt, dass $\lambda_1 = \lambda_2 = \ldots = \lambda_r = 0$ gilt.
-
-    Außerdem gilt:
-    \begin{itemize}
-        \item Keiner der Vektoren ist eine Linearkombination der übrigen.
-        \item Keiner der Vektoren ist der Nullvektor.
-    \end{itemize}
-
-    Tipp: Ein $r$-Tupel $(v_1, \ldots, v_r)$ von Vektoren in $V$ ist \emph{linear unabhängig} genau dann, wenn $\det(v_1, \ldots, v_r) \neq 0$.
-\end{defi}
-
-\begin{bonus}{Lineare Unabhängigkeit von Funktionen}
-    Wir bilden zu den Funktionen $f_1, \ldots, f_n$ für paarweise verschiedene $x_1, \ldots, x_n$ die $n$ Vektoren
-    $$
-        (f_1(x_1), \ldots, f_1(x_n))^T, \ldots, (f_n(x_1), \ldots, f_n(x_n))^T \in \mathbb{K}^n.
-    $$
-    Sind diese Vektoren linear unabhängig, dann sind die Funktionen $f_1, \ldots, f_n$ selbst linear unabhängig.
-
-    Hinweis: Die Rückrichtung gilt \textbf{nicht}!
-\end{bonus}
-
-\begin{defi}{Basis}
-    Sei $v \neq \{0\}$ ein endlich erzeugter $K$-Vektorraum und $v_1, \ldots, v_n \in V$. Das $n$-Tupel $B = (v_1, \ldots, v_n)$ heißt \emph{Basis} oder \emph{minimales Erzeugendensystem} von $V$, wenn $B$ linear unabhängig ist und wenn gilt $L(B) = V$.
-    Weiter sei $\emptyset$ die Basis des Nullvektorraums $\{0\}$.
-\end{defi}
-
-\begin{bonus}{Koordinaten eines Vektors}
-    Sei $(v_1, \ldots, v_n)$ eine Basis von $V$ und $v \in V$ mit
-    $$
-        v = \lambda_1v_1 + \ldots + \ldots_nv_n, \lambda_i, \ldots, \lambda_n \in K
-    $$
-    Das $n$-Tupel der obigen Vorfaktoren $(\lambda_1, \ldots, \lambda_n) \in K^n$ nennt man \emph{Koordinaten} des Vektors $v$ bzgl. der Basis $(v_1, \ldots, v_n)$.
-\end{bonus}
-
-\begin{defi}{Basisergänzungssatz}
-    Sei $V$ ein $K$-Vektorraum und seien
-    $$
-        v_1, \ldots, v_r, \quad w_1, \ldots w_s \in V
-    $$
-    Ist $(v_1, \ldots, v_r)$ linear unabhängig und ist
-    $$
-        L(v_1, \ldots, v_r, w_1, \ldots w_s) = V,
-    $$
-    dann kann man $(v_1, \ldots, v_r)$ durch evtl. Hinzunahme geeigneter Vektoren aus $\{w_1, \ldots w_s\}$ zu einer Basis von $V$ ergänzen.
-\end{defi}
-
-\begin{defi}{Austauschlemma}
-    Sind $(v_1, \ldots, v_n)$, $(w_1, \ldots w_n)$ Basen eines $K$-Vektorraums $V$, dann gibt es zu jedem $v_i$ ein $w_j$, so dass aus $(v_1, \ldots, v_n)$ wieder eine Basis entsteht, wenn man in ihr $v_i$ durch $w_j$ ersetzt.
-\end{defi}
-
-\begin{defi}{Dimension}
-    Besitzt ein Vektorraum $v \neq \{0\}$ eine Basis $(v_1, \ldots, v_n)$, so definieren wir die \emph{Dimension} von $V$ als $\dim(V) := n$.
-    Besitzt $V$ keine endliche Basis, dann setzt man $\dim(V) := \infty$. Weiter sei $\dim(\{0\}) := 0$.
-\end{defi}
-
-\newpage
-\subsection{Polynome}
-\begin{defi}{Polynom}
-    Ein \emph{Polynom} oder ganzrationale Funktion $p : \mathbb{K} \to \mathbb{K}$ ist eine Funktion der Gestalt
-    $$
-        p(x) = a_0 + a_1x + a_2x^x + \ldots + a_nx_n = \sum^n_{k=0} a_kx^k
-    $$.
-\end{defi}
-
-\begin{bonus}{Polynome als $\mathbb{K}$-Vektorraum}
-    Sei $+$ die Addition von Funktionen und $\cdot$ die Multiplikation einer Funktion mit einem Skalar. Dann bildet $(P_n, +, \cdot)$ einen $\mathbb{K}$-Vektorraum.
-\end{bonus}
-
-\begin{bonus}{Basis des Vektorraums $P_n$}
-    Die Funktionen $1, x, x^2, \ldots, x^n$ bilden eine Basis des Vektorraums $P_n$ und es gilt
-    $$
-        \dim(P_n) = n + 1.
-    $$
-    Diese Basis wird auch \emph{Monombasis} genannt.
-\end{bonus}
-
-\begin{defi}{Interpolationspolynom}
-    Gegeben seien die $n+1$-Punkte $(x_k, y_k), 0 \leq k \leq n$ mit \emph{paarweise verschiedenen} $x_k$.
-    Dann existiert genau ein $p_n \in P_n$ mit $y_k = p_n(x_k) \forall 0 \leq k \leq n$.
-    Dies ist das sogenannte \emph{Interpolationspolynom}.
-\end{defi}
-
-\begin{example}{Interpolationspolynom}
-    Wir betrachten die drei Punkte $(-2, 1)$, $(-1, -1)$ und $(1, 1)$.
-
-    Eine interpolierende Parabel $p_2$ wird durch diese Punkte festgelegt.
-
-    Die allgemeine Form des Polynoms ist $p_2(x) = ax^2 + bx + c$.
-    Einsetzen der drei Punkte ergibt die Gleichungen
-    $$
-        \begin{aligned}
-            (1, 1): \quad   & 1 = a + b + c   \\
-            (-1, -1): \quad & -1 = a - b + c  \\
-            (-2, 1): \quad  & 1 = 4a - 2b + c \\
-        \end{aligned}
-    $$
-    und führt damit zu einem linearen Gleichungssystem.
-
-    Man errechnet als Lösung $a = 1$, $b = 1$, $c = -1$ und erhält
-    $$
-        p_2(x) = x^2 + x -1.
-    $$\qed
-\end{example}
-
-\begin{example}{Lineare Unabhängigkeit von Polynomen}
-    Die Polynome
-    $$
-        p_1(x) = (1-x)^2 \qquad p_2(x) = (1-x)x \qquad p_3(x) = x^2
-    $$
-    sollen auf lineare Unabhängigkeit geprüft werden.
-    Wir berechnen zunächst die Koeffizientenvektoren.
-    $$
-        \begin{aligned}
-             & p_1(x) = (1-x)^2 &  & =1-2x+1x^2  &  & \implies a_{0_1} = 1, ~a_{1_1} = -2, ~a_{2_1} = 1 \\
-             & p_2(x) = (1-x)x  &  & =0+ 1x -x^2 &  & \implies a_{0_2} = 0, ~a_{1_2} = 1, ~a_{2_2} = -1 \\
-             & p_3(x) = x^2     &  &             &  & \implies a_{0_3} = 0, ~a_{1_3} = 0, ~a_{2_3} = 1
-        \end{aligned}
-    $$
-
-    $\det(a_0, a_1, a_2) \neq 0$ und damit sind die Polynome linear unabhängig.\qed
-\end{example}
-
-\subsection{Skalarprodukte, euklidische und unitäre Räume}
-\begin{defi}{Euklidische und unitäre Vektorräume}
-    Ein reeller Vektorraum gemeinsam mit einem Skalarprodukt heißt \emph{euklidischer Vektorraum}, ein komplexer Vektorraum mit einem Skalarprodukt heißt \emph{unitärer Vektorraum}.
-\end{defi}
-
-\begin{defi}{Orthogonale Projektion}
-    Sei $U$ ein endlich erzeugter Untervektorraum von $V$ und $a \in V$.
-    Ein Vektor $p_u(a) \in U$ heißt \emph{orthogonale Projektion} von $a$ auf $U$, wenn gilt:
-    $$
-        a - p_U(a) \perp u \quad \forall u \in U.
-    $$
-\end{defi}
-
-\begin{defi}{Orthogonales Komplement}
-    Für $M \subseteq V$ heißt
-    $$
-        M^\perp := \{v\in V \mid v \perp u \quad \forall u \in M\}
-    $$
-    das \emph{orthogonale Komplement} von $M$.
-\end{defi}
-
-\begin{defi}{Orthogonalsystem, Orthonormalsystem, Orthogonalbasis, Orthonormalbasis}
-    Sei $B = (v_1, \ldots, v_m)$ ein $m$-Tupel mit Vektoren in $V\setminus \{0\}$.
-    \begin{enumerate}
-        \item $B$ heißt \emph{Orthogonalsystem} in $V$, falls alle $v_i$ paarweise orthogonal sind.
-        \item Ein Orthogonalsystem, für das zusätzlich $\forall v_i \in B: \norm{v_i} = 1$ gilt, heißt \emph{Orthonormalsystem}.
-        \item Ein Orthogonalsystem, das eine Basis von $V$ bildet, heißt \emph{Orthogonalbasis} von $V$.
-        \item Ein Orthonormalsystem, das eine Basis von $V$ bildet, heißt \emph{Orthonormalbasis} von $V$.
-    \end{enumerate}
-\end{defi}
-
-\subsection{Das Verfahren von Gram-Schmidt}
-\begin{defi}{Gram-Schmidt-Verfahren}
-    Sei $V$ ein unitärer Vektorraum und $v_1, \ldots, v_m$ linear unabhängig.
-    Seien
-    $$
-        \begin{aligned}
-            w_1     & :={} \frac{v_1}{\norm{v_1}}                              \\
-            r_{k+1} & :={} v_{k+1} - \sum^k_{i=1} \scalarprod{v_{i+1}, w_i}w_i \\
-            w_{k+1} & :={} \frac{r_{k+1}}{\norm{r_{k+1}}}
-        \end{aligned}
-    $$
-    Dann bilden $(w_1, \ldots, w_m)$ eine Orthonormalbasis von $L(v_1, \ldots, v_m)$.
-\end{defi}
-
-\begin{example}{Gram-Schmidt-Verfahren (allgemein)}
-    Wir betrachten eine beliebige Basis $(v_1, v_2, v_3)$ von $\R^3$.
-    Wir gehen so vor:
-    \begin{enumerate}
-        \item Man wählt einfach $w_1 = \frac{1}{\norm{v_1}}v_1$, weil dann offenbar $\norm{w_1} = 1$ gilt.
-        \item Wir konstruieren einen Vektor $r_2$, der senkrecht auf $w_1$ steht.
-              Dazu projizieren wir $v_2$ auf den von $w_1$ erzeugen Unterraum $L(w_1)$ und setzen $r_2 := v_2 - p_{L(v_1)}(v_2)$.
-              Dann gilt nach Definition der orthogonalen Projektion $v_1 \perp r_2$.
-              Man erhält
-              $$
-                  r_2 = v_2 - \scalarprod{v_2, w_1}w_1.
-              $$
-              Normierung von $r_2$ liefert $w_2$.
-        \item Der Vektor $r_3 := v_3 - p_{L(v_1, v_2)}(v_3)$ steht nach Konstruktion senkrecht auf $L(v_1, v_2)$ und daher gilt insbesonere $r_3 \perp v_1$ und $r_3 \perp v_2$.
-              Weil $(w_1, w_2)$ eine Orthonormalbasis von $L(v_1, v_2)$ bilden, gilt:
-              $$
-                  r_3 = v_3 - \scalarprod{v_3, w_1}w_1 - \scalarprod{v_3, w_2}w_2
-              $$
-              Normierung von $r_3$ ergibt $w_3$.
-    \end{enumerate}
-\end{example}
-
-
-\printindex
-\printindex[Beispiele]
-\end{document}
+\documentclass[german]{../spicker}
+
+\usepackage{amsmath}
+\usepackage{polynom}
+
+\title{Lineare Algebra 1}
+\author{Patrick Gustav Blaneck}
+\makeindex[intoc]
+\makeindex[intoc, name=Beispiele,title=Beispiele]
+
+\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
+\newcommand{\vektor}[1]{\begin{pmatrix*}[r] #1 \end{pmatrix*}}
+\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
+\newcommand{\dx}{~\mathrm{d}x}
+
+\begin{document}
+\maketitle
+\tableofcontents
+\newpage
+
+%\setcounter{section}{1}
+
+\section{Analytische Geometrie}
+
+\subsection{Skalarprodukt und Norm}
+
+\begin{defi}{Skalarprodukt}
+    Eine Abbildung $\scalarprod{\cdot, \cdot}$ heißt Skalarprodukt, wenn folgende Bedingungen erfüllt sind:
+    \begin{itemize}
+        \item[\textbf{SP1}] Symmetrie: $\forall a, b \in \R^n: \scalarprod{a, b} = \scalarprod{b, a}$
+        \item[\textbf{SP2}] $\forall a, b, c \in \R^n: \scalarprod{a, b+c} = \scalarprod{a, b} + \scalarprod{a, c}$
+        \item[\textbf{SP3}] $\forall a \in \R^n: \scalarprod{\alpha a, b} = \alpha \scalarprod{a, b} = \scalarprod{a, \alpha b}$
+        \item[\textbf{SP4}] positive Definitheit: $\forall a \in \R^n \setminus \{0\}: \scalarprod{a, a} > 0 \land \scalarprod{0, 0} = 0$
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Euklidisches Skalarprodukt}
+    Für $a, b$ sei ihr \emph{euklidisches Skalarprodukt} $\scalarprod{a, b}$ definiert als
+    $$
+        \scalarprod{a, b} := \sum_{i=1}^n a_ib_i
+    $$
+\end{defi}
+
+\begin{defi}{Norm}
+    Eine Norm $\norm{a}$ hat folgende Eigenschaften:
+    \begin{itemize}
+        \item[\textbf{N0}] $\norm{a} \in \R$
+        \item[\textbf{N1}] $\norm{a} \geq 0$
+        \item[\textbf{N2}] $\norm{a} = 0 \iff a = 0$
+        \item[\textbf{N3}] $\forall \lambda \in \R : \norm{\lambda a} = \abs{\lambda} \norm{a}$
+        \item[\textbf{N4}] Dreiecksungleichung $\norm{a+b} \leq \norm{a} + \norm{b}$
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Euklidische Norm}
+    Einem Vektor $a$ wird die \emph{euklidische Norm} oder \emph{Standardnorm} $\norm{a}$ zugeordnet durch
+    $$
+        \norm{a} := \left(\sum_{i=1}^n a_i^2\right)^{\frac{1}{2}}
+    $$
+\end{defi}
+
+\begin{bonus}{Diskrete Minkowskische Ungleichung}
+    Für $p \geq 1$ definiert man die $\ell_p$-Norm durch
+    $$
+        \norm{a}_p := \left(\sum^n_{i=1} \abs{a_i}^p\right)^\frac{1}{p}
+    $$
+    \begin{itemize}
+        \item $p=1$: \emph{Betragssummennorm} oder \emph{Einsernorm}
+        \item $p=2$: euklidische Norm
+        \item $p=\infty$: \emph{Maximumnorm} pder $\ell_\infty$\emph{-Norm} ($\norm{a}_\infty = \max\{\abs{a_i}, \ldots, \abs{a_n}\}$)
+    \end{itemize}
+\end{bonus}
+
+\begin{defi}{Orthogonalität}
+    Seien $a,b \in \R^n$ und $\scalarprod{\cdot, \cdot}$ ein beliebiges Skalarprodukt.
+    Die Vektoren $a$ und $b$ stehen \emph{orthogonal} zueinander bzgl. $\scalarprod{\cdot, \cdot}$, Schreibweise $a \perp b$, wenn $\scalarprod{a, b} = 0$.
+\end{defi}
+
+\begin{algo}{Orthogonalen Vektor finden}
+    Wir betrachten den Vektor $a= (a_1, a_2)^T$.
+    Für den senkrechten Vektor $a'$ gilt: $(-a_2, a_1)^T$.
+\end{algo}
+
+\begin{bonus}{Satz des Pythagoras}
+    Seien $a,b \in \R^n$ mit $a \perp b$ und $\scalarprod{\cdot, \cdot}$ ein beliebiges Skalarprodukt.
+    Dann gilt:
+    $$
+        \norm{a + b}^2 = \norm{a}^2 + \norm{b}^2
+    $$
+\end{bonus}
+
+\begin{defi}{Orthogonale Projektion}
+    Seien $a, b$ zwei Vektoren und $b \neq 0$. Dann gilt für die orthogonale Projektion $p$ von $a$ in Richtung $b$:
+    $$
+        p_b(a) = \frac{\scalarprod{a, b}}{\scalarprod{b, b}} b
+    $$
+\end{defi}
+
+\begin{bonus}{Cauchy-Schwarzsche Ungleichung}
+    Für $a, b \in \R^n$ gilt:
+    $$
+        \abs{\scalarprod{a, b}} \leq \norm{a} \norm{b}
+    $$
+\end{bonus}
+
+\begin{defi}{Winkel zwischen Vektoren}
+    Seien $a, b\in \R^n\setminus \{0\}$.
+    Der Winkel zwischen $a$ und $b$, geschrieben $\angle (a, b)$, wird definiert als
+    $$
+        \angle (a, b) := \arccos \frac{\scalarprod{a, b}}{\norm{a} \norm{b}}
+    $$
+\end{defi}
+
+\begin{defi}{Vektorprodukt (Kreuzprodukt)}
+    Seien $a, b \in \R^n$. Dann heißt
+    $$
+        a \times b := \vektor{a_2b_3-a_3b_2 \\ a_3b_1-a_1b_3 \\ a_1b_2 - a_2b_1}
+    $$
+    das \emph{Vektorprodukt} oder \emph{Kreuzprodukt} von $a$ und $b$.
+\end{defi}
+
+\newpage
+\subsection{Geraden und Ebenen}
+
+\begin{defi}{Gerade (Punkt-Richtungsgleichung)}
+    Für einen \emph{Ortsvektor} oder \emph{Aufpunkt} $p$ und einen \emph{Richtungsvektor} $v \neq 0$ heißt
+    $$
+        x = p + \alpha v
+    $$
+    \emph{Punkt-Richtungsgleichung} einer \emph{Geraden} $G$.
+\end{defi}
+
+\begin{defi}{Gerade (Normalform in der Ebene)}
+    Sei $G$ eine Gerade in der Ebene, $p$ der Aufpunkt und $v$ der Richtungsvektor von $G$.\\
+    Gilt $n \perp v$, dann heißt
+    $$
+        \scalarprod{x,n} = \scalarprod{p, n} \iff n_1x_1 + n_2x_2 = c
+    $$
+    \emph{Normalform} von $G$.
+\end{defi}
+
+\begin{defi}{Ebene (Punkt-Richtungsgleichung)}
+    Seien $p, v, w \in \R^3, v\neq 0$ und $w \neq 0$, und seien $v$ und $w$ nicht parallel.
+    Dann heißt
+    $$
+        x = p + \alpha v + \beta w
+    $$
+    \emph{Punkt-Richtungsgleichung} einer \emph{Ebene} $E$.
+\end{defi}
+
+\begin{defi}{Ebene (Normalform)}
+    Sei $E$ eine Ebene im Raum, $p$ der Aufpunkt und $v, w$ Richtungsvektoren von $E$. \\
+    Gilt $n \perp v \land n \perp w$, dann heißt
+    $$
+        \scalarprod{x, n} = \scalarprod{p, n} \iff n_1x_1 + n_2x_2 + n_3x_3 = d
+    $$
+    \emph{Normalform} von $E$.
+\end{defi}
+
+
+\begin{defi}{Hessesche Normalform}
+    Sei $n$ ein Normalenvektor einer Gerade $G$ in der Ebene oder einer Ebene $E$ im Raum.
+    Gilt $\norm{n} = 1$, so heißt die damit gebildete Normalform \emph{Hessesche Normalform}.
+\end{defi}
+
+\begin{algo}{Normalform $\to$ Hessesche Normalform (Geraden und Ebenen)}
+    Man erhält die Hessesche Normalform aus einer beliebigen Normalform, indem man die Normalform durch $\norm{n}$ teilt:
+    $$
+        \frac{\scalarprod{x, n}}{\norm{n}} = \frac{\scalarprod{p, n}}{\norm{n}}
+    $$
+    Damit liegt der Normalvektor bis auf das Vorzeichen eindeutig fest.
+\end{algo}
+
+\begin{algo}{Punkt-Richtungsform $\to$ Normalform (Geraden)}
+    Sei eine Gerade $G$ gegeben durch $x = p + \alpha v$ mit $v = (v_1, v_2)^T$.
+    Einene Normalenvektor $n$ findet man durch
+    $$
+        n := \vektor{v_2 \\ -v_1}.
+    $$
+    Durch Ausrechnen von $\scalarprod{p, n}$ erhält man die rechte Seite der Normalform.
+\end{algo}
+
+\begin{algo}{Normalform $\to$ Punkt-Richtungsform (Geraden)}
+    Liegt die Gerade in der Normalform $ax_1 + bx_2 = c$ vor, wird ein Richtungsvektor $v \perp n \iff v \perp (a, b)^T$ benötigt.
+
+    Man kann hier $v = (b, -a)^T$ wählen. Einen Aufpunkt $p$ erhält man, indem man z.B. $x_1 = 0$ oder $x_2 = 0$ setzt und aus der parameterlosen Form die andere Komponente errechnet.
+\end{algo}
+
+\begin{algo}{Punkt-Richtungsform $\to$ Normalform (Ebenen)}
+    Um einen Normalenvektor $n$ für die Richtungsvektoren $v, w$ zu erhalten, kann man das Kreuzprodukt der beiden Richtungsvektoren berechnen.
+
+    Als Aufpunkt lässt sich jeder Punkt der Ebene verwenden, insbesondere der Vektor $p$ aus der Punkt-Richtungsform.
+\end{algo}
+
+\begin{algo}{Normalform $\to$ Punkt-Richtungsform (Ebenen)}
+    Aus der Normalgleichung $ax_1 + bx_2 + cx_3 = d$ liest man den Normalenvektor $n = (a, b, c)^T$ ab.
+    Mindestens eine Komponente $n_i$ von $n$ ist ungleich $0$.
+    Wir vertauschen $n_i$ mit einer anderen Komponente $n_j$ und verändern das Vorzeichen von $n_j$ im so erzeugten Vektor.
+
+    Weil es zwei Möglichkeiten gibt $i \neq j$ zu wählen, erhalten wir zwei Vektoren $v$ und $w$, mit $v \perp n$, $w\perp n$ und $v \neq 0 \neq w$ und $v \not \parallel w$.
+
+    Ein Aufpunkt lässt sich errechnen, indem man zwei der drei Koordinaten von $x = (x_1, x_2, x_3)^T$ z.B. den Wert 0 zuweist und dann aus der Normalform den Wert der fehlenden Koordinate errechnet.
+
+    Sollte dies nicht möglich sein, wähle man ein anderes Koordinatenpaar. Es gibt immer zwei Koordinaten in $x$, mit denen obige Rechnung möglich ist.
+
+\end{algo}
+
+\begin{defi}{Lagebeziehungen von Geraden und Ebenen}
+    Geraden:
+    \begin{itemize}
+        \item Zwei Geraden in $\R^2$ oder $\R^3$ heißen \emph{parallel}, wenn ihre Richtungsvektoren parallel sind.
+        \item Zwei sich schneidende Geraden heißen \emph{orthogonal}, wenn ihre Richtungsvektoren orthogonal sind.
+        \item Seien $G$ und $G'$ zwei sich schneidende Geraden mit Richtungsvektoren $v$ bzw. $v'$. Der Winkel zwischen den Geraden wird definiert durch
+              $$
+                  \angle (G, G') := \min \{\angle (v, v'), \angle (v', v)\} = \arccos \left(\frac{\abs{\scalarprod{v, v'}}}{\norm{v} \norm{v'}}\right)
+              $$
+    \end{itemize}
+
+    Ebenen:
+    \begin{itemize}
+        \item Zwei Ebenen heißen \emph{parallel}, wenn ihre Normalenvektoren parallel sind. Sie heißen \emph{orthogonal}, wenn ihre Normalenvektoren orthogonal sind.
+        \item Sei $E$ eine Ebene mit Normalenvektor $n$. Eine Gerade mit Richtungsvektoren $v$ heißt \emph{parallel} zur Ebene $E$, falls $v \perp n$.
+        \item Seien $n$ und $n'$ Normalenvektoren der beiden Ebenen $E$ und $E'$. Dann wird der Winkel $\angle (E, E')$ zwischen den beiden Ebenen erklärt durch
+              $$
+                  \angle (E, E') := \min \{\angle (n, n'), \angle (n', n)\} = \arccos \left(\frac{\abs{\scalarprod{n, n'}}}{\norm{n} \norm{n'}}\right)
+              $$
+    \end{itemize}
+\end{defi}
+
+\begin{algo}{Schnittmengen zwischen Geraden und Ebenen in $\R^2$ und $\R^3$}
+    \begin{enumerate}
+        \item Man sorgt eventuell durch Umrechnung dafür, dass das eine Objekt durch eine parameterlose (\emph{Normalgleichung}) und das andere durch eine parameterbehaftete Gleichung (\emph{Punkt-Richtungsgleichung}) beschrieben wird.
+        \item Man setzt die Parametergleichung in die parameterlose Gleichung ein und erhält Ausdrücke für den oder die Parameter.
+        \item Diese setzt man in die Parametergleichung ein und erhält eine Parametrisierung der Schnittmenge.
+    \end{enumerate}
+\end{algo}
+
+\begin{example}{Schnittmenge zwischen einer Gerade und einer Ebene}
+    Gegeben seien $p = (1, -1, 2)^T$, $q = (1, 1, 1)^T$ und $n = (1, 2, 3)^T$.
+    Gesucht wird der Schnittpunkt der Geraden $G$ durch $p$ in Richtung von $n$ mit der Ebene $E$ durch $q$ senkrecht zu $n$.
+    Man verwendet bei der Gleichsetzung für $E$ eine Normal- und für $G$ eine Parameterform, z.B.
+    $$
+        x = \vektor{x_1, x_2, x_3} = \vektor{1 \\ -1 \\ 2} + \alpha \cdot \vektor{1 \\ 2\\ 3}.
+    $$
+    Komponentenweise liest man daraus die Gleichungen
+    $$
+        x_1 = 1 + \alpha \qquad x_2 = -1+2\alpha \qquad x_3 = 2+3\alpha
+    $$
+    ab. Eine Normalform von $E$ lautet
+    $$
+        \scalarprod{x, n} = \scalarprod{q, n} \iff x_1 + 2x_2 + 3x_3 = 6.
+    $$
+    Einsetzen in die Normalgleichung liefert dann $\alpha = \frac{1}{14}$.
+    Den Schnittpunkt $s$ erhält man durch Ensetzen von $\alpha$ in die Parametergleichung:
+    $$
+        s = p + \alpha n = \left(\frac{15}{14}, -\frac{12}{14}, \frac{31}{14}\right)^T.
+    $$\qed
+\end{example}
+
+\begin{bonus}{Lotfußpunkt}
+    Sei $G$ eine Gerade mit Richtungsvektor $v$ und $q \notin G$.
+    Ein Punkt $q'\in G$ heißt \emph{Lotfußpunkt}, wenn $l := q=q' \perp G$ gilt, $l$ heißt \emph{Lot}, und der Abstand $d$ zwischen einem Punkt und einer Geraden in $\R^3$ wird definiert durch $d := \norm{l}$.
+\end{bonus}
+
+\begin{algo}{Abstandsberechnung (Punkte, Geraden und Hyperebenen)}
+    Abstandsberechnungen zwischen Punkten, Geraden und Hyperebenen lassen sich auf die Berechnung des Lotfußpunktes zurückführen:
+
+    \begin{enumerate}
+        \item Bestimme die Richtung $r$ des Lots.
+        \item Bestimme jeweils einen Punkt auf den beiden Objekten und (durch Differenzbildung) den Abstandsvektor $a$ zwischen den beiden Punkten (Aufpunkte!).
+        \item Das Lot $l$ ist die Projektion von $a$ auf $r$. Der gesuchte Abstand ist $d = \norm{l}$.
+    \end{enumerate}
+    $$
+        l = \frac{\scalarprod{a, r}}{\scalarprod{r, r}} r \qquad d = \frac{\abs{\scalarprod{a, r}}}{\scalarprod{r, r}} \norm{r} = \frac{\abs{\scalarprod{a, r}}}{\norm{r}}
+    $$
+
+    Tipps:
+    \begin{itemize}
+        \item Ist eine Hyperebene beteiligt, dann wählt man $r$ als Normalenvektor $n$ der Hyperebene.
+        \item Bei zwei Geraden in $\R^3$ muss $r$ senkrecht auf beiden Geraden stehen.
+        \item Bei nicht parallelen Geraden wählt man $r$ als Vektorprodukt der beiden Richtungsvektoren.
+        \item Der Abstand zweier paralleler Geraden lässt sich auf den Abstand eines Punkts zu einer Geraden zurückführen.
+    \end{itemize}
+\end{algo}
+
+\begin{algo}{Abstand Punkt-Gerade im $\R^3$}
+    \begin{enumerate}
+        \item $a = l + r$, also $l = a-r$
+        \item $r$ ist die Projektion von $a$ auf den Richtungsvektor der Geraden $v$, also
+              $$
+                  r = \frac{\scalarprod{a, v}}{\scalarprod{v, v}}v
+              $$
+        \item Zusammen ergibt sich
+              $$
+                  l = a - \frac{\scalarprod{a, v}}{\scalarprod{v, v}}v \qquad d = \norm{l}
+              $$
+    \end{enumerate}
+\end{algo}
+
+\newpage
+\subsection{Die Determinante im $\R^2$ und $\R^3$}
+\begin{defi}{Determinante}
+    Sei $A \in \R^{n\times n}$.
+    \begin{itemize}
+        \item[\textbf{n=1:}] $A = (a_1)$. Dann gilt
+            $$
+                \det(A) := a_1
+            $$
+        \item[\textbf{n=2:}] Sei $A = (a, b)$ mit den Spaltenvektoren $a, b \in \R^2$. Dann gilt
+            $$
+                \det A = \det(a, b) := a_1b_2 - b_1a_2
+            $$
+            Der Betrag der Determinanten entspricht genau der Fläche des von $a$ und $b$ aufgespannten Parallelogramms.
+        \item[\textbf{n=3:}]
+            $$
+                \det(a, b, c) = \det \vektor{a_1 & b_1 & c_1 \\ a_2 & b_2 & c_2 \\ a_3 & b_3 & c_3} = a_1b_2c_3 + b_1c_2a_3 + c_1a_2b_3 - a_1c_2b_3 - b_1a_2c_3-c_1b_2a_3
+            $$
+    \end{itemize}
+
+\end{defi}
+
+\begin{defi}{Spatprodukt}
+    Für drei Vektoren $a, b, c \in \R^3$ nennt man
+    $$
+        \scalarprod{a, b \times c} \in \R
+    $$
+    das \emph{Spatprodukt} der drei Vektoren $a, b, c$.
+
+    Die Vektoren $a, b, c$ bilden die Kanten eines Körpers im dreidimensionalen Raum, eines \emph{Parallelipeds} oder \emph{Spats}.
+
+    Es entspricht also der Betrag der Determinante dem Volumen des durch die drei Spaltenvektoren aufgespannten Spats.
+\end{defi}
+
+\begin{bonus}{Determinante (Alternative)}
+    Seien $a, b, c \in \R^3$, $\phi$ der Winkel zwischen $a$ und $b$ sowie $\psi$ der Winkel zwischen den Vektoren $a\times b$ und $c$. Dann gilt:
+    $$
+        \det (a, b, c) = \norm{a} \norm{b} \norm{c} \sin \phi \cos \psi
+    $$
+\end{bonus}
+
+\begin{defi}{Eigenschaften der Determinante}
+    Die Determinante hat folgende Eigenschaften.
+    \begin{itemize}
+        \item[\textbf{D1}] $\det(a, b, c) = \det(c, a, b) = \det(b, c, a)$
+        \item[\textbf{D2}] $\det(a, b, c) = - \det(b, a, c)$
+        \item[\textbf{D3}] $\det(a, a, c) = 0$
+        \item[\textbf{D4}] Für $\alpha \in R$ gilt $\det(\alpha a, b, c) = \alpha \det(a, b, c)$
+        \item[\textbf{D5}] $\det(a,b, c + d) = \det(a, b, c) + \det(a, b, d)$
+        \item[\textbf{D6}] $\det A = \det A^T$
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{Lösbarkeit linearer Gleichungssysteme}
+    Notwendig und hinreichend dafür, dass das lineare Gleichungssystem $LG$ eine eindeutige Lösung besitzt, ist die Bedingung
+    $$
+        \det(a, b, c) \neq 0
+    $$
+\end{bonus}
+
+\newpage
+\section{Algebraische Strukturen}
+\subsection{Gruppen}
+
+\begin{defi}{Gruppe}
+    Sei $M$ eine Menge, und $\circ: M \times M \to M$ eine \emph{Verknüpfung}.
+    $(M, \circ)$ heißt Gruppe, wenn gilt:
+    \begin{itemize}
+        \item[\textbf{G1}] (Assoziativität): Die Verknüpfung ist assoziativ, d.h. es gilt:
+            $$
+                \forall x, y, z \in M : (x \circ y) \circ z = x \circ (y \circ z)
+            $$
+        \item[\textbf{G2}] (Neutralelement:) Es existiert ein neutrales Element $e \in M$ so dass
+            $$
+                \forall x \in M : x \circ e = x
+            $$
+        \item[\textbf{G3}] (Inverses Element:) $\forall x \in M \exists x'$ mit
+            $$
+                x \circ x' = e
+            $$
+        \item Gilt für eine Gruppe $G = (M, \circ)$, dass $x \circ y = y\circ x, \forall x, y \in M$, dann heißt $G$ \emph{abelsche Gruppe} oder \emph{kommutative Gruppe}.
+    \end{itemize}
+
+    Auch muss implizit gelten:
+    \begin{itemize}
+        \item $x \circ y$ existiert $\forall x, y \in M$ und ist eindeutig festgelegt
+        \item $x \circ y \in M$
+    \end{itemize}
+    Ist dies der Fall, ist die Abbildung $\circ: M \times M \to M$ \emph{wohldefiniert}.
+\end{defi}
+
+\begin{defi}{Untergruppe}
+    Sei $G = (M, \circ)$ eine Gruppe und $M' \subseteq M$. Bildet $U = (M', \circ)$ eine Gruppe, so heißt $U$ \emph{Untergruppe} von $G$, Schreibweise $U \leq G$.
+
+    Für $G$ und $U$ wie oben gilt $U \leq G$ genau dann, wenn gilt:
+    \begin{enumerate}
+        \item $M'\neq \emptyset$
+        \item $\forall a, b \in M' : a\circ b \in M'$
+        \item $\forall a \in M': a^{-1} \in M$
+    \end{enumerate}
+\end{defi}
+
+\newpage
+\subsection{Körper}
+\begin{defi}{Körper}
+    Das Tripel $(\R, +, \cdot)$ hat folgende Eigenschaften:
+    \begin{enumerate}
+        \item $(\R, +)$ bildet eine abelsche Gruppe.
+        \item $(\R \setminus \{0\}, \cdot)$ bildet eine abelsche Gruppe.
+        \item Es gelten die \emph{Distributivgesetze}
+              $$
+                  \forall x, y, z \in \R : (x+y) \cdot z = (x\cdot z) + (x \cdot y) \text{ und } x \cdot (y + z) = (x \cdot y) + (x \cdot z)
+              $$
+              \emph{Jedes} Tripel $(M, \oplus, \odot)$, das die obigen drei Bedingungen erfüllt, wird \emph{Körper} genannt.
+    \end{enumerate}
+\end{defi}
+
+\newpage
+\subsection{Vektorräume}
+\begin{defi}{Vektorraum}
+    Sei $K$ ein beliebiger Körper.
+    Eine nicht-leere Menge $V$ zusammen mit den beiden Abbildungen
+    $$
+        \begin{aligned}
+                         & \oplus : V \times V \to V, \quad (x, y) \to x \oplus y \in V
+            \text{ und } & \odot : K \times V \to V, \quad (\lambda, x) \to \lambda \odot x \in V
+        \end{aligned}
+    $$
+    heißt \emph{Vektorraum über K} oder \emph{K-Vektorraum}, wenn folgende Axiome gelten:
+    \begin{itemize}
+        \item $(V, \oplus)$ ist eine kommutative Gruppe.
+        \item $\forall \lambda, \mu \in K$ und $x \in V$ gilt $\lambda \odot (\mu \odot x) = (\lambda\mu) \odot x$, wobei mit $\lambda\mu$ die Multiplikation aus $K$ gemeint ist.
+        \item $\forall x \in V$ gilt $1 \odot x = x$ ($1$ ist das neutrale Element der Multiplikation aus $K$)
+        \item $\forall \lambda \in K, x, y \in V$ gilt: $\lambda \odot (x \oplus y) = (\lambda x) \oplus (\lambda \odot y)$.
+        \item $\forall \lambda, \mu \in K, x \in V$ gilt $(\lambda + \mu) \odot x = (\lambda \odot x) \oplus (\lambda \odot x)$
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Untervektorraum}
+    Eine Teilmenge $U \subseteq V$ heißt \emph{Untervektorraum} oder \emph{Unterraum} von $V$, wenn $U \neq \emptyset$ und $\forall x, y \in U$ und alle $\lambda \in K$ gilt:
+    $$
+        \begin{aligned}
+             & x \oplus y \in U,      \\
+             & \lambda \odot x \in U.
+        \end{aligned}
+    $$
+\end{defi}
+
+\newpage
+\subsection{Lineare Unabhängigkeit, Basis, Dimension}
+
+Seien $v_1, \ldots, v_r \in V$ Vektoren eines $K$-Vektorraums $V$.
+
+\begin{defi}{Linearkombination}
+    Lässt sich $v\in V$ als Summe dieser Vektoren mit Vorfaktoren darstellen,
+    $$
+        v = \sum^r_{k=1} \lambda_kv_k
+    $$
+    heißt $v$ $Linearkombination$ von $v_1, \ldots, v_r$.
+\end{defi}
+
+\begin{defi}{Lineare Hülle}
+    Die Menge
+    $$
+        L(v_1, \ldots, v_r) := \left\{ \sum^r_{k=1} \lambda_kv_k \mid \lambda_i \in K \right\} \subseteq V
+    $$
+    aller Linearkombinationen heißt \emph{Lineare Hülle} von $v_1, \ldots, v_r$.
+\end{defi}
+
+\begin{defi}{Erzeugendensystem}
+    Sei $V$ ein $K$-Vektorraum und $(v_1, \ldots, v_n)$ ein $n$-Tupel von Vektoren in $V$.
+    Gilt $L(v_1, \ldots, v_n) = V$, nennt man $(v_1, \ldots, v_n)$ ein \emph{Erzeugendensystem} von $V$.
+
+    $V$ heißt \emph{endlich erzeugt}, wenn es endlich viele Vektoren $v_1, \ldots, v_r$ gibt, so dass  $L(v_1, \ldots, v_r) = V$, ansonsten \emph{nicht endlich erzeugt}.
+\end{defi}
+
+\begin{defi}{Lineare Unabhängigkeit}
+    Sei $V$ ein $K$-Vektorraum. Ein $r$-Tupel $(v_1, \ldots, v_r)$ von Vektoren in $V$ heißt \emph{linear unabhängig}, wenn aus $\lambda_1v_1 +\lambda_2v_2 + \ldots + \lambda_rv_r = 0$ stets folgt, dass $\lambda_1 = \lambda_2 = \ldots = \lambda_r = 0$ gilt.
+
+    Außerdem gilt:
+    \begin{itemize}
+        \item Keiner der Vektoren ist eine Linearkombination der übrigen.
+        \item Keiner der Vektoren ist der Nullvektor.
+    \end{itemize}
+
+    Tipp: Ein $r$-Tupel $(v_1, \ldots, v_r)$ von Vektoren in $V$ ist \emph{linear unabhängig} genau dann, wenn $\det(v_1, \ldots, v_r) \neq 0$.
+\end{defi}
+
+\begin{bonus}{Lineare Unabhängigkeit von Funktionen}
+    Wir bilden zu den Funktionen $f_1, \ldots, f_n$ für paarweise verschiedene $x_1, \ldots, x_n$ die $n$ Vektoren
+    $$
+        (f_1(x_1), \ldots, f_1(x_n))^T, \ldots, (f_n(x_1), \ldots, f_n(x_n))^T \in \mathbb{K}^n.
+    $$
+    Sind diese Vektoren linear unabhängig, dann sind die Funktionen $f_1, \ldots, f_n$ selbst linear unabhängig.
+
+    Hinweis: Die Rückrichtung gilt \textbf{nicht}!
+\end{bonus}
+
+\begin{defi}{Basis}
+    Sei $v \neq \{0\}$ ein endlich erzeugter $K$-Vektorraum und $v_1, \ldots, v_n \in V$. Das $n$-Tupel $B = (v_1, \ldots, v_n)$ heißt \emph{Basis} oder \emph{minimales Erzeugendensystem} von $V$, wenn $B$ linear unabhängig ist und wenn gilt $L(B) = V$.
+    Weiter sei $\emptyset$ die Basis des Nullvektorraums $\{0\}$.
+\end{defi}
+
+\begin{bonus}{Koordinaten eines Vektors}
+    Sei $(v_1, \ldots, v_n)$ eine Basis von $V$ und $v \in V$ mit
+    $$
+        v = \lambda_1v_1 + \ldots + \ldots_nv_n, \lambda_i, \ldots, \lambda_n \in K
+    $$
+    Das $n$-Tupel der obigen Vorfaktoren $(\lambda_1, \ldots, \lambda_n) \in K^n$ nennt man \emph{Koordinaten} des Vektors $v$ bzgl. der Basis $(v_1, \ldots, v_n)$.
+\end{bonus}
+
+\begin{defi}{Basisergänzungssatz}
+    Sei $V$ ein $K$-Vektorraum und seien
+    $$
+        v_1, \ldots, v_r, \quad w_1, \ldots w_s \in V
+    $$
+    Ist $(v_1, \ldots, v_r)$ linear unabhängig und ist
+    $$
+        L(v_1, \ldots, v_r, w_1, \ldots w_s) = V,
+    $$
+    dann kann man $(v_1, \ldots, v_r)$ durch evtl. Hinzunahme geeigneter Vektoren aus $\{w_1, \ldots w_s\}$ zu einer Basis von $V$ ergänzen.
+\end{defi}
+
+\begin{defi}{Austauschlemma}
+    Sind $(v_1, \ldots, v_n)$, $(w_1, \ldots w_n)$ Basen eines $K$-Vektorraums $V$, dann gibt es zu jedem $v_i$ ein $w_j$, so dass aus $(v_1, \ldots, v_n)$ wieder eine Basis entsteht, wenn man in ihr $v_i$ durch $w_j$ ersetzt.
+\end{defi}
+
+\begin{defi}{Dimension}
+    Besitzt ein Vektorraum $v \neq \{0\}$ eine Basis $(v_1, \ldots, v_n)$, so definieren wir die \emph{Dimension} von $V$ als $\dim(V) := n$.
+    Besitzt $V$ keine endliche Basis, dann setzt man $\dim(V) := \infty$. Weiter sei $\dim(\{0\}) := 0$.
+\end{defi}
+
+\newpage
+\subsection{Polynome}
+\begin{defi}{Polynom}
+    Ein \emph{Polynom} oder ganzrationale Funktion $p : \mathbb{K} \to \mathbb{K}$ ist eine Funktion der Gestalt
+    $$
+        p(x) = a_0 + a_1x + a_2x^x + \ldots + a_nx_n = \sum^n_{k=0} a_kx^k
+    $$.
+\end{defi}
+
+\begin{bonus}{Polynome als $\mathbb{K}$-Vektorraum}
+    Sei $+$ die Addition von Funktionen und $\cdot$ die Multiplikation einer Funktion mit einem Skalar. Dann bildet $(P_n, +, \cdot)$ einen $\mathbb{K}$-Vektorraum.
+\end{bonus}
+
+\begin{bonus}{Basis des Vektorraums $P_n$}
+    Die Funktionen $1, x, x^2, \ldots, x^n$ bilden eine Basis des Vektorraums $P_n$ und es gilt
+    $$
+        \dim(P_n) = n + 1.
+    $$
+    Diese Basis wird auch \emph{Monombasis} genannt.
+\end{bonus}
+
+\begin{defi}{Interpolationspolynom}
+    Gegeben seien die $n+1$-Punkte $(x_k, y_k), 0 \leq k \leq n$ mit \emph{paarweise verschiedenen} $x_k$.
+    Dann existiert genau ein $p_n \in P_n$ mit $y_k = p_n(x_k) \forall 0 \leq k \leq n$.
+    Dies ist das sogenannte \emph{Interpolationspolynom}.
+\end{defi}
+
+\begin{example}{Interpolationspolynom}
+    Wir betrachten die drei Punkte $(-2, 1)$, $(-1, -1)$ und $(1, 1)$.
+
+    Eine interpolierende Parabel $p_2$ wird durch diese Punkte festgelegt.
+
+    Die allgemeine Form des Polynoms ist $p_2(x) = ax^2 + bx + c$.
+    Einsetzen der drei Punkte ergibt die Gleichungen
+    $$
+        \begin{aligned}
+            (1, 1): \quad   & 1 = a + b + c   \\
+            (-1, -1): \quad & -1 = a - b + c  \\
+            (-2, 1): \quad  & 1 = 4a - 2b + c \\
+        \end{aligned}
+    $$
+    und führt damit zu einem linearen Gleichungssystem.
+
+    Man errechnet als Lösung $a = 1$, $b = 1$, $c = -1$ und erhält
+    $$
+        p_2(x) = x^2 + x -1.
+    $$\qed
+\end{example}
+
+\begin{example}{Lineare Unabhängigkeit von Polynomen}
+    Die Polynome
+    $$
+        p_1(x) = (1-x)^2 \qquad p_2(x) = (1-x)x \qquad p_3(x) = x^2
+    $$
+    sollen auf lineare Unabhängigkeit geprüft werden.
+    Wir berechnen zunächst die Koeffizientenvektoren.
+    $$
+        \begin{aligned}
+             & p_1(x) = (1-x)^2 &  & =1-2x+1x^2  &  & \implies a_{0_1} = 1, ~a_{1_1} = -2, ~a_{2_1} = 1 \\
+             & p_2(x) = (1-x)x  &  & =0+ 1x -x^2 &  & \implies a_{0_2} = 0, ~a_{1_2} = 1, ~a_{2_2} = -1 \\
+             & p_3(x) = x^2     &  &             &  & \implies a_{0_3} = 0, ~a_{1_3} = 0, ~a_{2_3} = 1
+        \end{aligned}
+    $$
+
+    $\det(a_0, a_1, a_2) \neq 0$ und damit sind die Polynome linear unabhängig.\qed
+\end{example}
+
+\subsection{Skalarprodukte, euklidische und unitäre Räume}
+\begin{defi}{Euklidische und unitäre Vektorräume}
+    Ein reeller Vektorraum gemeinsam mit einem Skalarprodukt heißt \emph{euklidischer Vektorraum}, ein komplexer Vektorraum mit einem Skalarprodukt heißt \emph{unitärer Vektorraum}.
+\end{defi}
+
+\begin{defi}{Orthogonale Projektion}
+    Sei $U$ ein endlich erzeugter Untervektorraum von $V$ und $a \in V$.
+    Ein Vektor $p_u(a) \in U$ heißt \emph{orthogonale Projektion} von $a$ auf $U$, wenn gilt:
+    $$
+        a - p_U(a) \perp u \quad \forall u \in U.
+    $$
+\end{defi}
+
+\begin{defi}{Orthogonales Komplement}
+    Für $M \subseteq V$ heißt
+    $$
+        M^\perp := \{v\in V \mid v \perp u \quad \forall u \in M\}
+    $$
+    das \emph{orthogonale Komplement} von $M$.
+\end{defi}
+
+\begin{defi}{Orthogonalsystem, Orthonormalsystem, Orthogonalbasis, Orthonormalbasis}
+    Sei $B = (v_1, \ldots, v_m)$ ein $m$-Tupel mit Vektoren in $V\setminus \{0\}$.
+    \begin{enumerate}
+        \item $B$ heißt \emph{Orthogonalsystem} in $V$, falls alle $v_i$ paarweise orthogonal sind.
+        \item Ein Orthogonalsystem, für das zusätzlich $\forall v_i \in B: \norm{v_i} = 1$ gilt, heißt \emph{Orthonormalsystem}.
+        \item Ein Orthogonalsystem, das eine Basis von $V$ bildet, heißt \emph{Orthogonalbasis} von $V$.
+        \item Ein Orthonormalsystem, das eine Basis von $V$ bildet, heißt \emph{Orthonormalbasis} von $V$.
+    \end{enumerate}
+\end{defi}
+
+\subsection{Das Verfahren von Gram-Schmidt}
+\begin{defi}{Gram-Schmidt-Verfahren}
+    Sei $V$ ein unitärer Vektorraum und $v_1, \ldots, v_m$ linear unabhängig.
+    Seien
+    $$
+        \begin{aligned}
+            w_1     & :={} \frac{v_1}{\norm{v_1}}                              \\
+            r_{k+1} & :={} v_{k+1} - \sum^k_{i=1} \scalarprod{v_{k+1}, w_i}w_i \\
+            w_{k+1} & :={} \frac{r_{k+1}}{\norm{r_{k+1}}}
+        \end{aligned}
+    $$
+    Dann bilden $(w_1, \ldots, w_m)$ eine Orthonormalbasis von $L(v_1, \ldots, v_m)$.
+\end{defi}
+
+\begin{example}{Gram-Schmidt-Verfahren (allgemein)}
+    Wir betrachten eine beliebige Basis $(v_1, v_2, v_3)$ von $\R^3$.
+    Wir gehen so vor:
+    \begin{enumerate}
+        \item Man wählt einfach $w_1 = \frac{1}{\norm{v_1}}v_1$, weil dann offenbar $\norm{w_1} = 1$ gilt.
+        \item Wir konstruieren einen Vektor $r_2$, der senkrecht auf $w_1$ steht.
+              Dazu projizieren wir $v_2$ auf den von $w_1$ erzeugen Unterraum $L(w_1)$ und setzen $r_2 := v_2 - p_{L(v_1)}(v_2)$.
+              Dann gilt nach Definition der orthogonalen Projektion $v_1 \perp r_2$.
+              Man erhält
+              $$
+                  r_2 = v_2 - \scalarprod{v_2, w_1}w_1.
+              $$
+              Normierung von $r_2$ liefert $w_2$.
+        \item Der Vektor $r_3 := v_3 - p_{L(v_1, v_2)}(v_3)$ steht nach Konstruktion senkrecht auf $L(v_1, v_2)$ und daher gilt insbesonere $r_3 \perp v_1$ und $r_3 \perp v_2$.
+              Weil $(w_1, w_2)$ eine Orthonormalbasis von $L(v_1, v_2)$ bilden, gilt:
+              $$
+                  r_3 = v_3 - \scalarprod{v_3, w_1}w_1 - \scalarprod{v_3, w_2}w_2
+              $$
+              Normierung von $r_3$ ergibt $w_3$.
+    \end{enumerate}
+\end{example}
+
+
+\printindex
+\printindex[Beispiele]
+\end{document}
diff --git a/la2/la2.pdf b/la2/la2.pdf
index 4cd8b44e586329ab54bf66e0e58003482c8b7080..80b2e189975afaa4e738e39f5740ffd04e17c1a1 100644
Binary files a/la2/la2.pdf and b/la2/la2.pdf differ
diff --git a/la2/la2.tex b/la2/la2.tex
index 304bce2b9ac87860728fc1735615ba48ecf707f7..cfed3e78b631511dda2a77070be454a2636c3e55 100644
--- a/la2/la2.tex
+++ b/la2/la2.tex
@@ -1,1575 +1,1575 @@
-\documentclass[german]{../spicker}
-
-\usepackage{amsmath}
-\usepackage{polynom}
-\usepackage{nicefrac}
-\usepackage{array}   % for \newcolumntype macro
-\usepackage{tikz}
-\usepackage{pgfplots}
-\usepackage{multirow,bigdelim}
-\usepgfplotslibrary{fillbetween}
-
-\usetikzlibrary{positioning}
-
-\title{Lineare Algebra 2}
-\author{Patrick Gustav Blaneck}
-\makeindex[intoc]
-\makeindex[intoc, name=Beispiele,title=Beispiele]
-
-\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
-\newcommand{\vektor}[1]{\begin{pmatrix*}[c] #1 \end{pmatrix*}}
-\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
-
-\newcommand{\im}{\operatorname{im}}
-\newcommand{\rg}{\operatorname{rg}}
-\newcommand{\defect}{\operatorname{def}}
-\newcommand{\Eig}{\operatorname{Eig}}
-
-\renewcommand{\d}{\,\mathrm{d}}
-
-\renewcommand{\abs}[1]{\left| #1 \right|}
-\newcommand{\cis}[1]{\left( \cos\left( #1 \right) + i \sin\left( #1 \right) \right)}
-\newcommand{\sgn}{\text{sgn}}
-\newcommand{\diff}{\mathrm{d}}
-\newcommand{\dx}{~\mathrm{d}x}
-\newcommand{\du}{~\mathrm{d}u}
-\newcommand{\dv}{~\mathrm{d}v}
-\newcommand{\dw}{~\mathrm{d}w}
-\newcommand{\dt}{~\mathrm{d}t}
-\newcommand{\dn}{~\mathrm{d}n}
-\newcommand{\dudx}{~\frac{\mathrm{d}u}{\mathrm{d}x}}
-\newcommand{\dudn}{~\frac{\mathrm{d}u}{\mathrm{d}n}}
-\newcommand{\dvdx}{~\frac{\mathrm{d}v}{\mathrm{d}x}}
-\newcommand{\dwdx}{~\frac{\mathrm{d}w}{\mathrm{d}x}}
-\newcommand{\dtdx}{~\frac{\mathrm{d}t}{\mathrm{d}x}}
-\newcommand{\ddx}{\frac{\mathrm{d}}{\mathrm{d}x}}
-\newcommand{\dFdx}{\frac{\mathrm{d}F}{\mathrm{d}x}}
-\newcommand{\dfdx}{\frac{\mathrm{d}f}{\mathrm{d}x}}
-\newcommand{\interval}[1]{\left[ #1 \right]}
-
-\newcolumntype{L}{>{$}l<{$}} % math-mode version of "l" column type
-\newcolumntype{R}{>{$}r<{$}} % math-mode version of "r" column type
-\newcolumntype{C}{>{$}c<{$}} % math-mode version of "c" column type
-\newcolumntype{P}{>{$}p<{$}} % math-mode version of "l" column type
-
-\newenvironment{sysmatrix}[1]
- {\left(\begin{array}{@{}#1@{}}}
- {\end{array}\right)}
-
-\newcommand{\dvektor}[1]{\begin{vmatrix*}[r] #1 \end{vmatrix*}}
-
-\begin{document}
-\maketitle
-\tableofcontents
-\newpage
-
-%\setcounter{section}{1}
-
-\section{Lineare Abbildungen}
-
-\subsection{Grundlegende Eigenschaften linearer Abbildungen}
-
-\begin{defi}{Homomorphismus}
-    Eine Abbildung $f : V \to W$ heißt \emph{linear} oder ein \emph{Homomorphismus}, falls $\forall x, y \in V, \forall \lambda \in K$ gilt:
-    \begin{itemize}
-        \item Additivität: $f(x + y) = f(x) + f(y)$
-        \item Homogenität: $f(\lambda x) = \lambda f(x)$
-    \end{itemize}
-
-    Es gilt auch:
-    \begin{itemize}
-        \item Für eine lineare Funktion $f$ gilt $f(0) = 0$.
-        \item Die Funktion $f$ ist genau dann linear, wenn $\forall x, y \in V, \forall \lambda \in K$ gilt:
-              $$
-                  f(x + \lambda y) = f(x) + \lambda f(y)
-              $$
-        \item Summen, Vielfache linearer Abbildungen und vektorwertige Abbildungen, deren Komponenten aus linearen Abbildungen bestehen, sind wiederum linear.
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Homomorphismus}
-    Gegeben sei die Abbildung $f : \R^3 \to \R^2$ mit $f(x_1, x_2, x_3) = (x_1-2x_3, 4x_2)$.
-
-    Zeigen Sie: $f$ ist linear.
-
-    \exampleseparator
-
-    $f$ ist genau dann \emph{linear}, wenn $f$ \emph{homogen} und \emph{additiv} ist.
-
-    \emph{Homogenität:} $\forall x \in \R^3, \lambda \in \R: f(\lambda  x) = \lambda  f(x)$
-    $$
-        \begin{aligned}
-                         & f(\lambda  x)                                  &  & = \lambda  f(x)                              \\
-            \equiv \quad & f(\lambda  x_1, \lambda  x_2, \lambda  x_3)    &  & = \lambda  f(x_1, x_2, x_3)                  \\
-            \equiv \quad & (\lambda  x_1-2  \lambda  x_3, 4 \lambda  x_2) &  & = \lambda  (x_1-2x_3, 4x_2)                  \\
-            \equiv \quad & \lambda  (x_1-2x_3, 4x_2)                      &  & = \lambda  (x_1-2x_3, 4x_2) \quad \checkmark
-        \end{aligned}
-    $$
-    \emph{Additivität:} $\forall x, y \in \R^3: f(x + y) = f(x) + f_4(y)$
-    $$
-        \begin{aligned}
-                         & f(x + y)                                 &  & = f(x) + f(y)                                               \\
-            \equiv \quad & f(x_1 + y_1, x_2 + y_2, x_3 + y_3)       &  & = f(x_1, x_2, x_3) + f(y_1, y_2, y_3)                       \\
-            \equiv \quad & (x_1 + y_1-2(x_3 + y_3), 4(x_2 + y_2))   &  & = (x_1-2x_3, 4x_2) + (y_1-2y_3, 4y_2)                       \\
-            \equiv \quad & (x_1 + y_1-2 x_3 -2  y_3, 4 x_2 +4  y_2) &  & = (x_1 + y_1-2 x_3 -2  y_3, 4 x_2 +4  y_2) \quad \checkmark
-        \end{aligned}
-    $$
-
-    Damit ist $f$ linear. \qed
-\end{example}
-
-\begin{defi}{Kern}
-    Der \emph{Kern} einer linearen Abbildung $f : V \to W$ wird definiert durch
-    $$
-        \ker (f) := f^{-1}(0)
-    $$
-
-    Dabei gilt:
-    \begin{itemize}
-        \item $\im (f)$\footnote{Bild von $f$} ist ein Untervektorraum von $W$.
-        \item $\ker (f)$ ist ein Untervektorraum von $V$.
-    \end{itemize}
-
-    Eine lineare Abbildung ist genau dann injektiv, wenn $\ker (f) = \{0\}$ gilt.
-\end{defi}
-
-\begin{bonus}{Defekt}
-    Für eine lineare Funktion $f: V\to W$ definiert man den \emph{Defekt} von $f$ durch
-    $$
-        \defect (f) := \dim\ker (f)
-    $$
-
-    Eine lineare Abbildung ist genau dann injektiv, wenn $\defect (f) = 0$ gilt.
-\end{bonus}
-
-\begin{example}{Kern}
-    Gegeben sei die Abbildung $f : \R^3 \to \R^2$ mit $f(x_1, x_2, x_3) = (x_1-2x_3, 4x_2)$.
-
-    Bestimmen Sie den Kern von $f$ und geben Sie $\dim(\ker(f))$ an.
-
-    \exampleseparator
-
-    $$
-        f(x_1, x_2, x_3) = 0 \iff
-        \begin{sysmatrix}{ccc|c}
-            1 & 0 & -2 & 0 \\
-            0 & 4 & 0  & 0
-        \end{sysmatrix}
-        \implies x_2 = 0 \quad \land \quad x_1 = 2x_3
-    $$
-    Daraus folgt:
-    $$
-        \ker(f) = f^{-1}(0) = \left\{ (2\lambda, 0, \lambda) \mid \lambda \in \R \right\} \implies \defect(f) = \dim(\ker(f)) = 1
-    $$\qed
-\end{example}
-
-\begin{defi}{Rang}
-    Für eine lineare Funktion $f: V\to W$ definiert man den \emph{Rang} von $f$ durch
-    $$
-        \rg (f) := \dim\im (f)
-    $$
-
-    Eine lineare Abbildung ist genau dann surjektiv, wenn $\rg (f) = \dim (W)$ gilt.
-\end{defi}
-
-\begin{defi}{Dimensionsformel für lineare Abbildungen (Rangsatz)}
-    Es sei $f : V \to W$ linear. Dann gilt:
-    $$
-        \defect (f) + \rg (f) = \dim V
-    $$
-    bzw. äquivalent
-    $$
-        \dim\ker (f) + \dim\im (f) = \dim V
-    $$
-\end{defi}
-
-\begin{defi}{Isomorphismus}
-    Sei $f : V \to W$ linear.
-    Dann ist $f$ ein \emph{Isomorphismus}, wenn $f$ bijektiv ist.
-
-    Es gilt (für $f$ linear):
-    \begin{itemize}
-        \item $f$ ist genau dann ein Isomorphismus, wenn $\ker(f) = \{0\}$ und $\im(f) = W$ gilt.
-        \item Gelte $\dim (V) = \dim (W)$. Dann gilt $f$ ist injektiv $\iff$ $f$ ist surjektiv $\iff$ $f$ ist bijektiv.
-    \end{itemize}
-
-    Es gilt (für $f$ Isomorphismus):
-    \begin{itemize}
-        \item $\dim(V) = \dim(W)$
-        \item $f^{-1} : W \to V$ ist ebenfalls ein Isomorphismus.
-    \end{itemize}
-
-    Sei $\dim(V) = \dim(W) = n$, $(v_1, \ldots, v_n)$ eine Basis von $V$ und $f : V \to W$ linear.
-    $f$ ist genau dann ein Isomorphismus, wenn $(f(v_1), \ldots, f(v_n))$ eine Basis von $W$ bildet.
-\end{defi}
-
-\begin{bonus}{Isomorphie}
-    Seien $V$ und $W$ zwei $K$-Vektorräume
-    Dann heißen $V$ und $W$ \emph{isomorph}, Schreibweise $V \simeq W$, falls ein Isomorphismus von $V$ nach $W$ existiert.
-
-    Gilt $\dim(V) = \dim(W) = n$, dann gilt direkt $K^n \simeq V \simeq W$.
-\end{bonus}
-
-\begin{defi}{Automorphismus}
-    Sei $f : V \to W$ linear.
-    Dann ist $f$ ein \emph{Automorphismus}, wenn $f$ bijektiv ist und $V = W$.
-\end{defi}
-
-\begin{defi}{Endomorphismus}
-    Eine lineare Abbildung $f : V \to V$ heißt \emph{Endomorphismus}.
-\end{defi}
-
-\subsection{Matrizen und lineare Abbildungen}
-
-\begin{defi}{Abbildungsmatrix}
-    Sei $f : V \to W$ linear. Dann ist die \emph{Abbildungsmatrix} $A$ bzgl. $f$ gegeben mit
-    $$
-        A = \vektor{f(e_1) & \ldots & f(e_n)} \ \text{mit} \ \forall x : f(x) = Ax
-    $$
-
-    Sei $(v_1, \ldots, v_n)$ eine Basis von $V$. Dann gilt:
-    \begin{itemize}
-        \item $\im(f) = \scalarprod{f(v_1), \ldots, f(v_n)}$
-        \item $f$ ist injektiv $\iff$ $f(v_1), \ldots, f(v_n)$ sind linear unabhängig.
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Darstellungsmatrix}
-    Sei $f : V \to W$ linear, $\mathcal{B}_V = (v_1, \ldots, v_n)$ eine Basis von $V$ und $\mathcal{B}_W = (w_1, \ldots, w_m)$ eine Basis von $W$.
-    Dann ist
-    $$
-        M^{\mathcal{B}_V}_{\mathcal{B}_W} (f) = \vektor{K_{\mathcal{B}_W}(f(v_1)) & \ldots & K_{\mathcal{B}_W}(f(v_1))}
-    $$
-    die \emph{Darstellungsmatrix} von $f$ bezüglich der Basen $\mathcal{B}_V$ und $\mathcal{B}_W$.
-
-    $K_{\mathcal{B}_W}(f(v_i))$ bedeutet hier, dass das Bild von $v_i$ in der Basis $\mathcal{B}_W$ kodiert wird.
-
-    Es gilt:
-    \begin{itemize}
-        \item Sind $\mathcal{B}_V$ und $\mathcal{B}_W$ die Standardbasen bez. $V$ und $W$, dann gilt $M^{\mathcal{B}_V}_{\mathcal{B}_W} (f) = A$.
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Abbildungsmatrix}
-    Sei
-    $$
-        F\left(\vektor{x\\y\\z}\right) = \vektor{x + y + 2z \\ -3x + z \\ -x + 2y + 5z}
-    $$
-    \begin{enumerate}[a)]
-        \item Geben Sie für obige Abbildung die Abbildungsmatrix an.
-        \item Bestimmen Sie $\ker(F)$ und dessen Dimension.
-        \item Bestimmen Sie mit Hilfe der Dimensionsformel $\dim(\im (F))$.
-        \item Geben Sie eine Basis des Bildes an.
-    \end{enumerate}
-
-    \exampleseparator
-
-    \begin{enumerate}[a)]
-        \item Sei $B$ die kanonische Einheitsbasis des $\R^3$.
-              Dann ist die Abbildungsmatrix gegeben mit
-              $$
-                  A = M^B_B (F) = \vektor{~ \\F(e_1) & F(e_2) & F(e_3)\\ ~} = \vektor{1 & 1 & 2\\ -3 & 0 & 1\\ -1 & 2 & 5}
-              $$\qed
-        \item $$
-                  M^B_B \cdot \vektor{x \\ y \\ z} = \vektor{1 & 1 & 2\\ -3 & 0 & 1\\ -1 & 2 & 5} \cdot \vektor{x \\ y \\ z} = \vektor{0 \\ 0 \\ 0}
-              $$
-
-              Wir erhalten also ein LGS, dessen Lösung eine Basis von $\ker(F)$ ist:
-              $$
-                  \begin{sysmatrix}{c c c | c}
-                      1 & 1 & 2 & 0 \\ -3 & 0 & 1 & 0 \\ -1 & 2 & 5 & 0
-                  \end{sysmatrix}
-                  \sim
-                  \begin{sysmatrix}{c c c | c}
-                      1 & 1 & 2 & 0 \\ 0 & 3 & 7 & 0 \\ 0 & 3 & 7 & 0
-                  \end{sysmatrix}
-                  \sim
-                  \begin{sysmatrix}{c c c | c}
-                      1 & 1 & 2 & 0 \\ 0 & 3 & 7 & 0 \\ 0 & 0 & 0 & 0
-                  \end{sysmatrix}
-                  \sim
-                  \begin{sysmatrix}{c c c | c}
-                      -3 & 0 & 1 & 0 \\ 0 & \frac{3}{7} & 1 & 0 \\ 0 & 0 & 0 & 0
-                  \end{sysmatrix}
-              $$
-
-              Daraus können wir folgern, dass $\ker(F) = \scalarprod{\vektor{1 & -7 & 3}^T}$ und $\defect(F) = 1$. \qed
-        \item $\dim(\R^3) = \defect(F) + \rg(F) \implies \rg(F) = 2$\qed
-        \item Wegen $\rg(F) = 2$ wissen wir, dass wir zwei linear unabhängige Vektoren aus $M^B_B$ auswählen können, die dann automatisch eine Basis von $\im(F)$ ergeben.
-
-              Wir wählen $\im(F) = \scalarprod{ \vektor{1 & 0 & 2}^T, \vektor{2 & 1 & 5}^T }$.\qed
-    \end{enumerate}
-\end{example}
-
-\subsection{Abbildungsverkettung und Matrizenmultiplikation}
-
-\begin{defi}{Eigenschaften der Abbildungsverkettung}
-    Seien $U$, $V$, $W$ $K$-Vektorräume und $f : V \to W$ sowie $g : U \to V$ linear.
-    Dann ist auch $f \circ g : U \to W$ linear.
-
-    Ist $f$ ein Isomorphismus und $\dim(V) = \dim(W)$, dann gilt:
-    $$
-        \rg(f\circ g) = \rg(g)
-    $$
-\end{defi}
-
-\begin{defi}{Eigenschaften der Matrixmultiplikation}
-    Seien $A$, $B$, $C$ so, dass die nachfolgend vorkommenden Matrixmultiplikationen definiert sind.
-    Dann gilt:
-    \begin{itemize}
-        \item $A(BC) = (AB)C$ (Assoziativgesetz)
-        \item $A(B+C) = AB+AC$ und $(A+B)C = AC+BC$ (Distributivgesetz)
-        \item $(AB)^T = B^TA^T$
-        \item Sei $A \in K^{m\times n}$ und $E_k \in K^{k\times k}$ die $(k\times k)$-Einheitsmatrix. Dann gilt:
-              $$
-                  AE_n = E_mA = A
-              $$
-        \item Sei $A \in K^{m\times n}$ und $0_{kl} \in K^{k\times l}$ die $(k\times l)$-Nullmatrix. Dann gilt:
-              $$
-                  A0_{nl} = 0_{ml} \quad \text{und} \quad 0_{km}A = 0_{kn}
-              $$
-        \item Das Matrixprodukt ist im Allgemeinen nicht kommutativ.
-        \item Seien $x, y \in K^n$. Dann gilt:
-              $$
-                  \scalarprod{x, y} = x^T \cdot y
-              $$
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Matrixmultiplikation}
-    Gegeben sind die Matrizen
-    $$
-        A = \vektor{10 & 2 & 3 \\ 8 & 5 & 3 \\ 2 & 3 & 2}, \quad
-        B = \vektor{7 & 3 \\ 1 & 5}, \quad
-        C = \vektor{4 & 5 \\ 2 & 7 \\ 3 & 6}
-    $$
-    Welche der folgenden Matrixprodukte sind wohldefiniert?
-
-    \begin{enumerate}[a)]
-        \item $A\cdot B$
-        \item $C\cdot B$
-        \item $C\cdot B \cdot A$
-    \end{enumerate}
-
-    \exampleseparator
-
-    \begin{enumerate}[a)]
-        \item $$
-                  A\cdot B = \overset{3\times \pmb{3}}{\vektor{10 & 2 & 3 \\ 8 & 5 & 3 \\ 2 & 3 & 2}} \overset{\pmb{2}\times 2}{\vektor{7 & 3 \\ 1 & 5}} \quad \lightning \quad (3 \neq 2)
-              $$
-        \item $$
-                  C\cdot B = \overset{3\times \pmb{2}}{\vektor{4 & 5 \\ 2 & 7 \\ 3 & 6}} \overset{\pmb{2}\times 2}{\vektor{7 & 3 \\ 1 & 5}} = \vektor{33 & 37 \\ 21 & 41 \\ 27 & 39}
-              $$
-        \item $$
-                  C\cdot B \cdot A = \overset{3\times \pmb{2}}{\vektor{4 & 5 \\ 2 & 7 \\ 3 & 6}} \overset{\pmb{2}\times \pmb{2}}{\vektor{7 & 3 \\ 1 & 5}} \overset{\pmb{3}\times 3}{\vektor{10 & 2 & 3 \\ 8 & 5 & 3 \\ 2 & 3 & 2}} \quad \lightning \quad (2 \neq 3)
-              $$
-    \end{enumerate}
-\end{example}
-
-\begin{defi}{Inverse einer Matrix}
-    Sei $A$ eine quadratische Matrix.
-    Gibt es eine Matrix $A^{-1}$ mit
-    $$
-        AA^{-1} = A^{-1}A = E
-    $$
-    so heißt $A$ \emph{invertierbar} oder auch \emph{regulär}.
-    $A^{-1}$ wird als \emph{Inverse} von $A$ bezeichnet.
-
-    Es gilt:
-    \begin{itemize}
-        \item Eine lineare Abbildung $f : V \to W$ ist genau dann invertierbar, wenn ihre Darstellungsmatrix invertierbar ist.
-        \item Jede invertierbare Matrix ist quadratisch.
-    \end{itemize}
-
-    Seien $A, B \in K^{n\times n}$ invertierbar.
-    Dann gilt:
-    \begin{itemize}
-        \item $AB = E \iff BA = E \iff B = A^{-1}$
-        \item $AB$ ist invertierbar, und es gilt $(AB)^{-1} = B^{-1}A^{-1}$.
-        \item $A^{-1}$ ist invertierbar, und es gilt $(A^{-1})^{-1} = A$.
-        \item $A^T$ ist invertierbar, und es gilt $(A^T)^{-1} = (A^{-1})^T$.
-        \item Für $\lambda \in K \setminus \{0\}$ ist $\lambda A$ invertierbar, und es gilt $(\lambda A)^{-1} = \frac{1}{\lambda}A^{-1}$.
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Inverse einer Matrix (Gauß-Algorithmus)}
-    Berechnen Sie mit Hilfe des Gauß-Algorithmus die Inverse zu folgender Matrix:
-    $$\vektor{0 & 0 & 2 & 0 \\ 1 & 0 & 0 & 1 \\ 0 & -1 & -3 & 0 \\ 2 & 1 & 5 & 3}$$
-
-    \exampleseparator
-
-    $$
-        \begin{sysmatrix}{cccr|cccr}
-            0 & 0 & 2 & 0   & 1 & 0 & 0 & 0 \\
-            1 & 0 & 0 & 1   & 0 & 1 & 0 & 0 \\
-            0 & -1 & -3 & 0 & 0 & 0 & 1 & 0 \\
-            2 & 1 & 5 & 3   & 0 & 0 & 0 & 1
-        \end{sysmatrix}
-        \sim
-        \begin{sysmatrix}{cccr|cccr}
-            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
-            1 & 0 & 0 & 1   & 0 & 1 & 0 & 0 \\
-            0 & -1 & 0 & 0 & \nicefrac{3}{2} & 0 & 1 & 0 \\
-            2 & 1 & 0 & 3   & -\nicefrac{5}{2} & 0 & 0 & 1
-        \end{sysmatrix}
-    $$
-    $$
-        \sim
-        \begin{sysmatrix}{cccr|cccr}
-            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
-            1 & 0 & 0 & 1   & 0 & 1 & 0 & 0 \\
-            0 & 1 & 0 & 0 & -\nicefrac{3}{2} & 0 & -1 & 0 \\
-            0 & 1 & 0 & 1   & -\nicefrac{5}{2} & -2 & 0 & 1
-        \end{sysmatrix}
-        \sim
-        \begin{sysmatrix}{cccr|cccr}
-            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
-            1 & 0 & 0 & 1   & 0 & 1 & 0 & 0 \\
-            0 & 1 & 0 & 0 & -\nicefrac{3}{2} & 0 & -1 & 0 \\
-            0 & 0 & 0 & 1   & -1 & -2 & 1 & 1
-        \end{sysmatrix}
-    $$
-    $$
-        \sim
-        \begin{sysmatrix}{cccr|cccr}
-            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
-            1 & 0 & 0 & 0   & 1 & 3 & -1 & -1 \\
-            0 & 1 & 0 & 0 & -\nicefrac{3}{2} & 0 & -1 & 0 \\
-            0 & 0 & 0 & 1   & -1 & -2 & 1 & 1
-        \end{sysmatrix}
-        \sim
-        \begin{sysmatrix}{cccr|cccr}
-            1 & 0 & 0 & 0   & 1 & 3 & -1 & -1 \\
-            0 & 1 & 0 & 0 & -\nicefrac{3}{2} & 0 & -1 & 0 \\
-            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
-            0 & 0 & 0 & 1   & -1 & -2 & 1 & 1
-        \end{sysmatrix}
-    $$
-
-    Damit ist
-    $$
-        \vektor{0 & 0 & 2 & 0 \\ 1 & 0 & 0 & 1 \\ 0 & -1 & -3 & 0 \\ 2 & 1 & 5 & 3}^{-1} = \vektor{1 & 3 & -1 & -1 \\-\nicefrac{3}{2} & 0 & -1 & 0 \\ \nicefrac{1}{2} & 0 & 0 & 0 \\ -1 & -2 & 1 & 1}
-    $$\qed
-\end{example}
-
-\begin{example}{Inverse von verketteten Abbildungen}
-    Ein sehr gutes (aber sperriges) Beispiel zum Finden von Inversen verketteter Abbildungen ist zu finden im \emph{Lineare Algebra Übungsblatt 05} (Aufgabe 6).
-
-    Das Übungsblatt ist erreichbar unter \url{https://fh-aachen.paddel.xyz/#lineare-algebra-2}.
-\end{example}
-
-\subsection{Koordinatentransformationen}
-
-\begin{defi}{Koordinatenabbildung}
-    Sei $V$ ein $K$-Vektorraum mit einer Basis $\mathcal{B} = (b_1, \ldots, b_n)$.
-    Dann existiert genau ein Isomorphismus $\varphi_{\mathcal{B}} : K^n \to V$ mit $\varphi_{\mathcal{B}}(e_i) = v_i$, $1 \leq i \leq n$.
-
-    Der Isomorphismus $\varphi_{\mathcal{B}}$ heißt \emph{Koordinatenabbildung}.
-\end{defi}
-
-\begin{defi}{Koordinaten eines Vektors}
-    Sei $V$ ein $K$-Vektorraum mit einer Basis $\mathcal{B} = (b_1, \ldots, b_n)$.
-    Die Abbildung $K_{\mathcal{B}}(v)$ mit
-    $$
-        K_{\mathcal{B}} : V \to K^n , v = \sum^n_{i=1} \lambda_ib_i \longmapsto \vektor{\lambda_1 \\ \vdots \\ \lambda_n}
-    $$
-    erzeugt die \emph{Koordinaten von v bezüglich der Basis} $\mathcal{B}$.
-
-    Es gilt:
-    \begin{itemize}
-        \item $K_{\mathcal{B}}(v) = \varphi^{-1}_{\mathcal{B}}(v)$
-    \end{itemize}
-\end{defi}
-
-\begin{defi}{Transformationsmatrix}
-    Sei ein Vektorraum $V$ mit den Basen $\mathcal{A} = (a_1, \ldots, a_n)$ und $\mathcal{B} = (b_1, \ldots, b_n)$ gegeben.
-
-    Für einen Vektor $v$ existieren die Darstellungen $K_{\mathcal{A}}(v)$ und $K_{\mathcal{B}}(v)$.
-    Es gilt:
-
-    \begin{center}
-        \begin{tikzpicture}
-            \node (v) {$V$};
-            \node [below left=of v] (k1) {$K^n$};
-            \node [below right=of v] (k2) {$K^n$};
-
-            \draw [->] (k1) -- (v) node [midway, above left] {\small $\varphi_{\mathcal{A}}$};
-            \draw [->] (k2) -- (v) node [midway, above right] {\small $\varphi_{\mathcal{B}}$};
-            \draw [->] (k1) -- (k2) node [midway, below] {\small $T^{\mathcal{A}}_{\mathcal{B}} = \varphi_{\mathcal{B}}^{-1} \circ \varphi_{\mathcal{A}}$};
-        \end{tikzpicture}
-    \end{center}
-
-
-    Die Matrix $T^{\mathcal{A}}_{\mathcal{B}}$ heißt \emph{Transformationsmatrix des Basiswechsels von} $\mathcal{A}$ \emph{nach} $\mathcal{B}$
-
-    Sei $v\in V$ beliebig, $K_{\mathcal{A}}(v) = \vektor{x_1 & \ldots & x_n}^T$ und $K_{\mathcal{B}}(v) = \vektor{y_1 & \ldots & y_n}^T$. Dann gilt:
-    $$
-        \vektor{y_1 \\ \vdots \\ y_n} = T^{\mathcal{A}}_{\mathcal{B}} \vektor{x_1 \\ \vdots \\ x_n}
-    $$
-
-    Sind die Koordinaten von $v$ beqüglich $\mathcal{A}$ bekannt, kann man mithilfe der Matrix $T^{\mathcal{A}}_{\mathcal{B}}$ die Koordinaten von $v$ bezüglich $\mathcal{B}$ berechnen.
-
-    Seien $A$ und $B$ die Matrizen der Basisvektoren von $\mathcal{A}$ bzw. $\mathcal{B}$.
-    Dann gilt:
-
-    \begin{center}
-        \begin{tikzpicture}
-            \node (ka) {$K_{\mathcal{A}}(x)$};
-            \node [right=of ka] (kb) {$K_{\mathcal{B}}(x)$};
-
-            \node [above=of ka] (x1) {$x$};
-            \node [above=of kb] (x2) {$x$};
-
-
-            \draw [->] (x1) -- (x2) node [midway, above] {\small $E$};
-            \draw [->] (ka) -- (x1) node [midway, left] {\small $A$};
-            \draw [->] (kb) -- (x2) node [midway, right] {\small $B$};
-            \draw [->] (ka) -- (kb) node [midway, below] {\small $T^{\mathcal{A}}_{\mathcal{B}}$};
-        \end{tikzpicture}
-    \end{center}
-
-    Man erkennt:
-    $$
-        T^{\mathcal{A}}_{\mathcal{B}} = B^{-1}A
-    $$
-\end{defi}
-
-\begin{example}{Transformationsmatrizen}
-    $\mathcal{A}  = (e_1, e_2, e_3)$, $\mathcal{A}' = (a'_1, a'_2, a'_3)$ und $\mathcal{A}'' = (a''_1, a''_2, a''_3)$ bilden mit den kanonischen Einheitsvektoren $e_1, e_2, e_3$ sowie
-    $$
-        a'_1 = \vektor{1\\0\\0}, a'_2 = \vektor{1\\1\\0}, a'_3 = \vektor{1\\1\\1}
-        \quad \text{bzw.} \quad
-        a''_1 = \vektor{1\\-1\\0}, a''_2 = \vektor{-1\\0\\1}, a''_3 = \vektor{0\\1\\1}
-    $$
-    jeweils Basen des $\R^3$.
-
-    Bestimmen Sie:
-    \begin{enumerate}[a)]
-        \item die Transformationsmatrizen $T^{\mathcal{A}'}_{\mathcal{A}}$ sowie $T^{\mathcal{A}}_{\mathcal{A}'}$.
-        \item die Transformationsmatrizen $T^{\mathcal{A}''}_{\mathcal{A}}$ sowie $T^{\mathcal{A}}_{\mathcal{A}''}$.
-        \item die Transformationsmatrizen $T^{\mathcal{A}'}_{\mathcal{A}''}$ sowie $T^{\mathcal{A}''}_{\mathcal{A}'}$.
-        \item die Koordinaten des Vektors $\vektor{1 & 0 & 1}^T$ bzgl. der Basen $\mathcal{A}'$ und $\mathcal{A}''$.
-    \end{enumerate}
-
-    \exampleseparator
-
-    \begin{enumerate}[a)]
-        \item Berechnen von $\mathcal{A}'^{-1}$:
-              $$
-                  \begin{sysmatrix}{rrr|rrr}
-                      1 & 1 & 1 & 1 & 0 & 0 \\
-                      0 & 1 & 1 & 0 & 1 & 0 \\
-                      0 & 0 & 1 & 0 & 0 & 1
-                  \end{sysmatrix}
-                  \sim
-                  \begin{sysmatrix}{rrr|rrr}
-                      1 & 1 & 0 & 1 & 0 & -1 \\
-                      0 & 1 & 0 & 0 & 1 & -1 \\
-                      0 & 0 & 1 & 0 & 0 & 1
-                  \end{sysmatrix}
-                  \sim
-                  \begin{sysmatrix}{rrr|rrr}
-                      1 & 0 & 0 & 1 & -1 & 0 \\
-                      0 & 1 & 0 & 0 & 1 & -1 \\
-                      0 & 0 & 1 & 0 & 0 & 1
-                  \end{sysmatrix}
-              $$
-
-              Damit gilt:
-              $$
-                  T^{\mathcal{A}'}_{\mathcal{A}} = \mathcal{A}^{-1}\mathcal{A}' = \vektor{1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} \vektor{1 & 1 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 1} = \vektor{1 & 1 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 1}
-              $$
-              und
-              $$
-                  T^{\mathcal{A}}_{\mathcal{A}'} = \mathcal{A}'^{-1}\mathcal{A} = \vektor{1 & -1 & 0 \\ 0 & 1 & -1 \\ 0 & 0 & 1} \vektor{1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} = \vektor{1 & -1 & 0 \\ 0 & 1 & -1 \\ 0 & 0 & 1}.
-              $$\qed
-        \item Berechnen von $\mathcal{A}''^{-1}$:
-              $$
-                  \begin{sysmatrix}{rrr|rrr}
-                      1 & -1 & 0 & 1 & 0 & 0 \\
-                      -1 & 0 & 1 & 0 & 1 & 0 \\
-                      0 & 1 & 1 & 0 & 0 & 1
-                  \end{sysmatrix}
-                  \sim
-                  \ldots
-                  \sim
-                  \begin{sysmatrix}{rrr|rrr}
-                      1 & 0 & 0 & \nicefrac{1}{2} & -\nicefrac{1}{2} & \nicefrac{1}{2} \\
-                      0 & 1 & 0 & -\nicefrac{1}{2} & -\nicefrac{1}{2} & \nicefrac{1}{2}\\
-                      0 & 0 & 1 & \nicefrac{1}{2} & \nicefrac{1}{2} & \nicefrac{1}{2}
-                  \end{sysmatrix}
-                  =
-                  \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1}
-              $$
-              Damit gilt:
-              $$
-                  T^{\mathcal{A}''}_{\mathcal{A}} = \mathcal{A}^{-1}\mathcal{A}'' = \vektor{1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} \vektor{1 & -1 & 0 \\ -1 & 0 & 1 \\ 0 & 1 & 1} = \vektor{1 & -1 & 0 \\ -1 & 0 & 1 \\ 0 & 1 & 1}
-              $$
-              und
-              $$
-                  T^{\mathcal{A}}_{\mathcal{A}''} = \mathcal{A}''^{-1}\mathcal{A} = \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1} \vektor{1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} = \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1}.
-              $$\qed
-    \end{enumerate}
-
-\end{example}
-
-\begin{example}{Transformationsmatrizen (Fortsetzung)}
-    \begin{enumerate}[a)]
-        \setcounter{enumi}{2}
-        \item Mit den bisherigen Ergebnissen gilt:
-              $$
-                  T^{\mathcal{A}'}_{\mathcal{A}''} = \mathcal{A}''^{-1}\mathcal{A}' = \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1} \vektor{1 & 1 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 1} = \frac{1}{2}\vektor{1 & 0 & 1 \\ -1 & -2 & -1 \\ 1 & 2 & 3}
-              $$
-              und
-              $$
-                  T^{\mathcal{A}''}_{\mathcal{A}'} = \mathcal{A}'^{-1}\mathcal{A}'' = \vektor{1 & -1 & 0 \\ 0 & 1 & -1 \\ 0 & 0 & 1} \vektor{1 & -1 & 0 \\ -1 & 0 & 1 \\ 0 & 1 & 1} = \vektor{2 & -1 & -1 \\ -1 & -1 & 0 \\ 0 & 1 & 1}.
-              $$\qed
-        \item Sei $x = \vektor{1 & 0 & 1}^T$.
-
-              Dann gilt für $x$ bzgl. $\mathcal{A}'$:
-              $$
-                  x = K_{\mathcal{A}'}(x) = T^{\mathcal{A}}_{\mathcal{A}'} \cdot K_{\mathcal{A}}(x) = \vektor{1 & -1 & 0 \\ 0 & 1 & -1 \\ 0 & 0 & 1} \vektor{1 \\ 0 \\ 1} = \vektor{1 \\ -1 \\ 1},
-              $$
-              bzw. bzgl. $\mathcal{A}''$:
-              $$
-                  x = K_{\mathcal{A}''}(x) = T^{\mathcal{A}}_{\mathcal{A}''} \cdot K_{\mathcal{A}}(x) = \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1} \vektor{1 \\ 0 \\ 1} = \vektor{1 \\ 0 \\ 1}.
-              $$\qed
-    \end{enumerate}
-\end{example}
-
-\begin{defi}{Darstellungsmatrix mit Basistransformation}
-    Seien $V$ und $W$ endlich erzeugt mit Basen $\mathcal{A}$ und $\mathcal{A}'$ bzw. $\mathcal{B}$ und $\mathcal{B}'$.
-    Sei weiter $f : V \to W$ linear.
-    Dann gilt:
-    $$
-        M^{\mathcal{A}'}_{\mathcal{\mathcal{B}'}}(f) = T^{\mathcal{B}}_{\mathcal{B}'} \cdot M^{\mathcal{A}}_{\mathcal{\mathcal{B}}}(f) \cdot T^{\mathcal{A}'}_{\mathcal{A}}
-    $$
-
-    Zur Visualisierung dient folgendes kommutative Diagramm:
-    \begin{center}
-        \begin{tikzpicture}
-            \node (kn1) {$K^n$};
-            \node [above right=of kn1] (v) {$V$};
-            \node [above left=of v] (kn2) {$K^n$};
-            \node [right=of v] (w) {$W$};
-            \node [above right=of w] (km2) {$K^m$};
-            \node [below right=of w] (km1) {$K^m$};
-
-            \draw [->] (kn1) -- (v) node [midway, above left] {\small $\varphi_{\mathcal{A}'}$};
-            \draw [->] (kn2) -- (v) node [midway, above right] {\small $\varphi_{\mathcal{A}}$};
-            \draw [->] (km1) -- (w) node [midway, above right] {\small $\varphi_{\mathcal{B}'}$};
-            \draw [->] (km2) -- (w) node [midway, above left] {\small $\varphi_{\mathcal{B}}$};
-
-            \draw [->] (v) -- (w) node [midway, above] {\small $f$};
-
-            \draw [->] (kn2) -- (km2) node [midway, above] {\small $M^{\mathcal{A}}_{\mathcal{B}} (f)$};
-            \draw [->] (kn1) -- (km1) node [midway, below] {\small $M^{\mathcal{A}'}_{\mathcal{B}'} (f)$};
-
-            \draw [->] (kn2) -- (kn1) node [midway, left] {\small $T^{\mathcal{A}}_{\mathcal{A}'}$};
-            \draw [->] (km2) -- (km1) node [midway, right] {\small $T^{\mathcal{B}}_{\mathcal{B}'}$};
-        \end{tikzpicture}
-    \end{center}
-\end{defi}
-
-\section{Determinanten}
-
-\begin{defi}{Elementarmatrix}
-    Seien $1\leq i$, $j \leq n$ mit $i \neq j$ und $\lambda \in K \setminus \{0\}$ gegeben.
-    Dann sei
-    $$
-        C1 := \vektor{1 & & & & \\ & \ddots & & & \\ & \lambda & \ddots & & \\ & & & \ddots & & \\ & & & & \ddots & \\ & & & & & 1} \in K^{n \times n}
-    $$
-    wobei der $(i, j)$-te Eintrag den Wert $\lambda$ annehmen soll und alle anderen Einträge außerhalb der Hauptdiagonalen $0$ sein sollen.
-
-    Sei $C2$ die Matrix, die man aus der Einheitsmatrix gewinnt, indem man die $i$-te und $j$-te Spalte vertauscht, also
-    $$
-        C2 := \vektor{1 & & & & \\ & \ddots & & & \\ &  & 0 & &1 \\ & & & \ddots & & \\ & & 1 & & 0 & \\ & & & & & 1} \in K^{n \times n}
-    $$
-
-    Zuletzt definieren wir
-    $$
-        C3 := \vektor{1 & & & & \\ & \ddots & & & \\ &  & \lambda & & \\ & & & \ddots & & \\ & & & & \ddots & \\ & & & & & 1} \in K^{n \times n}
-    $$
-
-    Matrizen der Gestalt $C1$, $C2$ oder $C3$ nennt man \emph{Elementarmatrizen}.
-
-    Es gilt:
-    \begin{itemize}
-        \item Die Multiplikation einer Matrix $A$ von links mit einer Elementarmatrix entspricht der Anwendung einer elementaren Zeilenoperation des Gauß-Verfahrens auf $A$.
-              \subitem Notation: $Zi$ statt $Ci$
-        \item Die Multiplikation einer Matrix $A$ von rechts mit einer Elementarmatrix entspricht der Anwendung einer elementaren Spaltenoperation auf $A$.
-              \subitem Notation: $Si$ statt $Ci$
-    \end{itemize}
-
-    \begin{itemize}
-        \item $C1$ entspricht dem Addieren von $\lambda$-mal Spalte bzw. Zeile $j$ auf Spalte bzw. Zeile $i$.
-        \item $C2$ entspricht dem Tauschen von Spalte bzw. Zeile $i$ mit Spalte bzw. Zeile $j$.
-        \item $C3$ entspricht dem Multiplizieren von Spalte bzw. Zeile $i$ mit $\lambda$.
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Elementarmatrizen}
-    Sei
-    $$
-        A = \vektor{1 & 0 \\ -5 & 2}
-    $$
-    Bestimmen Sie Elementarmatrizen $M_1$ und $M_2$ mit $M_1M_2A = E$.
-
-    \exampleseparator
-
-    Es gilt:
-    $$
-        \begin{sysmatrix}{cc|cc}
-            1 & 0 & 1 & 0 \\
-            -5 & 2 & 0 & 1
-        \end{sysmatrix}
-        \sim
-        \begin{sysmatrix}{cc|cc}
-            1 & 0 & 1 & 0 \\
-            0 & 2 & 5 & 1
-        \end{sysmatrix}
-        \sim
-        \begin{sysmatrix}{cc|cc}
-            1 & 0 & 1 & 0 \\
-            0 & 1 & \frac{5}{2} & \frac{1}{2}
-        \end{sysmatrix}
-    $$
-    Damit gilt:
-    $$
-        A^{-1} = \vektor{1 & 0 \\ \frac{5}{2} & \frac{1}{2}} =\footnote{Das wird aus dem Kontext ersichtlich: Für $A^{-1}$ wird zuerst fünfmal \Rnum{1} auf \Rnum{2} addiert und anschließend wird \Rnum{2} mit $\frac{1}{2}$ skaliert.} \vektor{1 & 0 \\ 0 & \frac{1}{2}} \cdot \vektor{1 & 0 \\ 5 & 1}
-    $$
-    und schlussendlich:
-    $$
-        A^{-1} \cdot A = \vektor{1 & 0 \\ 0 & \frac{1}{2}} \cdot \vektor{1 & 0 \\ 5 & 1} \cdot A = M_1 M_2  A
-    $$\qed
-\end{example}
-
-\begin{defi}{Eigenschaften der Determinante}
-    Für $A, B \in K^{n\times n}$ gilt:
-    \begin{itemize}
-        \item $S1$ und $Z1$ ändern die Determinante einer Matrix nicht. ($\det(C1) = 1$)
-        \item $S2$ und $Z2$ kehren das Vorzeichen der Determinante um. ($\det(C2) = -1$)
-        \item $S3$ und $Z3$ vervielfachen den Wert der Determinante um den Faktor $\lambda$. ($\det(C3) = \lambda$)
-    \end{itemize}
-
-    \begin{itemize}
-        \item $\det(A) = \det(A^T)$
-        \item Besitzt $A$ zwei gleiche Spalten bzw. Zeilen, so gilt $\det(A) = 0$.
-        \item $A$ invertierbar $\iff \det(A) \neq 0$
-        \item $\det(AB) = \det(A)\det(B)$
-        \item $A$ invertierbar $\implies \det(A^{-1}) = (\det(A))^{-1}$
-    \end{itemize}
-\end{defi}
-
-\subsection{Verfahren zur Berechnung der Determinante}
-
-\begin{defi}{Laplacescher Entwicklungssatz}
-    Für $A \in K^{n\times n}$ bezeichne $A_{ij}$ die Matrix in $K^{(n-1)\times (n-1)}$, die durch Streichen der $i$-ten Zeile und der $j$-ten Spalte aus $A$ hervorgeht.
-
-    Es sei $A = (a_{ij}) \in K^{n\times n}$ und $j$ mit $1 \leq j \leq n$.
-    Dann gilt:
-    $$
-        \det(A) = \sum^n_{i=1} (-1)^{i+j} a_{ij}\det(A_{ij})
-    $$
-    Man spricht von der \emph{Entwicklung der Determinante nach der j-ten Spalte}.
-    Ebenso ist eine \emph{Entwicklung der Determinante nach der i-ten Zeile} möglich:
-    $$
-        \det(A) = \sum^n_{j=1} (-1)^{i+j} a_{ij}\det(A_{ij})
-    $$
-\end{defi}
-
-\begin{defi}{Determinante mit Gauß-Algorithmus}
-    Zur Berechnung mit dem Gauß-Algorithmus bringt man die gegebene Matrix $A$ mittels äquivalenter Zeilen- oder Spaltenumformungen $Z1$-$Z3$ bzw. $S1$-$S3$ auf Stufenform $B$ und errechnet dann nach Folgerung $\det(A)$ leicht als Produkt der Hauptdiagonalelelemente von $B$, multipliziert mit den Determinanten der genutzten Elementarmatrizen.
-\end{defi}
-
-\begin{example}{Determinante mit Gauß-Algorithmus}
-    Berechnen Sie die Determinante von $A = \vektor{4 & 5 & 6 \\ 2 & -2 & -1 \\ 0 & 1 & -3}$ mit Hilfe des Gauß-Algorithmus.
-
-    \exampleseparator
-
-    $$
-        \vektor{4 & 5 & 6 \\ 2 & -2 & -1 \\ 0 & 1 & -3}
-        \underset{}{\xrightarrow{\text{\Rnum{2}: \Rnum{2} + 2 \Rnum{3}}}}
-        \vektor{4 & 5 & 6 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
-        \underset{}{\xrightarrow{\text{\Rnum{1}: \Rnum{1} - 5 \Rnum{3}}}}
-        \vektor{4 & 0 & 21 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
-        \underset{}{\xrightarrow{\text{\Rnum{1}: \Rnum{1} - 2 \Rnum{2}}}}
-        \vektor{0 & 0 & 35 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
-    $$
-    $$
-        \vektor{0 & 0 & 35 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
-        \underset{\nicefrac{1}{35} \cdot \det(A)}{\xrightarrow{\text{\Rnum{1}: \Rnum{1} - 2 \Rnum{2}}}}
-        \vektor{0 & 0 & 1 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
-        \underset{}{\xrightarrow{\text{(\Rnum{2}: \Rnum{2} + 7 \Rnum{1})} \ \circ \ \text{(\Rnum{3}: \Rnum{3} + 3 \Rnum{1})}}}
-        \vektor{0 & 0 & 1 \\ 2 & 0 & 0 \\ 0 & 1 & 0}
-    $$
-    $$
-        \vektor{0 & 0 & 1 \\ 2 & 0 & 0 \\ 0 & 1 & 0}
-        \underset{(-1)\cdot(-1)\cdot \det A}{\xrightarrow{\text{(\Rnum{1}$\,\leftrightarrow\,$\Rnum{3})} \ \circ \ \text{(\Rnum{1}$\,\leftrightarrow\,$\Rnum{2})}}}
-        \vektor{2 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1}
-    $$
-    Damit gilt:
-    $$
-        \det A = (-1) \cdot (-1) \cdot 35 \cdot \dvektor{2 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} = 35 \cdot 2 = 70
-    $$\qed
-\end{example}
-
-\begin{bonus}{Tipps zur Determinantenberechnung}
-    \begin{enumerate}
-        \item Für $(2\times 2)$- und $(3\times 3)$-Matrizen empfiehlt sich die Sarrus-Regel.\footnote{Siehe Lineare Algebra 1}
-        \item Die Laplace-Entwicklung ist dann vorzuziehen, wenn in einer Spalte oder Zeile nur wenige Nicht-Null-Einträge vorhanden sind, weil bei einer Entwicklung nach dieser Zeile bzw. Spalte die meisten Summanden erst gar nicht berechnet werden müssen.
-        \item Es können zur Berechnung der Determinanten mehrere Verfahren kombiniert werden, z.B. $(4\times 4)$-Matrizen zuerst nach Laplace entwickeln und die dann entstehenden Determinanten von $(3\times 3)$-Matrizen direkt mit der Sarrus-Regel berechnen.
-    \end{enumerate}
-\end{bonus}
-
-\begin{bonus}{Inverse einer $(2\times 2)$-Matrix}
-    Sei $A$ definiert als $A = \vektor{a & b \\ c & d}$. Dann gilt:
-    $$
-        A^{-1} = \frac{1}{\det(A)} \vektor{d & -b \\ -c & a} = \frac{1}{ad - bc} \vektor{d & -b \\ -c & a}
-    $$
-\end{bonus}
-
-\section{Lineare Gleichungssysteme}
-
-\subsection{Lösbarkeit eines linearen Gleichungssystems}
-
-\begin{defi}{Lineares Gleichungssystem}
-    Seien $A = (a_{ij}) \in K^{m\times n}$ und $b = \vektor{b_1 & \ldots & b_m}^T$.
-    Dann heißt
-    $$
-        \begin{aligned}
-             & a_{11}x_1 &  & + \ \ldots \ + &  & a_{1n}x_n &  & = &  & b_1 \\
-             & \ldots                                                       \\
-             & a_{m1}x_1 &  & + \ \ldots \ + &  & a_{mn}x_n &  & = &  & b_m
-        \end{aligned}
-    $$
-    \emph{lineares Gleichungssystem} bzgl. $(x_1, \ldots, x_n)$ mit Koeffizienten $a_{ij}$ in $K$.
-    Hierbei sind $x_1, \ldots, x_n$ die \emph{Unbekannten} des Systems.
-
-    Für $b = 0_{m1}$ nennt man das lineare Gleichungssystem \emph{homogen}, sonst \emph{inhomogen}.
-
-    Jedes lineare Gleichungssystem kann in der Form $Ax = b$ geschrieben werden.
-\end{defi}
-
-\begin{defi}{Lösungsmenge}
-    Die \emph{Lösungsmenge} $L(A, b)$ des zu $(A, b)$ gehörigen Gleichungssystems ist festgelegt durch
-    $$
-        L(A, b) := \{x \in K^n \mid Ax = b\}
-    $$
-\end{defi}
-
-\begin{defi}{Spaltenrang}
-    Die lineare Abbildung $L_A : K^n \to K^m$ sei gegeben durch $L_A(x) := Ax$. Dann sei $\rg(A) := \rg(L_A)$.
-    Der \emph{Spaltenrang} $\rg_S(A)$ sei die maximale Anzahl linear unabhängiger Spaltenvektoren von $A$.
-
-    Es gilt $\rg(A) = \rg_S(A)$.
-\end{defi}
-
-\begin{defi}{Zeilenrang}
-    Für $A \in K^{m\times n}$ sei die maximale Anzahl linear unabhängiger Zeilenvektoren von $A$ der \emph{Zeilenrang} $\rg_Z(A)$ von $A$.
-
-    Es gilt:
-    $$
-        \rg(A) = \rg_S(A) = \rg_Z(A)
-    $$
-\end{defi}
-
-\begin{defi}{Lösbarkeit von linearen Gleichungssystemen}
-    Das lineare Gleichungssystem $Ax = b$ ist genau dann lösbar, wenn gilt:
-    $$
-        \rg(a_1, \ldots, a_n) = \rg(a_1, \ldots, a_n, b)
-    $$
-    Kürzer schreibt man $\rg(A) = \rg(A, b)$.
-
-    $Ax = b$ ist also genau dann eindeutig lösbar, falls $\ker(A) = \{0\} \iff \rg(A) = \rg(A, b) = n$.
-\end{defi}
-
-\begin{bonus}{Äquivalente Bedingungen für eindeutige Lösbarkeit}
-    Sei $K \in \{\R, \C\}$.
-    Für $A \in K^{n\times n}$ und die dadurch gegebene lineare Abbildung $L_A$ sind folgende Bedingungen äquivalent:
-    \begin{enumerate}
-        \item $A$ ist invertierbar.
-        \item $Ax = 0$ hat nur die triviale Lösung $x=0$.
-        \item Durch Zeilen- und Spaltenumformungen kann $A$ auf die Einheitsmatrix transformiert werden.
-        \item $A$ ist darstellbar als Produkt von Elementarmatrizen.
-        \item $Ax = b$ besitzt für jedes $b \in K^n$ mindestens eine Lösung.
-        \item $Ax = b$ hat genau eine Lösung für jedes $b \in K^n$.
-        \item $\det(A) \neq 0$
-        \item $\im(A) = K^n$
-        \item $L_A$ ist bijektiv.
-        \item Die Spaltenvektoren von $A$ sind linear unabhängig.
-        \item Die Zeilenvektoren von $A$ sind linear unabhängig.
-        \item Die Spaltenvektoren von $A$ bilden eine Basis von $K^n$.
-        \item Die Zeilenvektoren von $A$ bilden eine Basis von $K^n$.
-        \item $\rg(A)=n$
-        \item $\ker(L_A) = \{0\}$
-        \item $(\ker(L_A))^\perp = K^n$
-        \item Das orthogonale Komplement des von den Zeilen von $A$ aufgespannten Raums ist $\{0\}$.
-        \item $A^TA$ ist invertierbar.
-    \end{enumerate}
-\end{bonus}
-
-\begin{defi}{Allgemeine Lösung eines linearen Gleichungssystems}
-    Sei $x_s \in K^n$ eine (spezielle) Lösung von $Ax = b$.
-    Dann gilt:
-    $$
-        L(A, b) = x_s + \ker(A) = \{x_s + x \mid x \in \ker(A)\}
-    $$
-    bzw., wenn $(v_1, \ldots, v_r)$ eine Basis von $\ker(A)$ ist:
-    $$
-        L(A, b) = \{x + \lambda_1 v_1 + \ldots + \lambda_rv_r \mid \lambda_i \in K\}
-    $$
-\end{defi}
-
-\begin{example}{Allgemeine Lösung eines linearen Gleichungssystems}
-    Finden Sie die Lösung des linearen Gleichungssystems
-    $$
-        \vektor{-1 & 1 & 0 \\ 0 & 1 & 1}x = \vektor{0 \\ 2}
-    $$
-    mit Hilfe folgender Schritte:
-    \begin{enumerate}[a)]
-        \item Bestimmen Sie den Kern der Abbildungsmatrix.
-        \item Erraten Sie eine spezielle Lösung.
-        \item Bestimmen Sie die allgemeine Lösung.
-    \end{enumerate}
-
-    \exampleseparator
-
-    \begin{enumerate}[a)]
-        \item $$
-                  \begin{sysmatrix}{rrr|r}
-                      -1 & 1 & 0 & 0 \\
-                      0 & 1 & 1 & 0
-                  \end{sysmatrix}
-                  \quad \implies \quad
-                  \ker \vektor{-1 & 1 & 0 \\ 0 & 1 & 1} = \scalarprod{\vektor{1 \\ 1 \\ -1}}
-              $$\qed
-        \item $$
-                  x = \vektor{0\\0\\2} \quad \implies \quad \vektor{-1 & 1 & 0 \\ 0 & 1 & 1}\cdot \vektor{0\\0\\2} = \vektor{0 \\ 2}
-              $$\qed
-        \item Es gilt:
-              $$
-                  L \left({\vektor{-1 & 1 & 0 \\ 0 & 1 & 1}, \vektor{0 \\ 2}} \right) = \vektor{0\\0\\2} + \ker\vektor{-1 & 1 & 0 \\ 0 & 1 & 1} = \vektor{0\\0\\2} + \lambda \cdot \vektor{1 \\ 1 \\ -1}, \quad \lambda \in \R
-              $$\qed
-    \end{enumerate}
-\end{example}
-
-\begin{defi}{Cramersche Regel}
-    Es seien $A = \vektor{a_1 & \ldots & a_n} \in K^{n\times n}$ und $x, b \in K^n$ sowie $Ax=b$ ein lineares Gleichungssystem, und es gelte $\det(A) \neq 0$.
-    Seien
-    $$
-        A_i := \vektor{a_1 & \ldots & a_{i-1} & b & a_{i+1} & \ldots & a_n}, 1 \leq i \leq n
-    $$
-    Dann gilt:
-    $$
-        x_i = \frac{\det(A_i)}{\det(A)}
-    $$
-\end{defi}
-
-\begin{example}{Cramersche Regel}
-    In der Elektrotechnik ergeben sich eine Widerstandsmatrix $R$ und ein Quellspannungsvektor $U$:
-    $$
-        R = \vektor{1 & 3 & 0 \\ 1 & 4 & 1 \\ 2 & 1 & 1}, \quad U = \vektor{5 \\ 9 \\ 8}.
-    $$
-    Gesucht ist der Stromvektor $I$, der sich durch Lösen des linearen Gleichungssystems
-    $$
-        R \cdot I = U
-    $$
-    ergibt.
-    Bestimmen Sie die Lösung mithilfe der Cramerschen Regel.
-
-    \exampleseparator
-
-    Es gilt:
-    $$
-        \vektor{1 & 3 & 0 \\ 1 & 4 & 1 \\ 2 & 1 & 1}  \vektor{i_1 \\ i_2 \\ i_3} = \vektor{5 \\ 9 \\ 8}
-    $$
-
-    Nach der Cramerschen Regel gilt:\footnote{$\abs{R} = -1 \cdot (1-6) + 1 \cdot (4-3) = 6$}
-    $$
-        i_1 = \frac{\dvektor{5 & 3 & 0 \\ 9 & 4 & 1 \\ 8 & 1 & 1}}{\abs{R}} = \frac{-1 \cdot (5-24) + 1 \cdot (20-27)}{6} = \frac{12}{6} = 2
-    $$
-    $$
-        i_2 = \frac{\dvektor{1 & 5 & 0 \\ 1 & 9 & 1 \\ 2 & 8 & 1}}{\abs{R}} = \frac{-1 \cdot (8-10) + 1 \cdot (9-5)}{6} = \frac{6}{6} = 1
-    $$
-    $$
-        i_3 = \frac{\dvektor{1 & 3 & 5 \\ 1 & 4 & 9 \\ 2 & 1 & 8}}{\abs{R}} = \frac{32+54+5-40-9-24}{6} = \frac{18}{6} = 3
-    $$
-
-    Damit ist der Stromvektor $I$ gegeben mit $I = \vektor{2 & 1 & 3}^T$.\qed
-\end{example}
-
-\subsection{Über- und unterbestimmte lineare Gleichungssysteme}
-
-\begin{defi}{Normalgleichung}
-    Sei $p_A(b)$ die Projektion eines Vektors $b \in \R^m$ auf den von den Vektoren $A = \vektor{a_1 & \ldots & a_n} \in \R^{m\times n}$ aufgespannten Unterraum $U$, also das Bild von $A$.
-
-    Damit existiert ein $x \in \R^n$ mit
-    $$
-        p_A(b) = \sum^n_{k=1} x_ka_k = Ax
-    $$
-    Dann gilt
-    $$
-        b - p_A(b) \iff \ldots \iff A^TAx = A^Tb
-    $$
-
-    Die Gleichungen $A^TAx = A^Tb$ heißen \emph{Normalgleichungen}.
-
-    Die Normalgleichungen sind für jede relle Matrix $A \in \R^{m\times n}$ lösbar.
-
-\end{defi}
-
-\begin{defi}{Verallgemeinerte Inverse}
-    Gegeben ist ein lineares Gleichungssystem $Ax=b$ mit $A \in \R^{m\times n}$, $x \in \R^n$, $b \in \R^m$.
-
-    Im Fall $\rg(A) = n$ (voller Spaltenrang) existiert mit
-    $$
-        x = (A^TA)^{-1}A^Tb
-    $$
-    eine eindeutige Lösung.
-    In diesem Fall heißt $(A^TA)^{-1}A^T$ \emph{verallgemeinerte Inverse} von $A$.
-
-    Im Fall $\rg(A) = m$ (voller Zeilenrang) existiert mit
-    $$
-        x = A^T(AA^T)^{-1}b
-    $$
-    eine eindeutige Lösung.
-    In diesem Fall heißt $A^T(AA^T)^{-1}$ \emph{verallgemeinerte Inverse} von $A$.
-\end{defi}
-
-\begin{algo}{Lösen von überbestimmten Gleichungssystemen (Methode der kleinsten Quadrate)}
-    Gegeben ist das \emph{überbestimmte} Gleichungssystem
-    $$
-        Ax = b, \quad A \in \R^{m\times n}, \, b\in \R^m, \, m \geq n
-    $$
-    Im Fall $\rg(A) = n$ (voller Spaltenrang) gilt mithilfe der verallgemeinerten Inverse für
-    $$
-        x_s = (A^TA)^{-1}A^Tb
-    $$
-    dass
-    $$
-        \norm{b-Ax_s} = \min_{z\in\R^n} \norm{b-Az}
-    $$
-
-    Der Vektor $x_s$ heißt \emph{Näherungslösung nach der Methode der kleinsten Quadrate}.
-\end{algo}
-
-\begin{example}{Methode der kleinsten Quadrate}
-    Eine Messreihe ergibt zu den Zeiten $t = 1,2,3,4,5$ in Sekunden folgende Temperaturwerte:
-
-    \begin{center}
-        \begin{tabular}{l | CCCCC}
-            $t$ Sekunden        & 1   & 2   & 3    & 4    & 5    \\
-            \hline
-            $y(t)\si{\celsius}$ & 0.9 & 5.8 & 11.4 & 12.1 & 12.9 \\
-        \end{tabular}
-    \end{center}
-
-    Stellen Sie das überbestimmte Gleichungssystem für die unbekannten Parameter $a$ und $b$ auf und bestimmen Sie diese nach der Methode der kleinsten Quadrate, wenn folgende Beziehung zwischen $y$ und $t$ gilt:
-    $$
-        y(t) = a \cdot t + b \cdot \sin\left( -t \cdot \frac{\pi}{2} \right)
-    $$
-    \exampleseparator
-
-    \begin{center}
-        \begin{tikzpicture}[scale=1]
-            \begin{axis}[
-                    %view={45}{15},
-                    width=15cm,
-                    unit vector ratio*=1 1,
-                    axis lines = middle,
-                    grid=major,
-                    ymin=-.5,
-                    ymax=14,
-                    xmin=0,
-                    xmax=7,
-                    %zmin=-1,
-                    %zmax=10,
-                    xlabel = $x$,
-                    ylabel = $y$,
-                    %zlabel = $z$,
-                    %xtick style={draw=none},
-                    %ytick style={draw=none},
-                    %ztick style={draw=none},
-                    xtick distance={1},
-                    ytick distance={1},
-                    %ztick distance={1},
-                    %xticklabels=\empty,
-                    %yticklabels=\empty,
-                    %zticklabels=\empty,
-                    disabledatascaling,
-                ]
-
-                \addplot[domain=0:6, samples=100, color=red]{3.02308 * x - 2.22308 * sin(deg(x * pi/2))};
-
-                \node[label={315:{(1,0.9)}},circle,fill,inner sep=1pt] at (axis cs:1,0.9) {};
-                \node[label={135:{(2,5.8)}},circle,fill,inner sep=1pt] at (axis cs:2,5.8) {};
-                \node[label={135:{(3,11.4)}},circle,fill,inner sep=1pt] at (axis cs:3,11.4) {};
-                \node[label={135:{(4,12.1)}},circle,fill,inner sep=1pt] at (axis cs:4,12.1) {};
-                \node[label={315:{(5,12.9)}},circle,fill,inner sep=1pt] at (axis cs:5,12.9) {};
-            \end{axis}
-        \end{tikzpicture}
-    \end{center}
-\end{example}
-
-\begin{example}{Methode der kleinsten Quadrate (Fortsetzung)}
-    Mit den gegebenen Daten erhalten wir folgendes LGS:
-    $$
-        Ax = b \quad \iff \quad \vektor{1 & -\sin \frac{\pi}{2} \\ 2 & -\sin \pi \\ 3 & -\sin \frac{3\pi}{2} \\ 4 & -\sin 2 \pi \\ 5 & -\sin \frac{5\pi}{2}}\vektor{a \\ b} = \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \quad \iff \quad \vektor{1 & -1 \\ 2 & 0 \\ 3 & 1 \\ 4 & 0 \\ 5 & -1}\vektor{a \\ b} = \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9}
-    $$
-    mit
-    $$
-        \rg(A) = 2 = n \quad \implies \quad A^TAx = A^Tb \quad \iff \quad x = \left(A^T A\right)^{-1} A^T b
-    $$
-    Dann gilt nach der Methode der kleinsten Quadrate:
-    $$
-        \begin{aligned}
-            x_s \quad = \quad & \left(A^T A\right)^{-1} A^T b                     \\
-            = \quad           & \left(\vektor{1               & 2  & 3  & 4  & 5  \\ -1 & 0 & 1 & 0 & -1} \vektor{1 & -1 \\ 2 & 0 \\ 3 & 1 \\ 4 & 0 \\ 5 & -1}\right)^{-1} \vektor{1 & 2 & 3 & 4 & 5 \\ -1 & 0 & 1 & 0 & -1} \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \\
-            = \quad           & \vektor{55                    & -3                \\ -3 & 3}^{-1} \vektor{1 & 2 & 3 & 4 & 5 \\ -1 & 0 & 1 & 0 & -1} \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \\
-            = \quad           & \frac{1}{156}\vektor{3        & 3                 \\ 3 & 55} \vektor{1 & 2 & 3 & 4 & 5 \\ -1 & 0 & 1 & 0 & -1} \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \\
-            = \quad           & \frac{1}{156}\vektor{0        & 6  & 12 & 12 & 12 \\ -52 & 6 & 64 & 12 & -40} \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \\
-            = \quad           & \frac{1}{156}\vektor{471.6                        \\ 346.8} = \vektor{3.02308 \\ 2.22308} = \vektor{a \\ b}
-        \end{aligned}
-    $$
-
-    Damit gilt insgesamt:
-    $$
-        y(t) = a \cdot t + b \cdot \sin\left( -t \cdot \frac{\pi}{2} \right) = 3.02308 \cdot t + 2.22308 \cdot \sin\left( -t \cdot \frac{\pi}{2} \right)
-    $$\qed
-\end{example}
-
-
-\begin{algo}{Lösen von unterbestimmten Gleichungssystemen}
-    Gegeben ist das \emph{unterbestimmte} Gleichungssystem
-    $$
-        Ax = b, \quad A \in \R^{m\times n}, \, b\in \R^m, \, m \leq n
-    $$
-    Im Fall $\rg(A) = m$ (voller Zeilenrang) gilt mithilfe der verallgemeinerten Inverse für
-    $$
-        x_s = A^T(AA^T)^{-1}b
-    $$
-    dass
-    $$
-        \norm{x_s} = \min_{Ax=b} \norm{x} \quad \land \quad x_s \perp \ker(A)
-    $$
-
-    Der Vektor $x_s$ ist eine \emph{eindeutige Lösung mit minimaler Norm}.
-\end{algo}
-
-\begin{example}{Lösen von unterbestimmten Gleichungssystemen}
-    Die Punkte $A(6;0;0)$, $B(2;1;3)$ und $C(-2;-2;2)$ liegen in einer Ebene $E$.
-    \begin{enumerate}[a)]
-        \item Stellen Sie die Hessesche Normalform der Ebene auf.
-              Wie groß ist der Abstand der Ebene zum Ursprung?
-        \item Welcher Punkt in der Ebene hat den kleinsten Abstand zum Ursprung?
-              Stellen Sie dazu das zugehörige unterbestimmte LGS auf und finden Sie die Lösung mit Hilfe der verallgemeinerten Inverse.
-    \end{enumerate}
-
-    \exampleseparator
-
-    \begin{enumerate}[a)]
-        \item Wir wählen uns $\vec{a}$ (Ortsvektor von $A$) als Stützvektor und die Vektoren $v = \vec{b} - \vec{a}$ und $w = \vec{c} - \vec{a}$ als Richtungsvektoren der Ebene.
-              Dann gilt:
-              $$
-                  v = \vektor{2\\1\\3} - \vektor{6\\0\\0} = \vektor{-4\\1\\3}, \qquad w = \vektor{-2\\-2\\2} - \vektor{6\\0\\0} = \vektor{-8\\-2\\2}
-              $$
-              $$
-                  n = \frac{v \times w}{\abs{v \times w}} = \frac{1}{\abs{v \times w}} \vektor{8 \\ -16 \\ 16} = \frac{1}{24} \vektor{8 \\ -16 \\ 16} = \vektor{\nicefrac{1}{3} \\ -\nicefrac{2}{3} \\ \nicefrac{2}{3}}
-              $$
-
-              Mit $n$ als (normierten) Normalenvektor erhalten wir dann die Hessesche Normalform der Ebene mit
-              $$
-                  E: \scalarprod{x,n} = \scalarprod{\vec{a}, n} \quad \iff \quad \frac{1}{3} \cdot x - \frac{2}{3} \cdot y + \frac{2}{3} \cdot z = 2
-              $$
-
-              Setzen wir den Nullpunkt in die Ebene ein, erhalten wir den Abstand mit $d = 2$.\qed
-        \item Mit der Ebenengleichung
-              $$
-                  E: \frac{1}{3} \cdot x - \frac{2}{3} \cdot y + \frac{2}{3} \cdot z = 2
-              $$
-              können wir folgendes unterbestimmte LGS aufstellen:
-              $$
-                  Ax = b \quad \iff \quad \vektor{\nicefrac{1}{3} & -\nicefrac{2}{3} & \nicefrac{2}{3}} \vektor{x \\ y \\ z} = \vektor{2}
-              $$
-              mit
-              $$
-                  \rg(A) = 1 = m \quad \implies \quad x = A^T \left(AA^T\right)^{-1}b
-              $$
-
-              Dann gilt:
-              $$
-                  \begin{aligned}
-                      x_s \quad = \quad & A^T \left(AA^T\right)^{-1}b \\
-                      = \quad           & \vektor{\nicefrac{1}{3}     \\ -\nicefrac{2}{3} \\ \nicefrac{2}{3}} \left( \vektor{\nicefrac{1}{3} & -\nicefrac{2}{3} & \nicefrac{2}{3}} \vektor{\nicefrac{1}{3} \\ -\nicefrac{2}{3} \\ \nicefrac{2}{3}} \right)^{-1} \cdot 2 \\
-                      = \quad           & \vektor{\nicefrac{2}{3}     \\ -\nicefrac{4}{3} \\ \nicefrac{4}{3}} = \vektor{x\\y\\z}
-                  \end{aligned}
-              $$
-              Damit ist dann $\vektor{\nicefrac{2}{3} & -\nicefrac{4}{3} & \nicefrac{4}{3}}^T$ der gesuchte Punkt in der Ebene mit dem geringsten Abstand.\qed
-    \end{enumerate}
-\end{example}
-\section{Geometrie linearer Abbildungen}
-
-\subsection{Orthogonale Abbildungen und Matrizen}
-
-\begin{defi}{Isometrie}
-    Eine \emph{Isometrie} ist eine lineare Abbildung, die zwei metrische Räume aufeinander abbildet und dabei die euklidische Länge eines Vektors erhält.
-
-    Man spricht auch von einer abstandserhaltenden Abbildung.
-
-    Sei $f : \R^n \to \R^n$ beliebig. Dann sind äquivalent:
-    \begin{enumerate}
-        \item $\forall x, y \in \R^n : \scalarprod{f(x), f(y)} = \scalarprod{x, y}$
-        \item $f$ ist eine winkelerhaltende Isometrie.
-    \end{enumerate}
-\end{defi}
-
-\begin{defi}{Orthogonalmatrix}
-    Eine Matrix $A\in \R^{n\times n}$ heißt \emph{orthogonal}, wenn ihre Spaltenvektoren eine Orthonormalbasis bilden.
-
-    Die Menge aller orthogonalen Matrizen in $\R^{n\times n}$ heiße $O(n)$.
-
-    Es gilt:
-    \begin{itemize}
-        \item $A \in O(n) \implies \abs{\det(A)} = 1$
-    \end{itemize}
-
-    Es sind äquivalent:
-    \begin{enumerate}
-        \item $A \in O(n)$
-        \item $A$ ist invertierbar, und es gilt $A^{-1} = A^T$
-        \item $A^T \in O(n)$
-    \end{enumerate}
-\end{defi}
-
-\begin{example}{Orthogonalmatrix}
-    Zeigen Sie, dass die Matrix
-    $$
-        Q = \vektor{
-            \cos \beta & -\sin\beta & 0 \\
-            \cos \alpha \sin\beta & \cos\alpha \cos\beta & -\sin\alpha \\
-            \sin\alpha \sin\beta & \sin\alpha \cos\beta & \cos\alpha
-        }
-    $$
-    eine Orthogonalmatrix ist und bestimmen Sie ihre Inverse.
-
-    \exampleseparator
-
-    Genau dann, wenn $Q$ eine Orthogonalmatrix ist, ist $QQ^T = I$ und damit auch $Q^T = Q^{-1}$:
-    $$
-        \begin{aligned}
-            QQ^T = \quad        &
-            \vektor{ \cos \beta & -\sin\beta                        & 0                        \\ \cos \alpha \sin\beta & \cos\alpha \cos\beta & -\sin\alpha \\ \sin\alpha \sin\beta & \sin\alpha \cos\beta & \cos\alpha }
-            \vektor{ \cos\beta  & \cos\alpha \sin\beta              & \sin\alpha \sin\beta     \\ -\sin\beta & \cos\alpha \cos\beta & \sin\alpha \cos\beta \\ 0 & -\sin\alpha & \cos\alpha} \\
-            = \quad             & \vektor{\cos^2\beta + \sin^2\beta & 0                    & 0 \\ 0 & \cos^2\alpha \left( \sin^2\beta + \cos^2\beta \right) + \sin^2\alpha & 0  \\ 0 & 0 & \sin^2\alpha \left( \sin^2\beta + \cos^2\beta \right) + \cos^2\alpha} \\
-            = \quad             & \vektor{\cos^2\beta + \sin^2\beta & 0                    & 0 \\ 0 & \cos^2\alpha  + \sin^2\alpha & 0  \\ 0 & 0 & \sin^2\alpha + \cos^2\alpha} \\
-            = \quad             & \vektor{1                         & 0                    & 0 \\ 0 & 1 & 0  \\ 0 & 0 & 1}
-        \end{aligned}
-    $$
-
-    Damit ist $Q$ eine Orthogonalmatrix und $Q^T$ die Inverse von $Q$.\qed
-\end{example}
-
-\begin{algo}{QR-Zerlegung}
-    Sei $A = \vektor{a_1 & \ldots & a_n} \in \R^{m\times n}$ und $\rg(A) = n$.
-    Dann gibt es eine in den Spalten orthogonale Matrix $Q \in \R^{m\times n}$ und eine obere Dreiecksmatrix $R \in \R^{n\times n}$ mit $A = QR$.
-    Hierbei können die Spalten von $Q$ mithilfe des Verfahrens von Gram-Schmidt aus den Spalten von $A$ erzeugt werden, und es gilt $\rg(R) = n$.
-
-    Mit $Q = \vektor{q_1 & \ldots & q_n}$ und $R = (\varrho_{ij})$ ergibt sich $R$ durch Lösen der $n$ linearen Gleichungen
-    $$
-        \vektor{a_1 & \ldots & a_n} = \vektor{q_1 & \ldots & q_n} \vektor{ \varrho_{11} & \varrho_{12} & \ldots & \varrho_{1n} \\ & \varrho_{22} & \ldots & \varrho_{2n} \\ & & \ddots & \vdots \\ & & & \varrho_{nn}}
-    $$
-    Hierbei kann bei $n > 1$ über die per Gram-Schmidt generierten Zwischenrechnungen durch Koeffizientenvergleich gelöst werden.
-\end{algo}
-
-\begin{example}{QR-Zerlegung}
-    Wie lautet die QR-Zerlegung von
-    $$
-        A = \vektor{3 & 1 \\ 4 & 5}?
-    $$
-    Lösen Sie anschließend mit dieser Zerlegung das lineare Gleichungssystem $Ax = b$ mit $b = \vektor{2 & 3}^T$.
-
-    \exampleseparator
-
-    Wir wenden das Gram-Schmidt-Verfahren auf die Spaltenvektoren an:\footnote{Wir sehen, dass die Vektoren orthogonal sind.}
-    $$
-        \begin{aligned}
-            v_1 \quad = \quad & \vektor{3                                                        \\4} \\
-            w_1 \quad = \quad & \frac{v_1}{\norm{v_1}} = \frac{1}{5}\vektor{3                    \\4} = \vektor{\nicefrac{3}{5}\\\nicefrac{4}{5}} \\
-            v_2 \quad = \quad & \vektor{1                                                        \\5} \\
-            r_2 \quad = \quad & v_2 - \scalarprod{v_2, w_1}w_1                                   \\
-            = \quad           & \vektor{1                                                        \\ 5} - \left( \frac{1}{5} \right)^2\scalarprod{\vektor{1 \\ 5}, \vektor{3 \\ 4}}\vektor{3 \\ 4} =  \vektor{-\nicefrac{44}{25}                      \\ \nicefrac{33}{25}}\\
-            w_2 \quad = \quad & \frac{r_2}{\norm{r_2}} = \frac{5}{11} \vektor{-\nicefrac{44}{25} \\ \nicefrac{33}{25}} = \vektor{-\nicefrac{4}{5} \\ \nicefrac{3}{5}}
-        \end{aligned}
-    $$
-
-    Damit erhalten wir $Q$ mit
-    $$
-        Q = \vektor{w_1 & w_2} =  \vektor{\nicefrac{3}{5} & -\nicefrac{4}{5} \\ \nicefrac{4}{5} & \nicefrac{3}{5}} = \frac{1}{5} \vektor{3 & -4 \\ 4 & 3}
-    $$
-    Da $A$ quadratisch ist\footnote{\ldots und damit auch $Q$}, gilt:
-    $$
-        QR = A \quad \iff \quad R = Q^TA
-    $$
-    womit $R$ gegeben ist, mit
-    $$
-        R = Q^TA = \frac{1}{5}\vektor{3 & 4 \\ -4 & 3} \vektor{3 & 1 \\ 4 & 5} = \frac{1}{5} \vektor{25 & 23 \\ 0 & 11}
-    $$
-\end{example}
-
-\begin{example}{QR-Zerlegung (Fortsetzung)}
-    Für das gegebene lineare Gleichungssystem $Ax = b$ ergibt sich dann:
-    $$
-        Ax = b \quad \iff \quad QRx = b  \quad \iff \quad Rx = Q^Tb
-    $$
-    $$
-        \begin{aligned}
-            \iff \quad     & \frac{1}{5} \vektor{25                                  & 23 \\ 0 & 11}x = \frac{1}{5}\vektor{3 & 4 \\ -4 & 3}\vektor{2\\3} \\
-            \iff \quad     & \vektor{25                                              & 23 \\ 0 & 11}x = \vektor{18 \\ 1} \\
-            \implies \quad & 11x_2 = 1 \quad \land \quad 25x_1 + 23x_2 = 18               \\
-            \iff \quad     & x_2 = \frac{1}{11} \quad \land \quad x_1 = \frac{7}{11}      \\
-            \implies \quad & x = \vektor{\nicefrac{7}{11}                                 \\ \nicefrac{1}{11}}
-        \end{aligned}
-    $$\qed
-\end{example}
-
-\subsection{Eigenwerte und Eigenvektoren}
-
-\begin{defi}{Eigenwert, Eigenvektor und Eigenraum}
-    Existiert für einen Endomorphismus $f$ ein $\lambda \in \C$ und $v\in V \setminus \{0\}$ mit
-    $$
-        f(v) = \lambda v
-    $$
-    dann heißt $v$ \emph{Eigenvektor} von $f$ zum \emph{Eigenwert} $\lambda$.
-
-    Sei $\lambda$ ein Eigenwert von $f$ und $v_1, \ldots, v_k$ Eigenvektoren von $f$ zu $\lambda$.
-    Dann ist auch $v \in L(v_1, \ldots, v_k) \setminus \{0\}$ ein Eigenvektor von $f$ zu $\lambda$.
-
-    Für $\lambda \in \C$ ist $\Eig(f;\lambda) := \{v \in V \mid f(v) = \lambda v\}$, der \emph{Eigenraum} von $f$ zu $\lambda$, ein Untervektorraum von $V$.
-
-    Es gilt:
-    \begin{itemize}
-        \item Für $\lambda \neq \gamma$ gilt $\Eig(f;\lambda) \cap \Eig(f;\gamma) = \{0\}$.
-        \item Eigenvektoren zu unterschiedlichen Eigenwerten sind linear unabhängig.
-        \item Die Eigenwerte einer Dreiecksmatrix sind die Werte auf der Hauptdiagonalen.
-        \item Eigenwerte reeller symmetrischer Matrizen sind immer reell.
-        \item Zu jedem Eigenwert einer reellen symmetrischen Matrix existieren reelle Eigenvektoren.
-        \item Sei $A \in \R^{n\times n}$ symmetrisch, $\lambda \neq \mu$ zwei Eigenwerte von $A$ mit Eigenvektoren $v$ bzw. $w$. Dann gilt $v \perp w$.
-    \end{itemize}
-
-\end{defi}
-
-\begin{defi}{Charakteristisches Polynom}
-    Sei $A \in \C^{n\times n}$.
-    Dann ist die Funktion
-    $$
-        \chi_A(\lambda) := \det(A-\lambda E)
-    $$
-    ein Polynom mit $\deg(\chi_A) = n$ und heißt \emph{charakteristisches Polynom}.
-
-    Es gilt:
-    \begin{itemize}
-        \item $\lambda \in \C$ ist Eigenwert von $A$ $\iff \chi_A(\lambda) = 0$
-        \item $A$ hat (mit Vielfachheit) genau $n$ Eigenwerte $\lambda_i \in \C$.
-        \item $\Eig(f;\lambda) = \ker(A-\lambda E)$
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Eigenwerte und Eigenvektoren}
-    Gegeben sind
-    $$
-        A_t = \vektor{1 & t \\ -2 & -1-t} \quad \text{und} \quad x_t = \vektor{-t \\ 2}, t \in \R
-    $$
-    Zeigen Sie, dass der Vektor $x_t$ Eigenvektor der Matrix $A_t$ ist.
-    Wie lautet der zugehörige Eigenwert?
-    Bestimmen Sie auch den zweiten Eigenwert.
-
-    \exampleseparator
-
-    Berechnen des charakteristischen Polynoms von $A_t$:
-    $$
-        \abs{A - \lambda I} = \abs{\vektor{1 - \lambda & t \\ -2  & -1-t-\lambda}} = (1-\lambda)(-1-t-\lambda) + 2t = \lambda^2 + t\lambda + t - 1
-    $$
-
-    Nullstellen des charakteristischen Polynoms (Eigenwerte):
-    $$
-        \lambda_{1,2} = -\frac{t}{2} \pm \sqrt{\left(\frac{t}{2}\right)^2 - t + 1} = -\frac{t}{2} \pm \sqrt{\frac{t^2-4t + 4}{4}} = -\frac{t}{2} \pm \frac{t-2}{2}
-    $$
-    $$
-        \lambda_1 = -1 \quad \land \quad \lambda_2 = -t +1
-    $$
-
-    Bestimmen des Eigenraums/der Eigenvektoren zum Eigenwert $\lambda_1$:
-    $$
-        \begin{sysmatrix}{cc|c}
-            1-\lambda_1 & t & 0 \\
-            -2 & -1-t-\lambda_1 & 0
-        \end{sysmatrix}
-        \sim
-        \begin{sysmatrix}{cc|c}
-            2 & t & 0 \\
-            -2 & -t & 0
-        \end{sysmatrix}
-        \sim
-        \begin{sysmatrix}{cc|c}
-            2 & t & 0 \\
-            0 & 0 & 0
-        \end{sysmatrix}
-    $$
-    $$
-        \begin{aligned}
-            \implies \quad & 2x_1 + tx_2 = 0 \iff x_1 = -\frac{tx_2}{2}                  \\
-            \implies \quad & E(\lambda_1) = \ker(A-\lambda_1 I) = \scalarprod{\vektor{-t \\ 2}} \ni x_t
-        \end{aligned}
-    $$
-
-    Insgesamt sind also die Eigenwerte $\lambda_1 = -1$ und $\lambda_2 = -t+1$ und $x_t$ Eigenvektor zu $\lambda_1$.\qed
-\end{example}
-
-\begin{bonus}{Eigenwerte und Determinanten}
-    Für $A = \vektor{a_1 & \ldots & a_n} \in \C^{n\times n}$ mit Eigenwerten $\lambda_i$, $1 \leq i \leq n$ gilt
-    $$
-        \det(A) = \prod^n_{i=1}\lambda_i
-    $$
-\end{bonus}
-
-\subsection{Diagonalisierung linearer Abbildungen}
-
-\begin{defi}{Diagonalisierbarkeit}
-    Eine quadratische Matrix $A \in \C^{n\times n}$ heißt \emph{diagonalisierbar}, wenn es eine Diagonalmatrix $D$ und eine invertierbare Matrix $S$ existiert, sodass
-    $$
-        A = SDS^{-1}
-    $$
-    gilt.
-    Dabei ist $A$ genau dann diagonalisierbar, wenn eine Basis aus Eigenvektoren existiert.
-    Bildet man mit ihnen als Spalten eine Matrix $S$, dann ist $S$ genau die oben genannte Matrix\footnote{\ldots des Basiswechsels.}.
-
-    Auf der Hauptdiagonalen von $D$ befinden sich die entsprechenden Eigenwerte von $A$.
-
-    Es gilt:
-    \begin{itemize}
-        \item Zu jeder reellsymmetrischen Matrix $A$ gibt es eine Orthogonalmatrix $S$ und eine Diagonalmatrix $D$ wie oben.
-    \end{itemize}
-\end{defi}
-
-\begin{example}{Diagonalmatrix}
-    Gesucht ist die Matrix $A$ mit den Eigenwerten $1$ und $4$ und den zugehörigen Eigenvektoren $\vektor{4\\1}$ und $\vektor{2\\1}$.
-
-    \exampleseparator
-
-    Wir wissen, dass $A$ diagonalisierbar ist.
-    Damit gilt
-    $$
-        \begin{aligned}
-            A & \quad = SDS^{-1}                    \\
-              & \quad = \vektor{4              & 2  \\ 1 & 1} \vektor{1 & 0 \\ 0 & 4} \vektor{4 & 2 \\ 1 & 1}^{-1} \\
-              & \quad = \vektor{4              & 2  \\ 1 & 1} \vektor{1 & 0 \\ 0 & 4} \frac{1}{2} \vektor{1 & -2 \\ -1 & 4} \\
-              & \quad = \frac{1}{2} \vektor{4  & 2  \\ 1 & 1} \vektor{1 & -2 \\ -4 & 16} \\
-              & \quad = \frac{1}{2} \vektor{-4 & 24 \\ -3 & 14}
-        \end{aligned}
-    $$\qed
-\end{example}
-
-\begin{defi}{Vielfachheit}
-    Sei $A \in \C^{n\times n}$ und $\lambda$ ein Eigenwert.
-
-    Die Vielfachheit der Nullstelle $\lambda$ von $\chi_A$ heißte \emph{algebraische Vielfachheit} $a(\lambda)$.
-
-    Weiter sei $g(\lambda) := \dim(\Eig(A;\lambda))$ die \emph{geometrische Vielfachheit} von $\lambda$.
-
-    Es gilt:
-    \begin{itemize}
-        \item Existiert ein Eigenwert $\tilde{\lambda}$ mit $a(\tilde{\lambda}) > g(\tilde{\lambda})$, dann ist $A$ nicht diagonalisierbar.
-    \end{itemize}
-\end{defi}
-
-\begin{bonus}{Normale Matrix}
-    Eine Matrix $A \in \C^{n\times n}$ heißt \emph{normal}, wenn gilt:
-    $$
-        AA^{*} = A^{*}A \quad \iff \quad A\bar{A}^T = \bar{A}^TA
-    $$
-
-    $A^{*}$ heißt adjungierte Matrix von $A$.
-
-    Sei $A \in \C^{n\times n}$.
-    Es gilt:
-    \begin{itemize}
-        \item Es existiert eine bzgl. des Standardskalarprodukts in $\C^n$ orthonormale Basis aus Eigenvektoren, d.h. $A$ ist diagonalisierbar.
-        \item Jede reelle symmetrische Matrix ist diagonalisierbar. Die Eigenwerte sind reell.
-        \item Jede reelle antisymmetrische Matrix (d.h. $A^T = -A$) ist diagonalisierbar. Die Eigenwerte sind rein imaginär oder 0.
-        \item Jede reelle orthogonale Matrix ist diagonalisierbar.
-    \end{itemize}
-\end{bonus}
-
-\subsection{Definitheit und Skalarprodukte}
-
-\begin{defi}{Skalarprodukt}
-    Für ein \emph{Skalarprodukt} $(\cdot, \cdot) : \R^n \times \R^n \to \R$ müssen drei Bedingungen erfüllt sein:
-    \begin{enumerate}
-        \item $(\cdot, \cdot)$ ist linear in den Spalten.
-        \item $(\cdot, \cdot)$ ist symmetrisch.
-        \item $(x, x) > 0$ für $x \neq 0$.
-    \end{enumerate}
-
-    Wir wählen eine beliebige Matrix $A \in \R^{n\times n}$ und betrachten die Abbildung
-    $$
-        (\cdot, \cdot)_A : \R^n \times \R^n \to \R, \quad (x, y)_A := \scalarprod{x, Ay}
-    $$
-    wobei $\scalarprod{\cdot, \cdot}$ für das Standardskalarprodukt steht.
-
-    Die Abbildung $(\cdot, \cdot)_A$ ist genau dann symmetrisch, wenn $A$ symmetrisch ist.
-
-    Nicht jede symmetrische Matrix definiert ein Skalarprodukt (z.B. die Nullmatrix).
-\end{defi}
-
-\begin{defi}{Quadratische Form}
-    Sei $A$ eine symmetrische Matrix $A \in \R^{n\times n}$.
-
-    Die Abbildung $x \to \scalarprod{x, Ax}$ wird \emph{quadratische Form} genannt.
-\end{defi}
-
-\begin{defi}{Hauptminoren}
-    Für $A \in \R^{n\times n}$ seien $A_k$ die \emph{links oben} beginnenden $k \times k$-Untermatrizen $A_k = (a_{ij})^k_{i,j=1}$ von $A$.
-
-    Dann heißen $D_k = \det(A_k)$ die \emph{Hauptunterdeterminanten} oder \emph{Hauptminoren} von $A$.
-\end{defi}
-
-\begin{defi}{Definitheit}
-    Sei $A$ eine symmetrische Matrix $A \in \R^{n\times n}$.
-
-    Dann gilt:
-    \begin{itemize}
-        \item $A$ heißt \emph{positiv definit}, wenn $\scalarprod{x, Ax} > 0 \forall x \in \R^n \setminus \{0\}$.\footnote{Häufig kürzt man \glqq symmetrisch positiv definit\grqq mit \emph{spd} ab.}
-        \item $A$ heißt \emph{negativ definit}, wenn $\scalarprod{x, Ax} < 0 \forall x \in \R^n \setminus \{0\}$.
-        \item $A$ heißt \emph{positiv semidefinit}, wenn $\scalarprod{x, Ax} \geq 0 \forall x \in \R^n \setminus \{0\}$.
-        \item $A$ heißt \emph{negativ semidefinit}, wenn $\scalarprod{x, Ax} \leq 0 \forall x \in \R^n \setminus \{0\}$.
-        \item $A$ heißt \emph{indefinit}, falls sie weder positiv noch negativ (semi-)definit ist, d.h.
-              $$
-                  \exists x, y \in \R^n \{0\} : \scalarprod{x, Ax} > 0 \land \scalarprod{y, Ay} < 0
-              $$
-    \end{itemize}
-
-    Es gilt:
-    \begin{itemize}
-        \item Die Abbildung $(\cdot, \cdot)_A$ ist genau dann ein Skalarprodukt, wenn $A$ spd ist.
-    \end{itemize}
-
-    Für eine reelle symmetrische Matrix $A$ sind äquivalent:
-    \begin{enumerate}
-        \item $A$ ist positiv definit.
-        \item $A$ besitzt nur positive Eigenwerte.
-        \item Alle Hauptminoren von $A$ sind positiv.
-    \end{enumerate}
-
-    Weiter ist $A$ genau dann positiv semidefinit, wenn alle Eigenwerte von $A$ nicht negativ sind.
-    In diesem Fall sind alle Hauptminoren von $A$ nicht negativ.
-
-    $A$ ist genau dann negativ (semi-)definit, wenn $-A$ positiv (semi-)definit ist.
-
-    Für die Hauptminoren $D_k$ einer negativ definiten Matrix gilt, dass $D_k$ abwechselnd positiv und negativ sind, beginnend mit negativem Vorzeichen.
-\end{defi}
-
-\printindex
-\printindex[Beispiele]
-
+\documentclass[german]{../spicker}
+
+\usepackage{amsmath}
+\usepackage{polynom}
+\usepackage{nicefrac}
+\usepackage{array}   % for \newcolumntype macro
+\usepackage{tikz}
+\usepackage{pgfplots}
+\usepackage{multirow,bigdelim}
+\usepgfplotslibrary{fillbetween}
+
+\usetikzlibrary{positioning}
+
+\title{Lineare Algebra 2}
+\author{Patrick Gustav Blaneck}
+\makeindex[intoc]
+\makeindex[intoc, name=Beispiele,title=Beispiele]
+
+\newcommand{\scalarprod}[1]{\left\langle #1 \right\rangle}
+\newcommand{\vektor}[1]{\begin{pmatrix*}[c] #1 \end{pmatrix*}}
+\renewcommand{\span}[1]{\operatorname{span}\left(#1\right)}
+
+\newcommand{\im}{\operatorname{im}}
+\newcommand{\rg}{\operatorname{rg}}
+\newcommand{\defect}{\operatorname{def}}
+\newcommand{\Eig}{\operatorname{Eig}}
+
+\renewcommand{\d}{\,\mathrm{d}}
+
+\renewcommand{\abs}[1]{\left| #1 \right|}
+\newcommand{\cis}[1]{\left( \cos\left( #1 \right) + i \sin\left( #1 \right) \right)}
+\newcommand{\sgn}{\text{sgn}}
+\newcommand{\diff}{\mathrm{d}}
+\newcommand{\dx}{~\mathrm{d}x}
+\newcommand{\du}{~\mathrm{d}u}
+\newcommand{\dv}{~\mathrm{d}v}
+\newcommand{\dw}{~\mathrm{d}w}
+\newcommand{\dt}{~\mathrm{d}t}
+\newcommand{\dn}{~\mathrm{d}n}
+\newcommand{\dudx}{~\frac{\mathrm{d}u}{\mathrm{d}x}}
+\newcommand{\dudn}{~\frac{\mathrm{d}u}{\mathrm{d}n}}
+\newcommand{\dvdx}{~\frac{\mathrm{d}v}{\mathrm{d}x}}
+\newcommand{\dwdx}{~\frac{\mathrm{d}w}{\mathrm{d}x}}
+\newcommand{\dtdx}{~\frac{\mathrm{d}t}{\mathrm{d}x}}
+\newcommand{\ddx}{\frac{\mathrm{d}}{\mathrm{d}x}}
+\newcommand{\dFdx}{\frac{\mathrm{d}F}{\mathrm{d}x}}
+\newcommand{\dfdx}{\frac{\mathrm{d}f}{\mathrm{d}x}}
+\newcommand{\interval}[1]{\left[ #1 \right]}
+
+\newcolumntype{L}{>{$}l<{$}} % math-mode version of "l" column type
+\newcolumntype{R}{>{$}r<{$}} % math-mode version of "r" column type
+\newcolumntype{C}{>{$}c<{$}} % math-mode version of "c" column type
+\newcolumntype{P}{>{$}p<{$}} % math-mode version of "l" column type
+
+\newenvironment{sysmatrix}[1]
+ {\left(\begin{array}{@{}#1@{}}}
+ {\end{array}\right)}
+
+\newcommand{\dvektor}[1]{\begin{vmatrix*}[r] #1 \end{vmatrix*}}
+
+\begin{document}
+\maketitle
+\tableofcontents
+\newpage
+
+%\setcounter{section}{1}
+
+\section{Lineare Abbildungen}
+
+\subsection{Grundlegende Eigenschaften linearer Abbildungen}
+
+\begin{defi}{Homomorphismus}
+    Eine Abbildung $f : V \to W$ heißt \emph{linear} oder ein \emph{Homomorphismus}, falls $\forall x, y \in V, \forall \lambda \in K$ gilt:
+    \begin{itemize}
+        \item Additivität: $f(x + y) = f(x) + f(y)$
+        \item Homogenität: $f(\lambda x) = \lambda f(x)$
+    \end{itemize}
+
+    Es gilt auch:
+    \begin{itemize}
+        \item Für eine lineare Funktion $f$ gilt $f(0) = 0$.
+        \item Die Funktion $f$ ist genau dann linear, wenn $\forall x, y \in V, \forall \lambda \in K$ gilt:
+              $$
+                  f(x + \lambda y) = f(x) + \lambda f(y)
+              $$
+        \item Summen, Vielfache linearer Abbildungen und vektorwertige Abbildungen, deren Komponenten aus linearen Abbildungen bestehen, sind wiederum linear.
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Homomorphismus}
+    Gegeben sei die Abbildung $f : \R^3 \to \R^2$ mit $f(x_1, x_2, x_3) = (x_1-2x_3, 4x_2)$.
+
+    Zeigen Sie: $f$ ist linear.
+
+    \exampleseparator
+
+    $f$ ist genau dann \emph{linear}, wenn $f$ \emph{homogen} und \emph{additiv} ist.
+
+    \emph{Homogenität:} $\forall x \in \R^3, \lambda \in \R: f(\lambda  x) = \lambda  f(x)$
+    $$
+        \begin{aligned}
+                         & f(\lambda  x)                                  &  & = \lambda  f(x)                              \\
+            \equiv \quad & f(\lambda  x_1, \lambda  x_2, \lambda  x_3)    &  & = \lambda  f(x_1, x_2, x_3)                  \\
+            \equiv \quad & (\lambda  x_1-2  \lambda  x_3, 4 \lambda  x_2) &  & = \lambda  (x_1-2x_3, 4x_2)                  \\
+            \equiv \quad & \lambda  (x_1-2x_3, 4x_2)                      &  & = \lambda  (x_1-2x_3, 4x_2) \quad \checkmark
+        \end{aligned}
+    $$
+    \emph{Additivität:} $\forall x, y \in \R^3: f(x + y) = f(x) + f_4(y)$
+    $$
+        \begin{aligned}
+                         & f(x + y)                                 &  & = f(x) + f(y)                                               \\
+            \equiv \quad & f(x_1 + y_1, x_2 + y_2, x_3 + y_3)       &  & = f(x_1, x_2, x_3) + f(y_1, y_2, y_3)                       \\
+            \equiv \quad & (x_1 + y_1-2(x_3 + y_3), 4(x_2 + y_2))   &  & = (x_1-2x_3, 4x_2) + (y_1-2y_3, 4y_2)                       \\
+            \equiv \quad & (x_1 + y_1-2 x_3 -2  y_3, 4 x_2 +4  y_2) &  & = (x_1 + y_1-2 x_3 -2  y_3, 4 x_2 +4  y_2) \quad \checkmark
+        \end{aligned}
+    $$
+
+    Damit ist $f$ linear. \qed
+\end{example}
+
+\begin{defi}{Kern}
+    Der \emph{Kern} einer linearen Abbildung $f : V \to W$ wird definiert durch
+    $$
+        \ker (f) := f^{-1}(0)
+    $$
+
+    Dabei gilt:
+    \begin{itemize}
+        \item $\im (f)$\footnote{Bild von $f$} ist ein Untervektorraum von $W$.
+        \item $\ker (f)$ ist ein Untervektorraum von $V$.
+    \end{itemize}
+
+    Eine lineare Abbildung ist genau dann injektiv, wenn $\ker (f) = \{0\}$ gilt.
+\end{defi}
+
+\begin{bonus}{Defekt}
+    Für eine lineare Funktion $f: V\to W$ definiert man den \emph{Defekt} von $f$ durch
+    $$
+        \defect (f) := \dim\ker (f)
+    $$
+
+    Eine lineare Abbildung ist genau dann injektiv, wenn $\defect (f) = 0$ gilt.
+\end{bonus}
+
+\begin{example}{Kern}
+    Gegeben sei die Abbildung $f : \R^3 \to \R^2$ mit $f(x_1, x_2, x_3) = (x_1-2x_3, 4x_2)$.
+
+    Bestimmen Sie den Kern von $f$ und geben Sie $\dim(\ker(f))$ an.
+
+    \exampleseparator
+
+    $$
+        f(x_1, x_2, x_3) = 0 \iff
+        \begin{sysmatrix}{ccc|c}
+            1 & 0 & -2 & 0 \\
+            0 & 4 & 0  & 0
+        \end{sysmatrix}
+        \implies x_2 = 0 \quad \land \quad x_1 = 2x_3
+    $$
+    Daraus folgt:
+    $$
+        \ker(f) = f^{-1}(0) = \left\{ (2\lambda, 0, \lambda) \mid \lambda \in \R \right\} \implies \defect(f) = \dim(\ker(f)) = 1
+    $$\qed
+\end{example}
+
+\begin{defi}{Rang}
+    Für eine lineare Funktion $f: V\to W$ definiert man den \emph{Rang} von $f$ durch
+    $$
+        \rg (f) := \dim\im (f)
+    $$
+
+    Eine lineare Abbildung ist genau dann surjektiv, wenn $\rg (f) = \dim (W)$ gilt.
+\end{defi}
+
+\begin{defi}{Dimensionsformel für lineare Abbildungen (Rangsatz)}
+    Es sei $f : V \to W$ linear. Dann gilt:
+    $$
+        \defect (f) + \rg (f) = \dim V
+    $$
+    bzw. äquivalent
+    $$
+        \dim\ker (f) + \dim\im (f) = \dim V
+    $$
+\end{defi}
+
+\begin{defi}{Isomorphismus}
+    Sei $f : V \to W$ linear.
+    Dann ist $f$ ein \emph{Isomorphismus}, wenn $f$ bijektiv ist.
+
+    Es gilt (für $f$ linear):
+    \begin{itemize}
+        \item $f$ ist genau dann ein Isomorphismus, wenn $\ker(f) = \{0\}$ und $\im(f) = W$ gilt.
+        \item Gelte $\dim (V) = \dim (W)$. Dann gilt $f$ ist injektiv $\iff$ $f$ ist surjektiv $\iff$ $f$ ist bijektiv.
+    \end{itemize}
+
+    Es gilt (für $f$ Isomorphismus):
+    \begin{itemize}
+        \item $\dim(V) = \dim(W)$
+        \item $f^{-1} : W \to V$ ist ebenfalls ein Isomorphismus.
+    \end{itemize}
+
+    Sei $\dim(V) = \dim(W) = n$, $(v_1, \ldots, v_n)$ eine Basis von $V$ und $f : V \to W$ linear.
+    $f$ ist genau dann ein Isomorphismus, wenn $(f(v_1), \ldots, f(v_n))$ eine Basis von $W$ bildet.
+\end{defi}
+
+\begin{bonus}{Isomorphie}
+    Seien $V$ und $W$ zwei $K$-Vektorräume
+    Dann heißen $V$ und $W$ \emph{isomorph}, Schreibweise $V \simeq W$, falls ein Isomorphismus von $V$ nach $W$ existiert.
+
+    Gilt $\dim(V) = \dim(W) = n$, dann gilt direkt $K^n \simeq V \simeq W$.
+\end{bonus}
+
+\begin{defi}{Automorphismus}
+    Sei $f : V \to W$ linear.
+    Dann ist $f$ ein \emph{Automorphismus}, wenn $f$ bijektiv ist und $V = W$.
+\end{defi}
+
+\begin{defi}{Endomorphismus}
+    Eine lineare Abbildung $f : V \to V$ heißt \emph{Endomorphismus}.
+\end{defi}
+
+\subsection{Matrizen und lineare Abbildungen}
+
+\begin{defi}{Abbildungsmatrix}
+    Sei $f : V \to W$ linear. Dann ist die \emph{Abbildungsmatrix} $A$ bzgl. $f$ gegeben mit
+    $$
+        A = \vektor{f(e_1) & \ldots & f(e_n)} \ \text{mit} \ \forall x : f(x) = Ax
+    $$
+
+    Sei $(v_1, \ldots, v_n)$ eine Basis von $V$. Dann gilt:
+    \begin{itemize}
+        \item $\im(f) = \scalarprod{f(v_1), \ldots, f(v_n)}$
+        \item $f$ ist injektiv $\iff$ $f(v_1), \ldots, f(v_n)$ sind linear unabhängig.
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Darstellungsmatrix}
+    Sei $f : V \to W$ linear, $\mathcal{B}_V = (v_1, \ldots, v_n)$ eine Basis von $V$ und $\mathcal{B}_W = (w_1, \ldots, w_m)$ eine Basis von $W$.
+    Dann ist
+    $$
+        M^{\mathcal{B}_V}_{\mathcal{B}_W} (f) = \vektor{K_{\mathcal{B}_W}(f(v_1)) & \ldots & K_{\mathcal{B}_W}(f(v_1))}
+    $$
+    die \emph{Darstellungsmatrix} von $f$ bezüglich der Basen $\mathcal{B}_V$ und $\mathcal{B}_W$.
+
+    $K_{\mathcal{B}_W}(f(v_i))$ bedeutet hier, dass das Bild von $v_i$ in der Basis $\mathcal{B}_W$ kodiert wird.
+
+    Es gilt:
+    \begin{itemize}
+        \item Sind $\mathcal{B}_V$ und $\mathcal{B}_W$ die Standardbasen bez. $V$ und $W$, dann gilt $M^{\mathcal{B}_V}_{\mathcal{B}_W} (f) = A$.
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Abbildungsmatrix}
+    Sei
+    $$
+        F\left(\vektor{x\\y\\z}\right) = \vektor{x + y + 2z \\ -3x + z \\ -x + 2y + 5z}
+    $$
+    \begin{enumerate}[a)]
+        \item Geben Sie für obige Abbildung die Abbildungsmatrix an.
+        \item Bestimmen Sie $\ker(F)$ und dessen Dimension.
+        \item Bestimmen Sie mit Hilfe der Dimensionsformel $\dim(\im (F))$.
+        \item Geben Sie eine Basis des Bildes an.
+    \end{enumerate}
+
+    \exampleseparator
+
+    \begin{enumerate}[a)]
+        \item Sei $B$ die kanonische Einheitsbasis des $\R^3$.
+              Dann ist die Abbildungsmatrix gegeben mit
+              $$
+                  A = M^B_B (F) = \vektor{~ \\F(e_1) & F(e_2) & F(e_3)\\ ~} = \vektor{1 & 1 & 2\\ -3 & 0 & 1\\ -1 & 2 & 5}
+              $$\qed
+        \item $$
+                  M^B_B \cdot \vektor{x \\ y \\ z} = \vektor{1 & 1 & 2\\ -3 & 0 & 1\\ -1 & 2 & 5} \cdot \vektor{x \\ y \\ z} = \vektor{0 \\ 0 \\ 0}
+              $$
+
+              Wir erhalten also ein LGS, dessen Lösung eine Basis von $\ker(F)$ ist:
+              $$
+                  \begin{sysmatrix}{c c c | c}
+                      1 & 1 & 2 & 0 \\ -3 & 0 & 1 & 0 \\ -1 & 2 & 5 & 0
+                  \end{sysmatrix}
+                  \sim
+                  \begin{sysmatrix}{c c c | c}
+                      1 & 1 & 2 & 0 \\ 0 & 3 & 7 & 0 \\ 0 & 3 & 7 & 0
+                  \end{sysmatrix}
+                  \sim
+                  \begin{sysmatrix}{c c c | c}
+                      1 & 1 & 2 & 0 \\ 0 & 3 & 7 & 0 \\ 0 & 0 & 0 & 0
+                  \end{sysmatrix}
+                  \sim
+                  \begin{sysmatrix}{c c c | c}
+                      -3 & 0 & 1 & 0 \\ 0 & \frac{3}{7} & 1 & 0 \\ 0 & 0 & 0 & 0
+                  \end{sysmatrix}
+              $$
+
+              Daraus können wir folgern, dass $\ker(F) = \scalarprod{\vektor{1 & -7 & 3}^T}$ und $\defect(F) = 1$. \qed
+        \item $\dim(\R^3) = \defect(F) + \rg(F) \implies \rg(F) = 2$\qed
+        \item Wegen $\rg(F) = 2$ wissen wir, dass wir zwei linear unabhängige Vektoren aus $M^B_B$ auswählen können, die dann automatisch eine Basis von $\im(F)$ ergeben.
+
+              Wir wählen $\im(F) = \scalarprod{ \vektor{1 & 0 & 2}^T, \vektor{2 & 1 & 5}^T }$.\qed
+    \end{enumerate}
+\end{example}
+
+\subsection{Abbildungsverkettung und Matrizenmultiplikation}
+
+\begin{defi}{Eigenschaften der Abbildungsverkettung}
+    Seien $U$, $V$, $W$ $K$-Vektorräume und $f : V \to W$ sowie $g : U \to V$ linear.
+    Dann ist auch $f \circ g : U \to W$ linear.
+
+    Ist $f$ ein Isomorphismus und $\dim(V) = \dim(W)$, dann gilt:
+    $$
+        \rg(f\circ g) = \rg(g)
+    $$
+\end{defi}
+
+\begin{defi}{Eigenschaften der Matrixmultiplikation}
+    Seien $A$, $B$, $C$ so, dass die nachfolgend vorkommenden Matrixmultiplikationen definiert sind.
+    Dann gilt:
+    \begin{itemize}
+        \item $A(BC) = (AB)C$ (Assoziativgesetz)
+        \item $A(B+C) = AB+AC$ und $(A+B)C = AC+BC$ (Distributivgesetz)
+        \item $(AB)^T = B^TA^T$
+        \item Sei $A \in K^{m\times n}$ und $E_k \in K^{k\times k}$ die $(k\times k)$-Einheitsmatrix. Dann gilt:
+              $$
+                  AE_n = E_mA = A
+              $$
+        \item Sei $A \in K^{m\times n}$ und $0_{kl} \in K^{k\times l}$ die $(k\times l)$-Nullmatrix. Dann gilt:
+              $$
+                  A0_{nl} = 0_{ml} \quad \text{und} \quad 0_{km}A = 0_{kn}
+              $$
+        \item Das Matrixprodukt ist im Allgemeinen nicht kommutativ.
+        \item Seien $x, y \in K^n$. Dann gilt:
+              $$
+                  \scalarprod{x, y} = x^T \cdot y
+              $$
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Matrixmultiplikation}
+    Gegeben sind die Matrizen
+    $$
+        A = \vektor{10 & 2 & 3 \\ 8 & 5 & 3 \\ 2 & 3 & 2}, \quad
+        B = \vektor{7 & 3 \\ 1 & 5}, \quad
+        C = \vektor{4 & 5 \\ 2 & 7 \\ 3 & 6}
+    $$
+    Welche der folgenden Matrixprodukte sind wohldefiniert?
+
+    \begin{enumerate}[a)]
+        \item $A\cdot B$
+        \item $C\cdot B$
+        \item $C\cdot B \cdot A$
+    \end{enumerate}
+
+    \exampleseparator
+
+    \begin{enumerate}[a)]
+        \item $$
+                  A\cdot B = \overset{3\times \pmb{3}}{\vektor{10 & 2 & 3 \\ 8 & 5 & 3 \\ 2 & 3 & 2}} \overset{\pmb{2}\times 2}{\vektor{7 & 3 \\ 1 & 5}} \quad \lightning \quad (3 \neq 2)
+              $$
+        \item $$
+                  C\cdot B = \overset{3\times \pmb{2}}{\vektor{4 & 5 \\ 2 & 7 \\ 3 & 6}} \overset{\pmb{2}\times 2}{\vektor{7 & 3 \\ 1 & 5}} = \vektor{33 & 37 \\ 21 & 41 \\ 27 & 39}
+              $$
+        \item $$
+                  C\cdot B \cdot A = \overset{3\times \pmb{2}}{\vektor{4 & 5 \\ 2 & 7 \\ 3 & 6}} \overset{\pmb{2}\times \pmb{2}}{\vektor{7 & 3 \\ 1 & 5}} \overset{\pmb{3}\times 3}{\vektor{10 & 2 & 3 \\ 8 & 5 & 3 \\ 2 & 3 & 2}} \quad \lightning \quad (2 \neq 3)
+              $$
+    \end{enumerate}
+\end{example}
+
+\begin{defi}{Inverse einer Matrix}
+    Sei $A$ eine quadratische Matrix.
+    Gibt es eine Matrix $A^{-1}$ mit
+    $$
+        AA^{-1} = A^{-1}A = E
+    $$
+    so heißt $A$ \emph{invertierbar} oder auch \emph{regulär}.
+    $A^{-1}$ wird als \emph{Inverse} von $A$ bezeichnet.
+
+    Es gilt:
+    \begin{itemize}
+        \item Eine lineare Abbildung $f : V \to W$ ist genau dann invertierbar, wenn ihre Darstellungsmatrix invertierbar ist.
+        \item Jede invertierbare Matrix ist quadratisch.
+    \end{itemize}
+
+    Seien $A, B \in K^{n\times n}$ invertierbar.
+    Dann gilt:
+    \begin{itemize}
+        \item $AB = E \iff BA = E \iff B = A^{-1}$
+        \item $AB$ ist invertierbar, und es gilt $(AB)^{-1} = B^{-1}A^{-1}$.
+        \item $A^{-1}$ ist invertierbar, und es gilt $(A^{-1})^{-1} = A$.
+        \item $A^T$ ist invertierbar, und es gilt $(A^T)^{-1} = (A^{-1})^T$.
+        \item Für $\lambda \in K \setminus \{0\}$ ist $\lambda A$ invertierbar, und es gilt $(\lambda A)^{-1} = \frac{1}{\lambda}A^{-1}$.
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Inverse einer Matrix (Gauß-Algorithmus)}
+    Berechnen Sie mit Hilfe des Gauß-Algorithmus die Inverse zu folgender Matrix:
+    $$\vektor{0 & 0 & 2 & 0 \\ 1 & 0 & 0 & 1 \\ 0 & -1 & -3 & 0 \\ 2 & 1 & 5 & 3}$$
+
+    \exampleseparator
+
+    $$
+        \begin{sysmatrix}{cccr|cccr}
+            0 & 0 & 2 & 0   & 1 & 0 & 0 & 0 \\
+            1 & 0 & 0 & 1   & 0 & 1 & 0 & 0 \\
+            0 & -1 & -3 & 0 & 0 & 0 & 1 & 0 \\
+            2 & 1 & 5 & 3   & 0 & 0 & 0 & 1
+        \end{sysmatrix}
+        \sim
+        \begin{sysmatrix}{cccr|cccr}
+            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
+            1 & 0 & 0 & 1   & 0 & 1 & 0 & 0 \\
+            0 & -1 & 0 & 0 & \nicefrac{3}{2} & 0 & 1 & 0 \\
+            2 & 1 & 0 & 3   & -\nicefrac{5}{2} & 0 & 0 & 1
+        \end{sysmatrix}
+    $$
+    $$
+        \sim
+        \begin{sysmatrix}{cccr|cccr}
+            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
+            1 & 0 & 0 & 1   & 0 & 1 & 0 & 0 \\
+            0 & 1 & 0 & 0 & -\nicefrac{3}{2} & 0 & -1 & 0 \\
+            0 & 1 & 0 & 1   & -\nicefrac{5}{2} & -2 & 0 & 1
+        \end{sysmatrix}
+        \sim
+        \begin{sysmatrix}{cccr|cccr}
+            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
+            1 & 0 & 0 & 1   & 0 & 1 & 0 & 0 \\
+            0 & 1 & 0 & 0 & -\nicefrac{3}{2} & 0 & -1 & 0 \\
+            0 & 0 & 0 & 1   & -1 & -2 & 1 & 1
+        \end{sysmatrix}
+    $$
+    $$
+        \sim
+        \begin{sysmatrix}{cccr|cccr}
+            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
+            1 & 0 & 0 & 0   & 1 & 3 & -1 & -1 \\
+            0 & 1 & 0 & 0 & -\nicefrac{3}{2} & 0 & -1 & 0 \\
+            0 & 0 & 0 & 1   & -1 & -2 & 1 & 1
+        \end{sysmatrix}
+        \sim
+        \begin{sysmatrix}{cccr|cccr}
+            1 & 0 & 0 & 0   & 1 & 3 & -1 & -1 \\
+            0 & 1 & 0 & 0 & -\nicefrac{3}{2} & 0 & -1 & 0 \\
+            0 & 0 & 1 & 0   & \nicefrac{1}{2} & 0 & 0 & 0 \\
+            0 & 0 & 0 & 1   & -1 & -2 & 1 & 1
+        \end{sysmatrix}
+    $$
+
+    Damit ist
+    $$
+        \vektor{0 & 0 & 2 & 0 \\ 1 & 0 & 0 & 1 \\ 0 & -1 & -3 & 0 \\ 2 & 1 & 5 & 3}^{-1} = \vektor{1 & 3 & -1 & -1 \\-\nicefrac{3}{2} & 0 & -1 & 0 \\ \nicefrac{1}{2} & 0 & 0 & 0 \\ -1 & -2 & 1 & 1}
+    $$\qed
+\end{example}
+
+\begin{example}{Inverse von verketteten Abbildungen}
+    Ein sehr gutes (aber sperriges) Beispiel zum Finden von Inversen verketteter Abbildungen ist zu finden im \emph{Lineare Algebra Übungsblatt 05} (Aufgabe 6).
+
+    Das Übungsblatt ist erreichbar unter \url{https://fh-aachen.paddel.xyz/#lineare-algebra-2}.
+\end{example}
+
+\subsection{Koordinatentransformationen}
+
+\begin{defi}{Koordinatenabbildung}
+    Sei $V$ ein $K$-Vektorraum mit einer Basis $\mathcal{B} = (b_1, \ldots, b_n)$.
+    Dann existiert genau ein Isomorphismus $\varphi_{\mathcal{B}} : K^n \to V$ mit $\varphi_{\mathcal{B}}(e_i) = v_i$, $1 \leq i \leq n$.
+
+    Der Isomorphismus $\varphi_{\mathcal{B}}$ heißt \emph{Koordinatenabbildung}.
+\end{defi}
+
+\begin{defi}{Koordinaten eines Vektors}
+    Sei $V$ ein $K$-Vektorraum mit einer Basis $\mathcal{B} = (b_1, \ldots, b_n)$.
+    Die Abbildung $K_{\mathcal{B}}(v)$ mit
+    $$
+        K_{\mathcal{B}} : V \to K^n , v = \sum^n_{i=1} \lambda_ib_i \longmapsto \vektor{\lambda_1 \\ \vdots \\ \lambda_n}
+    $$
+    erzeugt die \emph{Koordinaten von v bezüglich der Basis} $\mathcal{B}$.
+
+    Es gilt:
+    \begin{itemize}
+        \item $K_{\mathcal{B}}(v) = \varphi^{-1}_{\mathcal{B}}(v)$
+    \end{itemize}
+\end{defi}
+
+\begin{defi}{Transformationsmatrix}
+    Sei ein Vektorraum $V$ mit den Basen $\mathcal{A} = (a_1, \ldots, a_n)$ und $\mathcal{B} = (b_1, \ldots, b_n)$ gegeben.
+
+    Für einen Vektor $v$ existieren die Darstellungen $K_{\mathcal{A}}(v)$ und $K_{\mathcal{B}}(v)$.
+    Es gilt:
+
+    \begin{center}
+        \begin{tikzpicture}
+            \node (v) {$V$};
+            \node [below left=of v] (k1) {$K^n$};
+            \node [below right=of v] (k2) {$K^n$};
+
+            \draw [->] (k1) -- (v) node [midway, above left] {\small $\varphi_{\mathcal{A}}$};
+            \draw [->] (k2) -- (v) node [midway, above right] {\small $\varphi_{\mathcal{B}}$};
+            \draw [->] (k1) -- (k2) node [midway, below] {\small $T^{\mathcal{A}}_{\mathcal{B}} = \varphi_{\mathcal{B}}^{-1} \circ \varphi_{\mathcal{A}}$};
+        \end{tikzpicture}
+    \end{center}
+
+
+    Die Matrix $T^{\mathcal{A}}_{\mathcal{B}}$ heißt \emph{Transformationsmatrix des Basiswechsels von} $\mathcal{A}$ \emph{nach} $\mathcal{B}$
+
+    Sei $v\in V$ beliebig, $K_{\mathcal{A}}(v) = \vektor{x_1 & \ldots & x_n}^T$ und $K_{\mathcal{B}}(v) = \vektor{y_1 & \ldots & y_n}^T$. Dann gilt:
+    $$
+        \vektor{y_1 \\ \vdots \\ y_n} = T^{\mathcal{A}}_{\mathcal{B}} \vektor{x_1 \\ \vdots \\ x_n}
+    $$
+
+    Sind die Koordinaten von $v$ beqüglich $\mathcal{A}$ bekannt, kann man mithilfe der Matrix $T^{\mathcal{A}}_{\mathcal{B}}$ die Koordinaten von $v$ bezüglich $\mathcal{B}$ berechnen.
+
+    Seien $A$ und $B$ die Matrizen der Basisvektoren von $\mathcal{A}$ bzw. $\mathcal{B}$.
+    Dann gilt:
+
+    \begin{center}
+        \begin{tikzpicture}
+            \node (ka) {$K_{\mathcal{A}}(x)$};
+            \node [right=of ka] (kb) {$K_{\mathcal{B}}(x)$};
+
+            \node [above=of ka] (x1) {$x$};
+            \node [above=of kb] (x2) {$x$};
+
+
+            \draw [->] (x1) -- (x2) node [midway, above] {\small $E$};
+            \draw [->] (ka) -- (x1) node [midway, left] {\small $A$};
+            \draw [->] (kb) -- (x2) node [midway, right] {\small $B$};
+            \draw [->] (ka) -- (kb) node [midway, below] {\small $T^{\mathcal{A}}_{\mathcal{B}}$};
+        \end{tikzpicture}
+    \end{center}
+
+    Man erkennt:
+    $$
+        T^{\mathcal{A}}_{\mathcal{B}} = B^{-1}A
+    $$
+\end{defi}
+
+\begin{example}{Transformationsmatrizen}
+    $\mathcal{A}  = (e_1, e_2, e_3)$, $\mathcal{A}' = (a'_1, a'_2, a'_3)$ und $\mathcal{A}'' = (a''_1, a''_2, a''_3)$ bilden mit den kanonischen Einheitsvektoren $e_1, e_2, e_3$ sowie
+    $$
+        a'_1 = \vektor{1\\0\\0}, a'_2 = \vektor{1\\1\\0}, a'_3 = \vektor{1\\1\\1}
+        \quad \text{bzw.} \quad
+        a''_1 = \vektor{1\\-1\\0}, a''_2 = \vektor{-1\\0\\1}, a''_3 = \vektor{0\\1\\1}
+    $$
+    jeweils Basen des $\R^3$.
+
+    Bestimmen Sie:
+    \begin{enumerate}[a)]
+        \item die Transformationsmatrizen $T^{\mathcal{A}'}_{\mathcal{A}}$ sowie $T^{\mathcal{A}}_{\mathcal{A}'}$.
+        \item die Transformationsmatrizen $T^{\mathcal{A}''}_{\mathcal{A}}$ sowie $T^{\mathcal{A}}_{\mathcal{A}''}$.
+        \item die Transformationsmatrizen $T^{\mathcal{A}'}_{\mathcal{A}''}$ sowie $T^{\mathcal{A}''}_{\mathcal{A}'}$.
+        \item die Koordinaten des Vektors $\vektor{1 & 0 & 1}^T$ bzgl. der Basen $\mathcal{A}'$ und $\mathcal{A}''$.
+    \end{enumerate}
+
+    \exampleseparator
+
+    \begin{enumerate}[a)]
+        \item Berechnen von $\mathcal{A}'^{-1}$:
+              $$
+                  \begin{sysmatrix}{rrr|rrr}
+                      1 & 1 & 1 & 1 & 0 & 0 \\
+                      0 & 1 & 1 & 0 & 1 & 0 \\
+                      0 & 0 & 1 & 0 & 0 & 1
+                  \end{sysmatrix}
+                  \sim
+                  \begin{sysmatrix}{rrr|rrr}
+                      1 & 1 & 0 & 1 & 0 & -1 \\
+                      0 & 1 & 0 & 0 & 1 & -1 \\
+                      0 & 0 & 1 & 0 & 0 & 1
+                  \end{sysmatrix}
+                  \sim
+                  \begin{sysmatrix}{rrr|rrr}
+                      1 & 0 & 0 & 1 & -1 & 0 \\
+                      0 & 1 & 0 & 0 & 1 & -1 \\
+                      0 & 0 & 1 & 0 & 0 & 1
+                  \end{sysmatrix}
+              $$
+
+              Damit gilt:
+              $$
+                  T^{\mathcal{A}'}_{\mathcal{A}} = \mathcal{A}^{-1}\mathcal{A}' = \vektor{1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} \vektor{1 & 1 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 1} = \vektor{1 & 1 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 1}
+              $$
+              und
+              $$
+                  T^{\mathcal{A}}_{\mathcal{A}'} = \mathcal{A}'^{-1}\mathcal{A} = \vektor{1 & -1 & 0 \\ 0 & 1 & -1 \\ 0 & 0 & 1} \vektor{1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} = \vektor{1 & -1 & 0 \\ 0 & 1 & -1 \\ 0 & 0 & 1}.
+              $$\qed
+        \item Berechnen von $\mathcal{A}''^{-1}$:
+              $$
+                  \begin{sysmatrix}{rrr|rrr}
+                      1 & -1 & 0 & 1 & 0 & 0 \\
+                      -1 & 0 & 1 & 0 & 1 & 0 \\
+                      0 & 1 & 1 & 0 & 0 & 1
+                  \end{sysmatrix}
+                  \sim
+                  \ldots
+                  \sim
+                  \begin{sysmatrix}{rrr|rrr}
+                      1 & 0 & 0 & \nicefrac{1}{2} & -\nicefrac{1}{2} & \nicefrac{1}{2} \\
+                      0 & 1 & 0 & -\nicefrac{1}{2} & -\nicefrac{1}{2} & \nicefrac{1}{2}\\
+                      0 & 0 & 1 & \nicefrac{1}{2} & \nicefrac{1}{2} & \nicefrac{1}{2}
+                  \end{sysmatrix}
+                  =
+                  \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1}
+              $$
+              Damit gilt:
+              $$
+                  T^{\mathcal{A}''}_{\mathcal{A}} = \mathcal{A}^{-1}\mathcal{A}'' = \vektor{1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} \vektor{1 & -1 & 0 \\ -1 & 0 & 1 \\ 0 & 1 & 1} = \vektor{1 & -1 & 0 \\ -1 & 0 & 1 \\ 0 & 1 & 1}
+              $$
+              und
+              $$
+                  T^{\mathcal{A}}_{\mathcal{A}''} = \mathcal{A}''^{-1}\mathcal{A} = \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1} \vektor{1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} = \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1}.
+              $$\qed
+    \end{enumerate}
+
+\end{example}
+
+\begin{example}{Transformationsmatrizen (Fortsetzung)}
+    \begin{enumerate}[a)]
+        \setcounter{enumi}{2}
+        \item Mit den bisherigen Ergebnissen gilt:
+              $$
+                  T^{\mathcal{A}'}_{\mathcal{A}''} = \mathcal{A}''^{-1}\mathcal{A}' = \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1} \vektor{1 & 1 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 1} = \frac{1}{2}\vektor{1 & 0 & 1 \\ -1 & -2 & -1 \\ 1 & 2 & 3}
+              $$
+              und
+              $$
+                  T^{\mathcal{A}''}_{\mathcal{A}'} = \mathcal{A}'^{-1}\mathcal{A}'' = \vektor{1 & -1 & 0 \\ 0 & 1 & -1 \\ 0 & 0 & 1} \vektor{1 & -1 & 0 \\ -1 & 0 & 1 \\ 0 & 1 & 1} = \vektor{2 & -1 & -1 \\ -1 & -1 & 0 \\ 0 & 1 & 1}.
+              $$\qed
+        \item Sei $x = \vektor{1 & 0 & 1}^T$.
+
+              Dann gilt für $x$ bzgl. $\mathcal{A}'$:
+              $$
+                  x = K_{\mathcal{A}'}(x) = T^{\mathcal{A}}_{\mathcal{A}'} \cdot K_{\mathcal{A}}(x) = \vektor{1 & -1 & 0 \\ 0 & 1 & -1 \\ 0 & 0 & 1} \vektor{1 \\ 0 \\ 1} = \vektor{1 \\ -1 \\ 1},
+              $$
+              bzw. bzgl. $\mathcal{A}''$:
+              $$
+                  x = K_{\mathcal{A}''}(x) = T^{\mathcal{A}}_{\mathcal{A}''} \cdot K_{\mathcal{A}}(x) = \frac{1}{2}\vektor{1 & -1 & 1 \\ -1 & -1 & 1 \\ 1 & 1 & 1} \vektor{1 \\ 0 \\ 1} = \vektor{1 \\ 0 \\ 1}.
+              $$\qed
+    \end{enumerate}
+\end{example}
+
+\begin{defi}{Darstellungsmatrix mit Basistransformation}
+    Seien $V$ und $W$ endlich erzeugt mit Basen $\mathcal{A}$ und $\mathcal{A}'$ bzw. $\mathcal{B}$ und $\mathcal{B}'$.
+    Sei weiter $f : V \to W$ linear.
+    Dann gilt:
+    $$
+        M^{\mathcal{A}'}_{\mathcal{\mathcal{B}'}}(f) = T^{\mathcal{B}}_{\mathcal{B}'} \cdot M^{\mathcal{A}}_{\mathcal{\mathcal{B}}}(f) \cdot T^{\mathcal{A}'}_{\mathcal{A}}
+    $$
+
+    Zur Visualisierung dient folgendes kommutative Diagramm:
+    \begin{center}
+        \begin{tikzpicture}
+            \node (kn1) {$K^n$};
+            \node [above right=of kn1] (v) {$V$};
+            \node [above left=of v] (kn2) {$K^n$};
+            \node [right=of v] (w) {$W$};
+            \node [above right=of w] (km2) {$K^m$};
+            \node [below right=of w] (km1) {$K^m$};
+
+            \draw [->] (kn1) -- (v) node [midway, above left] {\small $\varphi_{\mathcal{A}'}$};
+            \draw [->] (kn2) -- (v) node [midway, above right] {\small $\varphi_{\mathcal{A}}$};
+            \draw [->] (km1) -- (w) node [midway, above right] {\small $\varphi_{\mathcal{B}'}$};
+            \draw [->] (km2) -- (w) node [midway, above left] {\small $\varphi_{\mathcal{B}}$};
+
+            \draw [->] (v) -- (w) node [midway, above] {\small $f$};
+
+            \draw [->] (kn2) -- (km2) node [midway, above] {\small $M^{\mathcal{A}}_{\mathcal{B}} (f)$};
+            \draw [->] (kn1) -- (km1) node [midway, below] {\small $M^{\mathcal{A}'}_{\mathcal{B}'} (f)$};
+
+            \draw [->] (kn2) -- (kn1) node [midway, left] {\small $T^{\mathcal{A}}_{\mathcal{A}'}$};
+            \draw [->] (km2) -- (km1) node [midway, right] {\small $T^{\mathcal{B}}_{\mathcal{B}'}$};
+        \end{tikzpicture}
+    \end{center}
+\end{defi}
+
+\section{Determinanten}
+
+\begin{defi}{Elementarmatrix}
+    Seien $1\leq i$, $j \leq n$ mit $i \neq j$ und $\lambda \in K \setminus \{0\}$ gegeben.
+    Dann sei
+    $$
+        C1 := \vektor{1 & & & & \\ & \ddots & & & \\ & \lambda & \ddots & & \\ & & & \ddots & & \\ & & & & \ddots & \\ & & & & & 1} \in K^{n \times n}
+    $$
+    wobei der $(i, j)$-te Eintrag den Wert $\lambda$ annehmen soll und alle anderen Einträge außerhalb der Hauptdiagonalen $0$ sein sollen.
+
+    Sei $C2$ die Matrix, die man aus der Einheitsmatrix gewinnt, indem man die $i$-te und $j$-te Spalte vertauscht, also
+    $$
+        C2 := \vektor{1 & & & & \\ & \ddots & & & \\ &  & 0 & &1 \\ & & & \ddots & & \\ & & 1 & & 0 & \\ & & & & & 1} \in K^{n \times n}
+    $$
+
+    Zuletzt definieren wir
+    $$
+        C3 := \vektor{1 & & & & \\ & \ddots & & & \\ &  & \lambda & & \\ & & & \ddots & & \\ & & & & \ddots & \\ & & & & & 1} \in K^{n \times n}
+    $$
+
+    Matrizen der Gestalt $C1$, $C2$ oder $C3$ nennt man \emph{Elementarmatrizen}.
+
+    Es gilt:
+    \begin{itemize}
+        \item Die Multiplikation einer Matrix $A$ von links mit einer Elementarmatrix entspricht der Anwendung einer elementaren Zeilenoperation des Gauß-Verfahrens auf $A$.
+              \subitem Notation: $Zi$ statt $Ci$
+        \item Die Multiplikation einer Matrix $A$ von rechts mit einer Elementarmatrix entspricht der Anwendung einer elementaren Spaltenoperation auf $A$.
+              \subitem Notation: $Si$ statt $Ci$
+    \end{itemize}
+
+    \begin{itemize}
+        \item $C1$ entspricht dem Addieren von $\lambda$-mal Spalte bzw. Zeile $j$ auf Spalte bzw. Zeile $i$.
+        \item $C2$ entspricht dem Tauschen von Spalte bzw. Zeile $i$ mit Spalte bzw. Zeile $j$.
+        \item $C3$ entspricht dem Multiplizieren von Spalte bzw. Zeile $i$ mit $\lambda$.
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Elementarmatrizen}
+    Sei
+    $$
+        A = \vektor{1 & 0 \\ -5 & 2}
+    $$
+    Bestimmen Sie Elementarmatrizen $M_1$ und $M_2$ mit $M_1M_2A = E$.
+
+    \exampleseparator
+
+    Es gilt:
+    $$
+        \begin{sysmatrix}{cc|cc}
+            1 & 0 & 1 & 0 \\
+            -5 & 2 & 0 & 1
+        \end{sysmatrix}
+        \sim
+        \begin{sysmatrix}{cc|cc}
+            1 & 0 & 1 & 0 \\
+            0 & 2 & 5 & 1
+        \end{sysmatrix}
+        \sim
+        \begin{sysmatrix}{cc|cc}
+            1 & 0 & 1 & 0 \\
+            0 & 1 & \frac{5}{2} & \frac{1}{2}
+        \end{sysmatrix}
+    $$
+    Damit gilt:
+    $$
+        A^{-1} = \vektor{1 & 0 \\ \frac{5}{2} & \frac{1}{2}} =\footnote{Das wird aus dem Kontext ersichtlich: Für $A^{-1}$ wird zuerst fünfmal \Rnum{1} auf \Rnum{2} addiert und anschließend wird \Rnum{2} mit $\frac{1}{2}$ skaliert.} \vektor{1 & 0 \\ 0 & \frac{1}{2}} \cdot \vektor{1 & 0 \\ 5 & 1}
+    $$
+    und schlussendlich:
+    $$
+        A^{-1} \cdot A = \vektor{1 & 0 \\ 0 & \frac{1}{2}} \cdot \vektor{1 & 0 \\ 5 & 1} \cdot A = M_1 M_2  A
+    $$\qed
+\end{example}
+
+\begin{defi}{Eigenschaften der Determinante}
+    Für $A, B \in K^{n\times n}$ gilt:
+    \begin{itemize}
+        \item $S1$ und $Z1$ ändern die Determinante einer Matrix nicht. ($\det(C1) = 1$)
+        \item $S2$ und $Z2$ kehren das Vorzeichen der Determinante um. ($\det(C2) = -1$)
+        \item $S3$ und $Z3$ vervielfachen den Wert der Determinante um den Faktor $\lambda$. ($\det(C3) = \lambda$)
+    \end{itemize}
+
+    \begin{itemize}
+        \item $\det(A) = \det(A^T)$
+        \item Besitzt $A$ zwei gleiche Spalten bzw. Zeilen, so gilt $\det(A) = 0$.
+        \item $A$ invertierbar $\iff \det(A) \neq 0$
+        \item $\det(AB) = \det(A)\det(B)$
+        \item $A$ invertierbar $\implies \det(A^{-1}) = (\det(A))^{-1}$
+    \end{itemize}
+\end{defi}
+
+\subsection{Verfahren zur Berechnung der Determinante}
+
+\begin{defi}{Laplacescher Entwicklungssatz}
+    Für $A \in K^{n\times n}$ bezeichne $A_{ij}$ die Matrix in $K^{(n-1)\times (n-1)}$, die durch Streichen der $i$-ten Zeile und der $j$-ten Spalte aus $A$ hervorgeht.
+
+    Es sei $A = (a_{ij}) \in K^{n\times n}$ und $j$ mit $1 \leq j \leq n$.
+    Dann gilt:
+    $$
+        \det(A) = \sum^n_{i=1} (-1)^{i+j} a_{ij}\det(A_{ij})
+    $$
+    Man spricht von der \emph{Entwicklung der Determinante nach der j-ten Spalte}.
+    Ebenso ist eine \emph{Entwicklung der Determinante nach der i-ten Zeile} möglich:
+    $$
+        \det(A) = \sum^n_{j=1} (-1)^{i+j} a_{ij}\det(A_{ij})
+    $$
+\end{defi}
+
+\begin{defi}{Determinante mit Gauß-Algorithmus}
+    Zur Berechnung mit dem Gauß-Algorithmus bringt man die gegebene Matrix $A$ mittels äquivalenter Zeilen- oder Spaltenumformungen $Z1$-$Z3$ bzw. $S1$-$S3$ auf Stufenform $B$ und errechnet dann nach Folgerung $\det(A)$ leicht als Produkt der Hauptdiagonalelelemente von $B$, multipliziert mit den Determinanten der genutzten Elementarmatrizen.
+\end{defi}
+
+\begin{example}{Determinante mit Gauß-Algorithmus}
+    Berechnen Sie die Determinante von $A = \vektor{4 & 5 & 6 \\ 2 & -2 & -1 \\ 0 & 1 & -3}$ mit Hilfe des Gauß-Algorithmus.
+
+    \exampleseparator
+
+    $$
+        \vektor{4 & 5 & 6 \\ 2 & -2 & -1 \\ 0 & 1 & -3}
+        \underset{}{\xrightarrow{\text{\Rnum{2}: \Rnum{2} + 2 \Rnum{3}}}}
+        \vektor{4 & 5 & 6 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
+        \underset{}{\xrightarrow{\text{\Rnum{1}: \Rnum{1} - 5 \Rnum{3}}}}
+        \vektor{4 & 0 & 21 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
+        \underset{}{\xrightarrow{\text{\Rnum{1}: \Rnum{1} - 2 \Rnum{2}}}}
+        \vektor{0 & 0 & 35 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
+    $$
+    $$
+        \vektor{0 & 0 & 35 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
+        \underset{\nicefrac{1}{35} \cdot \det(A)}{\xrightarrow{\text{\Rnum{1}: \Rnum{1} - 2 \Rnum{2}}}}
+        \vektor{0 & 0 & 1 \\ 2 & 0 & -7 \\ 0 & 1 & -3}
+        \underset{}{\xrightarrow{\text{(\Rnum{2}: \Rnum{2} + 7 \Rnum{1})} \ \circ \ \text{(\Rnum{3}: \Rnum{3} + 3 \Rnum{1})}}}
+        \vektor{0 & 0 & 1 \\ 2 & 0 & 0 \\ 0 & 1 & 0}
+    $$
+    $$
+        \vektor{0 & 0 & 1 \\ 2 & 0 & 0 \\ 0 & 1 & 0}
+        \underset{(-1)\cdot(-1)\cdot \det A}{\xrightarrow{\text{(\Rnum{1}$\,\leftrightarrow\,$\Rnum{3})} \ \circ \ \text{(\Rnum{1}$\,\leftrightarrow\,$\Rnum{2})}}}
+        \vektor{2 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1}
+    $$
+    Damit gilt:
+    $$
+        \det A = (-1) \cdot (-1) \cdot 35 \cdot \dvektor{2 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1} = 35 \cdot 2 = 70
+    $$\qed
+\end{example}
+
+\begin{bonus}{Tipps zur Determinantenberechnung}
+    \begin{enumerate}
+        \item Für $(2\times 2)$- und $(3\times 3)$-Matrizen empfiehlt sich die Sarrus-Regel.\footnote{Siehe Lineare Algebra 1}
+        \item Die Laplace-Entwicklung ist dann vorzuziehen, wenn in einer Spalte oder Zeile nur wenige Nicht-Null-Einträge vorhanden sind, weil bei einer Entwicklung nach dieser Zeile bzw. Spalte die meisten Summanden erst gar nicht berechnet werden müssen.
+        \item Es können zur Berechnung der Determinanten mehrere Verfahren kombiniert werden, z.B. $(4\times 4)$-Matrizen zuerst nach Laplace entwickeln und die dann entstehenden Determinanten von $(3\times 3)$-Matrizen direkt mit der Sarrus-Regel berechnen.
+    \end{enumerate}
+\end{bonus}
+
+\begin{bonus}{Inverse einer $(2\times 2)$-Matrix}
+    Sei $A$ definiert als $A = \vektor{a & b \\ c & d}$. Dann gilt:
+    $$
+        A^{-1} = \frac{1}{\det(A)} \vektor{d & -b \\ -c & a} = \frac{1}{ad - bc} \vektor{d & -b \\ -c & a}
+    $$
+\end{bonus}
+
+\section{Lineare Gleichungssysteme}
+
+\subsection{Lösbarkeit eines linearen Gleichungssystems}
+
+\begin{defi}{Lineares Gleichungssystem}
+    Seien $A = (a_{ij}) \in K^{m\times n}$ und $b = \vektor{b_1 & \ldots & b_m}^T$.
+    Dann heißt
+    $$
+        \begin{aligned}
+             & a_{11}x_1 &  & + \ \ldots \ + &  & a_{1n}x_n &  & = &  & b_1 \\
+             & \ldots                                                       \\
+             & a_{m1}x_1 &  & + \ \ldots \ + &  & a_{mn}x_n &  & = &  & b_m
+        \end{aligned}
+    $$
+    \emph{lineares Gleichungssystem} bzgl. $(x_1, \ldots, x_n)$ mit Koeffizienten $a_{ij}$ in $K$.
+    Hierbei sind $x_1, \ldots, x_n$ die \emph{Unbekannten} des Systems.
+
+    Für $b = 0_{m1}$ nennt man das lineare Gleichungssystem \emph{homogen}, sonst \emph{inhomogen}.
+
+    Jedes lineare Gleichungssystem kann in der Form $Ax = b$ geschrieben werden.
+\end{defi}
+
+\begin{defi}{Lösungsmenge}
+    Die \emph{Lösungsmenge} $L(A, b)$ des zu $(A, b)$ gehörigen Gleichungssystems ist festgelegt durch
+    $$
+        L(A, b) := \{x \in K^n \mid Ax = b\}
+    $$
+\end{defi}
+
+\begin{defi}{Spaltenrang}
+    Die lineare Abbildung $L_A : K^n \to K^m$ sei gegeben durch $L_A(x) := Ax$. Dann sei $\rg(A) := \rg(L_A)$.
+    Der \emph{Spaltenrang} $\rg_S(A)$ sei die maximale Anzahl linear unabhängiger Spaltenvektoren von $A$.
+
+    Es gilt $\rg(A) = \rg_S(A)$.
+\end{defi}
+
+\begin{defi}{Zeilenrang}
+    Für $A \in K^{m\times n}$ sei die maximale Anzahl linear unabhängiger Zeilenvektoren von $A$ der \emph{Zeilenrang} $\rg_Z(A)$ von $A$.
+
+    Es gilt:
+    $$
+        \rg(A) = \rg_S(A) = \rg_Z(A)
+    $$
+\end{defi}
+
+\begin{defi}{Lösbarkeit von linearen Gleichungssystemen}
+    Das lineare Gleichungssystem $Ax = b$ ist genau dann lösbar, wenn gilt:
+    $$
+        \rg(a_1, \ldots, a_n) = \rg(a_1, \ldots, a_n, b)
+    $$
+    Kürzer schreibt man $\rg(A) = \rg(A, b)$.
+
+    $Ax = b$ ist also genau dann eindeutig lösbar, falls $\ker(A) = \{0\} \iff \rg(A) = \rg(A, b) = n$.
+\end{defi}
+
+\begin{bonus}{Äquivalente Bedingungen für eindeutige Lösbarkeit}
+    Sei $K \in \{\R, \C\}$.
+    Für $A \in K^{n\times n}$ und die dadurch gegebene lineare Abbildung $L_A$ sind folgende Bedingungen äquivalent:
+    \begin{enumerate}
+        \item $A$ ist invertierbar.
+        \item $Ax = 0$ hat nur die triviale Lösung $x=0$.
+        \item Durch Zeilen- und Spaltenumformungen kann $A$ auf die Einheitsmatrix transformiert werden.
+        \item $A$ ist darstellbar als Produkt von Elementarmatrizen.
+        \item $Ax = b$ besitzt für jedes $b \in K^n$ mindestens eine Lösung.
+        \item $Ax = b$ hat genau eine Lösung für jedes $b \in K^n$.
+        \item $\det(A) \neq 0$
+        \item $\im(A) = K^n$
+        \item $L_A$ ist bijektiv.
+        \item Die Spaltenvektoren von $A$ sind linear unabhängig.
+        \item Die Zeilenvektoren von $A$ sind linear unabhängig.
+        \item Die Spaltenvektoren von $A$ bilden eine Basis von $K^n$.
+        \item Die Zeilenvektoren von $A$ bilden eine Basis von $K^n$.
+        \item $\rg(A)=n$
+        \item $\ker(L_A) = \{0\}$
+        \item $(\ker(L_A))^\perp = K^n$
+        \item Das orthogonale Komplement des von den Zeilen von $A$ aufgespannten Raums ist $\{0\}$.
+        \item $A^TA$ ist invertierbar.
+    \end{enumerate}
+\end{bonus}
+
+\begin{defi}{Allgemeine Lösung eines linearen Gleichungssystems}
+    Sei $x_s \in K^n$ eine (spezielle) Lösung von $Ax = b$.
+    Dann gilt:
+    $$
+        L(A, b) = x_s + \ker(A) = \{x_s + x \mid x \in \ker(A)\}
+    $$
+    bzw., wenn $(v_1, \ldots, v_r)$ eine Basis von $\ker(A)$ ist:
+    $$
+        L(A, b) = \{x + \lambda_1 v_1 + \ldots + \lambda_rv_r \mid \lambda_i \in K\}
+    $$
+\end{defi}
+
+\begin{example}{Allgemeine Lösung eines linearen Gleichungssystems}
+    Finden Sie die Lösung des linearen Gleichungssystems
+    $$
+        \vektor{-1 & 1 & 0 \\ 0 & 1 & 1}x = \vektor{0 \\ 2}
+    $$
+    mit Hilfe folgender Schritte:
+    \begin{enumerate}[a)]
+        \item Bestimmen Sie den Kern der Abbildungsmatrix.
+        \item Erraten Sie eine spezielle Lösung.
+        \item Bestimmen Sie die allgemeine Lösung.
+    \end{enumerate}
+
+    \exampleseparator
+
+    \begin{enumerate}[a)]
+        \item $$
+                  \begin{sysmatrix}{rrr|r}
+                      -1 & 1 & 0 & 0 \\
+                      0 & 1 & 1 & 0
+                  \end{sysmatrix}
+                  \quad \implies \quad
+                  \ker \vektor{-1 & 1 & 0 \\ 0 & 1 & 1} = \scalarprod{\vektor{1 \\ 1 \\ -1}}
+              $$\qed
+        \item $$
+                  x = \vektor{0\\0\\2} \quad \implies \quad \vektor{-1 & 1 & 0 \\ 0 & 1 & 1}\cdot \vektor{0\\0\\2} = \vektor{0 \\ 2}
+              $$\qed
+        \item Es gilt:
+              $$
+                  L \left({\vektor{-1 & 1 & 0 \\ 0 & 1 & 1}, \vektor{0 \\ 2}} \right) = \vektor{0\\0\\2} + \ker\vektor{-1 & 1 & 0 \\ 0 & 1 & 1} = \vektor{0\\0\\2} + \lambda \cdot \vektor{1 \\ 1 \\ -1}, \quad \lambda \in \R
+              $$\qed
+    \end{enumerate}
+\end{example}
+
+\begin{defi}{Cramersche Regel}
+    Es seien $A = \vektor{a_1 & \ldots & a_n} \in K^{n\times n}$ und $x, b \in K^n$ sowie $Ax=b$ ein lineares Gleichungssystem, und es gelte $\det(A) \neq 0$.
+    Seien
+    $$
+        A_i := \vektor{a_1 & \ldots & a_{i-1} & b & a_{i+1} & \ldots & a_n}, 1 \leq i \leq n
+    $$
+    Dann gilt:
+    $$
+        x_i = \frac{\det(A_i)}{\det(A)}
+    $$
+\end{defi}
+
+\begin{example}{Cramersche Regel}
+    In der Elektrotechnik ergeben sich eine Widerstandsmatrix $R$ und ein Quellspannungsvektor $U$:
+    $$
+        R = \vektor{1 & 3 & 0 \\ 1 & 4 & 1 \\ 2 & 1 & 1}, \quad U = \vektor{5 \\ 9 \\ 8}.
+    $$
+    Gesucht ist der Stromvektor $I$, der sich durch Lösen des linearen Gleichungssystems
+    $$
+        R \cdot I = U
+    $$
+    ergibt.
+    Bestimmen Sie die Lösung mithilfe der Cramerschen Regel.
+
+    \exampleseparator
+
+    Es gilt:
+    $$
+        \vektor{1 & 3 & 0 \\ 1 & 4 & 1 \\ 2 & 1 & 1}  \vektor{i_1 \\ i_2 \\ i_3} = \vektor{5 \\ 9 \\ 8}
+    $$
+
+    Nach der Cramerschen Regel gilt:\footnote{$\abs{R} = -1 \cdot (1-6) + 1 \cdot (4-3) = 6$}
+    $$
+        i_1 = \frac{\dvektor{5 & 3 & 0 \\ 9 & 4 & 1 \\ 8 & 1 & 1}}{\abs{R}} = \frac{-1 \cdot (5-24) + 1 \cdot (20-27)}{6} = \frac{12}{6} = 2
+    $$
+    $$
+        i_2 = \frac{\dvektor{1 & 5 & 0 \\ 1 & 9 & 1 \\ 2 & 8 & 1}}{\abs{R}} = \frac{-1 \cdot (8-10) + 1 \cdot (9-5)}{6} = \frac{6}{6} = 1
+    $$
+    $$
+        i_3 = \frac{\dvektor{1 & 3 & 5 \\ 1 & 4 & 9 \\ 2 & 1 & 8}}{\abs{R}} = \frac{32+54+5-40-9-24}{6} = \frac{18}{6} = 3
+    $$
+
+    Damit ist der Stromvektor $I$ gegeben mit $I = \vektor{2 & 1 & 3}^T$.\qed
+\end{example}
+
+\subsection{Über- und unterbestimmte lineare Gleichungssysteme}
+
+\begin{defi}{Normalgleichung}
+    Sei $p_A(b)$ die Projektion eines Vektors $b \in \R^m$ auf den von den Vektoren $A = \vektor{a_1 & \ldots & a_n} \in \R^{m\times n}$ aufgespannten Unterraum $U$, also das Bild von $A$.
+
+    Damit existiert ein $x \in \R^n$ mit
+    $$
+        p_A(b) = \sum^n_{k=1} x_ka_k = Ax
+    $$
+    Dann gilt
+    $$
+        b - p_A(b) \iff \ldots \iff A^TAx = A^Tb
+    $$
+
+    Die Gleichungen $A^TAx = A^Tb$ heißen \emph{Normalgleichungen}.
+
+    Die Normalgleichungen sind für jede relle Matrix $A \in \R^{m\times n}$ lösbar.
+
+\end{defi}
+
+\begin{defi}{Verallgemeinerte Inverse}
+    Gegeben ist ein lineares Gleichungssystem $Ax=b$ mit $A \in \R^{m\times n}$, $x \in \R^n$, $b \in \R^m$.
+
+    Im Fall $\rg(A) = n$ (voller Spaltenrang) existiert mit
+    $$
+        x = (A^TA)^{-1}A^Tb
+    $$
+    eine eindeutige Lösung.
+    In diesem Fall heißt $(A^TA)^{-1}A^T$ \emph{verallgemeinerte Inverse} von $A$.
+
+    Im Fall $\rg(A) = m$ (voller Zeilenrang) existiert mit
+    $$
+        x = A^T(AA^T)^{-1}b
+    $$
+    eine eindeutige Lösung.
+    In diesem Fall heißt $A^T(AA^T)^{-1}$ \emph{verallgemeinerte Inverse} von $A$.
+\end{defi}
+
+\begin{algo}{Lösen von überbestimmten Gleichungssystemen (Methode der kleinsten Quadrate)}
+    Gegeben ist das \emph{überbestimmte} Gleichungssystem
+    $$
+        Ax = b, \quad A \in \R^{m\times n}, \, b\in \R^m, \, m \geq n
+    $$
+    Im Fall $\rg(A) = n$ (voller Spaltenrang) gilt mithilfe der verallgemeinerten Inverse für
+    $$
+        x_s = (A^TA)^{-1}A^Tb
+    $$
+    dass
+    $$
+        \norm{b-Ax_s} = \min_{z\in\R^n} \norm{b-Az}
+    $$
+
+    Der Vektor $x_s$ heißt \emph{Näherungslösung nach der Methode der kleinsten Quadrate}.
+\end{algo}
+
+\begin{example}{Methode der kleinsten Quadrate}
+    Eine Messreihe ergibt zu den Zeiten $t = 1,2,3,4,5$ in Sekunden folgende Temperaturwerte:
+
+    \begin{center}
+        \begin{tabular}{l | CCCCC}
+            $t$ Sekunden        & 1   & 2   & 3    & 4    & 5    \\
+            \hline
+            $y(t)\si{\celsius}$ & 0.9 & 5.8 & 11.4 & 12.1 & 12.9 \\
+        \end{tabular}
+    \end{center}
+
+    Stellen Sie das überbestimmte Gleichungssystem für die unbekannten Parameter $a$ und $b$ auf und bestimmen Sie diese nach der Methode der kleinsten Quadrate, wenn folgende Beziehung zwischen $y$ und $t$ gilt:
+    $$
+        y(t) = a \cdot t + b \cdot \sin\left( -t \cdot \frac{\pi}{2} \right)
+    $$
+    \exampleseparator
+
+    \begin{center}
+        \begin{tikzpicture}[scale=1]
+            \begin{axis}[
+                    %view={45}{15},
+                    width=15cm,
+                    unit vector ratio*=1 1,
+                    axis lines = middle,
+                    grid=major,
+                    ymin=-.5,
+                    ymax=14,
+                    xmin=0,
+                    xmax=7,
+                    %zmin=-1,
+                    %zmax=10,
+                    xlabel = $x$,
+                    ylabel = $y$,
+                    %zlabel = $z$,
+                    %xtick style={draw=none},
+                    %ytick style={draw=none},
+                    %ztick style={draw=none},
+                    xtick distance={1},
+                    ytick distance={1},
+                    %ztick distance={1},
+                    %xticklabels=\empty,
+                    %yticklabels=\empty,
+                    %zticklabels=\empty,
+                    disabledatascaling,
+                ]
+
+                \addplot[domain=0:6, samples=100, color=red]{3.02308 * x - 2.22308 * sin(deg(x * pi/2))};
+
+                \node[label={315:{(1,0.9)}},circle,fill,inner sep=1pt] at (axis cs:1,0.9) {};
+                \node[label={135:{(2,5.8)}},circle,fill,inner sep=1pt] at (axis cs:2,5.8) {};
+                \node[label={135:{(3,11.4)}},circle,fill,inner sep=1pt] at (axis cs:3,11.4) {};
+                \node[label={135:{(4,12.1)}},circle,fill,inner sep=1pt] at (axis cs:4,12.1) {};
+                \node[label={315:{(5,12.9)}},circle,fill,inner sep=1pt] at (axis cs:5,12.9) {};
+            \end{axis}
+        \end{tikzpicture}
+    \end{center}
+\end{example}
+
+\begin{example}{Methode der kleinsten Quadrate (Fortsetzung)}
+    Mit den gegebenen Daten erhalten wir folgendes LGS:
+    $$
+        Ax = b \quad \iff \quad \vektor{1 & -\sin \frac{\pi}{2} \\ 2 & -\sin \pi \\ 3 & -\sin \frac{3\pi}{2} \\ 4 & -\sin 2 \pi \\ 5 & -\sin \frac{5\pi}{2}}\vektor{a \\ b} = \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \quad \iff \quad \vektor{1 & -1 \\ 2 & 0 \\ 3 & 1 \\ 4 & 0 \\ 5 & -1}\vektor{a \\ b} = \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9}
+    $$
+    mit
+    $$
+        \rg(A) = 2 = n \quad \implies \quad A^TAx = A^Tb \quad \iff \quad x = \left(A^T A\right)^{-1} A^T b
+    $$
+    Dann gilt nach der Methode der kleinsten Quadrate:
+    $$
+        \begin{aligned}
+            x_s \quad = \quad & \left(A^T A\right)^{-1} A^T b                     \\
+            = \quad           & \left(\vektor{1               & 2  & 3  & 4  & 5  \\ -1 & 0 & 1 & 0 & -1} \vektor{1 & -1 \\ 2 & 0 \\ 3 & 1 \\ 4 & 0 \\ 5 & -1}\right)^{-1} \vektor{1 & 2 & 3 & 4 & 5 \\ -1 & 0 & 1 & 0 & -1} \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \\
+            = \quad           & \vektor{55                    & -3                \\ -3 & 3}^{-1} \vektor{1 & 2 & 3 & 4 & 5 \\ -1 & 0 & 1 & 0 & -1} \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \\
+            = \quad           & \frac{1}{156}\vektor{3        & 3                 \\ 3 & 55} \vektor{1 & 2 & 3 & 4 & 5 \\ -1 & 0 & 1 & 0 & -1} \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \\
+            = \quad           & \frac{1}{156}\vektor{0        & 6  & 12 & 12 & 12 \\ -52 & 6 & 64 & 12 & -40} \vektor{0.9 \\ 5.8 \\ 11.4 \\ 12.1 \\ 12.9} \\
+            = \quad           & \frac{1}{156}\vektor{471.6                        \\ 346.8} = \vektor{3.02308 \\ 2.22308} = \vektor{a \\ b}
+        \end{aligned}
+    $$
+
+    Damit gilt insgesamt:
+    $$
+        y(t) = a \cdot t + b \cdot \sin\left( -t \cdot \frac{\pi}{2} \right) = 3.02308 \cdot t + 2.22308 \cdot \sin\left( -t \cdot \frac{\pi}{2} \right)
+    $$\qed
+\end{example}
+
+
+\begin{algo}{Lösen von unterbestimmten Gleichungssystemen}
+    Gegeben ist das \emph{unterbestimmte} Gleichungssystem
+    $$
+        Ax = b, \quad A \in \R^{m\times n}, \, b\in \R^m, \, m \leq n
+    $$
+    Im Fall $\rg(A) = m$ (voller Zeilenrang) gilt mithilfe der verallgemeinerten Inverse für
+    $$
+        x_s = A^T(AA^T)^{-1}b
+    $$
+    dass
+    $$
+        \norm{x_s} = \min_{Ax=b} \norm{x} \quad \land \quad x_s \perp \ker(A)
+    $$
+
+    Der Vektor $x_s$ ist eine \emph{eindeutige Lösung mit minimaler Norm}.
+\end{algo}
+
+\begin{example}{Lösen von unterbestimmten Gleichungssystemen}
+    Die Punkte $A(6;0;0)$, $B(2;1;3)$ und $C(-2;-2;2)$ liegen in einer Ebene $E$.
+    \begin{enumerate}[a)]
+        \item Stellen Sie die Hessesche Normalform der Ebene auf.
+              Wie groß ist der Abstand der Ebene zum Ursprung?
+        \item Welcher Punkt in der Ebene hat den kleinsten Abstand zum Ursprung?
+              Stellen Sie dazu das zugehörige unterbestimmte LGS auf und finden Sie die Lösung mit Hilfe der verallgemeinerten Inverse.
+    \end{enumerate}
+
+    \exampleseparator
+
+    \begin{enumerate}[a)]
+        \item Wir wählen uns $\vec{a}$ (Ortsvektor von $A$) als Stützvektor und die Vektoren $v = \vec{b} - \vec{a}$ und $w = \vec{c} - \vec{a}$ als Richtungsvektoren der Ebene.
+              Dann gilt:
+              $$
+                  v = \vektor{2\\1\\3} - \vektor{6\\0\\0} = \vektor{-4\\1\\3}, \qquad w = \vektor{-2\\-2\\2} - \vektor{6\\0\\0} = \vektor{-8\\-2\\2}
+              $$
+              $$
+                  n = \frac{v \times w}{\abs{v \times w}} = \frac{1}{\abs{v \times w}} \vektor{8 \\ -16 \\ 16} = \frac{1}{24} \vektor{8 \\ -16 \\ 16} = \vektor{\nicefrac{1}{3} \\ -\nicefrac{2}{3} \\ \nicefrac{2}{3}}
+              $$
+
+              Mit $n$ als (normierten) Normalenvektor erhalten wir dann die Hessesche Normalform der Ebene mit
+              $$
+                  E: \scalarprod{x,n} = \scalarprod{\vec{a}, n} \quad \iff \quad \frac{1}{3} \cdot x - \frac{2}{3} \cdot y + \frac{2}{3} \cdot z = 2
+              $$
+
+              Setzen wir den Nullpunkt in die Ebene ein, erhalten wir den Abstand mit $d = 2$.\qed
+        \item Mit der Ebenengleichung
+              $$
+                  E: \frac{1}{3} \cdot x - \frac{2}{3} \cdot y + \frac{2}{3} \cdot z = 2
+              $$
+              können wir folgendes unterbestimmte LGS aufstellen:
+              $$
+                  Ax = b \quad \iff \quad \vektor{\nicefrac{1}{3} & -\nicefrac{2}{3} & \nicefrac{2}{3}} \vektor{x \\ y \\ z} = \vektor{2}
+              $$
+              mit
+              $$
+                  \rg(A) = 1 = m \quad \implies \quad x = A^T \left(AA^T\right)^{-1}b
+              $$
+
+              Dann gilt:
+              $$
+                  \begin{aligned}
+                      x_s \quad = \quad & A^T \left(AA^T\right)^{-1}b \\
+                      = \quad           & \vektor{\nicefrac{1}{3}     \\ -\nicefrac{2}{3} \\ \nicefrac{2}{3}} \left( \vektor{\nicefrac{1}{3} & -\nicefrac{2}{3} & \nicefrac{2}{3}} \vektor{\nicefrac{1}{3} \\ -\nicefrac{2}{3} \\ \nicefrac{2}{3}} \right)^{-1} \cdot 2 \\
+                      = \quad           & \vektor{\nicefrac{2}{3}     \\ -\nicefrac{4}{3} \\ \nicefrac{4}{3}} = \vektor{x\\y\\z}
+                  \end{aligned}
+              $$
+              Damit ist dann $\vektor{\nicefrac{2}{3} & -\nicefrac{4}{3} & \nicefrac{4}{3}}^T$ der gesuchte Punkt in der Ebene mit dem geringsten Abstand.\qed
+    \end{enumerate}
+\end{example}
+\section{Geometrie linearer Abbildungen}
+
+\subsection{Orthogonale Abbildungen und Matrizen}
+
+\begin{defi}{Isometrie}
+    Eine \emph{Isometrie} ist eine lineare Abbildung, die zwei metrische Räume aufeinander abbildet und dabei die euklidische Länge eines Vektors erhält.
+
+    Man spricht auch von einer abstandserhaltenden Abbildung.
+
+    Sei $f : \R^n \to \R^n$ beliebig. Dann sind äquivalent:
+    \begin{enumerate}
+        \item $\forall x, y \in \R^n : \scalarprod{f(x), f(y)} = \scalarprod{x, y}$
+        \item $f$ ist eine winkelerhaltende Isometrie.
+    \end{enumerate}
+\end{defi}
+
+\begin{defi}{Orthogonalmatrix}
+    Eine Matrix $A\in \R^{n\times n}$ heißt \emph{orthogonal}, wenn ihre Spaltenvektoren eine Orthonormalbasis bilden.
+
+    Die Menge aller orthogonalen Matrizen in $\R^{n\times n}$ heiße $O(n)$.
+
+    Es gilt:
+    \begin{itemize}
+        \item $A \in O(n) \implies \abs{\det(A)} = 1$
+    \end{itemize}
+
+    Es sind äquivalent:
+    \begin{enumerate}
+        \item $A \in O(n)$
+        \item $A$ ist invertierbar, und es gilt $A^{-1} = A^T$
+        \item $A^T \in O(n)$
+    \end{enumerate}
+\end{defi}
+
+\begin{example}{Orthogonalmatrix}
+    Zeigen Sie, dass die Matrix
+    $$
+        Q = \vektor{
+            \cos \beta & -\sin\beta & 0 \\
+            \cos \alpha \sin\beta & \cos\alpha \cos\beta & -\sin\alpha \\
+            \sin\alpha \sin\beta & \sin\alpha \cos\beta & \cos\alpha
+        }
+    $$
+    eine Orthogonalmatrix ist und bestimmen Sie ihre Inverse.
+
+    \exampleseparator
+
+    Genau dann, wenn $Q$ eine Orthogonalmatrix ist, ist $QQ^T = I$ und damit auch $Q^T = Q^{-1}$:
+    $$
+        \begin{aligned}
+            QQ^T = \quad        &
+            \vektor{ \cos \beta & -\sin\beta                        & 0                        \\ \cos \alpha \sin\beta & \cos\alpha \cos\beta & -\sin\alpha \\ \sin\alpha \sin\beta & \sin\alpha \cos\beta & \cos\alpha }
+            \vektor{ \cos\beta  & \cos\alpha \sin\beta              & \sin\alpha \sin\beta     \\ -\sin\beta & \cos\alpha \cos\beta & \sin\alpha \cos\beta \\ 0 & -\sin\alpha & \cos\alpha} \\
+            = \quad             & \vektor{\cos^2\beta + \sin^2\beta & 0                    & 0 \\ 0 & \cos^2\alpha \left( \sin^2\beta + \cos^2\beta \right) + \sin^2\alpha & 0  \\ 0 & 0 & \sin^2\alpha \left( \sin^2\beta + \cos^2\beta \right) + \cos^2\alpha} \\
+            = \quad             & \vektor{\cos^2\beta + \sin^2\beta & 0                    & 0 \\ 0 & \cos^2\alpha  + \sin^2\alpha & 0  \\ 0 & 0 & \sin^2\alpha + \cos^2\alpha} \\
+            = \quad             & \vektor{1                         & 0                    & 0 \\ 0 & 1 & 0  \\ 0 & 0 & 1}
+        \end{aligned}
+    $$
+
+    Damit ist $Q$ eine Orthogonalmatrix und $Q^T$ die Inverse von $Q$.\qed
+\end{example}
+
+\begin{algo}{QR-Zerlegung}
+    Sei $A = \vektor{a_1 & \ldots & a_n} \in \R^{m\times n}$ und $\rg(A) = n$.
+    Dann gibt es eine in den Spalten orthogonale Matrix $Q \in \R^{m\times n}$ und eine obere Dreiecksmatrix $R \in \R^{n\times n}$ mit $A = QR$.
+    Hierbei können die Spalten von $Q$ mithilfe des Verfahrens von Gram-Schmidt aus den Spalten von $A$ erzeugt werden, und es gilt $\rg(R) = n$.
+
+    Mit $Q = \vektor{q_1 & \ldots & q_n}$ und $R = (\varrho_{ij})$ ergibt sich $R$ durch Lösen der $n$ linearen Gleichungen
+    $$
+        \vektor{a_1 & \ldots & a_n} = \vektor{q_1 & \ldots & q_n} \vektor{ \varrho_{11} & \varrho_{12} & \ldots & \varrho_{1n} \\ & \varrho_{22} & \ldots & \varrho_{2n} \\ & & \ddots & \vdots \\ & & & \varrho_{nn}}
+    $$
+    Hierbei kann bei $n > 1$ über die per Gram-Schmidt generierten Zwischenrechnungen durch Koeffizientenvergleich gelöst werden.
+\end{algo}
+
+\begin{example}{QR-Zerlegung}
+    Wie lautet die QR-Zerlegung von
+    $$
+        A = \vektor{3 & 1 \\ 4 & 5}?
+    $$
+    Lösen Sie anschließend mit dieser Zerlegung das lineare Gleichungssystem $Ax = b$ mit $b = \vektor{2 & 3}^T$.
+
+    \exampleseparator
+
+    Wir wenden das Gram-Schmidt-Verfahren auf die Spaltenvektoren an:\footnote{Wir sehen, dass die Vektoren orthogonal sind.}
+    $$
+        \begin{aligned}
+            v_1 \quad = \quad & \vektor{3                                                        \\4} \\
+            w_1 \quad = \quad & \frac{v_1}{\norm{v_1}} = \frac{1}{5}\vektor{3                    \\4} = \vektor{\nicefrac{3}{5}\\\nicefrac{4}{5}} \\
+            v_2 \quad = \quad & \vektor{1                                                        \\5} \\
+            r_2 \quad = \quad & v_2 - \scalarprod{v_2, w_1}w_1                                   \\
+            = \quad           & \vektor{1                                                        \\ 5} - \left( \frac{1}{5} \right)^2\scalarprod{\vektor{1 \\ 5}, \vektor{3 \\ 4}}\vektor{3 \\ 4} =  \vektor{-\nicefrac{44}{25}                      \\ \nicefrac{33}{25}}\\
+            w_2 \quad = \quad & \frac{r_2}{\norm{r_2}} = \frac{5}{11} \vektor{-\nicefrac{44}{25} \\ \nicefrac{33}{25}} = \vektor{-\nicefrac{4}{5} \\ \nicefrac{3}{5}}
+        \end{aligned}
+    $$
+
+    Damit erhalten wir $Q$ mit
+    $$
+        Q = \vektor{w_1 & w_2} =  \vektor{\nicefrac{3}{5} & -\nicefrac{4}{5} \\ \nicefrac{4}{5} & \nicefrac{3}{5}} = \frac{1}{5} \vektor{3 & -4 \\ 4 & 3}
+    $$
+    Da $A$ quadratisch ist\footnote{\ldots und damit auch $Q$}, gilt:
+    $$
+        QR = A \quad \iff \quad R = Q^TA
+    $$
+    womit $R$ gegeben ist, mit
+    $$
+        R = Q^TA = \frac{1}{5}\vektor{3 & 4 \\ -4 & 3} \vektor{3 & 1 \\ 4 & 5} = \frac{1}{5} \vektor{25 & 23 \\ 0 & 11}
+    $$
+\end{example}
+
+\begin{example}{QR-Zerlegung (Fortsetzung)}
+    Für das gegebene lineare Gleichungssystem $Ax = b$ ergibt sich dann:
+    $$
+        Ax = b \quad \iff \quad QRx = b  \quad \iff \quad Rx = Q^Tb
+    $$
+    $$
+        \begin{aligned}
+            \iff \quad     & \frac{1}{5} \vektor{25                                  & 23 \\ 0 & 11}x = \frac{1}{5}\vektor{3 & 4 \\ -4 & 3}\vektor{2\\3} \\
+            \iff \quad     & \vektor{25                                              & 23 \\ 0 & 11}x = \vektor{18 \\ 1} \\
+            \implies \quad & 11x_2 = 1 \quad \land \quad 25x_1 + 23x_2 = 18               \\
+            \iff \quad     & x_2 = \frac{1}{11} \quad \land \quad x_1 = \frac{7}{11}      \\
+            \implies \quad & x = \vektor{\nicefrac{7}{11}                                 \\ \nicefrac{1}{11}}
+        \end{aligned}
+    $$\qed
+\end{example}
+
+\subsection{Eigenwerte und Eigenvektoren}
+
+\begin{defi}{Eigenwert, Eigenvektor und Eigenraum}
+    Existiert für einen Endomorphismus $f$ ein $\lambda \in \C$ und $v\in V \setminus \{0\}$ mit
+    $$
+        f(v) = \lambda v
+    $$
+    dann heißt $v$ \emph{Eigenvektor} von $f$ zum \emph{Eigenwert} $\lambda$.
+
+    Sei $\lambda$ ein Eigenwert von $f$ und $v_1, \ldots, v_k$ Eigenvektoren von $f$ zu $\lambda$.
+    Dann ist auch $v \in L(v_1, \ldots, v_k) \setminus \{0\}$ ein Eigenvektor von $f$ zu $\lambda$.
+
+    Für $\lambda \in \C$ ist $\Eig(f;\lambda) := \{v \in V \mid f(v) = \lambda v\}$, der \emph{Eigenraum} von $f$ zu $\lambda$, ein Untervektorraum von $V$.
+
+    Es gilt:
+    \begin{itemize}
+        \item Für $\lambda \neq \gamma$ gilt $\Eig(f;\lambda) \cap \Eig(f;\gamma) = \{0\}$.
+        \item Eigenvektoren zu unterschiedlichen Eigenwerten sind linear unabhängig.
+        \item Die Eigenwerte einer Dreiecksmatrix sind die Werte auf der Hauptdiagonalen.
+        \item Eigenwerte reeller symmetrischer Matrizen sind immer reell.
+        \item Zu jedem Eigenwert einer reellen symmetrischen Matrix existieren reelle Eigenvektoren.
+        \item Sei $A \in \R^{n\times n}$ symmetrisch, $\lambda \neq \mu$ zwei Eigenwerte von $A$ mit Eigenvektoren $v$ bzw. $w$. Dann gilt $v \perp w$.
+    \end{itemize}
+
+\end{defi}
+
+\begin{defi}{Charakteristisches Polynom}
+    Sei $A \in \C^{n\times n}$.
+    Dann ist die Funktion
+    $$
+        \chi_A(\lambda) := \det(A-\lambda E)
+    $$
+    ein Polynom mit $\deg(\chi_A) = n$ und heißt \emph{charakteristisches Polynom}.
+
+    Es gilt:
+    \begin{itemize}
+        \item $\lambda \in \C$ ist Eigenwert von $A$ $\iff \chi_A(\lambda) = 0$
+        \item $A$ hat (mit Vielfachheit) genau $n$ Eigenwerte $\lambda_i \in \C$.
+        \item $\Eig(f;\lambda) = \ker(A-\lambda E)$
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Eigenwerte und Eigenvektoren}
+    Gegeben sind
+    $$
+        A_t = \vektor{1 & t \\ -2 & -1-t} \quad \text{und} \quad x_t = \vektor{-t \\ 2}, t \in \R
+    $$
+    Zeigen Sie, dass der Vektor $x_t$ Eigenvektor der Matrix $A_t$ ist.
+    Wie lautet der zugehörige Eigenwert?
+    Bestimmen Sie auch den zweiten Eigenwert.
+
+    \exampleseparator
+
+    Berechnen des charakteristischen Polynoms von $A_t$:
+    $$
+        \abs{A - \lambda I} = \abs{\vektor{1 - \lambda & t \\ -2  & -1-t-\lambda}} = (1-\lambda)(-1-t-\lambda) + 2t = \lambda^2 + t\lambda + t - 1
+    $$
+
+    Nullstellen des charakteristischen Polynoms (Eigenwerte):
+    $$
+        \lambda_{1,2} = -\frac{t}{2} \pm \sqrt{\left(\frac{t}{2}\right)^2 - t + 1} = -\frac{t}{2} \pm \sqrt{\frac{t^2-4t + 4}{4}} = -\frac{t}{2} \pm \frac{t-2}{2}
+    $$
+    $$
+        \lambda_1 = -1 \quad \land \quad \lambda_2 = -t +1
+    $$
+
+    Bestimmen des Eigenraums/der Eigenvektoren zum Eigenwert $\lambda_1$:
+    $$
+        \begin{sysmatrix}{cc|c}
+            1-\lambda_1 & t & 0 \\
+            -2 & -1-t-\lambda_1 & 0
+        \end{sysmatrix}
+        \sim
+        \begin{sysmatrix}{cc|c}
+            2 & t & 0 \\
+            -2 & -t & 0
+        \end{sysmatrix}
+        \sim
+        \begin{sysmatrix}{cc|c}
+            2 & t & 0 \\
+            0 & 0 & 0
+        \end{sysmatrix}
+    $$
+    $$
+        \begin{aligned}
+            \implies \quad & 2x_1 + tx_2 = 0 \iff x_1 = -\frac{tx_2}{2}                  \\
+            \implies \quad & E(\lambda_1) = \ker(A-\lambda_1 I) = \scalarprod{\vektor{-t \\ 2}} \ni x_t
+        \end{aligned}
+    $$
+
+    Insgesamt sind also die Eigenwerte $\lambda_1 = -1$ und $\lambda_2 = -t+1$ und $x_t$ Eigenvektor zu $\lambda_1$.\qed
+\end{example}
+
+\begin{bonus}{Eigenwerte und Determinanten}
+    Für $A = \vektor{a_1 & \ldots & a_n} \in \C^{n\times n}$ mit Eigenwerten $\lambda_i$, $1 \leq i \leq n$ gilt
+    $$
+        \det(A) = \prod^n_{i=1}\lambda_i
+    $$
+\end{bonus}
+
+\subsection{Diagonalisierung linearer Abbildungen}
+
+\begin{defi}{Diagonalisierbarkeit}
+    Eine quadratische Matrix $A \in \C^{n\times n}$ heißt \emph{diagonalisierbar}, wenn es eine Diagonalmatrix $D$ und eine invertierbare Matrix $S$ existiert, sodass
+    $$
+        A = SDS^{-1}
+    $$
+    gilt.
+    Dabei ist $A$ genau dann diagonalisierbar, wenn eine Basis aus Eigenvektoren existiert.
+    Bildet man mit ihnen als Spalten eine Matrix $S$, dann ist $S$ genau die oben genannte Matrix\footnote{\ldots des Basiswechsels.}.
+
+    Auf der Hauptdiagonalen von $D$ befinden sich die entsprechenden Eigenwerte von $A$.
+
+    Es gilt:
+    \begin{itemize}
+        \item Zu jeder reellsymmetrischen Matrix $A$ gibt es eine Orthogonalmatrix $S$ und eine Diagonalmatrix $D$ wie oben.
+    \end{itemize}
+\end{defi}
+
+\begin{example}{Diagonalmatrix}
+    Gesucht ist die Matrix $A$ mit den Eigenwerten $1$ und $4$ und den zugehörigen Eigenvektoren $\vektor{4\\1}$ und $\vektor{2\\1}$.
+
+    \exampleseparator
+
+    Wir wissen, dass $A$ diagonalisierbar ist.
+    Damit gilt
+    $$
+        \begin{aligned}
+            A & \quad = SDS^{-1}                    \\
+              & \quad = \vektor{4              & 2  \\ 1 & 1} \vektor{1 & 0 \\ 0 & 4} \vektor{4 & 2 \\ 1 & 1}^{-1} \\
+              & \quad = \vektor{4              & 2  \\ 1 & 1} \vektor{1 & 0 \\ 0 & 4} \frac{1}{2} \vektor{1 & -2 \\ -1 & 4} \\
+              & \quad = \frac{1}{2} \vektor{4  & 2  \\ 1 & 1} \vektor{1 & -2 \\ -4 & 16} \\
+              & \quad = \frac{1}{2} \vektor{-4 & 24 \\ -3 & 14}
+        \end{aligned}
+    $$\qed
+\end{example}
+
+\begin{defi}{Vielfachheit}
+    Sei $A \in \C^{n\times n}$ und $\lambda$ ein Eigenwert.
+
+    Die Vielfachheit der Nullstelle $\lambda$ von $\chi_A$ heißte \emph{algebraische Vielfachheit} $a(\lambda)$.
+
+    Weiter sei $g(\lambda) := \dim(\Eig(A;\lambda))$ die \emph{geometrische Vielfachheit} von $\lambda$.
+
+    Es gilt:
+    \begin{itemize}
+        \item Existiert ein Eigenwert $\tilde{\lambda}$ mit $a(\tilde{\lambda}) > g(\tilde{\lambda})$, dann ist $A$ nicht diagonalisierbar.
+    \end{itemize}
+\end{defi}
+
+\begin{bonus}{Normale Matrix}
+    Eine Matrix $A \in \C^{n\times n}$ heißt \emph{normal}, wenn gilt:
+    $$
+        AA^{*} = A^{*}A \quad \iff \quad A\bar{A}^T = \bar{A}^TA
+    $$
+
+    $A^{*}$ heißt adjungierte Matrix von $A$.
+
+    Sei $A \in \C^{n\times n}$.
+    Es gilt:
+    \begin{itemize}
+        \item Es existiert eine bzgl. des Standardskalarprodukts in $\C^n$ orthonormale Basis aus Eigenvektoren, d.h. $A$ ist diagonalisierbar.
+        \item Jede reelle symmetrische Matrix ist diagonalisierbar. Die Eigenwerte sind reell.
+        \item Jede reelle antisymmetrische Matrix (d.h. $A^T = -A$) ist diagonalisierbar. Die Eigenwerte sind rein imaginär oder 0.
+        \item Jede reelle orthogonale Matrix ist diagonalisierbar.
+    \end{itemize}
+\end{bonus}
+
+\subsection{Definitheit und Skalarprodukte}
+
+\begin{defi}{Skalarprodukt}
+    Für ein \emph{Skalarprodukt} $(\cdot, \cdot) : \R^n \times \R^n \to \R$ müssen drei Bedingungen erfüllt sein:
+    \begin{enumerate}
+        \item $(\cdot, \cdot)$ ist linear in den Spalten.
+        \item $(\cdot, \cdot)$ ist symmetrisch.
+        \item $(x, x) > 0$ für $x \neq 0$.
+    \end{enumerate}
+
+    Wir wählen eine beliebige Matrix $A \in \R^{n\times n}$ und betrachten die Abbildung
+    $$
+        (\cdot, \cdot)_A : \R^n \times \R^n \to \R, \quad (x, y)_A := \scalarprod{x, Ay}
+    $$
+    wobei $\scalarprod{\cdot, \cdot}$ für das Standardskalarprodukt steht.
+
+    Die Abbildung $(\cdot, \cdot)_A$ ist genau dann symmetrisch, wenn $A$ symmetrisch ist.
+
+    Nicht jede symmetrische Matrix definiert ein Skalarprodukt (z.B. die Nullmatrix).
+\end{defi}
+
+\begin{defi}{Quadratische Form}
+    Sei $A$ eine symmetrische Matrix $A \in \R^{n\times n}$.
+
+    Die Abbildung $x \to \scalarprod{x, Ax}$ wird \emph{quadratische Form} genannt.
+\end{defi}
+
+\begin{defi}{Hauptminoren}
+    Für $A \in \R^{n\times n}$ seien $A_k$ die \emph{links oben} beginnenden $k \times k$-Untermatrizen $A_k = (a_{ij})^k_{i,j=1}$ von $A$.
+
+    Dann heißen $D_k = \det(A_k)$ die \emph{Hauptunterdeterminanten} oder \emph{Hauptminoren} von $A$.
+\end{defi}
+
+\begin{defi}{Definitheit}
+    Sei $A$ eine symmetrische Matrix $A \in \R^{n\times n}$.
+
+    Dann gilt:
+    \begin{itemize}
+        \item $A$ heißt \emph{positiv definit}, wenn $\scalarprod{x, Ax} > 0 \forall x \in \R^n \setminus \{0\}$.\footnote{Häufig kürzt man \glqq symmetrisch positiv definit\grqq mit \emph{spd} ab.}
+        \item $A$ heißt \emph{negativ definit}, wenn $\scalarprod{x, Ax} < 0 \forall x \in \R^n \setminus \{0\}$.
+        \item $A$ heißt \emph{positiv semidefinit}, wenn $\scalarprod{x, Ax} \geq 0 \forall x \in \R^n \setminus \{0\}$.
+        \item $A$ heißt \emph{negativ semidefinit}, wenn $\scalarprod{x, Ax} \leq 0 \forall x \in \R^n \setminus \{0\}$.
+        \item $A$ heißt \emph{indefinit}, falls sie weder positiv noch negativ (semi-)definit ist, d.h.
+              $$
+                  \exists x, y \in \R^n \{0\} : \scalarprod{x, Ax} > 0 \land \scalarprod{y, Ay} < 0
+              $$
+    \end{itemize}
+
+    Es gilt:
+    \begin{itemize}
+        \item Die Abbildung $(\cdot, \cdot)_A$ ist genau dann ein Skalarprodukt, wenn $A$ spd ist.
+    \end{itemize}
+
+    Für eine reelle symmetrische Matrix $A$ sind äquivalent:
+    \begin{enumerate}
+        \item $A$ ist positiv definit.
+        \item $A$ besitzt nur positive Eigenwerte.
+        \item Alle Hauptminoren von $A$ sind positiv.
+    \end{enumerate}
+
+    Weiter ist $A$ genau dann positiv semidefinit, wenn alle Eigenwerte von $A$ nicht negativ sind.
+    In diesem Fall sind alle Hauptminoren von $A$ nicht negativ.
+
+    $A$ ist genau dann negativ (semi-)definit, wenn $-A$ positiv (semi-)definit ist.
+
+    Für die Hauptminoren $D_k$ einer negativ definiten Matrix gilt, dass $D_k$ abwechselnd positiv und negativ sind, beginnend mit negativem Vorzeichen.
+\end{defi}
+
+\printindex
+\printindex[Beispiele]
+
 \end{document}
\ No newline at end of file
diff --git a/or/or.bib b/or/or.bib
index 7554751fea3786ffdf881c1c2722b364e510ddab..9f0336858da25c12ab1550d4d4fd364656e3f781 100644
--- a/or/or.bib
+++ b/or/or.bib
@@ -1,18 +1,18 @@
-@inproceedings{khachiyan1979,
-  title        = {A polynomial algorithm in linear programming},
-  author       = {Khachiyan, Leonid Genrikhovich},
-  booktitle    = {Doklady Akademii Nauk},
-  volume       = {244},
-  number       = {5},
-  pages        = {1093--1096},
-  year         = {1979},
-  organization = {Russian Academy of Sciences}
-}
-
-@inproceedings{karmarkar1984,
-  title     = {A new polynomial-time algorithm for linear programming},
-  author    = {Karmarkar, Narendra},
-  booktitle = {Proceedings of the sixteenth annual ACM symposium on Theory of computing},
-  pages     = {302--311},
-  year      = {1984}
+@inproceedings{khachiyan1979,
+  title        = {A polynomial algorithm in linear programming},
+  author       = {Khachiyan, Leonid Genrikhovich},
+  booktitle    = {Doklady Akademii Nauk},
+  volume       = {244},
+  number       = {5},
+  pages        = {1093--1096},
+  year         = {1979},
+  organization = {Russian Academy of Sciences}
+}
+
+@inproceedings{karmarkar1984,
+  title     = {A new polynomial-time algorithm for linear programming},
+  author    = {Karmarkar, Narendra},
+  booktitle = {Proceedings of the sixteenth annual ACM symposium on Theory of computing},
+  pages     = {302--311},
+  year      = {1984}
 }
\ No newline at end of file
diff --git a/or/or.pdf b/or/or.pdf
index ad782a4a5d56bc719e39794dd53cc845a878ae20..33ee8a1b7c8e97637ffd99a6452ca8547ed33af2 100644
Binary files a/or/or.pdf and b/or/or.pdf differ
diff --git a/or/or.tex b/or/or.tex
index a25901fdede5fbefdfacbf2c27674e12ed3547bd..8e368e85df3e369f0c458843f7e6b7fea9bd148b 100644
--- a/or/or.tex
+++ b/or/or.tex
@@ -1,76 +1,76 @@
-\documentclass[english]{../spicker}
-
-\usepackage{amsmath}
-
-\usepackage{graphicx}
-\usepackage{tabularx, multirow}
-
-\usepackage[style=numeric, backend=bibtex]{biblatex}
-\addbibresource{or.bib}
-
-\title{Operations Research}
-\author{Patrick Gustav Blaneck}
-
-\begin{document}
-\maketitle
-\tableofcontents
-\newpage
-
-%\setcounter{section}{1}
-
-\section{Linear Programming}
-
-\begin{defi}{Linear Programming}
-    \emph{Linear Programming} is the problem of optimizing (maximizing or minimizing) a \emph{linear objective function} subject to a set of \emph{linear functional constraints}.
-
-    \textbf{Given:} $A \in \R^{m\times n}, b \in \R^m, c\in R^n$
-
-    \textbf{Find:} $x^* \in \R^n$ where $x^* = \arg\max\{c^Tx \mid Ax \leq b\}$
-\end{defi}
-
-\begin{bonus}{Linear Programming Solvers}
-    Software that solves linear programs - \emph{linear programming solvers} - also generate lots of important auxiliary information (as well as the optimum):
-    \begin{itemize}
-        \item sensitivity analysis
-        \item shadow prices
-        \item alternative optima
-        \item \ldots
-    \end{itemize}
-\end{bonus}
-
-\begin{theo}{Ellipsoid Method}
-    A LP of dimension $n$ can be solved in $\bigo(L^2 \cdot n^6)$ time \cite{khachiyan1979}, where $L =$ \# bits in the input.
-\end{theo}
-
-\begin{theo}{Interior Point Method}
-    A LP of dimension $n$ can be solved in a \emph{numerically stable} way in $\bigo(L^2 \cdot n^{3.5})$ time \cite{karmarkar1984}.
-\end{theo}
-
-\begin{defi}{Integer Linear Programs (ILP)}
-    \textbf{Given:} $A \in \R^{m\times n}, b \in \R^m, c\in R^n$
-
-    \textbf{Find:} $\underline{x^*\in\Z^n}$ where $x^* = \arg\max\{c^Tx \mid Ax \leq b\}$
-\end{defi}
-
-\begin{example}{Integer Linear Program for \textsc{Vertex Cover}}
-    \fbox{
-        \parbox{0.95\textwidth}{
-            \underline{\textsc{Vertex Cover}}
-
-
-            \textbf{Given:} Graph $G = (V, E)$\\
-            \textbf{Find:} \textsc{Vertex Cover}, i.e. $V' \subseteq V$ such that every edge has at least one endpoint in $V'$.
-        }
-    }
-
-    \textbf{Integer Linear Program:}
-
-    For $v\in V$, let $x_v \in \{0, 1\}$.
-
-    Goal: minimize $\sum_{v\in V}x_v$.
-
-    Constraints: for every edge $uv \in E$, we require $x_u + x_v \geq 1$.
-\end{example}
-
-\printbibliography
-\end{document}
+\documentclass[english]{../spicker}
+
+\usepackage{amsmath}
+
+\usepackage{graphicx}
+\usepackage{tabularx, multirow}
+
+\usepackage[style=numeric, backend=bibtex]{biblatex}
+\addbibresource{or.bib}
+
+\title{Operations Research}
+\author{Patrick Gustav Blaneck}
+
+\begin{document}
+\maketitle
+\tableofcontents
+\newpage
+
+%\setcounter{section}{1}
+
+\section{Linear Programming}
+
+\begin{defi}{Linear Programming}
+    \emph{Linear Programming} is the problem of optimizing (maximizing or minimizing) a \emph{linear objective function} subject to a set of \emph{linear functional constraints}.
+
+    \textbf{Given:} $A \in \R^{m\times n}, b \in \R^m, c\in R^n$
+
+    \textbf{Find:} $x^* \in \R^n$ where $x^* = \arg\max\{c^Tx \mid Ax \leq b\}$
+\end{defi}
+
+\begin{bonus}{Linear Programming Solvers}
+    Software that solves linear programs - \emph{linear programming solvers} - also generate lots of important auxiliary information (as well as the optimum):
+    \begin{itemize}
+        \item sensitivity analysis
+        \item shadow prices
+        \item alternative optima
+        \item \ldots
+    \end{itemize}
+\end{bonus}
+
+\begin{theo}{Ellipsoid Method}
+    A LP of dimension $n$ can be solved in $\bigo(L^2 \cdot n^6)$ time \cite{khachiyan1979}, where $L =$ \# bits in the input.
+\end{theo}
+
+\begin{theo}{Interior Point Method}
+    A LP of dimension $n$ can be solved in a \emph{numerically stable} way in $\bigo(L^2 \cdot n^{3.5})$ time \cite{karmarkar1984}.
+\end{theo}
+
+\begin{defi}{Integer Linear Programs (ILP)}
+    \textbf{Given:} $A \in \R^{m\times n}, b \in \R^m, c\in R^n$
+
+    \textbf{Find:} $\underline{x^*\in\Z^n}$ where $x^* = \arg\max\{c^Tx \mid Ax \leq b\}$
+\end{defi}
+
+\begin{example}{Integer Linear Program for \textsc{Vertex Cover}}
+    \fbox{
+        \parbox{0.95\textwidth}{
+            \underline{\textsc{Vertex Cover}}
+
+
+            \textbf{Given:} Graph $G = (V, E)$\\
+            \textbf{Find:} \textsc{Vertex Cover}, i.e. $V' \subseteq V$ such that every edge has at least one endpoint in $V'$.
+        }
+    }
+
+    \textbf{Integer Linear Program:}
+
+    For $v\in V$, let $x_v \in \{0, 1\}$.
+
+    Goal: minimize $\sum_{v\in V}x_v$.
+
+    Constraints: for every edge $uv \in E$, we require $x_u + x_v \geq 1$.
+\end{example}
+
+\printbibliography
+\end{document}
diff --git a/spicker.cls b/spicker.cls
index f0328df5dd92bc7aee7b07b3722e55660bbace75..8c688015025f10f7bb8b07d1611cb2c9cd1d3edb 100644
--- a/spicker.cls
+++ b/spicker.cls
@@ -1,227 +1,227 @@
-% Additional warnings for deprecated things
-\RequirePackage[l2tabu, orthodox]{nag}
-
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{spicker}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Optional 'english' language option
-\newcommand{\InitSpickerLanguage}{\PassOptionsToPackage{english,ngerman}{babel}}
-\DeclareOption{english}{\renewcommand{\InitSpickerLanguage}{\PassOptionsToPackage{english}{babel}}}
-\ProcessOptions
-\InitSpickerLanguage
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Compact scrartcl format
-\LoadClass[a4paper,parskip=half-,DIV=15,fontsize=11pt]{scrartcl}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Enable post-90s text processing
-\usepackage[utf8]{inputenc}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Typesetting
-\usepackage{babel}
-\usepackage{microtype}
-\usepackage{parskip}
-\usepackage{microtype}
-\usepackage{csquotes}
-\usepackage{booktabs}
-\usepackage{listings}
-
-\usepackage{lmodern} % upgrade default font
-\usepackage[sc]{mathpazo} % pretty font for text
-
-\linespread{1.05} % more spacing
-\setkomafont{disposition}{\fontseries{sbc}\sffamily}
-
-\usepackage[shortlabels]{enumitem}
-\setlist{nosep}
-
-\makeatletter
-% Re-enable paragraph spacing in minipages;
-% we choose something smaller than what is used outside of minipages.
-\newcommand{\@minipagerestore}{\setlength{\parskip}{0.8\medskipamount}}
-\makeatother
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Utilities
-\usepackage{lipsum}
-
-\usepackage[svgnames]{xcolor}
-% https://s3.amazonaws.com/edwardtufte.com/colorblind_palette.png
-\definecolor{orange}{RGB}{230,159,0}
-\definecolor{skyblue}{RGB}{86,180,233}
-\definecolor{bluishgreen}{RGB}{0,158,115}
-\definecolor{vermillion}{RGB}{213,94,0}
-\definecolor{reddishpurple}{RGB}{204,121,167}
-\definecolor{matse}{RGB}{11,102,168}
-\definecolor{fhmint}{RGB}{0,177,172}
-\definecolor{fhblue}{RGB}{0,141,208}
-\definecolor{fhred}{RGB}{168,46,104}
-\definecolor{fhpurple}{RGB}{147,81,159}
-
-% Show most recent revision number and date in date field
-\makeatletter
-\date{\small \IfLanguageName{ngerman}{Letzte Änderung:}{Last Change:} \filename@parse{\jobname}\IfFileExists{\filename@base.last-change}{\input{\filename@base.last-change}}{\today}}
-\makeatother
-
-\subject{\normalfont{}\texttt{\href{https://matse.paddel.xyz/spicker}{https://matse.paddel.xyz/spicker}}}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Math & Symbols
-\usepackage{mathtools}
-\usepackage{amssymb}
-\usepackage{amsmath}
-\usepackage{amsthm}
-\usepackage{stmaryrd}
-\usepackage{braket}
-\usepackage{cool}
-\usepackage{siunitx}
-
-\DeclarePairedDelimiter\abs{\lvert}{\rvert}
-\DeclarePairedDelimiter\norm{\lVert}{\rVert}
-\DeclarePairedDelimiter\floor{\lfloor}{\rfloor}
-\DeclarePairedDelimiter\ceil{\lceil}{\rceil}
-
-\DeclareMathOperator{\Exists}{\exists}
-\DeclareMathOperator{\Forall}{\forall}
-\DeclareMathOperator*{\argmin}{argmin}
-\DeclareMathOperator*{\argmax}{argmax}
-
-\newcommand{\Nplus}{\mathbb{N}^+}
-\newcommand{\N}{\mathbb{N}}
-\newcommand{\Rnonneg}{\mathbb{R}^+_0}
-\newcommand{\R}{\mathbb{R}}
-\newcommand{\C}{\mathbb{C}}
-\newcommand{\Z}{\mathbb{Z}}
-\newcommand{\bigo}{\mathcal{O}}
-
-\newcommand{\Rnum}[1]{\uppercase\expandafter{\romannumeral #1\relax}}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Diagrams
-
-\usepackage{pgfplots}
-\usepgfplotslibrary{fillbetween}
-\pgfplotsset{compat=1.8}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Links and Metadata
-\usepackage[
-  colorlinks,
-  citecolor = fhmint,
-  linkcolor = matse,
-  urlcolor = matse
-]{hyperref}
-\usepackage{bookmark}
-
-\makeatletter
-\AtBeginDocument{
-  \hypersetup{
-    pdftitle = {\@title},
-    pdfauthor = {\@author}
-  }
-}
-\makeatother
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Environments
-\usepackage{todonotes}
-
-% Just like the 'center' block, but without spacing around it.
-\newenvironment{tightcenter}{%
-  \setlength\topsep{0pt}
-  \setlength\parskip{0pt}
-  \begin{center}
-}{%
-  \end{center}
-}
-
-\usepackage{tcolorbox}
-
-\usepackage{array}   % for \newcolumntype macro
-
-\newcolumntype{L}{>{$}l<{$}} % math-mode version of "l" column type
-\newcolumntype{R}{>{$}r<{$}} % math-mode version of "r" column type
-\newcolumntype{C}{>{$}c<{$}} % math-mode version of "c" column type
-\newcolumntype{P}{>{$}p<{$}} % math-mode version of "l" column type
-
-%%%%%%%%%%%%%%%%
-% Context Blocks
-
-\usepackage[]{imakeidx}
-
-\usepackage{iflang}
-\newcommand{\SpickerAlgorithm}{\IfLanguageName{ngerman}{Algorithmus}{Algorithm}}
-\newcommand{\SpickerCode}{\IfLanguageName{ngerman}{Code}{Code}}
-
-\tcbset{boxrule=0pt,toprule=1pt,parbox=false,on line}
-
-\newenvironment{algo}[1]{%
-\index{#1}%
-\setlist{nosep,leftmargin=*}%
-\begin{tcolorbox}[colback=fhblue!5!white, colframe=fhblue!75!black, title={\sffamily \SpickerAlgorithm: #1}]
-}{%
-\end{tcolorbox}}
-
-\newenvironment{code}[1]{%
-\index{#1}%
-\begin{tcolorbox}[colback=fhpurple!5!white, colframe=fhpurple!75!black, title={\sffamily \SpickerCode: #1}]
-}{%
-\end{tcolorbox}}
-
-\newenvironment{defi}[1]{%
-\index{#1}%
-\begin{tcolorbox}[colback=fhmint!5!white, colframe=fhmint!75!black, title={\sffamily Definition: #1}]
-}{%
-\end{tcolorbox}}
-
-\newenvironment{bonus}[1]{%
-\index{#1}%
-\begin{tcolorbox}[colback=fhred!5!white, colframe=fhred!75!black, title={\sffamily Bonus: #1}]
-}{%
-\end{tcolorbox}}
-
-\newenvironment{example}[1]{%
-\index[Beispiele]{#1}%
-\begin{tcolorbox}[colback=fhred!5!white, colframe=fhred!75!black, title={\sffamily \IfLanguageName{ngerman}{Beispiel}{Example}: #1}]
-}{%
-\end{tcolorbox}}
-    
-\newcommand{\exampleseparator}{\noindent\rule{\textwidth}{0.2pt}}
-
-%%%%%%%%%%%%%%
-% Split Blocks
-
-\newenvironment{halfboxl}{%
-\noindent
-\begin{minipage}[t]{0.4875\textwidth}
-%\vspace{0pt}
-%\vspace{\dimexpr\ht\strutbox-\topskip}
-}{%
-\end{minipage}\hspace{0.025\textwidth}}
-\newenvironment{halfboxr}{%
-\begin{minipage}[t]{0.4875\textwidth}
-\vspace{0pt}
-}{%
-\end{minipage}\bigbreak}
-
-\newenvironment{thirdboxl}{%
-\begin{minipage}[t]{0.3166\textwidth}
-}{%
-\end{minipage}\hspace{0.025\textwidth}}
-\newenvironment{thirdboxm}{%
-\begin{minipage}[t]{0.3166\textwidth}
-}{%
-\end{minipage}\hspace{0.025\textwidth}}
-\newenvironment{thirdboxr}{%
-\begin{minipage}[t]{0.3166\textwidth}
-}{%
-\end{minipage}\bigbreak}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Citations 
-
+% Additional warnings for deprecated things
+\RequirePackage[l2tabu, orthodox]{nag}
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{spicker}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Optional 'english' language option
+\newcommand{\InitSpickerLanguage}{\PassOptionsToPackage{english,ngerman}{babel}}
+\DeclareOption{english}{\renewcommand{\InitSpickerLanguage}{\PassOptionsToPackage{english}{babel}}}
+\ProcessOptions
+\InitSpickerLanguage
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Compact scrartcl format
+\LoadClass[a4paper,parskip=half-,DIV=15,fontsize=11pt]{scrartcl}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Enable post-90s text processing
+\usepackage[utf8]{inputenc}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Typesetting
+\usepackage{babel}
+\usepackage{microtype}
+\usepackage{parskip}
+\usepackage{microtype}
+\usepackage{csquotes}
+\usepackage{booktabs}
+\usepackage{listings}
+
+\usepackage{lmodern} % upgrade default font
+\usepackage[sc]{mathpazo} % pretty font for text
+
+\linespread{1.05} % more spacing
+\setkomafont{disposition}{\fontseries{sbc}\sffamily}
+
+\usepackage[shortlabels]{enumitem}
+\setlist{nosep}
+
+\makeatletter
+% Re-enable paragraph spacing in minipages;
+% we choose something smaller than what is used outside of minipages.
+\newcommand{\@minipagerestore}{\setlength{\parskip}{0.8\medskipamount}}
+\makeatother
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Utilities
+\usepackage{lipsum}
+
+\usepackage[svgnames]{xcolor}
+% https://s3.amazonaws.com/edwardtufte.com/colorblind_palette.png
+\definecolor{orange}{RGB}{230,159,0}
+\definecolor{skyblue}{RGB}{86,180,233}
+\definecolor{bluishgreen}{RGB}{0,158,115}
+\definecolor{vermillion}{RGB}{213,94,0}
+\definecolor{reddishpurple}{RGB}{204,121,167}
+\definecolor{matse}{RGB}{11,102,168}
+\definecolor{fhmint}{RGB}{0,177,172}
+\definecolor{fhblue}{RGB}{0,141,208}
+\definecolor{fhred}{RGB}{168,46,104}
+\definecolor{fhpurple}{RGB}{147,81,159}
+
+% Show most recent revision number and date in date field
+\makeatletter
+\date{\small \IfLanguageName{ngerman}{Letzte Änderung:}{Last Change:} \filename@parse{\jobname}\IfFileExists{\filename@base.last-change}{\input{\filename@base.last-change}}{\today}}
+\makeatother
+
+\subject{\normalfont{}\texttt{\href{https://matse.paddel.xyz/spicker}{https://matse.paddel.xyz/spicker}}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Math & Symbols
+\usepackage{mathtools}
+\usepackage{amssymb}
+\usepackage{amsmath}
+\usepackage{amsthm}
+\usepackage{stmaryrd}
+\usepackage{braket}
+\usepackage{cool}
+\usepackage{siunitx}
+
+\DeclarePairedDelimiter\abs{\lvert}{\rvert}
+\DeclarePairedDelimiter\norm{\lVert}{\rVert}
+\DeclarePairedDelimiter\floor{\lfloor}{\rfloor}
+\DeclarePairedDelimiter\ceil{\lceil}{\rceil}
+
+\DeclareMathOperator{\Exists}{\exists}
+\DeclareMathOperator{\Forall}{\forall}
+\DeclareMathOperator*{\argmin}{argmin}
+\DeclareMathOperator*{\argmax}{argmax}
+
+\newcommand{\Nplus}{\mathbb{N}^+}
+\newcommand{\N}{\mathbb{N}}
+\newcommand{\Rnonneg}{\mathbb{R}^+_0}
+\newcommand{\R}{\mathbb{R}}
+\newcommand{\C}{\mathbb{C}}
+\newcommand{\Z}{\mathbb{Z}}
+\newcommand{\bigo}{\mathcal{O}}
+
+\newcommand{\Rnum}[1]{\uppercase\expandafter{\romannumeral #1\relax}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Diagrams
+
+\usepackage{pgfplots}
+\usepgfplotslibrary{fillbetween}
+\pgfplotsset{compat=1.8}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Links and Metadata
+\usepackage[
+  colorlinks,
+  citecolor = fhmint,
+  linkcolor = matse,
+  urlcolor = matse
+]{hyperref}
+\usepackage{bookmark}
+
+\makeatletter
+\AtBeginDocument{
+  \hypersetup{
+    pdftitle = {\@title},
+    pdfauthor = {\@author}
+  }
+}
+\makeatother
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Environments
+\usepackage{todonotes}
+
+% Just like the 'center' block, but without spacing around it.
+\newenvironment{tightcenter}{%
+  \setlength\topsep{0pt}
+  \setlength\parskip{0pt}
+  \begin{center}
+}{%
+  \end{center}
+}
+
+\usepackage{tcolorbox}
+
+\usepackage{array}   % for \newcolumntype macro
+
+\newcolumntype{L}{>{$}l<{$}} % math-mode version of "l" column type
+\newcolumntype{R}{>{$}r<{$}} % math-mode version of "r" column type
+\newcolumntype{C}{>{$}c<{$}} % math-mode version of "c" column type
+\newcolumntype{P}{>{$}p<{$}} % math-mode version of "l" column type
+
+%%%%%%%%%%%%%%%%
+% Context Blocks
+
+\usepackage[]{imakeidx}
+
+\usepackage{iflang}
+\newcommand{\SpickerAlgorithm}{\IfLanguageName{ngerman}{Algorithmus}{Algorithm}}
+\newcommand{\SpickerCode}{\IfLanguageName{ngerman}{Code}{Code}}
+
+\tcbset{boxrule=0pt,toprule=1pt,parbox=false,on line}
+
+\newenvironment{algo}[1]{%
+\index{#1}%
+\setlist{nosep,leftmargin=*}%
+\begin{tcolorbox}[colback=fhblue!5!white, colframe=fhblue!75!black, title={\sffamily \SpickerAlgorithm: #1}]
+}{%
+\end{tcolorbox}}
+
+\newenvironment{code}[1]{%
+\index{#1}%
+\begin{tcolorbox}[colback=fhpurple!5!white, colframe=fhpurple!75!black, title={\sffamily \SpickerCode: #1}]
+}{%
+\end{tcolorbox}}
+
+\newenvironment{defi}[1]{%
+\index{#1}%
+\begin{tcolorbox}[colback=fhmint!5!white, colframe=fhmint!75!black, title={\sffamily Definition: #1}]
+}{%
+\end{tcolorbox}}
+
+\newenvironment{bonus}[1]{%
+\index{#1}%
+\begin{tcolorbox}[colback=fhred!5!white, colframe=fhred!75!black, title={\sffamily Bonus: #1}]
+}{%
+\end{tcolorbox}}
+
+\newenvironment{example}[1]{%
+\index[Beispiele]{#1}%
+\begin{tcolorbox}[colback=fhred!5!white, colframe=fhred!75!black, title={\sffamily \IfLanguageName{ngerman}{Beispiel}{Example}: #1}]
+}{%
+\end{tcolorbox}}
+    
+\newcommand{\exampleseparator}{\noindent\rule{\textwidth}{0.2pt}}
+
+%%%%%%%%%%%%%%
+% Split Blocks
+
+\newenvironment{halfboxl}{%
+\noindent
+\begin{minipage}[t]{0.4875\textwidth}
+%\vspace{0pt}
+%\vspace{\dimexpr\ht\strutbox-\topskip}
+}{%
+\end{minipage}\hspace{0.025\textwidth}}
+\newenvironment{halfboxr}{%
+\begin{minipage}[t]{0.4875\textwidth}
+\vspace{0pt}
+}{%
+\end{minipage}\bigbreak}
+
+\newenvironment{thirdboxl}{%
+\begin{minipage}[t]{0.3166\textwidth}
+}{%
+\end{minipage}\hspace{0.025\textwidth}}
+\newenvironment{thirdboxm}{%
+\begin{minipage}[t]{0.3166\textwidth}
+}{%
+\end{minipage}\hspace{0.025\textwidth}}
+\newenvironment{thirdboxr}{%
+\begin{minipage}[t]{0.3166\textwidth}
+}{%
+\end{minipage}\bigbreak}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Citations 
+
 \usepackage[style=numeric, backend=bibtex]{biblatex}
\ No newline at end of file
diff --git a/tgi/tgi.pdf b/tgi/tgi.pdf
index 101e200d0604c4c8eb6c89e693c002fd17912888..b2654187c06419126bcc4592ab2d81dfe53c71cd 100644
Binary files a/tgi/tgi.pdf and b/tgi/tgi.pdf differ
diff --git a/tgi/tgi.tex b/tgi/tgi.tex
index a45cf28c857434a56b0e5eacccdbe11bacd6d5c8..fca75f954451c7902d1e3faacc081523324bd35c 100644
--- a/tgi/tgi.tex
+++ b/tgi/tgi.tex
@@ -1,513 +1,513 @@
-\documentclass[german]{../spicker}
-
-\usepackage{amsmath}
-
-\usepackage{graphicx}
-\usepackage{tabularx, multirow}
-
-\usetikzlibrary{arrows.meta,chains,decorations.pathreplacing,scopes,shapes.misc}
-
-\addbibresource{algo.bib}
-
-\title{Theoretische Grundlagen der Informatik}
-\author{Patrick Gustav Blaneck}
-\makeindex[intoc]
-\makeindex[intoc, name=Beispiele,title=Beispiele]
-
-\newenvironment{allintypewriter}{\ttfamily}{\par}
-
- 
-\pgfmathsetmacro\twopi{2*pi}
-
-\pgfmathdeclarefunction{lngamma}{1}{%
-  \pgfmathsetmacro\lngammatmp{#1*#1*#1}%
-  \pgfmathparse{%
-    #1*ln(#1) - #1 - .5*ln(#1/\twopi)
-    + 1/12/#1 - 1/360/\lngammatmp + 1/1260/\lngammatmp/#1/#1
-  }%
-}  
-
-\pgfmathdeclarefunction{facreal}{1}{%
-  \pgfmathparse{exp(lngamma(#1+1))}% 
-}
-
-\begin{document}
-\maketitle
-\tableofcontents
-\newpage
-
-%\setcounter{section}{1}
-
-% ------------------------------------------------
-\section{Random Access Machine (RAM)}
-
-\begin{defi}{Algorithmus}
-  Ein \emph{Algorithmus} ist eine \textbf{Verarbeitungsvorschrift}, die angibt wie Eingabedaten schrittweise in Ausgabedaten umgewandelt werden.
-
-  Wichtig für einen Algorithmus sind insbesondere:
-  \begin{itemize}
-    \item \textbf{Korrektheit:} berechnet der Algorithmus das gewünschte?
-    \item \textbf{Termination:} terminiert der Algorithmus immer?
-    \item \textbf{Geschwindigkeit:} wie lange läuft der Algorithmus?
-    \item \textbf{Speicherverbrauch:} wie viel Speicher verbraucht der Algorithmus?
-  \end{itemize}
-\end{defi}
-
-\begin{defi}{Random Access Machine (RAM), informal}
-  Die \emph{Random Access Machine (RAM)} ist ein axiomatisch definiertes Rechnermodell.
-
-  Die RAM besteht aus:
-  \begin{itemize}
-    \item Programmspeicher (lesen)
-    \item Befehlszähler
-    \item Hauptspeicher (lesen und schreiben)
-          \begin{itemize}
-            \item Speicherzelle 0 als \emph{Akkumulator}
-            \item Speicherzellen nehmen ganze Zahlen auf
-            \item keine Größenbeschränkung
-          \end{itemize}
-    \item Ein- und Ausgabeband
-          \begin{itemize}
-            \item beliebig viele ganze Zahlen
-            \item Zugriff nicht wahlfrei
-          \end{itemize}
-  \end{itemize}
-
-  \begin{center}
-    \includegraphics[]{images/ram.pdf}
-  \end{center}
-\end{defi}
-
-\begin{defi}{Befehlssatz der RAM}
-  Zugriff auf die Bänder:
-  \begin{itemize}
-    \item \texttt{READ} $n$: \\
-          liest den Wert unter dem Lesekopf, schreibt ihn an Speicherstelle $n$ und bewegt den Lesekopf um eine Stelle nach rechts
-    \item \texttt{WRITE} $n$: \\
-          schreibt den Wert aus Speicherstelle $n$ an die Position des Schreibkopfes auf das Ausgabeband und bewegt den Schreibkopf um eine Stelle nach rechts
-  \end{itemize}
-
-  Akkumulator:
-  \begin{itemize}
-    \item \texttt{LOAD} $op_r$: \\
-          beschreibt einen \emph{Wert}
-          \subitem Arten von Operanden $op_r$:
-          \begin{itemize}
-            \item $z$: \emph{unmittelbarer} Operand ($z \in \Z$)
-            \item $[n]$: \emph{direkt adressierter} Operand ($\sigma(n)$ - Inhalt an Speicheradresse $n\in \N_0$)
-            \item $[*n]$: \emph{indirekt adressierter} Operand ($\sigma(\sigma(n))$ - Inhalt der Speicheradresse $\sigma(n)$)
-          \end{itemize}
-  \end{itemize}
-
-  \begin{itemize}
-    \item \texttt{STORE} $op_w$: \\
-          beschreibt eine \emph{Speicheradresse}
-          \subitem Arten von Operanden $op_w$:
-          \begin{itemize}
-            \item $n$: \emph{unmittelbarer} Operand ($n \in \N_0$)
-            \item $[n]$: \emph{direkt adressierter} Operand ($\sigma(n)$ - Inhalt an Speicheradresse $n\in \N_0$)
-          \end{itemize}
-  \end{itemize}
-
-  Arithmetik:
-  \begin{itemize}
-    \item \texttt{ADD} $op_r$: \\
-          addiert den Operanden $op_r$ zum Akkumulator
-    \item \texttt{SUB} $op_r$: \\
-          subtrahier den Operanden $op_r$ vom Akkumulator
-    \item \texttt{MUL} $op_r$: \\
-          multipliziert den Akkumulator mit dem Operanden $op_r$
-    \item \texttt{DIV} $op_r$: \\
-          dividiert den Akkumulator durchden Operanden $op_r$ (Ganzzahldivision)
-  \end{itemize}
-
-  Sprungbefehle:
-  \begin{itemize}
-    \item \texttt{GOTO} $p$: \\
-          die Ausführung wird in Zeile $p$ fortgeführt
-    \item \texttt{JZ} $p$ (Jump Zero): \\
-          falls der Akkumulator 0 enthält, wird die Ausführung in Zeile $p$ fortgeführt, ansonsten bei der folgenden Zeile
-    \item \texttt{JGTZ} $p$ (Jump Greater Than Zero): \\
-          falls der Akkumulator einen Wert größer als 0 enthält, wird die Ausführung in Zeile $p$ fortgeführt, ansonsten bei der folgenden Zeile
-    \item \texttt{HALT}: \\
-          RAM stoppt die Ausführung
-  \end{itemize}
-\end{defi}
-
-\begin{bonus}{Adressierungsarten der RAM}
-  Unmittelbar:
-  \begin{center}
-    \begin{tikzpicture}
-      [
-        %  -{Stealth[length = 2.5pt]},
-        start chain,
-        node distance = 0pt,
-        StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-      ]
-
-      \node [draw, minimum width=2em, minimum height=2em, outer sep=0pt] (ins) {\texttt{LOAD 2}};
-
-      { start chain = going right
-      \node [StackBlock,label=above:$0$, right=2cm of ins, fill=red!30] (0) {2};
-      \node [StackBlock,label=above:$1$] (1) {4};
-      \node [StackBlock,label=above:$2$] (2) {3};
-      \node [StackBlock,label=above:$3$] (3) {1};
-      \node [StackBlock,label=above:$4$] (4) {2};
-
-      \draw[->] (ins.east) [out=0, in=180] to (0.west);
-      }
-    \end{tikzpicture}
-
-  \end{center}
-  Direkt:
-  \begin{center}
-    \begin{tikzpicture}
-      [
-        %  -{Stealth[length = 2.5pt]},
-        start chain,
-        node distance = 0pt,
-        StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-      ]
-
-      \node [draw, minimum width=2em, minimum height=2em, outer sep=0pt] (ins) {\texttt{LOAD [2]}};
-
-      { start chain = going right
-      \node [StackBlock,label=above:$0$, right=2cm of ins, fill=red!30] (0) {3};
-      \node [StackBlock,label=above:$1$] (1) {4};
-      \node [StackBlock,label=above:$2$] (2) {3};
-      \node [StackBlock,label=above:$3$] (3) {1};
-      \node [StackBlock,label=above:$4$] (4) {2};
-
-      \draw[->,dashed] (ins.south) [out=-45, in=-135] to (2.south);
-      \draw[->] (2.south) [out=-90, in=-90] to (0.south);
-      }
-    \end{tikzpicture}
-
-  \end{center}
-  Indirekt:
-  \begin{center}
-    \begin{tikzpicture}
-      [
-        %  -{Stealth[length = 2.5pt]},
-        start chain,
-        node distance = 0pt,
-        StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
-      ]
-
-      \node [draw, minimum width=2em, minimum height=2em, outer sep=0pt] (ins) {\texttt{LOAD [*2]}};
-
-      { start chain = going right
-      \node [StackBlock,label=above:$0$, right=2cm of ins, fill=red!30] (0) {1};
-      \node [StackBlock,label=above:$1$] (1) {4};
-      \node [StackBlock,label=above:$2$] (2) {3};
-      \node [StackBlock,label=above:$3$] (3) {1};
-      \node [StackBlock,label=above:$4$] (4) {2};
-
-      \draw[->,dashed] (ins.south) [out=-45, in=-135] to (2.south);
-      \draw[->,dashed] (2.south) [out=-90, in=-90] to (3.south);
-      \draw[->] (3.south) [out=-90, in=-90] to (0.south);
-      }
-    \end{tikzpicture}
-  \end{center}
-\end{bonus}
-
-\begin{defi}{Speicher der RAM}
-  Ein \emph{Speicher} ist eine totale Funktion $\sigma : \N_0 \to \Z$, wobei Adresse $0$ \emph{Akkumulator} genannt wird.
-
-  Die Funktion $\sigma_0$ mit $\forall i \in \N_0 : \sigma_0(i) = 0$ nennen wir den \emph{initialen Speicher}.
-
-  Seien $n \in \N_0$ eine Speicheradresse und $c \in \Z$, dann ist $\sigma[n\to c] : \N_0 \to \Z$ definiert durch\footnote{Verbal: Der Speicheradresse $n$ wird der Wert $c$ zugeordnet. $\sigma(x)$ gibt dann den Wert an der Stelle $x$ zurück.}
-  $$
-    \boxed{
-      \sigma[n\to c](x) = \begin{cases}
-        c         & \text{falls} \ x=n \\
-        \sigma(x) & \text{sonst}
-      \end{cases}
-    }
-  $$
-
-  \textbf{Notation:}
-  Betrachte $\sigma[n_1\to c_1][n_2 \to c_2]\ldots [n_k\to c_k]$
-  \begin{itemize}
-    \item Wir schreiben stattdessen auch $\sigma[n_1\to c_1,n_2 \to c_2,\ldots ,n_k\to c_k]$.
-    \item Für ein $n_i$ notieren wir immer nur das letzte Paar $n_i \to c_j$, da dieses alle vorangegangenen überschreibt
-          (z.B. $\sigma[0\to 1, 1\to 3]$ statt $\sigma[1\to 7, 0\to 1, 1\to 3]$)
-  \end{itemize}
-\end{defi}
-
-\begin{defi}{Bänder der RAM}
-  Sei $N = \{1, \ldots, n\} \in \N$ eine endliche Menge, dann ist ein \emph{RAM-Band} eine Folge von $n$ ganzen Zahlen, die wir als Funktion $\alpha: N \to \Z$ modellieren.
-
-  Bandoperationen:
-  \begin{itemize}
-    \item $\operatorname{read}(\alpha): (N \to \Z) \to (N - \{n\} \to \Z) \times \Z$ ist definiert durch\footnote{Verbal: $\operatorname{read}(\alpha)$ entfernt die erste Position des Bandes ($\alpha'$ entspricht $\alpha$ \glqq um eins nach links verschoben\grqq) und gibt das erste Element des alten Bandes $\alpha(1)$ zurück}
-          $$
-            \boxed{
-              \operatorname{read}(\alpha) = (\alpha', \alpha(1))
-            }
-            \quad \text{mit} \quad \forall i \in \{1, \ldots, n-1\} : \alpha'(i) = \alpha(i+1)
-          $$
-    \item $\operatorname{write}(\alpha, v): (N \to \Z) \times \Z \to (N \cup \{n+1\} \to \Z)$ ist definiert durch
-          $$
-            \boxed{
-              \operatorname{write}(\alpha, v) = \alpha'
-            }
-            \quad \text{mit} \quad \forall i \in \{1, \ldots, n+1\} : \alpha'(i) = \begin{cases}
-              v         & \text{falls} \ i = n+1 \\
-              \alpha(i) & \text{sonst}
-            \end{cases}
-          $$
-  \end{itemize}
-
-  \textbf{Beachte:}
-  $\operatorname{read}$ entfernt das erste Element einer Folge, $\operatorname{write}$ hängt ein Element an das Ende einer Folge an.
-\end{defi}
-
-\begin{defi}{Random Access Machine (RAM), formal}
-  Eine \emph{Random Access Machine (RAM)} ist definiert durch eine endliche Folge von RAM-Befehlen $\mathcal{R}_{am} = (s_1, \ldots, s_n)$, wobei für jedes Sprungziel gilt, dass es im Bereich $\{1, \ldots, n\}$ liegt.
-\end{defi}
-
-\begin{defi}{Konfiguration der RAM}
-  Sei $\mathcal{R}_{am} = (s_1, \ldots, s_n)$ eine RAM.
-  Eine \emph{Konfiguration} von $\mathcal{R}_{am}$ ist ein Quadrupel $(\pi, \alpha, \beta, \sigma)$, bestehend aus:
-  \begin{itemize}
-    \item $\pi$, dem Programmzähler mit $\pi \in \{0, \ldots, n\}$
-    \item $\alpha$, dem Eingabeband,
-    \item $\beta$, dem Ausgabeband
-    \item $\sigma$, dem Speicher
-  \end{itemize}
-
-  Für ein beliebiges $\alpha$ bezeichnet $1, \alpha, (), \sigma_0)$ die \emph{Startkonfiguration} einer RAM.
-
-  Konfigurationen der Form $(0, (), \beta, \sigma)$ nennen wir \emph{Endkonfiguration} und mit $\operatorname{Conf}(\mathcal{R}_{am})$ bezeichnen wir die Menge aller Konfigurationen zu einer RAM $\mathcal{R}_{am}$.
-\end{defi}
-
-\begin{defi}{Operandenfunktion}
-  Sei $\gamma = (\pi, \alpha, \beta, \sigma)$ eine RAM-Konfiguration, dann ist die \emph{Operandenfunktion} $\operatorname{eval}$ definiert durch:
-  \begin{itemize}
-    \item $\operatorname{eval}(\gamma, z) = z$ für $z \in \Z$
-    \item $\operatorname{eval}(\gamma, [n]) = \sigma(n)$ für $n\in \N_0$
-    \item $\operatorname{eval}(\gamma, [*n]) = \sigma(\sigma(n))$ für $n \in \N_0$
-  \end{itemize}
-
-  Anstelle von $\operatorname{eval}(\gamma, \chi) = z$ schreiben wir auch\footnote{Verbal: Unter der Konfiguration $\gamma$ hat der Operand $\chi$ den Wert $z$.}
-  $$
-    \boxed{
-      \gamma \vdash \chi = z
-    }
-  $$
-\end{defi}
-
-\begin{defi}{Deduktionssystem}
-  Die Rechenregeln der RAM werden wir in Form eines \emph{Deduktionssystems} angeben.
-  Darin haben die Regeln die Form:
-  $$
-    \boxed{
-      \frac{\text{Prämisse}_1 \cdots \text{Prämisse}_n}{\gamma \vdash \gamma'} \quad (\operatorname{NAME})
-    }
-  $$
-
-  Die Regel mit Namen $\operatorname{NAME}$ beschreibt den
-  \begin{itemize}
-    \item den \emph{Konfigurationsübergang} von $\gamma$ nach $\gamma'$, der nur dann möglich ist, wenn
-    \item die Bedingungen aller Prämissen erfüllbar sind.
-  \end{itemize}
-
-  Das Deduktionssystem beschreibt somit eine Relation
-  $$
-    \vdash \ : \ \operatorname{Conf} (\mathcal{R}_{am}) \times \operatorname{Conf} (\mathcal{R}_{am})
-  $$
-  die wir \emph{Schrittrelation} nennen.
-\end{defi}
-
-\begin{example}{Schrittrelationen (Bandoperationen)}
-  $$
-    \frac{s_\pi = \operatorname{READ} \ n \quad \operatorname{read}(\alpha) = (\alpha', z)}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha', \beta, \sigma[n\to z])} \quad (\operatorname{READ})
-  $$
-
-  $$
-    \frac{s_\pi = \operatorname{WRITE} \ n \quad \sigma(n) = z}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \operatorname{write}(\beta, z), \sigma)} \quad (\operatorname{WRITE})
-  $$
-
-  $$
-    \frac{s_\pi = \operatorname{LOAD} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[0\to z])} \quad (\operatorname{LOAD})
-  $$
-
-  $$
-    \frac{s_\pi = \operatorname{STORE} \ op_w \quad (\pi, \alpha, \beta, \sigma) \vdash op_w = n \quad n\in \N}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[n\to \sigma(0)])} \quad (\operatorname{STORE})
-  $$
-\end{example}
-
-\begin{example}{Schrittrelationen (Arithmetik)}
-  $$
-    \frac{s_\pi = \operatorname{ADD} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z_b \quad (\pi, \alpha, \beta, \sigma) \vdash [0] = z_a}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[0\to z_a + z_b])} \quad (\operatorname{ADD})
-  $$
-
-  $$
-    \frac{s_\pi = \operatorname{SUB} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z_b \quad (\pi, \alpha, \beta, \sigma) \vdash [0] = z_a}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[0\to z_a - z_b])} \quad (\operatorname{SUB})
-  $$
-
-  $$
-    \frac{s_\pi = \operatorname{MUL} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z_b \quad (\pi, \alpha, \beta, \sigma) \vdash [0] = z_a}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[0\to z_a \cdot z_b])} \quad (\operatorname{MUL})
-  $$
-
-  $$
-    \frac{s_\pi = \operatorname{DIV} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z_b \quad z_b \neq 0 \quad (\pi, \alpha, \beta, \sigma) \vdash [0] = z_a}{(\pi, \alpha, \beta, \sigma) \vdash \left(\pi + 1, \alpha, \beta, \sigma[0\to \left\lfloor \frac{z_a}{z_b} \right\rfloor ]\right)} \quad (\operatorname{DIV})
-  $$
-\end{example}
-
-\begin{example}{Schrittrelationen (konditional)}
-  $$
-    \frac{s_\pi = \operatorname{GOTO} \ p}{(\pi, \alpha, \beta, \sigma) \vdash (p, \alpha, \beta, \sigma)} \quad (\operatorname{GOTO})
-  $$
-
-  $$
-    \frac{s_\pi = \operatorname{JZ_1} \ p \quad \sigma(0) = 0}{(\pi, \alpha, \beta, \sigma) \vdash (p, \alpha, \beta, \sigma)} \quad (\operatorname{JZ}_1)
-    \qquad
-    \frac{s_\pi = \operatorname{JZ_2} \ p \quad \sigma(0) \neq 0}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma)} \quad (\operatorname{JZ_2}_2)
-  $$
-
-  $$
-    \frac{s_\pi = \operatorname{JGTZ_1} \ p \quad \sigma(0) > 0}{(\pi, \alpha, \beta, \sigma) \vdash (p, \alpha, \beta, \sigma)} \quad (\operatorname{JGTZ}_1)
-    \qquad
-    \frac{s_\pi = \operatorname{JGTZ_2} \ p \quad \sigma(0) \leq 0}{(\pi, \alpha, \beta, \sigma) \vdash (p, \alpha, \beta, \sigma)} \quad (\operatorname{JGTZ}_2)
-  $$
-  $$
-    \frac{s_\pi = \operatorname{HALT}}{(\pi, \alpha, \beta, \sigma) \vdash (0, \alpha, \beta, \sigma)} \quad (\operatorname{HALT})
-  $$
-\end{example}
-
-\begin{defi}{Abschluss der Schrittrelation}
-  Sei $\mathcal{R}_{am} = (s_1, \ldots, s_n)$ eine RAM.
-  Wir definieren
-  $$
-    \overset{*}{\vdash} \ : \ \operatorname{Conf} (\mathcal{R}_{am}) \times \operatorname{Conf} (\mathcal{R}_{am})
-  $$
-  als reflexiven und transitiven \emph{Abschluss der Schrittrelation}:
-
-  $$
-    \boxed{
-      (\pi, \alpha, \beta, \sigma) \overset{*}{\vdash} (\pi_n, \alpha_n, \beta_n, \sigma_n)
-    }
-  $$
-  falls
-  $$
-    \exists (\pi_1, \alpha_1, \beta_1, \sigma_1), \ldots, (\pi_n, \alpha_n, \beta_n, \sigma_n) \in \operatorname{Conf} (\mathcal{R}_{am}) :
-  $$
-  $$
-    (\pi, \alpha, \beta, \sigma) \vdash (\pi_1, \alpha_1, \beta_1, \sigma_1) \vdash \ldots \vdash (\pi_n, \alpha_n, \beta_n, \sigma_n)
-  $$
-\end{defi}
-
-\begin{defi}{RAM-Berechenbarkeit}
-  Seien $\mathcal{R}_{am} = (s_1, \ldots, s_n)$ eine RAM und $f : \Z^k \to \Z^l$ eine Funktion.
-
-  $\mathcal{R}_{am}$ \emph{berechnet f}, genau dann, wenn
-  $$
-    \forall (z_1, \ldots, z_k) \in \Z^k : (1, (z_1, \ldots, z_k), (), \sigma_0) \overset{*}{\vdash} (0, (), f(z_1, \ldots, z_k), \sigma')
-  $$
-  für ein geeignetes $\sigma'$.
-
-  Eine Funktion heißt \emph{RAM-berechenbar}, wenn es eine RAM gibt, die sie berechnet.
-\end{defi}
-
-\begin{bonus}{Modulo-Operator}
-  Der \emph{Modulo-Operator} $\operatorname{mod} : \Z \times \Z \setminus \{0\} \to Z$ ist definiert durch
-  $$
-    a \operatorname{mod} b = a - \left\lfloor \frac{a}{b} \right\rfloor \cdot b
-  $$
-\end{bonus}
-
-\begin{bonus}{Kongruenz}
-  Sei $m \in \Z \setminus \{0\}$.
-  Zwei Zahlen $a, b \in \Z$ heißen \emph{kongruent modulo m}, genau dann, wenn
-  $$
-    a \operatorname{mod} m = b \operatorname{mod} m
-  $$
-  und wir schreiben
-  $$
-    a \equiv b \ (\operatorname{mod} m)
-  $$
-  Die Menge
-  $$
-    [a]_m = \{z \in \Z \mid z \equiv a \operatorname{mod} m\}
-  $$
-  nennen wir dann \emph{Kongruenzklasse} (auch Restklasse) von $a$ modulo $m$.
-\end{bonus}
-
-\begin{defi}{Schleifeninvariante}
-  Eine \emph{Schleifeninvariante} ist eine Aussage, die vor und nach einer Schleife und jedem Durchlauf der Schleife gilt.
-  Sie ist damit unabhängig von der Zahl ihrer derzeitigen Durchläufe.
-
-  Für die Korrektheit der Schleifeninvatiante muss gezeigt werden, dass
-  \begin{itemize}
-    \item die Invariante direkt vor Ausführung der Schleife und damit auch am Anfang des ersten Schleifendurchlaufs gilt (\emph{Initialisierung})
-    \item falls die Invariante am Anfang eines Schleifendurchlaufs erfüllt ist, sie dann auch am Ende erfüllt ist (\emph{Erhaltung}), und
-    \item sie direkt nach Beendigung der Schleife gilt (\emph{Terminierung}).
-  \end{itemize}
-\end{defi}
-
-\begin{defi}{Partielle Korrektheit}
-  Seien $P$ eine Vorbedingung und $Q$ eine Nachbedingung.
-  Ein Algorithmus heißt \emph{partiell korrekt}, wenn er für Eingaben, unter denen $P$ erfüllt ist, nur Ausgaben liefert, welche $Q$ erfüllen.
-
-\end{defi}
-
-\begin{defi}{Totale Korrektheit}
-  Seien $P$ eine Vorbedingung und $Q$ eine Nachbedingung.
-  Ein Algorithmus heißt \emph{total korrekt}, falls er partiell korrekt ist und auf jeder Eingabe, die $P$ erfüllt, terminiert.
-
-  Zum Nachweis der Termination wird die \emph{Schleifenvariante} genutzt, für die gilt:\footnote{analog zu Zählvariablen}
-  \begin{itemize}
-    \item Ausdruck über Programmvariablen
-    \item liefert Zahl aus $\N_0$
-    \item muss in jeder Iteration verringert werden
-  \end{itemize}
-\end{defi}
-
-\begin{defi}{Speicherplatzverbrauch}
-  Der \emph{Speicherplatzverbrauch} $M$ wird in Abhängigkeit zur Größe der Eingabe angegeben.
-
-  Einfacher Speicherplatzverbrauch:
-  \begin{itemize}
-    \item $M$ entspricht Anzahl der gespeicherten Zahlen
-    \item z.B. für $\operatorname{mod}$: $M(A, B) = 3$
-  \end{itemize}
-
-  Realistischerer Speicherplatzverbrauch:
-  \begin{itemize}
-    \item $M$ entspricht Anzahl der Bits der gespeicherten Zahlen
-    \item z.B. für $\operatorname{mod}$: $M(A, B) = 2 \cdot \lceil \log_2 A \rceil + \lceil \log_2 B \rceil$
-  \end{itemize}
-\end{defi}
-
-\begin{defi}{Laufzeit}
-  Laufzeit ist abhängig von Größe der Eingabe und entspricht der Anzahl der abgearbeiteten RAM-Kommandos.
-
-  Einfache Laufzeit:
-  \begin{itemize}
-    \item $M$ entspricht genau der Anzahl der abgearbeiteten RAM-Kommandos
-    \item z.B. für $\operatorname{mod}$: $T(A, B) = 4 + \underbrace{\left\lfloor \frac{A}{B} \right\rfloor \cdot 7}_{\text{Schleife}} + 3$
-  \end{itemize}
-
-  Realistischere Laufzeit:
-  \begin{itemize}
-    \item logarithmisches Kostenmaß für arithmetische Operationen
-    \item z.B. Aufwand für Subtraktion: Anzahl Bits des größeren Operanden
-    \item damit gilt für $\operatorname{mod}$: $T(A, B) = 4 + \left\lfloor \frac{A}{B} \right\rfloor \cdot 6 + \underbrace{T_{\texttt{SUB}}(A, B)}_{\text{Alle Subtraktionen}} + 3$
-          mit
-          $$
-            T_{\texttt{SUB}}(x, y) = \begin{cases}
-              0                                                                                                      & \text{falls} \ x < y \\
-              T_{\texttt{SUB}}(x-y, y) + \max (\left\lceil \log_2 x \right\rceil, \left\lceil \log_2 y \right\rceil) & \text{sonst}
-            \end{cases}
-          $$
-  \end{itemize}
-\end{defi}
-
-% ------------------------------------------------
-\printindex
-\printindex[Beispiele]
-
-\printbibliography
-\end{document}
+\documentclass[german]{../spicker}
+
+\usepackage{amsmath}
+
+\usepackage{graphicx}
+\usepackage{tabularx, multirow}
+
+\usetikzlibrary{arrows.meta,chains,decorations.pathreplacing,scopes,shapes.misc}
+
+\addbibresource{algo.bib}
+
+\title{Theoretische Grundlagen der Informatik}
+\author{Patrick Gustav Blaneck}
+\makeindex[intoc]
+\makeindex[intoc, name=Beispiele,title=Beispiele]
+
+\newenvironment{allintypewriter}{\ttfamily}{\par}
+
+ 
+\pgfmathsetmacro\twopi{2*pi}
+
+\pgfmathdeclarefunction{lngamma}{1}{%
+  \pgfmathsetmacro\lngammatmp{#1*#1*#1}%
+  \pgfmathparse{%
+    #1*ln(#1) - #1 - .5*ln(#1/\twopi)
+    + 1/12/#1 - 1/360/\lngammatmp + 1/1260/\lngammatmp/#1/#1
+  }%
+}  
+
+\pgfmathdeclarefunction{facreal}{1}{%
+  \pgfmathparse{exp(lngamma(#1+1))}% 
+}
+
+\begin{document}
+\maketitle
+\tableofcontents
+\newpage
+
+%\setcounter{section}{1}
+
+% ------------------------------------------------
+\section{Random Access Machine (RAM)}
+
+\begin{defi}{Algorithmus}
+  Ein \emph{Algorithmus} ist eine \textbf{Verarbeitungsvorschrift}, die angibt wie Eingabedaten schrittweise in Ausgabedaten umgewandelt werden.
+
+  Wichtig für einen Algorithmus sind insbesondere:
+  \begin{itemize}
+    \item \textbf{Korrektheit:} berechnet der Algorithmus das gewünschte?
+    \item \textbf{Termination:} terminiert der Algorithmus immer?
+    \item \textbf{Geschwindigkeit:} wie lange läuft der Algorithmus?
+    \item \textbf{Speicherverbrauch:} wie viel Speicher verbraucht der Algorithmus?
+  \end{itemize}
+\end{defi}
+
+\begin{defi}{Random Access Machine (RAM), informal}
+  Die \emph{Random Access Machine (RAM)} ist ein axiomatisch definiertes Rechnermodell.
+
+  Die RAM besteht aus:
+  \begin{itemize}
+    \item Programmspeicher (lesen)
+    \item Befehlszähler
+    \item Hauptspeicher (lesen und schreiben)
+          \begin{itemize}
+            \item Speicherzelle 0 als \emph{Akkumulator}
+            \item Speicherzellen nehmen ganze Zahlen auf
+            \item keine Größenbeschränkung
+          \end{itemize}
+    \item Ein- und Ausgabeband
+          \begin{itemize}
+            \item beliebig viele ganze Zahlen
+            \item Zugriff nicht wahlfrei
+          \end{itemize}
+  \end{itemize}
+
+  \begin{center}
+    \includegraphics[]{images/ram.pdf}
+  \end{center}
+\end{defi}
+
+\begin{defi}{Befehlssatz der RAM}
+  Zugriff auf die Bänder:
+  \begin{itemize}
+    \item \texttt{READ} $n$: \\
+          liest den Wert unter dem Lesekopf, schreibt ihn an Speicherstelle $n$ und bewegt den Lesekopf um eine Stelle nach rechts
+    \item \texttt{WRITE} $n$: \\
+          schreibt den Wert aus Speicherstelle $n$ an die Position des Schreibkopfes auf das Ausgabeband und bewegt den Schreibkopf um eine Stelle nach rechts
+  \end{itemize}
+
+  Akkumulator:
+  \begin{itemize}
+    \item \texttt{LOAD} $op_r$: \\
+          beschreibt einen \emph{Wert}
+          \subitem Arten von Operanden $op_r$:
+          \begin{itemize}
+            \item $z$: \emph{unmittelbarer} Operand ($z \in \Z$)
+            \item $[n]$: \emph{direkt adressierter} Operand ($\sigma(n)$ - Inhalt an Speicheradresse $n\in \N_0$)
+            \item $[*n]$: \emph{indirekt adressierter} Operand ($\sigma(\sigma(n))$ - Inhalt der Speicheradresse $\sigma(n)$)
+          \end{itemize}
+  \end{itemize}
+
+  \begin{itemize}
+    \item \texttt{STORE} $op_w$: \\
+          beschreibt eine \emph{Speicheradresse}
+          \subitem Arten von Operanden $op_w$:
+          \begin{itemize}
+            \item $n$: \emph{unmittelbarer} Operand ($n \in \N_0$)
+            \item $[n]$: \emph{direkt adressierter} Operand ($\sigma(n)$ - Inhalt an Speicheradresse $n\in \N_0$)
+          \end{itemize}
+  \end{itemize}
+
+  Arithmetik:
+  \begin{itemize}
+    \item \texttt{ADD} $op_r$: \\
+          addiert den Operanden $op_r$ zum Akkumulator
+    \item \texttt{SUB} $op_r$: \\
+          subtrahier den Operanden $op_r$ vom Akkumulator
+    \item \texttt{MUL} $op_r$: \\
+          multipliziert den Akkumulator mit dem Operanden $op_r$
+    \item \texttt{DIV} $op_r$: \\
+          dividiert den Akkumulator durchden Operanden $op_r$ (Ganzzahldivision)
+  \end{itemize}
+
+  Sprungbefehle:
+  \begin{itemize}
+    \item \texttt{GOTO} $p$: \\
+          die Ausführung wird in Zeile $p$ fortgeführt
+    \item \texttt{JZ} $p$ (Jump Zero): \\
+          falls der Akkumulator 0 enthält, wird die Ausführung in Zeile $p$ fortgeführt, ansonsten bei der folgenden Zeile
+    \item \texttt{JGTZ} $p$ (Jump Greater Than Zero): \\
+          falls der Akkumulator einen Wert größer als 0 enthält, wird die Ausführung in Zeile $p$ fortgeführt, ansonsten bei der folgenden Zeile
+    \item \texttt{HALT}: \\
+          RAM stoppt die Ausführung
+  \end{itemize}
+\end{defi}
+
+\begin{bonus}{Adressierungsarten der RAM}
+  Unmittelbar:
+  \begin{center}
+    \begin{tikzpicture}
+      [
+        %  -{Stealth[length = 2.5pt]},
+        start chain,
+        node distance = 0pt,
+        StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+      ]
+
+      \node [draw, minimum width=2em, minimum height=2em, outer sep=0pt] (ins) {\texttt{LOAD 2}};
+
+      { start chain = going right
+      \node [StackBlock,label=above:$0$, right=2cm of ins, fill=red!30] (0) {2};
+      \node [StackBlock,label=above:$1$] (1) {4};
+      \node [StackBlock,label=above:$2$] (2) {3};
+      \node [StackBlock,label=above:$3$] (3) {1};
+      \node [StackBlock,label=above:$4$] (4) {2};
+
+      \draw[->] (ins.east) [out=0, in=180] to (0.west);
+      }
+    \end{tikzpicture}
+
+  \end{center}
+  Direkt:
+  \begin{center}
+    \begin{tikzpicture}
+      [
+        %  -{Stealth[length = 2.5pt]},
+        start chain,
+        node distance = 0pt,
+        StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+      ]
+
+      \node [draw, minimum width=2em, minimum height=2em, outer sep=0pt] (ins) {\texttt{LOAD [2]}};
+
+      { start chain = going right
+      \node [StackBlock,label=above:$0$, right=2cm of ins, fill=red!30] (0) {3};
+      \node [StackBlock,label=above:$1$] (1) {4};
+      \node [StackBlock,label=above:$2$] (2) {3};
+      \node [StackBlock,label=above:$3$] (3) {1};
+      \node [StackBlock,label=above:$4$] (4) {2};
+
+      \draw[->,dashed] (ins.south) [out=-45, in=-135] to (2.south);
+      \draw[->] (2.south) [out=-90, in=-90] to (0.south);
+      }
+    \end{tikzpicture}
+
+  \end{center}
+  Indirekt:
+  \begin{center}
+    \begin{tikzpicture}
+      [
+        %  -{Stealth[length = 2.5pt]},
+        start chain,
+        node distance = 0pt,
+        StackBlock/.style={draw, minimum width=2em, minimum height=2em, outer sep=0pt, on chain},
+      ]
+
+      \node [draw, minimum width=2em, minimum height=2em, outer sep=0pt] (ins) {\texttt{LOAD [*2]}};
+
+      { start chain = going right
+      \node [StackBlock,label=above:$0$, right=2cm of ins, fill=red!30] (0) {1};
+      \node [StackBlock,label=above:$1$] (1) {4};
+      \node [StackBlock,label=above:$2$] (2) {3};
+      \node [StackBlock,label=above:$3$] (3) {1};
+      \node [StackBlock,label=above:$4$] (4) {2};
+
+      \draw[->,dashed] (ins.south) [out=-45, in=-135] to (2.south);
+      \draw[->,dashed] (2.south) [out=-90, in=-90] to (3.south);
+      \draw[->] (3.south) [out=-90, in=-90] to (0.south);
+      }
+    \end{tikzpicture}
+  \end{center}
+\end{bonus}
+
+\begin{defi}{Speicher der RAM}
+  Ein \emph{Speicher} ist eine totale Funktion $\sigma : \N_0 \to \Z$, wobei Adresse $0$ \emph{Akkumulator} genannt wird.
+
+  Die Funktion $\sigma_0$ mit $\forall i \in \N_0 : \sigma_0(i) = 0$ nennen wir den \emph{initialen Speicher}.
+
+  Seien $n \in \N_0$ eine Speicheradresse und $c \in \Z$, dann ist $\sigma[n\to c] : \N_0 \to \Z$ definiert durch\footnote{Verbal: Der Speicheradresse $n$ wird der Wert $c$ zugeordnet. $\sigma(x)$ gibt dann den Wert an der Stelle $x$ zurück.}
+  $$
+    \boxed{
+      \sigma[n\to c](x) = \begin{cases}
+        c         & \text{falls} \ x=n \\
+        \sigma(x) & \text{sonst}
+      \end{cases}
+    }
+  $$
+
+  \textbf{Notation:}
+  Betrachte $\sigma[n_1\to c_1][n_2 \to c_2]\ldots [n_k\to c_k]$
+  \begin{itemize}
+    \item Wir schreiben stattdessen auch $\sigma[n_1\to c_1,n_2 \to c_2,\ldots ,n_k\to c_k]$.
+    \item Für ein $n_i$ notieren wir immer nur das letzte Paar $n_i \to c_j$, da dieses alle vorangegangenen überschreibt
+          (z.B. $\sigma[0\to 1, 1\to 3]$ statt $\sigma[1\to 7, 0\to 1, 1\to 3]$)
+  \end{itemize}
+\end{defi}
+
+\begin{defi}{Bänder der RAM}
+  Sei $N = \{1, \ldots, n\} \in \N$ eine endliche Menge, dann ist ein \emph{RAM-Band} eine Folge von $n$ ganzen Zahlen, die wir als Funktion $\alpha: N \to \Z$ modellieren.
+
+  Bandoperationen:
+  \begin{itemize}
+    \item $\operatorname{read}(\alpha): (N \to \Z) \to (N - \{n\} \to \Z) \times \Z$ ist definiert durch\footnote{Verbal: $\operatorname{read}(\alpha)$ entfernt die erste Position des Bandes ($\alpha'$ entspricht $\alpha$ \glqq um eins nach links verschoben\grqq) und gibt das erste Element des alten Bandes $\alpha(1)$ zurück}
+          $$
+            \boxed{
+              \operatorname{read}(\alpha) = (\alpha', \alpha(1))
+            }
+            \quad \text{mit} \quad \forall i \in \{1, \ldots, n-1\} : \alpha'(i) = \alpha(i+1)
+          $$
+    \item $\operatorname{write}(\alpha, v): (N \to \Z) \times \Z \to (N \cup \{n+1\} \to \Z)$ ist definiert durch
+          $$
+            \boxed{
+              \operatorname{write}(\alpha, v) = \alpha'
+            }
+            \quad \text{mit} \quad \forall i \in \{1, \ldots, n+1\} : \alpha'(i) = \begin{cases}
+              v         & \text{falls} \ i = n+1 \\
+              \alpha(i) & \text{sonst}
+            \end{cases}
+          $$
+  \end{itemize}
+
+  \textbf{Beachte:}
+  $\operatorname{read}$ entfernt das erste Element einer Folge, $\operatorname{write}$ hängt ein Element an das Ende einer Folge an.
+\end{defi}
+
+\begin{defi}{Random Access Machine (RAM), formal}
+  Eine \emph{Random Access Machine (RAM)} ist definiert durch eine endliche Folge von RAM-Befehlen $\mathcal{R}_{am} = (s_1, \ldots, s_n)$, wobei für jedes Sprungziel gilt, dass es im Bereich $\{1, \ldots, n\}$ liegt.
+\end{defi}
+
+\begin{defi}{Konfiguration der RAM}
+  Sei $\mathcal{R}_{am} = (s_1, \ldots, s_n)$ eine RAM.
+  Eine \emph{Konfiguration} von $\mathcal{R}_{am}$ ist ein Quadrupel $(\pi, \alpha, \beta, \sigma)$, bestehend aus:
+  \begin{itemize}
+    \item $\pi$, dem Programmzähler mit $\pi \in \{0, \ldots, n\}$
+    \item $\alpha$, dem Eingabeband,
+    \item $\beta$, dem Ausgabeband
+    \item $\sigma$, dem Speicher
+  \end{itemize}
+
+  Für ein beliebiges $\alpha$ bezeichnet $1, \alpha, (), \sigma_0)$ die \emph{Startkonfiguration} einer RAM.
+
+  Konfigurationen der Form $(0, (), \beta, \sigma)$ nennen wir \emph{Endkonfiguration} und mit $\operatorname{Conf}(\mathcal{R}_{am})$ bezeichnen wir die Menge aller Konfigurationen zu einer RAM $\mathcal{R}_{am}$.
+\end{defi}
+
+\begin{defi}{Operandenfunktion}
+  Sei $\gamma = (\pi, \alpha, \beta, \sigma)$ eine RAM-Konfiguration, dann ist die \emph{Operandenfunktion} $\operatorname{eval}$ definiert durch:
+  \begin{itemize}
+    \item $\operatorname{eval}(\gamma, z) = z$ für $z \in \Z$
+    \item $\operatorname{eval}(\gamma, [n]) = \sigma(n)$ für $n\in \N_0$
+    \item $\operatorname{eval}(\gamma, [*n]) = \sigma(\sigma(n))$ für $n \in \N_0$
+  \end{itemize}
+
+  Anstelle von $\operatorname{eval}(\gamma, \chi) = z$ schreiben wir auch\footnote{Verbal: Unter der Konfiguration $\gamma$ hat der Operand $\chi$ den Wert $z$.}
+  $$
+    \boxed{
+      \gamma \vdash \chi = z
+    }
+  $$
+\end{defi}
+
+\begin{defi}{Deduktionssystem}
+  Die Rechenregeln der RAM werden wir in Form eines \emph{Deduktionssystems} angeben.
+  Darin haben die Regeln die Form:
+  $$
+    \boxed{
+      \frac{\text{Prämisse}_1 \cdots \text{Prämisse}_n}{\gamma \vdash \gamma'} \quad (\operatorname{NAME})
+    }
+  $$
+
+  Die Regel mit Namen $\operatorname{NAME}$ beschreibt den
+  \begin{itemize}
+    \item den \emph{Konfigurationsübergang} von $\gamma$ nach $\gamma'$, der nur dann möglich ist, wenn
+    \item die Bedingungen aller Prämissen erfüllbar sind.
+  \end{itemize}
+
+  Das Deduktionssystem beschreibt somit eine Relation
+  $$
+    \vdash \ : \ \operatorname{Conf} (\mathcal{R}_{am}) \times \operatorname{Conf} (\mathcal{R}_{am})
+  $$
+  die wir \emph{Schrittrelation} nennen.
+\end{defi}
+
+\begin{example}{Schrittrelationen (Bandoperationen)}
+  $$
+    \frac{s_\pi = \operatorname{READ} \ n \quad \operatorname{read}(\alpha) = (\alpha', z)}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha', \beta, \sigma[n\to z])} \quad (\operatorname{READ})
+  $$
+
+  $$
+    \frac{s_\pi = \operatorname{WRITE} \ n \quad \sigma(n) = z}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \operatorname{write}(\beta, z), \sigma)} \quad (\operatorname{WRITE})
+  $$
+
+  $$
+    \frac{s_\pi = \operatorname{LOAD} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[0\to z])} \quad (\operatorname{LOAD})
+  $$
+
+  $$
+    \frac{s_\pi = \operatorname{STORE} \ op_w \quad (\pi, \alpha, \beta, \sigma) \vdash op_w = n \quad n\in \N}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[n\to \sigma(0)])} \quad (\operatorname{STORE})
+  $$
+\end{example}
+
+\begin{example}{Schrittrelationen (Arithmetik)}
+  $$
+    \frac{s_\pi = \operatorname{ADD} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z_b \quad (\pi, \alpha, \beta, \sigma) \vdash [0] = z_a}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[0\to z_a + z_b])} \quad (\operatorname{ADD})
+  $$
+
+  $$
+    \frac{s_\pi = \operatorname{SUB} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z_b \quad (\pi, \alpha, \beta, \sigma) \vdash [0] = z_a}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[0\to z_a - z_b])} \quad (\operatorname{SUB})
+  $$
+
+  $$
+    \frac{s_\pi = \operatorname{MUL} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z_b \quad (\pi, \alpha, \beta, \sigma) \vdash [0] = z_a}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma[0\to z_a \cdot z_b])} \quad (\operatorname{MUL})
+  $$
+
+  $$
+    \frac{s_\pi = \operatorname{DIV} \ op_r \quad (\pi, \alpha, \beta, \sigma) \vdash op_r = z_b \quad z_b \neq 0 \quad (\pi, \alpha, \beta, \sigma) \vdash [0] = z_a}{(\pi, \alpha, \beta, \sigma) \vdash \left(\pi + 1, \alpha, \beta, \sigma[0\to \left\lfloor \frac{z_a}{z_b} \right\rfloor ]\right)} \quad (\operatorname{DIV})
+  $$
+\end{example}
+
+\begin{example}{Schrittrelationen (konditional)}
+  $$
+    \frac{s_\pi = \operatorname{GOTO} \ p}{(\pi, \alpha, \beta, \sigma) \vdash (p, \alpha, \beta, \sigma)} \quad (\operatorname{GOTO})
+  $$
+
+  $$
+    \frac{s_\pi = \operatorname{JZ_1} \ p \quad \sigma(0) = 0}{(\pi, \alpha, \beta, \sigma) \vdash (p, \alpha, \beta, \sigma)} \quad (\operatorname{JZ}_1)
+    \qquad
+    \frac{s_\pi = \operatorname{JZ_2} \ p \quad \sigma(0) \neq 0}{(\pi, \alpha, \beta, \sigma) \vdash (\pi + 1, \alpha, \beta, \sigma)} \quad (\operatorname{JZ_2}_2)
+  $$
+
+  $$
+    \frac{s_\pi = \operatorname{JGTZ_1} \ p \quad \sigma(0) > 0}{(\pi, \alpha, \beta, \sigma) \vdash (p, \alpha, \beta, \sigma)} \quad (\operatorname{JGTZ}_1)
+    \qquad
+    \frac{s_\pi = \operatorname{JGTZ_2} \ p \quad \sigma(0) \leq 0}{(\pi, \alpha, \beta, \sigma) \vdash (p, \alpha, \beta, \sigma)} \quad (\operatorname{JGTZ}_2)
+  $$
+  $$
+    \frac{s_\pi = \operatorname{HALT}}{(\pi, \alpha, \beta, \sigma) \vdash (0, \alpha, \beta, \sigma)} \quad (\operatorname{HALT})
+  $$
+\end{example}
+
+\begin{defi}{Abschluss der Schrittrelation}
+  Sei $\mathcal{R}_{am} = (s_1, \ldots, s_n)$ eine RAM.
+  Wir definieren
+  $$
+    \overset{*}{\vdash} \ : \ \operatorname{Conf} (\mathcal{R}_{am}) \times \operatorname{Conf} (\mathcal{R}_{am})
+  $$
+  als reflexiven und transitiven \emph{Abschluss der Schrittrelation}:
+
+  $$
+    \boxed{
+      (\pi, \alpha, \beta, \sigma) \overset{*}{\vdash} (\pi_n, \alpha_n, \beta_n, \sigma_n)
+    }
+  $$
+  falls
+  $$
+    \exists (\pi_1, \alpha_1, \beta_1, \sigma_1), \ldots, (\pi_n, \alpha_n, \beta_n, \sigma_n) \in \operatorname{Conf} (\mathcal{R}_{am}) :
+  $$
+  $$
+    (\pi, \alpha, \beta, \sigma) \vdash (\pi_1, \alpha_1, \beta_1, \sigma_1) \vdash \ldots \vdash (\pi_n, \alpha_n, \beta_n, \sigma_n)
+  $$
+\end{defi}
+
+\begin{defi}{RAM-Berechenbarkeit}
+  Seien $\mathcal{R}_{am} = (s_1, \ldots, s_n)$ eine RAM und $f : \Z^k \to \Z^l$ eine Funktion.
+
+  $\mathcal{R}_{am}$ \emph{berechnet f}, genau dann, wenn
+  $$
+    \forall (z_1, \ldots, z_k) \in \Z^k : (1, (z_1, \ldots, z_k), (), \sigma_0) \overset{*}{\vdash} (0, (), f(z_1, \ldots, z_k), \sigma')
+  $$
+  für ein geeignetes $\sigma'$.
+
+  Eine Funktion heißt \emph{RAM-berechenbar}, wenn es eine RAM gibt, die sie berechnet.
+\end{defi}
+
+\begin{bonus}{Modulo-Operator}
+  Der \emph{Modulo-Operator} $\operatorname{mod} : \Z \times \Z \setminus \{0\} \to Z$ ist definiert durch
+  $$
+    a \operatorname{mod} b = a - \left\lfloor \frac{a}{b} \right\rfloor \cdot b
+  $$
+\end{bonus}
+
+\begin{bonus}{Kongruenz}
+  Sei $m \in \Z \setminus \{0\}$.
+  Zwei Zahlen $a, b \in \Z$ heißen \emph{kongruent modulo m}, genau dann, wenn
+  $$
+    a \operatorname{mod} m = b \operatorname{mod} m
+  $$
+  und wir schreiben
+  $$
+    a \equiv b \ (\operatorname{mod} m)
+  $$
+  Die Menge
+  $$
+    [a]_m = \{z \in \Z \mid z \equiv a \operatorname{mod} m\}
+  $$
+  nennen wir dann \emph{Kongruenzklasse} (auch Restklasse) von $a$ modulo $m$.
+\end{bonus}
+
+\begin{defi}{Schleifeninvariante}
+  Eine \emph{Schleifeninvariante} ist eine Aussage, die vor und nach einer Schleife und jedem Durchlauf der Schleife gilt.
+  Sie ist damit unabhängig von der Zahl ihrer derzeitigen Durchläufe.
+
+  Für die Korrektheit der Schleifeninvatiante muss gezeigt werden, dass
+  \begin{itemize}
+    \item die Invariante direkt vor Ausführung der Schleife und damit auch am Anfang des ersten Schleifendurchlaufs gilt (\emph{Initialisierung})
+    \item falls die Invariante am Anfang eines Schleifendurchlaufs erfüllt ist, sie dann auch am Ende erfüllt ist (\emph{Erhaltung}), und
+    \item sie direkt nach Beendigung der Schleife gilt (\emph{Terminierung}).
+  \end{itemize}
+\end{defi}
+
+\begin{defi}{Partielle Korrektheit}
+  Seien $P$ eine Vorbedingung und $Q$ eine Nachbedingung.
+  Ein Algorithmus heißt \emph{partiell korrekt}, wenn er für Eingaben, unter denen $P$ erfüllt ist, nur Ausgaben liefert, welche $Q$ erfüllen.
+
+\end{defi}
+
+\begin{defi}{Totale Korrektheit}
+  Seien $P$ eine Vorbedingung und $Q$ eine Nachbedingung.
+  Ein Algorithmus heißt \emph{total korrekt}, falls er partiell korrekt ist und auf jeder Eingabe, die $P$ erfüllt, terminiert.
+
+  Zum Nachweis der Termination wird die \emph{Schleifenvariante} genutzt, für die gilt:\footnote{analog zu Zählvariablen}
+  \begin{itemize}
+    \item Ausdruck über Programmvariablen
+    \item liefert Zahl aus $\N_0$
+    \item muss in jeder Iteration verringert werden
+  \end{itemize}
+\end{defi}
+
+\begin{defi}{Speicherplatzverbrauch}
+  Der \emph{Speicherplatzverbrauch} $M$ wird in Abhängigkeit zur Größe der Eingabe angegeben.
+
+  Einfacher Speicherplatzverbrauch:
+  \begin{itemize}
+    \item $M$ entspricht Anzahl der gespeicherten Zahlen
+    \item z.B. für $\operatorname{mod}$: $M(A, B) = 3$
+  \end{itemize}
+
+  Realistischerer Speicherplatzverbrauch:
+  \begin{itemize}
+    \item $M$ entspricht Anzahl der Bits der gespeicherten Zahlen
+    \item z.B. für $\operatorname{mod}$: $M(A, B) = 2 \cdot \lceil \log_2 A \rceil + \lceil \log_2 B \rceil$
+  \end{itemize}
+\end{defi}
+
+\begin{defi}{Laufzeit}
+  Laufzeit ist abhängig von Größe der Eingabe und entspricht der Anzahl der abgearbeiteten RAM-Kommandos.
+
+  Einfache Laufzeit:
+  \begin{itemize}
+    \item $M$ entspricht genau der Anzahl der abgearbeiteten RAM-Kommandos
+    \item z.B. für $\operatorname{mod}$: $T(A, B) = 4 + \underbrace{\left\lfloor \frac{A}{B} \right\rfloor \cdot 7}_{\text{Schleife}} + 3$
+  \end{itemize}
+
+  Realistischere Laufzeit:
+  \begin{itemize}
+    \item logarithmisches Kostenmaß für arithmetische Operationen
+    \item z.B. Aufwand für Subtraktion: Anzahl Bits des größeren Operanden
+    \item damit gilt für $\operatorname{mod}$: $T(A, B) = 4 + \left\lfloor \frac{A}{B} \right\rfloor \cdot 6 + \underbrace{T_{\texttt{SUB}}(A, B)}_{\text{Alle Subtraktionen}} + 3$
+          mit
+          $$
+            T_{\texttt{SUB}}(x, y) = \begin{cases}
+              0                                                                                                      & \text{falls} \ x < y \\
+              T_{\texttt{SUB}}(x-y, y) + \max (\left\lceil \log_2 x \right\rceil, \left\lceil \log_2 y \right\rceil) & \text{sonst}
+            \end{cases}
+          $$
+  \end{itemize}
+\end{defi}
+
+% ------------------------------------------------
+\printindex
+\printindex[Beispiele]
+
+\printbibliography
+\end{document}