Computermathematik: Aufgabenblatt Sage

Werbung
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
Herunterladen