Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen:



Ähnliche Dokumente
Funktionale Programmierung mit Haskell

ALP I. Funktionale Programmierung

Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS Prof. Dr. Margarita Esponda. Prof. Dr.

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Algorithmen und Datenstrukturen I

Funktionale Programmierung ALP I. Funktionen höherer Ordnung SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

WS 2011/2012. RobertGiegerich. November 12, 2013

WS 2011/2012. RobertGiegerich. November 12, 2013

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 4 -

Funktionale Programmierung mit Haskell. Jan Hermanns

Kapitel 6: Abstraktion. Programmieren in Haskell 1

Programmieren in Haskell Einstieg in Haskell

Funktionale Programmierung

Funktionale Programmierung mit C++

Programmieren in Haskell

Was bisher geschah Kryptographische Systeme (M, C, K, e, d) Verfahren: symmetrisch klassisch: Verschiebechiffren (Spezialfall Caesar-Code)

Tutorium - Haskell in der Schule. Ralf Dorn - Dennis Buchmann - Felix Last - Carl Ambroselli

Programmieren in Haskell

Programmieren in Haskell Einführung

Die Korrektheit von Mergesort

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur -

Ströme als unendliche Listen in Haskell

ProInformatik: Funktionale Programmierung. Punkte

Definieren Sie eine Funktion circlearea zur Berechnung der Fläche eines Kreises mit gegebenen Radius (Float).

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Funktionale Programmierung mit Haskell

HASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül

Kryptographische Systeme (M, C, K, E, D) Symmetrische Verfahren (gleicher Schlüssel zum Verschlüsseln und Entschlüsseln):

Einführung in Haskell

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Funktionen höherer Ordnung

WS 2011/2012. Georg Sauthoff 1. October 18, 2011

Informatik-Seminar Thema 6: Bäume

Paradigmen der Programmierung

Frage, Fragen und nochmals Fragen

: Funktionen höherer Ordnung. III.6 Funktionale Programmiertechniken - 1 -

Listen. 3.1 Vordefinierte Listenfunktionen

Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1

Einführung in die Informatik 2

Grundprinzipien der funktionalen Programmierung

Programmieren in Haskell

Programmierparadigmen Tutorium: Lazyness, Streams

WS 2011/2012. Georg Sauthoff November 2011

Programmieren in Haskell Das Haskell Typsystem

WS 2012/2013. Robert Giegerich. 21. November 2012

Programmieren in Haskell Programmiermethodik

monoalphabetisch: Verschiebechiffren (Caesar), multiplikative Chiffren polyalphabetisch: Vigenère-Chiffre

Einführung in die funktionale Programmierung

Sortierverfahren für Felder (Listen)

Unendliche Listen und Bäume

Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom : Funktionen Höherer Ordnung I

Programmierkurs II. Typsynonyme & algebraische Datentypen

Agenda. 1 Einleitung. 2 Binäre Bäume. 3 Binäre Suchbäume. 4 Rose Trees. 5 Zusammenfassung & Ausblick. Haskell Bäume. Einleitung.

Grundlegende Datentypen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Programmieren I. Kapitel 7. Sortieren und Suchen

[10] Software Transactional Memory in Haskell, Tortenwurf und Aufgabenblatt 7

Grundlegende Datentypen

Funktionale Programmierung

Funktionale Programmierung Grundlegende Datentypen

Aus diesem Grund lohnt es sich, weitere Notationen. einzuführen, die die Konstruktion und die Verarbeitung von

Fahrplan. Inhalt. Ähnliche Funktionen der letzten Vorlesung. Muster der primitiven Rekursion. Ähnliche Funktionen der letzten Vorlesung

Felder. November 5, 2014

WS 2011/2012. Robert Giegerich. October 17, 2012

Einführung in die Informatik 2

Schutz von Informationen bei Übertragung über unsichere Kanäle Beispiele für zu schützende Informationen

Kryptographische Systeme (M, C, K, e, d) Symmetrische Verfahren (gleicher Schlüssel zum Verschlüsseln und Entschlüsseln):

WS 2013/2014. Robert Giegerich. 11. Dezember 2013

Programmieren in Haskell

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

