Computermathematik: Aufgabenblatt Sage Christoph Temmel Allgemeines 1. Die Lösung einer jeden Aufgabe ist als eigenes, minimales, fehlerfrei abzuspielendes Worksheet (Dateiendung: sws) zu verfassen. 2. Es sind keine Ausgaberoutinen zu schreiben – die Ergebnisse sind gegebenenfalls in Listen bzw Tupeln zusammenzufassen und auf Variablen zuzuweisen. Die Ausgabe wird dann interaktiv über den REPL des Notebooks erfolgen. 3. Es ein Ziel, möglichst wenig imperative Elemente zu verwenden: dh auf Variablen nur einmal zuzuweisen, Werte zu transformieren, Funktionen höherer Ordnung und List-comprehensions zu verwenden, etc . . . 4. Auch sind Berechnungen, welche evtl mehrfach durchgeführt werden, als eigene Funktionen zu definieren. Dies hält den globalen Variablenraum frei und trennt Berechnungsfunktionalität vom IO. Dies ermöglicht es auch, die Funktionalität einfach mit kleinen Parametern zu testen. 5. Wichtig: Es ist wichtiger, dass die Rechnung richtig ist, als schnell. Wenn man eine suboptimale Implementation (mit viel zu hoher Laufzeit hat), dann wenigstens dass richtige Ergebnis mit kleineren, aber nicht trivialen, Werten durchtesten und vorführen. Dh Korrektheit ist notwendig, Lesbarkeit kommt an zweiter Stelle und Geschwindigkeit an letzter – was nicht heisst, das man nicht auch Letzteres anpeilen sollte. 6. Hinweise zu Befehlen in Sage Befehl können sich sowohl auf Funktionen als auch auf Eigenschaften (darunter Methoden) von Objekten beziehen. Aufgaben 21. Zifferndarstellung - Potenzen: Bestimme die Anzahl der Stellen und die Quersumme (Summe der Ziffern) der Zahlen (n + 1)n , wobei n die Werte 11,101,1001,10001,100001 annimmt. Tipp: digits, reduce. 22. Zifferndarstellung - π: Bestimme die 2759. Nachkommastelle von π. Tipp: n digits, integer part. 23. Primzahlen: Bestimme die Menge und Anzahl aller 6-stelligen Primzahlen. primes range und primes sind nicht erlaubt. Zusatz: was passiert, wenn ich alle 7-stelligen Primzahlen haben will? Tipp: alle erlaubten Befehle, welche prime enthalten, timeit für die Zusatzfrage. 24. Primzahlenzwillinge: Erstelle eine Liste aller Primzahlzwillinge, d.h. Paare von Primzahlen (p, p+ 2), welche kleiner als 8793 sind. Tipp: alle Befehle, welche prime enthalten. zip kann hilfreich sein. Wenn man eine komplizierte Ja/Nein Eigenschaft eines Elements öfters braucht, die Ja-Elemente in ein Set werfen und dann mit x in xset testen. Damit muss man diese nur einmal rechnen. 25. Goldbachsche Vermutung: Zeige, dass jede gerade Zahl zwischen 4 und 8792 als Summe zweier Primzahlen geschrieben werden kann und gib für jede Zahl alle solchen Zerlegungen an. Welche Zahl(en) hat(haben) die meisten Zerlegungen? Tipp: alle Befehle, welche prime enthalten. Nicht immer alles neu berechnen, sondern Listen aufbauen und diese mit Filtern/Loops etc mit immer mehr Information auffüllen (Listen von Tupeln). Gewisse Informationen vorberechnen. 1 26. Primzahlensatz: Der Primzahlsatz gibt eine asymptotische Abschätzung der Häufigkeit von Primzahlen. Wenn π(n) die Anzahl der Primzahlen ≤ n bezeichnet, dann gilt lim n→∞ auch als π(n) ∼ π(n) n ln n = 1, n := f (n) ln n für große n geschrieben. Überprüfe diese Aussage experimentell und vergleiche die beiden Funktionen graphisch in einem gemeinsamen Plot. Die obere Schranke für n soll selbst geeignete gewählt werden, um den Satz graphisch im Plot zu sehen. Tipp: f symbolisch aufstellen. π berechnen, evtl als Liste. list plot, plot sowie alle, welche prime enthalten. Am Anfang mit n ≤ 100 testen und dann die Schranke hochschrauben. Achtung, darauf achten, nicht jedes π(n) von Grund auf neu zu berechnen – man kann sich Daten vorher schon gemeinsam zurechtlegen. 27. Rationale Zahlen: (a) Erzeuge eine aufsteigende Liste aller verschiedenen rationalen Zahlen im Intervall [0, 1], deren Nenner nicht größer als 100 ist. (b) Extrahiere aus der in a erzeugten Liste diejenigen Zahlen, deren Dezimalentwicklung keine Periode länger als 3 enthält. (c) Erstelle eine Statistik der Länge der Periode der Zahlen in der Liste aus a, d.h. eine Aufstellung der vorkommenden Perioden und der jeweiligen Anzahl der Zahlen, welche die gegebene Periode besitzen. Tipp: uniq, period, count. 28. Funktionen höherer Ordnung: Implementiere nachfolgende Funktionen. Wir schreiben B A := {f : A → B} für den Raum der Funktionen von A nach B. (a) “Lifting of a constant to a constant function” = “Hinaufheben einer Konstanten zu einer konstanten Funktion” f: N → NN sodass ∀n, m ∈ N : f (n)(m) = n . (b) “Currying” (strongly related to “partial application” = “partielle Evaluation”) f: N → NN sodass ∀n, m ∈ N : f (n)(m) = n + m . (c) “Function composition” = “Funktionskomposition” f: NN × NN → NN sodass ∀n ∈ N, g, h ∈ NN : f (g, h)(n) = g(h(n)) . Gilt f (g, h) = f (h, g)? (d) “Folds” or “Hylomorphism” f: NN × N4 → N sodass ∀g ∈ NN , n := (ni )4i=1 ∈ N4 : f (g, n) = 4 X (−1)i g(ni ) . i=1 Denken Sie weiters über den Zusammenhang mit reduce nach. 29. Fibonacci: (a) Sei f: N→N wenn n = 1 , 0 n 7→ 1 wenn n = 2 , f (n − 1) + f (n − 2) sonst. Implementiere die Funktion f und und gib eine Liste der ersten 100 Funktionswerte aus. Page 2 (b) f ist eine Rekursion zweiter Ordnung, da f (n) auch von f (n − 2) abhängt. Wir wollen nun eine Funktion finden, welche nur rekursiv erster Ordnung definiert ist, aber sehr ähnlich zu f ist. Betrachten Sie dazu die Funktion g: N2 → N2 (n, m) 7→ (m, n + m) . Implementieren Sie g, und zeigen Sie, dass für eine geeignete Wahl des Starttupels t gilt: G(t) := (g(t), g 2 (t) := g(g(t)), g 3 (t) := g(g(g(t))), . . .) verhält sich sehr ähnlich zu (f (0), f (1), f (2), . . . ). Wie genau? Tipp: Die Folge G(t) nennt sich auch Orbit von t unter g und schreit, als a priori unendliches Objekt, nach einer Implementation mittels Generatorfunktion. Endliche Präfixe dieser Folge mittels list comprehensions oder einem geeigneten Befehl aus dem itertools Paket herausfischen. 0 1 (c) Berechnen Sie den größten Eigenwert λ der Matrix M := . Plotten Sie λn gegen f (n). 1 1 Plotten Sie dies ebenfalls auf logarithmische Skalierung in der Ordinate. Kommentieren Sie und versuchen Sie eine Erklärung. Zum Nachdenken: wie hängt M mit g zusammen? Tipp: CachedFunction, map, matrix, eigenvalues √ 30. Wurzel Approximationen: Wir wollen 2 mit einer rationalen Zahl approximieren. √ (a) 2 ist die positive Lösung von a2 = 2. Daraus leitet sich die Rekursion an+1 := a2n ab. Berechnen Sie a1001 für verschiedene Startwerte a1 . Was fällt Ihnen auf? Warum ist dies so? (b) Eine bessere Rekursion ist durch bn+1 = 2 + b1n =: f (bn ) gegeben. Berechnen Sie mittels Sage, dass die positive√ Lösung der Gleichung f (b) = b, dh ein Fixpunkt der Rekursion, eine einfache Translation von 2 ist. (c) Für b1 = 10 bildet (bn )n∈N eine Cauchy-Folge. Berechnen Sie nun für jedes ε ∈ {10−k : k ∈ √ {1, . . . , 8}} den Index Nε := min{n ∈ N : |bn − 1 − 2| ≤ ε}. (d) Berechnen Sie bn symbolisch als Funktion von b1 für n ∈ {2k : k ∈ {1, . . . , 5}} aus. Dh, nicht für ein fixes, sondern ein variables b1 . (k) (e) Wir bekommen nun für jedes k eine Rekursion für cn := b2k n . Jedes c(k) entspricht einer um den Faktor 2 beschleunigten Folge (was macht c(0) vs c(1) vs c(2) ?) Berechnen Sie die Rekursionen dieser beschleunigten Folgen und damit b232 +216 +28 für b1 = 10 exakt. Hinweis: die Rekursionsgesetze der Beschleunigungen unterliegen wieder einer Rekursion . . . mit dieser geht es schneller. Weiters ist es am schnellsten, b2 , b4 , · · · , c2k symbolisch rekursiv zu berechnen und erst am Ende mit einem Wert für b1 auszuwerten. Tipp: expand, solve, rhs (=“right hand side” of an equation) vars, SR.var, sys.setrecursionlimit, sys.getrecursionlimit, simplify rational 31. Gleichungssysteme: Löse folgende Gleichungen auf möglichst viele verschiedene Arten: (a) 12 + 4y − 3y 3 = 3y 4 + 9y 2 + z 5 , (b) 1 + 5y + y 5 = 0, (c) 2 + 3t − 4s = 0 ∧ 2 − 3t = 3s (System mit 2 Gleichungen in 2 Unbekannten), 2 (d) sin(y) = sin(y) (Wie bekommt man hier alle Lösungen?). Tipp: solve, factor, roots, find root 32. Dreieck: Gegeben seien drei verschiedene Punkte A, B und C im R2 . Sei T das von diesen drei Punkten aufgespannte Dreieck. Benötigte Formeln im folgenden aus den entsprechenden Schulunterlagen, Lehrbüchern, diversen Online-Lexika oder gleich der Encyclopedia of triangle centers heraussuchen. (a) Eine Gerade in Parameterform ist durch die vektorwertige Gleichung ~x = ~b + t~r mit Basisvektor ~b und Richtungsvektor ~r gegeben. Schreiben Sie eine Funktion, welche überprüft, ob zwei solche Geraden parallel sind, und wenn nicht, deren Schnittpunkt ausrechnet. (b) Überprüfen Sie, ob T rechwinkelig und/oder gleichschenklig ist (Bausteine: Länge von Vektoren bzw Winkel zwischen zwei Vektoren ausrechnen). Page 3 (c) Berechnen Sie den Umkreis U (dh Mittelpunkt MU und Radius ru ) von T . (d) Berechnen Sie den Schwerpunkt S von T . (e) Berechnen Sie den Höhenschnittpunkt H von T . (f) Plotten Sie T zusammen mit U , H, S und der Eulerschen Geraden. Tipp: vector, line, point. Mit Vektoren kann man sich einige der benötigten Rechnungen abkürzen, da Methoden wie .dot product, .normalize vorhanden sind bzw Rechnungen sich intuitiv schreiben lassen. Achtung: (1,2)+(3,3)=(1,2,3,3) aber vector((1,2))+vector((3,3))=vector((4,5))! Dh mit Tupeln kann man nicht rechnen, mit Vektoren aber schon. 33. Symbolisches Rechnen: (a) Für einen gegebenen Ausdruck und eine symbolische Variable, finden Sie die Anzahl der Vorkommnisse der Variable im Ausdruck. Beispiel: x kommt in ln(x + xx ) − 2x2 viermal vor. Demonstrieren Sie dies anhand von geeigneten Beispielen, welche mindestens alle Grundrechnungsarten, Winkel-, Exponentialfunktionen, Logarithmen, etc umfassen. (b) Schreiben Sie eine Funktion, welche in einem symbolischen Ausdruck alle Teilausdrücke der Form ln(xy) durch ln(x) + ln(y) und ln(xy ) durch y ln(x) ersetzt. An geeignet schwierigen Beispielen zu testen. Tipp: .operator() und .operands(), op(*arg) um eine Liste im Argument auszupacken, substitute und Varianten davon sind verboten 34. Collatzsche Vermutung: Wir betrachten die Funktion ( n/2 wenn n gerade, f: N → N ] {∞} n 7→ 3n + 1 wenn n ungerade. Zeige, dass (a) Ein Fixpunkt von f ist eine Lösung der Gleichung f (n) = n. Zeige, dass f keinen Fixpunkt kleiner als 10000 besitzt. (b) Wir zeichnen den gerichteten Graphen (im Sinne der Graphentheorie) der Funktion f , für die Werte kleiner als N (frei wählbar, aber nicht zu klein). Dies ist ein Graph mit Knotenmenge V := {1, . . . , N } und einer gerichteten Kante für jedes Paar E := {(n, f (n)) : n ∈ V, f (n) ≤ N }. Plotten Sie den Graphen (Methode .plot mit Optionen beachten). Diskutieren Sie das Resultat. Welche Knoten müssen Sie entfernen, damit der Graph ein Baum (dh kreisloser Graph) wird? Entfernen Sie diese und plotten Sie den Baum. (c) Der Orbit von n unter f ist die (möglicherweise unendliche) Folge (n, f (n), f (f (n)), f (f (f (n))), . . .). Zeige, dass der Orbit jeder natürlichen Zahl kleiner als 1312 nach endlich vielen Schritten 1 enthält. Was bedeutet dies für den weiteren Verlauf des Orbits? (d) Sei f k (n) gleich der k-fachen Iteration von f mit Startwert n. Was sind die Werte von S := max{sn : n ≤ 950} N := max{f k (n) : k ≤ sn , n ≤ 950} . Tipp: filter, exists, DiGraph(data=), addEdge Alle nachfolgenden Aufgaben sind temporär und noch nicht fix! Noch nicht bearbeiten! 35. Sinus exakt: Bestimme sin(pi/24) als Lösung einer Polynomgleichung exakt. 36. Tic-tac-toe: Spielbaum, α − β-Prunning Page 4 37. Tic-tac-toe: Spielbaum, α − β-Prunning 38. Schere-Stein-Papier: Mit Turnier und Tit-for-Tat Strategie? 39. Stirling Zahlen: 40. Pacalsche Pyramide: 41. Nichtnegative Irrfahrten und Catalan Zahlen: Page 5