diff --git a/20250325/ad-20250325.pdf b/20250325/ad-20250325.pdf index d37739f924159f162e2d9cee95ad77efea235f25..b81aeffb51223390573d8513179212546e0613c2 100644 Binary files a/20250325/ad-20250325.pdf and b/20250325/ad-20250325.pdf differ diff --git a/20250325/ad-20250325.tex b/20250325/ad-20250325.tex index baa83f7f5f7db22c2e8ea95077b719f061bb35a2..8b7a9e4c3f1cd40198ae164358a324e64eb10475 100644 --- a/20250325/ad-20250325.tex +++ b/20250325/ad-20250325.tex @@ -761,6 +761,8 @@ \end{frame} +\iffalse + \begin{frame} \showsection @@ -790,8 +792,6 @@ \end{frame} -\iffalse - \nosectionnonumber{\inserttitle} \begin{frame} diff --git a/20250401/Zeichen_123.pdf b/20250401/Zeichen_123.pdf new file mode 120000 index 0000000000000000000000000000000000000000..fdbc897227df059cfda790a16555e6e417682116 --- /dev/null +++ b/20250401/Zeichen_123.pdf @@ -0,0 +1 @@ +../common/Zeichen_123.pdf \ No newline at end of file diff --git a/20250401/ad-20250401.pdf b/20250401/ad-20250401.pdf new file mode 100644 index 0000000000000000000000000000000000000000..abfab80592754c022e0842e7b3eea0691be51dbe Binary files /dev/null and b/20250401/ad-20250401.pdf differ diff --git a/20250401/ad-20250401.tex b/20250401/ad-20250401.tex new file mode 100644 index 0000000000000000000000000000000000000000..9de9087a015cd443bb90eae54ddd682d2a874b32 --- /dev/null +++ b/20250401/ad-20250401.tex @@ -0,0 +1,1128 @@ +% ad-20250401.pdf - Lecture Slides on Algorithms and Data Structures in C/C++ +% Copyright (C) 2018-2024, 2025 Peter Gerwinski +% +% This document is free software: you can redistribute it and/or +% modify it either under the terms of the Creative Commons +% Attribution-ShareAlike 3.0 License, or under the terms of the +% GNU General Public License as published by the Free Software +% Foundation, either version 3 of the License, or (at your option) +% any later version. +% +% This document is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this document. If not, see <http://www.gnu.org/licenses/>. +% +% You should have received a copy of the Creative Commons +% Attribution-ShareAlike 3.0 Unported License along with this +% document. If not, see <http://creativecommons.org/licenses/>. + +% README: Einführung in die Kryptographie + +\documentclass[10pt,t]{beamer} + +\usepackage{pgslides} +\usepackage{tikz} +%\usepackage{rotating} + +\newcommand{\underconstruction}{% + \begin{picture}(0,0) + \color{black} + \put(6,-2.2){\makebox(0,0)[b]{\includegraphics[width=1.5cm]{Zeichen_123.pdf}}} + \put(6,-2.5){\makebox(0,0)[t]{\shortstack{Änderungen\\vorbehalten}}} + \end{picture}} + +\title{Algorithmen und Datenstrukturen in C/C++} +\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} +\date{1.\ April 2025} + +\begin{document} + +\maketitleframe + +\sectionnonumber{Zu dieser Lehrveranstaltung} + +\begin{frame} + + \showsectionnonumber + + \begin{itemize} + \item + Bitte nach Möglichkeit \textbf{eigenen Computer} (Notebook) mitbringen. + \item + \textbf{Lehrmaterialien:} \url{https://gitlab.cvh-server.de/pgerwinski/ad}\\ + Links auf die Datei klicken, nicht mittig auf den Kommentar. +% \item +% \textbf{Praktikum:} 3 Termine (nach Vereinbarung),\\ +% eine Gruppe Dienstag, 10:30--14:15 Uhr,\\ +% weitere Gruppen Mittwoch, 14:15--18:00 Uhr + \item +% \textbf{Prüfungsform: Klausur} + \textbf{Prüfungsform: Hausarbeit mit Kolloquium} + \end{itemize} + \bigskip + \textbf{Online-Teilnahme:} + \begin{itemize} + \item + \textbf{Mumble}: Seminarraum 2\\ + Fragen: Mikrofon einschalten oder über den Chat\\ + Umfragen: über den Chat + \item + \textbf{VNC}: Kanal 6, Passwort: \lstinline[style=cmd]{testcvh}\\ + Eigenen Bildschirm freigeben: per VNC-Server oder Web-Interface\\ + Kamerabild übertragen: Link zu Web-Interface auf Anfrage + \item + Allgemeine Informationen: + \url{https://www.cvh-server.de/online-werkzeuge/} + \item + Notfall-Schnellzugang: \url{https://www.cvh-server.de/virtuelle-raeume/}\\ + Seminarraum 2, VNC-Passwort: \lstinline[style=cmd]{testcvh} +% \item +% Bei Problemen: bitte notieren:\\ +% Art des Problems, genaue Uhrzeit, JavaScript-Fehlermeldungen (F12) + \end{itemize} + +\end{frame} + +\nosectionnonumber{Hardwarenahe Programmierung} + +%\begin{frame} +% +% \shownosectionnonumber +% +% \begin{itemize} +% \item[\textbf{1}] \textbf{Einführung} +% \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} +% \item[\textbf{2}] \textbf{Einführung in C} +% \item[\textbf{3}] \textbf{Bibliotheken} +% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} +% \item[\textbf{5}] \textbf{\color{black}Algorithmen} +% \begin{itemize} +% \color{medgreen} +% \item[5.1] Differentialgleichungen +% \item[5.2] Rekursion +% \item[5.3] Aufwandsabschätzungen +% \end{itemize} +% \item[\textbf{6}] \textbf{Objektorientierte Programmierung} +% \item[\textbf{7}] \textbf{\color{black}Datenstrukturen} +% \begin{itemize} +% \color{medgreen} +% \item[7.1] Stack und FIFO +% \item[7.2] Verkettete Listen +% \item[7.3] Bäume +% \end{itemize} +% \end{itemize} +% \vspace*{-1cm} +% +%\end{frame} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \color{gray} + \item[\textbf{1}] \textbf{Einführung} + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} + \item[\textbf{2}] \textbf{Einführung in C} + \item[\textbf{3}] \textbf{Bibliotheken} + \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} + \item[\textbf{5}] \textbf{\color{black}Algorithmen} + \begin{itemize} + \color{medgreen} + \item[5.1] Differentialgleichungen + \item[5.2] Rekursion + \item[5.3] Aufwandsabschätzungen + \end{itemize} + \item[\textbf{6}] \textbf{Objektorientierte Programmierung} + \item[\textbf{7}] \textbf{\color{black}Datenstrukturen} + \begin{itemize} + \color{medgreen} + \item[7.1] Stack und FIFO + \item[7.2] Verkettete Listen + \item[7.3] Bäume + \end{itemize} + \end{itemize} + \vspace*{-1cm} + +\end{frame} + +\nosectionnonumber{Algorithmen} + +\begin{frame} + + \shownosectionnonumber + + {\color{medgreen}\textbf{Differentialgleichungen}} + \begin{itemize} + \item Pendel + \item Planetenbahnen + \end{itemize} + + {\color{medgreen}\textbf{Rekursion}} + \begin{itemize} + \item Türme von Hanoi + \end{itemize} + + \smallskip + + \textarrow\ \emph{Wie rechnet man das überhaupt aus?} + + \bigskip + + {\color{medgreen}\textbf{Aufwandsabschätzungen}} + \begin{itemize} + \item Selectionsort + \item Bubblesort + \item Quicksort + \end{itemize} + + \smallskip + + \textarrow\ \emph{Wie rechnet man das möglichst effizient aus?} + \begin{itemize} + \item[\textbf{?}] möglichst schnell + \item[\textbf{?}] mit möglichst wenig Speicherplatzverbrauch + \item[\textbf{?}] unter Berücksichtigung gegebener Randbedingungen + \end{itemize} + +\end{frame} + +\nosectionnonumber{Datenstrukturen} + +\begin{frame} + + \shownosectionnonumber + + \addvspace{-3pt} + + \begin{visibleenv}<1-> + \textbf{Structs und Objekte} + \begin{itemize} + \item zusammengehörige Daten gemeinsam speichern + \end{itemize} + \end{visibleenv} + + {\color{medgreen}\textbf{Stack und FIFO}}\only<1->{\textbf{ -- Arrays}} + \begin{itemize} + \item effizientes Anfügen und Entfernen vorne und hinten + \item effizienter direkter Zugriff auf Elemente in der Mitte + \item ineffizientes Einfügen und Entfernen in der Mitte + \end{itemize} + + {\color{medgreen}\textbf{Verkettete Listen}}\only<1->{\textbf{ -- Structs mit Pointern}} + \begin{itemize} + \item effizientes Einfügen und Entfernen in der Mitte + \item ineffizienter direkter Zugriff auf Elemente in der Mitte + \end{itemize} + + {\color{medgreen}\textbf{Bäume}}\only<1->{\textbf{ -- Structs mit Pointern}} + \begin{itemize} + \item Kompromiß + \end{itemize} + + \smallskip + + \textarrow\ \emph{Wie speichert man das möglichst effizient?} + \begin{itemize} + \item[\textbf{?}] möglichst schnell + \item[\textbf{?}] mit möglichst wenig Speicherplatzverbrauch + \item[\textbf{?}] unter Berücksichtigung gegebener Randbedingungen + \end{itemize} + +\end{frame} + +\nosectionnonumber{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse} + +\begin{frame}[fragile] + +% \newcommand{\w}{\hspace*{0.75pt}} + + \shownosectionnonumber + + \begin{picture}(0,0) + \put(7.6,-0.5){% + \begin{minipage}[t]{5.3cm} +% \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf} + \alt<3->{\vspace*{-0.93cm}\includegraphics{landau-symbols-3.pdf}}% + {\vspace*{-1.00cm}\includegraphics{landau-symbols.pdf}} + \small%\vspace*{-1.0cm} + \begin{description}\itemsep0pt\leftskip-0.5cm + \item[$n$:] Eingabedaten + \item[$g(n)$:] Rechenzeit + \end{description} + \end{minipage}} + \end{picture} + + \vspace*{-\bigskipamount} + + Wann ist ein Programm "`schnell"'? + + \medskip + + \begin{onlyenv}<1> + Türme von Hanoi: $\mathcal{O}(2^n)$ + \par\medskip + Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! + \begin{itemize} + \arrowitem + $\frac{30,672\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4174$ + Jahre\\[\smallskipamount] + für 64 Scheiben + \end{itemize} + + \bigskip + \end{onlyenv} + + \begin{onlyenv}<1-> + Faustregel:\\Schachtelung der Schleifen zählen\\ + $k$ Schleifen ineinander \textarrow\ $\mathcal{O}(n^k)$ + + \bigskip + \end{onlyenv} + + \begin{onlyenv}<2> + \textbf{Beispiel: Sortieralgorithmen} + + \smallskip + + Anzahl der Vergleiche bei $n$ Strings + \begin{itemize} + \item + Maximum suchen mit Schummeln: $\mathcal{O}(1)$ +% \pause + \item + Maximum suchen: $\mathcal{O}(n)$ +% \pause + \item + Selection-Sort: $\mathcal{O}(n^2)$ +% \pause + \item + Bubble-Sort: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$ +% \pause + \item + Quicksort: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$ + \end{itemize} + + \end{onlyenv} + +% \begin{onlyenv}<3> +% \textbf{Wie schnell ist RSA-Verschlüsselung?} +% +% \smallskip +% +% \begin{math} +% c = m^e\,\%\,N +% \end{math} +% \quad +% ("`$\%$"' = "`modulo"') +% +% \medskip +% +% \begin{lstlisting}[gobble=6,xleftmargin=2em] +% int c = 1; +% for (int i = 0; i < e; i++) +% c = (c * m) % N; +% \end{lstlisting} +% +% \smallskip +% +% \begin{itemize} +% \item +% $\mathcal{O}(e)$ Iterationen +% % \item +% % wenn $n$ die Anzahl der Binärziffern (Bits) von $e$ ist: +% % $\mathcal{O}(2^n)$ Iterationen +% \item +% mit Trick: +% $\mathcal{O}(\log e)$ Iterationen ($\log e$ = Anzahl der Ziffern von $e$) +% \end{itemize} +% +% \smallskip +% +% Jede Iteration enthält eine Multiplikation und eine Division.\\ +% Aufwand dafür: $\mathcal{O}(\log e)$\\ +% \textarrow\ Gesamtaufwand: $\mathcal{O}\bigl((\log e)^2\bigr)$ +% +% \end{onlyenv} + + \begin{onlyenv}<3-> + + \textbf{Wie schnell ist RSA?}\\ + + \smallskip + + ($n$ = typische beteiligte Zahl, z.\,B. $e,p,q$) + + \begin{itemize} + \item + Ver- und Entschlüsselung (Exponentiation):\\ + \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} + \only<3->{{\color{magenta}$\mathcal{O}(n^2)$}} + \item + Schlüsselerzeugung (Berechnung von $d$):\\ + \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} + \only<3->{{\color{magenta}$\mathcal{O}(n^2)$}} + \item + Verschlüsselung brechen (Primfaktorzerlegung):\\ + \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$\hss} + \only<3->{{\color{magenta}$\mathcal{O}\bigl(2^{\sqrt{n\log n}}\bigr)$}} + \end{itemize} + + \smallskip +% \vspace{0cm plus 1filll} + + \textbf{Die Sicherheit von RSA beruht darauf, + daß das Brechen der Verschlüsselung aufwendiger ist als + \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).} + +% \vspace*{0.65cm} + +% \pause[4] + \smallskip + \hspace*{2.29cm}\textcolor{red}{\textbf{Mit Quantencomputer: \boldmath$\mathcal{O}\bigl((\log n)^3\bigr)$}} + + \end{onlyenv} + +\end{frame} + +\nosectionnonumber{\inserttitle} + +\iffalse + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/ad}}} + \item[\textbf{2}] \textbf{\dots} + \end{itemize} + + \begin{picture}(0,0)(-2,-0.5) + \put(0.5,-1.0){\mbox{\Large$\mathcal{O}(n\log n)$}} + \put(0.6,-2.7){\mbox{\large\bf B-Baum}} + \put(-1.3,-3.4){\mbox{\small\it verkettete Liste}} + \put(1.5,-4.0){\mbox{\large Datenbanken}} + \put(-1.0,-1.9){\mbox{\large\tt struct}} + \put(3.0,-2.0){\mbox{\large Wegfindung}} + \put(4.0,-3.0){\mbox{Verschlüsseln}} + \put(5.7,-4.2){\mbox{\it Datenkompression}} + \put(6.0,-1.5){\mbox{CORDIC}} + \put(8.5,-2.0){\mbox{\small\bf FFT}} + \put(7.5,-2.9){\mbox{\small\tt pointer}} + \put(3.5,-0.5){\mbox{\it Rasterung}} + \put(7.7,-0.7){\mbox{\tt array}} + \put(-0.5,-5.0){\mbox{digitale Signatur}} + \put(3.5,-5.2){\mbox{\large Hash-Tabelle}} + \put(0.0,-6.3){\mbox{\small\bf kryptographische Hash-Funktion}} + \put(6.5,-6.0){\mbox{\it Prüfsumme}} +% \pause +% \put(4.0,-2.7){\begin{rotate}{18} +% \makebox(0,0){\LARGE\color{red}\shortstack{% +% Online-Werkzeuge für Home Office, Lehre\\ +% und Kommunikation mit Unterdrückten}} +% \end{rotate}} + \end{picture} + +\end{frame} + +\fi + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \underconstruction + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/ad}}} +% \item[\textbf{\color{red}i}] {\color{red}Online-Werkzeuge für Home Office, Lehre\\ +% und Kommunikation mit Unterdrückten} + \item[\textbf{2}] \textbf{Arrays und Zeiger für Fortgeschrittene} + \item[\textbf{3}] \textbf{Langzahl-Arithmetik} + \item[\textbf{4}] \textbf{Kryptographie} + \item[\textbf{5}] \textbf{C++} + \item[\textbf{6}] \textbf{Datenorganisation} + \vspace{-\smallskipamount} + \item[\textbf{\dots}] + \end{itemize} + +\end{frame} + +\setcounter{section}{1} +\section{Arrays und Zeiger für Fortgeschrittene} + +\begin{frame}[fragile] + \showsection + + \begin{minipage}[t]{6cm} + Array: + \smallskip + \begin{lstlisting}[gobble=6] + char a[] = "Test"; + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{6cm} + Zeiger: + \smallskip + \begin{lstlisting}[gobble=6] + char *p = "Test"; + \end{lstlisting} + \end{minipage} + + \bigskip + + \begin{itemize} + \item + In beiden Fällen wird ein Array von ganzen Zahlen\\ + (5 \lstinline{char}-Variable mit den Werten 84, 101, 115, 116 und 0)\\ + im Speicher angelegt. + \medskip + \item + Links heißt das Array \lstinline{a}; + rechts ist es "`anonym"'. + \item + Rechts wird zusätzlich ein Zeiger \lstinline{p} im Speicher angelegt,\\ + der auf das (anonyme) Array zeigt. + \medskip + \item + \lstinline{&a} ist dasselbe wie \lstinline{a}, + nämlich die Adresse des Arrays. + \item + \lstinline{&p} ist die Adresse des Zeigers. + \item + \lstinline{p} ist der Wert des Zeigers,\\ + momentan also die Adresse des (anonymen) Arrays. + \end{itemize} + +\end{frame} + +\begin{frame}[fragile] + \showsection + + \begin{minipage}[t]{6cm} + Array: + \smallskip + \begin{lstlisting}[gobble=6] + char a[] = "Test"; + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{6cm} + Zeiger: + \smallskip + \begin{lstlisting}[gobble=6] + char *p = "Test"; + \end{lstlisting} + \end{minipage} + + \bigskip + + \begin{itemize} + \item + In beiden Fällen wird ein Array von ganzen Zahlen\\ + (5 \lstinline{char}-Variable mit den Werten 84, 101, 115, 116 und 0)\\ + im Speicher angelegt. + \medskip + \item + Links heißt das Array \lstinline{a}; + rechts ist es "`anonym"'. + \item + Rechts wird zusätzlich ein Zeiger \lstinline{p} im Speicher angelegt,\\ + der auf das (anonyme) Array zeigt. + \medskip + \item + \lstinline{&a} ist {\color{red}fast} dasselbe wie \lstinline{a},\\ + nämlich die Adresse des Arrays {\color{red}bzw.\ das Array selbst,\\ + das zuweisungskompatibel zu einem Zeiger auf Elemente des Arrays ist.\\ + \lstinline{&} bewirkt hier eine (nicht explizite!) Typumwandlung.} + \item + \lstinline{&p} ist die Adresse des Zeigers. + \item + \lstinline{p} ist der Wert des Zeigers,\\ + momentan also die Adresse des (anonymen) Arrays. + \end{itemize} + + \vspace*{-1cm} + +\end{frame} + +\begin{frame}[fragile] + \showsection + + \begin{minipage}[t]{7cm} + Array: + \smallskip + \begin{lstlisting}[gobble=6] + char *a[] = { "Dies", "ist", "ein", "Test" }; + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{5cm} + Zeiger: + \smallskip + \begin{lstlisting}[gobble=6] + char **p = a; + \end{lstlisting} + \end{minipage} + + \bigskip + + \begin{itemize} + \item + Array von Zeigern auf \lstinline{char}-Variable + \item + Zeiger auf das Array = Zeiger auf Zeiger auf \lstinline{char}-Variable + \item + Schleife durch äußeres Array mit \lstinline{p++} möglich + \end{itemize} + +\end{frame} + +\begin{frame}[fragile] + \showsection + + \begin{minipage}[t]{7cm} + Array: + \smallskip + \begin{lstlisting}[gobble=6] + char a[][5] = { "Dies", "ist", "ein", "Test" }; + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{5cm} + Zeiger: + \smallskip + \begin{lstlisting}[gobble=6] + char *p = a[0]; + \end{lstlisting} + \end{minipage} + + \bigskip + + \begin{itemize} + \item + zweidimensionales Array von \lstinline{char}-Variablen + \item + Zeiger auf Array-Komponente\\ + = Zeiger auf eindimensionales Array\\ + = Zeiger auf \lstinline{char}-Variable + \item + Schleife durch äußeres Array mit Zeiger-Arithmetik nicht möglich + \end{itemize} + + \begin{picture}(0,0) + \color{red} + \thicklines + \put(8.6,0.63){\line(1,0){0.85}} + \put(9.05,0.4){\makebox(0,0)[t]{$\overbrace{\mbox{nur mit Trick: + \lstinline{p += 5}}}$}} + \end{picture} + +\end{frame} + +\begin{frame}[fragile] + \showsection + + \begin{lstlisting} + typedef char string5[5]; + string5 a[] = { "Dies", "ist", "ein", "Test" }; + string5 *p = a; + \end{lstlisting} + + \bigskip + + \begin{itemize} + \item + Array von Array von \lstinline{char}-Variablen\\ + = zweidimensionales Array von \lstinline{char}-Variablen + \item + Zeiger auf zweidimensionales Array + \item + Schleife durch äußeres Array mit \lstinline{p++} möglich + \bigskip + \arrowitem + Fazit:\\ + Ein Hoch auf \lstinline{typedef}! + \arrowitem + Trotzdem: {\color{red}Vorsicht!}\\ + Ein \lstinline{p++} auf einen Zeiger vom Typ \lstinline{string5 *p}\\ + ergibt anscheinend undefiniertes Verhalten! + \end{itemize} + +\end{frame} + +\begin{frame}[fragile] + \showsection + + \begin{lstlisting} + typedef char string5[5]; + string5 *p = { "Dies", "ist", "ein", "Test" }; + \end{lstlisting} + + \bigskip + + \begin{itemize} + \item + anonymes Array von Array von \lstinline{char}-Variablen\\ + = anonymes zweidimensionales Array von \lstinline{char}-Variablen + \item + Zeiger auf zweidimensionales Array + \item + Schleife durch äußeres Array mit \lstinline{p++} möglich + \end{itemize} + +% \pause + + \begin{picture}(0,0)(-2,-0.4) + \color{red} + \thicklines + \put(0,0){\line(2,1){4}} + \put(0,2){\line(2,-1){4}} + \end{picture} + + Das Konstrukt \lstinline|{ "Dies", "ist", "ein", "Test" }|\\ + steht für ein Array von 4 Zeigern auf \lstinline{char}-Variable. + + \smallskip + + \lstinline{string5 *p} hingegen erwartet einen Zeiger auf ein Array + von 5 \lstinline{char}-Variablen. + + \smallskip + + Es bekommt die Adresse von \lstinline{"Dies"} zugewiesen. + + \smallskip + + Durch das Erhöhen von \lstinline{p} (um 5) zeigt es danach + \emph{zufällig\/} auf das \lstinline{"ist"}. + + Bei nochmaligem Erhöhen zeigt es auf das \lstinline{"in"} von \lstinline{"ein"}. + + \smallskip + + (Auch ohne Optimierung werden die Strings \lstinline{"ist"}, \lstinline{"ein"} + und \lstinline{"Test"}\\ + u.\,U.\ wegoptimiert.) + +\end{frame} + +\iffalse + +\nosectionnonumber{\large\bf Übungsaufgabe: Verkettete Listen} + +\begin{frame} + + \shownosectionnonumber + + \begin{enumerate}[\quad(a)] + \item + Schreiben Sie eine Funktion, die eine verkettete Liste\\ + in die umgekehrte Reihenfolge bringt. + \item + Schreiben Sie eine Funktion, die eine verkettete Liste\\ + in eine doppelt verkettete Liste umwandelt. + \item + Wieviel Rechenzeit (Landau-Symbol) benötigen Ihre Funktionen? + \item + Wieviel Speicherplatz (Landau-Symbol) benötigen Ihre Funktionen? + \end{enumerate} + +\end{frame} + +\fi + +\section{Langzahl-Arithmetik} + +\begin{frame} + + \showsection + + Problem: Rechnen mit ganzen Zahlen, die größer sind als das,\\ + was der Rechner normalerweise verarbeiten kann + + \bigskip + + {\large\textbf{Aufgabe: Addition langer Zahlen}\par} + \smallskip + \begin{itemize} + \item[(a)] + Überlegen Sie sich eine Datenstruktur, um eine lange Zahl zu speichern. + \item[(b)] + Schreiben Sie eine Funktion, die zwei lange Zahlen addiert. + \end{itemize} + + \smallskip + + Hinweis: "`schriftlich"' rechnen + +\end{frame} + +\begin{frame} + + \showsection + + Problem: Rechnen mit ganzen Zahlen, die größer sind als das,\\ + was der Rechner normalerweise verarbeiten kann + + \medskip + + \begin{itemize} + \item + Grundrechenarten (einschließlich "`modulo"'):\\ + "`schriftlich"' rechnen + \item + \href{https://de.wikipedia.org/wiki/Binäre_Exponentiation}% + {binäre Exponentiation}:\\ + Basis fortlaufend quadrieren, ggf.\ damit multiplizieren\\ + Beispiel: $x^9 = ((x^2)^2)^2 \cdot x$ + \item + Suche nach $d$ mit $d\cdot e~\text{mod}~N = 1$:\\ + \href{https://de.wikipedia.org/wiki/Erweiterter_euklidischer_Algorithmus}% + {erweiterter euklidischer Algorithmus} + \smallskip + \arrowitem + RSA + \end{itemize} + +\end{frame} + +\section{Kryptographie} +\subsectionnonumber{\boldmath 4.$(x^2 - 1)$\quad Der Herr der Ringe: Manchmal ist $1 + 1 = 0$.} +\subsubsectionnonumber{\boldmath 4.$(x^2 - 1).x$\quad Motivation} + +\begin{frame} + + \showsection + \pause + \showsubsectionnonumber + \pause + \showsubsubsectionnonumber + + Man kann auch mit sehr merkwürdigen Objekten\\ + wie mit "`ganz normalen"' Zahlen rechnen. + + \pause + \bigskip + + Anwendungen: + \begin{itemize} + \item Funktionsweise von Computern (\textarrow\ Rechnertechnik) + \item Fehlererkennung + \item Fehlerkorrektur + \item Verschlüsselung + \item Digitale Signaturen + \end{itemize} + +\end{frame} + +\subsubsectionnonumber{\boldmath 4.$(x^2 - 1).(x + 1)$\quad Gruppen} + +\begin{frame} + + \showsection + \showsubsectionnonumber + \showsubsubsectionnonumber + + \textbf{Definition:} + Sei $G$ eine Menge, $*$ eine Verknüpfung auf $G$. + Wenn + \begin{itemize} + \item + $\forall a, b, c \in G$: $(a * b) * c = a * (b * c)$ \quad (Assoziativgesetz), + \item + $\exists e \in G$: $\forall a \in G$: $a * e = e * a = a$ \quad (neutrales Element), + \item + $\forall a \in G$: $\exists a^{-1} \in G$: $a * a^{-1} = a^{-1} * a = e$ \quad (inverses Element), + \end{itemize} + dann heißt $(G,*)$ eine \newterm{Gruppe}. + + \pause + \bigskip + + \textbf{Definition:} + Sei $(G,*)$ eine Gruppe. + Wenn zusätzlich + \begin{itemize} + \item + $\forall a, b \in G$: $a * b = b * a$ \quad (Kommutativgesetz), + \end{itemize} + dann heißt $(G,*)$ eine \newterm{kommutative Gruppe}. + +\end{frame} + +\subsubsectionnonumber{\boldmath 4.$(x^2 - 1).(x + 2)$\quad Ringe} + +\begin{frame} + +% \showsection + \showsubsectionnonumber + \showsubsubsectionnonumber + + \textbf{Definition:} + Sei $R$ eine Menge; seien $+$ und $\cdot$ Verknüpfungen auf $R$. + Wenn + \begin{itemize} + \item + $(R,+)$ eine kommutative Gruppe ist, + \item + $\forall a, b, c \in R$: $(a \cdot b) \cdot c = a \cdot (b \cdot c)$ \quad (Assoziativgesetz), + \item + $\forall a, b, c \in R$: $(a + b)\cdot c = a\cdot c + b\cdot c$ + und $a\cdot(b + c) = a\cdot b + a\cdot c$ \quad (Distributivgesetze), + \end{itemize} + dann heißt $(R,+,\cdot)$ ein \newterm{Ring}. + + \pause + \bigskip + + \textbf{Definition:} + Sei $(R,+,\cdot)$ ein Ring. + Wenn zusätzlich + \begin{itemize} + \item + $\forall a, b \in R$: $a \cdot b = b \cdot a$ \quad (Kommutativgesetz), + \end{itemize} + dann heißt $(R,+,\cdot)$ ein \newterm{kommutativer Ring}. + + \pause + \bigskip + + \textbf{Definition:} + Sei $(R,+,\cdot)$ ein (kommutativer) Ring. + Wenn zusätzlich + \begin{itemize} + \item + ein $e \in R$ existiert, so daß für alle $a \in R$ gilt: $a \cdot e = e \cdot a = a$\\ + (neutrales Element), + \end{itemize} + dann heißt $(R,+,\cdot)$ ein \newterm{(kommutativer) Ring mit 1}. + + \vspace*{-1cm} + +\end{frame} + +\subsubsectionnonumber{\boldmath 4.$(x^2 - 1).(x + 3)$\quad Körper} + +\begin{frame} + +% \showsection + \showsubsectionnonumber + \showsubsubsectionnonumber + + \textbf{Definition:} + Sei $K$ eine Menge; seien $+$ und $\cdot$ Verknüpfungen auf $K$. + Wenn + \begin{itemize} + \item + $(K,+,\cdot)$ ein Ring mit 1 ist und + \item + $(K \backslash \{0\},\cdot)$ eine kommutative Gruppe ist, + \end{itemize} + dann heißt $(K,+,\cdot)$ ein \newterm{Körper}. + +\end{frame} + +\iffalse + +\nosectionnonumber{\inserttitle} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \underconstruction + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/ad}}} +% \item[\textbf{i}] \textbf{Gesellschaftliche Auswirkungen\\ +% von Algorithmen und Datenstrukturen} + \item[\textbf{2}] \textbf{Datenorganisation} + \item[\textbf{3}] \textbf{Optimierung} + \item[\textbf{4}] \textbf{Hardwarenahe Algorithmen} + \item[\textbf{5}] \textbf{Datenkodierung} + \color{gray} + \item[\textbf{6}] \textbf{Numerik} + \end{itemize} + +\end{frame} + +\section{Einführung in C++} +\addtocounter{subsection}{-1} +\subsection{Was ist C?} + +\begin{frame} + + \showsection + \showsubsection + + Etabliertes Profi-Werkzeug + \begin{itemize} + \item + kleinster gemeinsamer Nenner für viele Plattformen\\ + \begin{picture}(0,1) + \color{red} + \put(7.2,0.6){\tikz{\draw[-latex](0.0,0.0)--(0.0,0.4);}} + \put(7.2,0.5){\makebox(0,0)[t]{\color{black}Hardware und/oder Betriebssystem}} + \end{picture} + \item + Hardware direkt ansprechen und effizient einsetzen + \item + \dots\ bis hin zu komplexen Software-Projekten + \medskip + \arrowitem + Man kann Computer vollständig beherrschen. + \end{itemize} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + \begin{picture}(0,0) + \put(5.3,-2.5){\makebox(0,0)[tl]{\begin{minipage}{7cm} + \emph{C makes it easy to shoot yourself in the foot.} + \begin{flushright} + Bjarne Stroustrup, ca.~1986\\ + \href{http://www.stroustrup.com/bs_faq.html\#really-say-that}% + {\nolinkurl{http://www.stroustrup.com/bs_faq.html}\\ + \nolinkurl{\#really-say-that}} + \end{flushright} + \end{minipage}}} + \end{picture}% + Etabliertes Profi-Werkzeug + \begin{itemize} + \item + kleinster gemeinsamer Nenner für viele Plattformen + \item + Hardware direkt ansprechen und effizient einsetzen + \item + \dots\ bis hin zu komplexen Software-Projekten + \item + leistungsfähig, aber gefährlich + \end{itemize} + + \medskip + "`High-Level-Assembler"' + \begin{itemize} + \item + kein "`Fallschirm"' + \item + kompakte Schreibweise + \end{itemize} + + \medskip + Unix-Hintergrund + \begin{itemize} + \item + Baukastenprinzip + \item + konsequente Regeln + \item + kein "`Fallschirm"' + \end{itemize} + +\end{frame} + +\subsection{Was ist C++?} + +\begin{frame} + + \showsection + \showsubsection + + \begin{picture}(0,0) + \put(6.3,-0.2){\makebox(0,0)[tl]{\begin{minipage}{6cm} + \emph{C++ is a better C.} + \begin{flushright} + Bjarne Stroustrup, Autor von C++\\ + \url{http://www.stroustrup.com/C++.html} + \end{flushright} + \end{minipage}}} + \put(5.3,-2.5){\makebox(0,0)[tl]{\begin{minipage}{7cm} + \emph{C makes it easy to shoot yourself in the foot;\\ + C++ makes it harder, but when you do\\ + it blows your whole leg off.} + \begin{flushright} + Bjarne Stroustrup, Autor von C++, ca.~1986\\ + \href{http://www.stroustrup.com/bs_faq.html\#really-say-that}% + {\nolinkurl{http://www.stroustrup.com/bs_faq.html}\\ + \nolinkurl{\#really-say-that}} + \end{flushright} + \end{minipage}}} + \end{picture}% + Etabliertes Profi-Werkzeug + \begin{itemize} + \item + kompatibel zu C + \end{itemize} + + \medskip + + C++ unterstützt + \begin{itemize} + \item + \newterm{objektorientierte\\ + Programmierung} + \item + \newterm{Datenabstraktion} + \item + \newterm{generische\\ + Programmierung} + \end{itemize} + + \vspace{0cm plus 1 filll} + + \textbf{Motivation:}\\[\smallskipamount] + Vermeidung unsicherer Techniken,\\ + insbesondere von Präprozessor-Konstruktionen und Zeigern,\\ + unter Beibehaltung der Effizienz + +\end{frame} + +\subsection{Elementare Neuerungen in C++ gegenüber C} + +\begin{frame}[fragile] + \showsubsection + \begin{itemize} + \pause + \item + Kommentare mit \lstinline{//} + \pause + \item + Konstante: + \begin{onlyenv}<3> + \begin{lstlisting}[gobble=10] + const int answer = 42; + \end{lstlisting} + \end{onlyenv} + \begin{lstlisting}[gobble=8] + const int n = 5; + int prime[n] = { 2, 3, 5, 7, 11 }; + \end{lstlisting} + \pause + \item + Ab C++11: \lstinline{constexpr}-Funktionen\\ +% \only<1->{{\color{red}\dots\ anscheinend auch ohne "`constexpr"' \dots}\\} + C++11: darf nur aus einem einzigen \lstinline{return}-Statement bestehen\\ + \textarrow\ \lstinline{?:} statt \lstinline{if}, Rekursion statt Schleife\\ + C++-14: auch Verzweigungen und Schleifen erlaubt + \pause + \item + leere Parameterliste: \lstinline{void} optional\\ + in C: ohne \lstinline{void} = Parameterliste wird nicht geprüft + \pause + \item + Operatoren \lstinline{new} und \lstinline{delete}\\ + als Alternative zu den Funktionen \lstinline{malloc()} und \lstinline{free()} + \end{itemize} +\end{frame} + +\fi + +\end{document} diff --git a/20250401/landau-symbols-2.pdf b/20250401/landau-symbols-2.pdf new file mode 120000 index 0000000000000000000000000000000000000000..6b458b6efd8e274824a6dfcaabc4b9c27d196dc4 --- /dev/null +++ b/20250401/landau-symbols-2.pdf @@ -0,0 +1 @@ +../common/landau-symbols-2.pdf \ No newline at end of file diff --git a/20250401/landau-symbols-3.pdf b/20250401/landau-symbols-3.pdf new file mode 120000 index 0000000000000000000000000000000000000000..46efa409b35ff5df763c744a423599cba515d886 --- /dev/null +++ b/20250401/landau-symbols-3.pdf @@ -0,0 +1 @@ +../common/landau-symbols-3.pdf \ No newline at end of file diff --git a/20250401/landau-symbols.pdf b/20250401/landau-symbols.pdf new file mode 120000 index 0000000000000000000000000000000000000000..ca145425bf07439c680632aa0663f84be601a565 --- /dev/null +++ b/20250401/landau-symbols.pdf @@ -0,0 +1 @@ +../common/landau-symbols.pdf \ No newline at end of file diff --git a/20250401/logo-hochschule-bochum-cvh-text-v3.pdf b/20250401/logo-hochschule-bochum-cvh-text-v3.pdf new file mode 120000 index 0000000000000000000000000000000000000000..aa19ac68bf7f79336d9235b66da10510eeaa70d5 --- /dev/null +++ b/20250401/logo-hochschule-bochum-cvh-text-v3.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum-cvh-text-v3.pdf \ No newline at end of file diff --git a/20250401/logo-hochschule-bochum-de-narrow.pdf b/20250401/logo-hochschule-bochum-de-narrow.pdf new file mode 120000 index 0000000000000000000000000000000000000000..9c8831d42a60f3d3f4fd6a583355d05c375f28bb --- /dev/null +++ b/20250401/logo-hochschule-bochum-de-narrow.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum-de-narrow.pdf \ No newline at end of file diff --git a/20250401/pgslides.sty b/20250401/pgslides.sty new file mode 120000 index 0000000000000000000000000000000000000000..5be1416f4216f076aa268901f52a15d775e43f64 --- /dev/null +++ b/20250401/pgslides.sty @@ -0,0 +1 @@ +../common/pgslides.sty \ No newline at end of file