Funktionale Programmierung ALP I. Algebraische Datentypen und Abstrakte Datentypen. SS 2013 Prof. Dr. Margarita Esponda. Prof. Dr.

Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom : Funktionen Höherer Ordnung I

WS 2013/2014. Robert Giegerich. 11. Dezember 2013

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom : Rekursive Datentypen

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

ALP I. Funktionale Programmierung

Funktionale Programmierung

Konzepte von Programmiersprachen

VL06: Haskell (Funktionen höherer Ordnung, Currying)

Grundlegende Datentypen

Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz

Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension

Programmieren in Haskell

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Prof. Dr. Margarita Esponda

Haskell Seminar Abstrakte Datentypen. Nils Bardenhagen ms2725

Haskell for Hackers... or why functional programming matters

Programmieren in Haskell

Einführung in die Informatik 2 5. Übung

Programmieren in Haskell Programmieren mit Listen

Programmieren in Haskell

Haskell. A Wild Ride. Sven M. Hallberg. sm@khjk.org. 21C3 Berlin / Bildungswerk Hamburg p. 1/36

Musterlösung zur 2. Aufgabe der 4. Übung

Jahrgang: Jahrgang 1. Thema: Systementwicklung einer Webapplikation - Geheimnachrichten-Generator

Verfügbarkeit (Schutz vor Verlust) Vertraulichkeit (Schutz vor unbefugtem Lesen) Authentizität (Schutz vor Veränderung, Fälschung)

Vorkurs Informatik Wintersemester 2015/2016. Programmtexte

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen

Transkript:

Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen: Peano-Zahlen, Listen, Bäume Rekursive Funktionen strukturelle Induktion Rekursionsschemata für Peano-Zahlen, Listen, Bäume Funktionen höherer Ordnung (mit Funktionen als Argumenten) λ-kalkül, β-reduktion fold auf rekursiven Datentypen (Peano-Zahlen, Listen, Bäume) map auf Listen und Bäumen, filter auf Listen Bedarfsauswertung (lazy evaluation): leftmost outermost reduction + sharing

Sortieren sortiert :: Ord a => [a] -> Bool sortiert xs = foldr (&&) True $ zipwith (<=) xs $ tail xs sort :: Ord a => [a] -> [a] z.b. durch Einfügen in (anfangs leeren) binären Suchbaum Inorder-Ausgabe

Klassische Sortier-Verfahren Sortieren durch Einfügen insert :: Ord a => a -> [ a ] -> [ a ] insert x [] = [x] insert x ( y : ys ) x <= y = x : y : ys x > y = y : (insert x ys) isort :: Ord a => [a] -> [a] isort [] = [] isort (x:xs) = insert x $ isort xs Quicksort qsort :: Ord a => [a] -> [a] qsort [] = [] qsort (x:xs) = qsort [ y y <- xs, y <= x] ++ [x] ++ qsort [ y y <- xs, y > x]

Mergesort merge :: Ord a => [a] -> [a] -> [a] merge xs [] = xs merge [] ys = ys merge (x : xs) (y : ys) x <= y = x : merge xs ( y : ys ) otherwise = y : merge ( x : xs ) ys msort :: Ord a => [a] -> [a] msort [] = [] msort [ x ] = [ x ] msort xs = merge ( msort l ) ( msort r ) where ( l, r ) = splitat halb xs halb = div (length xs) 2

Ver- und Entschlüsseln Verschiebe-Chiffre symmetrisches Verschlüsselungs-Verfahren: derselbe Schlüssel zum Ver- und Entschlüsseln Substitutionschiffre: Ersetzung jedes Klartextsymboles durch ein Chiffretextsymbol monoalphabetisch: Klartextsymbol überall durch dasselbe Chiffretextsymbol ersetzt Klartextmenge: M = {a, b,..., z} Chiffretextmenge: C = {a, b,..., z} Schlüsselmenge: K = {0,..., 25} Verschlüsselung: jeden Buchstaben durch Buchstaben k Positionen später im Alphabet ersetzen Entschlüsselung: jeden Buchstaben durch Buchstaben k Positionen früher im Alphabet ersetzen klassisches Beispiel: Caesar-Chiffre k = 3

