M∪Φ X Lehrstuhl Übungen zur Vorlesung Mathematik für Informatiker I Wintersemester 2016/2017 Prof. Dr. Knut Hüper, Thorsten Reichert Aufgabenblatt Nr. 4 7.11.2016 (20 Punkte. Abzugeben bis 14.11.2016 um 12:00 Uhr) Hausaufgaben Aufgabe 4-1: Induktionsbeweise Beweisen Sie durch Induktion: i) Sei n ∈ N. Dann gilt n X k= k=1 n(n + 1) 2 (3 Punkte) N ii) Sei n ∈ . Wir betrachten ein Schachbrett der Größe 2n × 2n , bei dem eines der vier Eckfelder entfernt wurde (hier abgebildet für n = 3, links): Die Steine: Das Feld: Zeigen Sie, dass das gesamte Feld (ohne die ausgeschlossene Ecke) durch Steine, wie oben rechts abgebildet, überdeckt werden kann. (3 Punkte) Hinweis: Überlegen Sie sich, um wie viel ein Schachbrett der Größe 2n+1 × 2n+1 größer ist, als eins der Größe 2n × 2n . 1 Aufgabe 4-2: Rechnen mit komplexen Zahlen Beweisen Sie Satz 2.4 durch direktes Nachrechnen für komplexe Zahlen w = a + bi und z = c + di: i) |w|2 = Re(w)2 + Im(w)2 , |w|2 = w · w und |Re(w)|, |Im(w)| ≤ |w| ii) Re(w) = w+w 2 und Im(w) = w−w 2i (4 Punkte) (2 Punkte) iii) w = w, wz = w · z, w + z = w + z und w/z = w/z (4 Punkte) iv) |wz| = |w| · |z| und |w| = |w| (2 Punkte) Aufgabe 4-3: Komplexe Zahlen in der Spieleentwicklung Wir nehmen an, Sie sind als Senior Developer bei einem Spieleentwickler angestellt und sollen ein Spiel programmieren, in dem ein Auto auf einem quadratischen Straßengitter umherfährt: Die aktuelle Fahrtrichtung wird durch ein Tupel (h, v) ∈ {(1, 0), (−1, 0), (0, 1), (0, −1)} ⊂ ben: (0, 1) für ↑ (−1, 0) für ← (1, 0) für → (0, −1) für ↓ R2 angege- Das Auto kann an jeder Kreuzung entweder geradeaus fahren, links abbiegen oder rechts abbiegen. Sie haben einen ihrer Praktikanten damit beauftragt, die Steuerung in Java zu implementieren und erhalten von ihm folgenden Code: ... public enum Input { RIGHT, LEFT, STRAIGHT } // Zulässige Werte: // (0,1) für ‘‘oben’’ // (0,-1) für ‘‘unten’’ // (1,0) für ‘‘rechts’’ // (-1,0) für ‘‘links’’ public class Direction { int horizontal; int vertical; } 2 Direction handleInput(Direction direction, Input input) { if (input == Input.LEFT) { if (direction.horizontal == 1) { // rechts -> oben direction.horizontal = 0; direction.vertical = 1; } else if (direction.horizontal == -1) { // links -> unten direction.horizontal = 0; direction.vertical = -1; } else if (direction.vertical == 1) { // oben -> links direction.horizontal = -1; direction.vertical = 0; } else if (direction.vertical == -1) { // unten -> rechts direction.horizontal = 1; direction.vertical = 0; } } else if (input == Input.RIGHT) { if (direction.horizontal == 1) { // rechts -> unten direction.horizontal = 0; direction.vertical = -1; } else if (direction.horizontal == -1) { // links -> oben direction.horizontal = 0; direction.vertical = 1; } else if (direction.vertical == 1) { // oben -> rechts direction.horizontal = 1; direction.vertical = 0; } else if (direction.vertical == -1) { // unten -> links direction.horizontal = -1; direction.vertical = 0; } } return direction; } ... Obwohl der Code korrekt ist, gefallen Ihnen die 8 Fallunterscheidungen nicht. Glücklicherweise gibt es komplexe Zahlen: wenn Sie die Fahrtrichtung als komplexe Zahl z ∈ auffassen, lässt sich die Funktion “handleInput” drastisch vereinfachen. Wir identifizieren also zunächst die Fahrtrichtungen C 3 wie folgt: −1 für ← i für ↑ −i für ↓ 1 für → C Zeigen Sie, dass “links abbiegen” dann durch Multiplikation der Richtung z ∈ mit einer festen komplexen Zahl l ∈ , und “rechts abbiegen” durch Multiplikation mit einer anderen komplexen Zahl r ∈ beschrieben werden kann. (2 Punkte) Hinweis: Sie müssen die Funktion handleInput nicht neu programmieren, lediglich beschreiben, wie diese funktionieren würde. C C 4