Verschlüsseln für jeden (Klein-)Buchstaben im Klartext: Buchstabe durch Zahl {0,..., 25} ersetzen b2int :: Char -> Int b2int b = ord b - ord a Zahl durch entsprechenden Buchstaben ersetzen int2b :: Int -> Char int2b n = chr (ord a + n) Buchstabe mit Schlüssel k verschlüsseln: enc :: Int -> Char -> Char enc k b islower b = int2b ( mod (k + b2int b) 26) otherwise = b Klartext verschlüsseln: encode :: Int -> String -> String encode k = map ( enc k ) Chiffretext entschlüsseln:...

Angriffe auf Verschiebechiffren Ciphertext-Only-Angriffe auf Verschiebechiffren gegeben: verschlüsselter Text hinreichend lang, natürlichsprachig (deutsch), mit Verschiebechiffre verschlüsselt gesucht: Klartext ( und evtl. Schlüssel ) Ideen für Angriffe: Brute Force: Ausprobieren aller 26 Schlüssel typische Häufigkeiten von Buchstaben, Buchstabengruppen

Funktionen auf Listen / Strings Anzahl der Vorkommen eines Elementes in einer Liste: countel :: Eq a => a -> [ a ] -> Int countel b = ( foldr (\x y -> y + 1) 0 ). filter ( == b ) z.b. countel o "foo" = 2 Anzahl der Kleinbuchstaben in einer Zeichenkette: lowers :. String -> Int lowers = ( foldr (\x y -> y + 1) 0 ). filter ( islower ) z.b. lowers "Foo!" = 2

Funktionen auf Listen / Strings alle Positionen eines Elementes in einer Liste: positions :: Eq a => a -> [ a ] -> [ Int ] positions x xs = ( map fst ) $ filter (\ ( _, y) -> y == x ) $ zip [ 0.. ] xs z.b. positions o "foo" = [1,2] Rotieren von Listen rotate :: Int -> [ a ] -> [ a ] rotate n xs = drop n xs ++ take n xs

Buchstaben-Häufigkeiten Häufigkeiten (in deutschen Texten): haeufigkeitstabelle :: [ Float ] haeufigkeitstabelle = [6.51, 1.89, 3.06, 5.08, 17.4, 1.66, 3.01, 4.76, 7.55, 0.27, 1.21, 3.44, 2.53, 9.78, 2.51, 0.79, 0.02, 7.00, 7.27, 6.15, 4.35, 0.67, 1.89, 0.03, 0.04, 1.13] zip [ a.. z ] häufigkeitstabelle proz :: Int -> Int -> Float proz m n = (fromintegral m / fromintegral n) * 100 Prozentuale Häufigkeit im (verschlüsselten) Text: häufigkeiten :: String -> [ Float ] häufigkeiten t = [ proz ( countel x t ) n x <- [ a.. z ] ] where n = lowers t

Statistik Test auf (annähernd) gleiche Verteilung durch Chi-Quadrat-Test für Buchstabenhäufigkeiten erwartet: e R {0,...,25} 0 (häufigkeitstabelle) im Text t aufgetreten: a R {0,...,25} 0 (häufigkeiten t) e, a R {0,...,25} n 1 0 : χ 2 (a, e) = i=0 (a i e i ) 2 e i chiquad :: [ Float ] -> [ Float ] -> Float chiquad a e = foldr (\x y -> x + y) 0 $ zipwith (\ x y -> (x - y)^2 / y) a e chiquad (häufigkeiten "ipiqirx") häufigkeitstabelle

Knacken der Verschiebechiffre Chi-Test für alle möglichen Schlüssel k {0,..., 25} für Chiffretext c: chitab = [ chiquad ( rotate k ( häufigkeiten c ) ) häufigkeitstabelle k <- [ 0.. 25 ] ] Index (Verschiebung) des kleinsten χ 2 -Wertes: k = head ( positions (minimum chitab ) chitab ) where chitab = [ chiquad (rotate n (häufigkeiten c)) häufigkeitstabelle n <- [ 0.. 25 ] ] ist (wahrscheinlich) der Schlüssel crack :: String -> String crack c = decode k c where k = head ( positions (minimum chitab ) chitab ) chitab = [ chiquad (rotate n (häufigkeiten c)) häufigkeitstabelle n <- [0.. 25]]