Johannes Waldmann, HTWK Leipzig
<all>
numerisches Rechnen mit Maschinenzahlen
sqrt 2 + sqrt 3 ==> 3.1462643699419726
(sqrt 2 + sqrt 3)*(sqrt 2 - sqrt 3) ==> ...exaktes Rechnen (mit algebraischen Ausdrücken)
,
maxima: expand(%)
auf konkreten Daten:
let f x = (x+1)^2 in f 3.1 - f 3
auf symbolischen Daten: diff((x+1)^2,x)
subst([x=3],diff((x+1)^2,x))
eigentlich diff(\x -> (x+1)^2)
mit diff::(R -> R) -> (R -> R),
hat weitreichende Anwendungen:
Lösen von (parametrisierten) Aufgabenklassen
(für numerisches Rechnen muß Parameter fixiert werden)
exaktes Lösen von Aufgaben
(numer. R. mit Maschinenzahlen: nur Approximation)
experimentelle, explorative, exakte Mathematik und Programmierung
ist nützlich im Studium, verwendet und vertieft:
Mathematik (Analysis, Algebra)
Algorithmen-Entwurf, -Analyse
Prinzipien von Programmiersprachen
Zahlen (große, genaue)
Vektoren (Gitterbasen)
Polynome
Terme, Term-Ersetzungs-Systeme
(Anwendung: Differentiation, Vereinfachung)
Termination un Vervollständigung v. Reduktionssystemen
für Polynom-Ideale, Anw.: Geometrische Beweise
für Gleichheits-Theorien auf Termen (Knuth-Bendix)
maschinell unterstütztes interaktives Programmieren und Beweisen in konstruktiver Typ-Theorie (Agda)
Wolfram Koepf: Computeralgebra, Springer, 2006. https://www.mathematik.uni-kassel.de/~koepf/CA/
Hans-Gert Gräbe: Einführung in das Symbolische Rechnen, Gröbnerbasen und Anwendungen, Skripte, Universität Leipzig https://www.informatik.uni-leipzig.de/~graebe/skripte/
Franz Baader and Tobias Nipkow: Term Rewriting and All That, Cambridge, 1998. https://www21.in.tum.de/~nipkow/TRaAT/
weitere Literatur siehe z.B. https://portal.risc.jku.at/Members/hemmecke/teaching/ppscs
wir benutzen
ist alles im Pool installiert (ssh, tmux, x2go)
allgemeine Hinweise, auch zum Selbstbauen https://www.imn.htwk-leipzig.de/~waldmann/etc/cas/
Regeln für symbolisches Differenzieren (nach t):
D(t) -> 1 D(constant) -> 0
D(+(x,y)) -> +(D(x),D(y))
D(*(x,y)) -> +(*(y,D(x)),*(x,D(y)))
D(-(x,y)) -> -(D(x),D(y))
Robert Floyd 1967, zitiert in: Nachum Dershowitz: 33 Examples of Termination,
Korrektheit? Termination? Komplexität?
Strategie (Auswahl von Regel und Position)?
ausreichend? angemessen?
data E = Zero | One | T
| Plus E E | Times E E deriving Show
e :: E
e = let b = Plus T One in Times b b
d :: E -> E
d e = case e of
Zero -> Zero ; One -> Zero ; T -> One
Plus x y -> Plus (d x) (d y)
Times x y ->
Plus (Times y (d x)) (Times x (d y))
http://wayback.cecm.sfu.ca/projects/ISC/ISCmain.html (kaputt)
zur Bestimmung ganzzahliger Relationen (z.B. zwischen Potenzen einer numerisch gegebenen Zahl)
sqrt(2+sqrt 3) ==> 1.9318516525781366
integer relations algorithm, run:
K = 1.9318516525781366
4 2
K satisfies the polynomial, X - 4 X + 1
mit LLL-Algorithmus (Lenstra, Lenstra, and Lovasz, 1982), der kurzen Vektor in geeignetem Gitter bestimmt.
zum Haskell-Programm zum Symb. Differenzieren:
füge Syntax und Regel für Quotienten hinzu
schlage Regeln zur Vereinfachung vor
ISC Simple Lookup and Browser sagt für :
Mixed constants with 5 operations
1931851652578136 = 1/2/sin(Pi/12)
begründen Sie das (geometrisch oder schriftlich)
ein Polynom mit Nullstelle bestimmen, nachrechnen.
Geonext: Satz von Napoleon illustrieren (gleichseitige Dreiecke über den Seiten eines beliebigen Dreiecks)
eigener Rechner: rlwrap maxima installieren,
Rechner im Pool: ssh und tmux ausprobieren,
auch Management von Sessions, Windows, Panes (split horizontal,
vertikal), vgl. https://news.ycombinator.com/item?id=26670708
Organisatorisches:
in Gitlab.Dit-Projekt einschreiben
Hausaugabe: Wiki anmelden, Issue: diskutieren, ggf. MR
Prüfungszulassung: Hausaufgaben, autotool (empfohlen, nicht erzwungen)
Prüfung: Klausur, ggf. Hilfspunkte aus Projekt ( ausgearbeitete Hausaufgabe o.ä.)
exakte Zahlen: natürlich, ganz, rational
Darstellungen: Positionssystem, Bruch
Rechnungen: Addition, Multiplikation
beliebig genau genäherte Zahlen
(berechenbare reelle Zahlen)
Darstellungen: Positions-System, Kettenbruch
Rechnungen: arithmetische und irrationale Funktionen
später:
exaktes Rechnen mit algebraischen Zahlen
die Zahl im Positionssystem zur Basis :
mit und endlich
Bsp:
Darstellung ist eindeutig, kann durch fortgesetzte Division mit Rest bestimmt werden
praktisch wählt man die Basis
10 für schriftliches Rechnen
historisch auch 60 (Zeit- und Winkelteilung)
2 (oder ) binäre Hardware, maschinennahe Software
Darstellung
type Digit = Word64 ; data N = Z | C Digit N
Semantik
value :: N -> Natural
value Z = 0 ; value (C x xs) = x + 2^64 * value xs
Rechnung
instance Num N where (+) = plus_carry False
plus_carry :: Bool -> N -> N -> N
plus_carry cin (C x xs) (C y ys) =
let z = bool 0 1 cin + x + y
cout = z < x || z < y || ...
in C z (plus_carry cout xs ys)
plus_carry ...
anstatt „Schulmethode“: rekursive Multiplikation
Bsp. ,
Anzahl elementarer Operationen (Plus, Mal) für Multiplikation -stelliger Zahlen nach diesem Verfahren
, also
also wie bei Schulmethode, aber das läßt sich verbessern, und darauf muß man erstmal kommen
Anatoli Karatsuba, Juri Ofman 1962
Anzahl elementarer Operationen (Plus, Mal) für Multiplikation -stelliger Zahlen nach diesem Verfahren
(eine Multiplikation weniger, drei Additionen mehr)
asymptotisch mit Ansatz
, also
explizite Werte für ,
ab wann besser als Schulmethode?
für , ,
bestimme mit
Karatsuba (je zwei Blöcke) , , dann
Andrei Toom 1963: drei Blöcke, fünf Produkte:
, , , (Übung)
Linearkombinationen (Bsp.)
Zeit ,
Blöcke: Exponent , aber steigende Faktoren
Schönhage, Strassen 1971:
Harvey, van der Hoeven 2019:
Darstellung: Bsp GMP (GNU Multi Precision Library)
Natürliche Zahl (magnitude) mit Vorzeichen (sign)
nicht Zweierkomplement, denn das ist nur für Rechnungen modulo sinnvoll
GHC (integer-gmp)
data Integer = S Int | Jp BigNat | Jn BigNat
data BigNat = BN ByteArray
NB: ganzzahlige Zahlbereiche in Haskell/GHC:
Int (ist immer die falsche Wahl)
Maschinenzahlen (mod
):
Int64, Word64,
beliebig große: Integer,
Numeric.Natural
rationale Zahl ist Paar von ganzen Zahlen
data Q = Q Integer Integernormalisiert: und
normalisierte Darstellung ist eindeutig
Vorteil:
semantische Gleichheit (dieselbe Zahl wird bezeichnet) ist syntaktische Gleichheit (der Komponenten)
Nachteil (?)
nach jeder arithmetischen Operation normalisieren
nicht normale Zahlen verhindern: Konstruktor Q nicht
exportieren (sonst let q = Q 8 12)
Funktion
,
Zähler (und Nenner) in jedem Schritt (wenigstens) quadriert, d.h., Stellenzahl verdoppelt (Bsp: )
das ist typisch für Folgen arithmetischer Op.,
Normalisierung wirkt nur selten verkleinernd.
die Folge nähert an:
Konvergenz ist quadratisch (jeder Schritt quadriert den Fehler, verdoppelt Anzahl gültiger Stellen)
Darstellug von Zahlen in
mit Basis und Ziffern
Bsp: ,
hier sind auch unendliche Ziffernfolgen sinnvoll,
bezeichnet Limes der Werte der endlichen Partialfolgen
Konversion
decimal :: Rational -> [ Nat ]
decimal x = let q = truncate (fromRational x)
in q : decimal (10 * (x-q))
Anwendung: vorige Näherung von
beschrieben wird hier nicht die exakte (symbolische) Rechnung, sondern eine konvergente Näherung
Def. reelle Zahl mit heißt berechenbar (zur Basis ), wenn die Funktion , welche die Darstellung von zur Basis bestimmt, berechenbar ist (z.B. durch eine Turingmaschine)
jede rationale Zahl ist berechenbar
(Beweis: Dezimalbruch ist endlich oder periodisch)
ist berechenbar (Beweis: vorige Folge )
Menge der berechenbaren Zahlen ist abgeschlossen unter arithmetischen Operationen (und weiteren)
Satz von Taylor: wenn oft genug diff-bar,
dann
mit
Bsp: , dann und
take 100 $ decimal
$ sum $ take 100 $ scanl (/) (1::Rational) [1..]
==> [2,7,1,8,2,8,1,8,2,8,4,5,9,0,4 ... ]
Fehlerabschätzung? (reicht die zweite 100 für die erste?)
, diese Reihe konvergiert schneller
Taylor-Reihe von an der Stelle 1
Ableitungen mit maxima:
diff(sqrt(x),x,5);
diff(sqrt(x),x,6);
Vermutung
für : Berechnung als konvergiert langsam
besser:
Taylor-Entwicklung
konvergiert sehr langsam für , gar nicht für größere .
J.R. Young, 1835, siehe v. Mangoldt/Knopp, Bd. 2, S. 127 Umstellung ergibt Aufgaben:
alle Koeffizienten ausrechnen
wie genau sind die Werte für usw., wenn man nur die erste Näherung benutzt, also
woher bekommt man geeignete Brüche (z. B. für )?
darüber gibt es ganze Bücher (Aufgabe: finde Beispiele)
Ansatz: Taylor-Entwicklung von
betrachte , ,
bestimme (ist nahe bei 1)
bestimme
und mit (ist nahe bei 0)
(J. Machin, 1706, 100 Stellen; W. Shanks, 1873, 707 St.)
auf Gleitkomma-Zahlen begrenzter Stellenzahl
in CPU/FPU, durch Microcode, Polynom-Approximation
Ken Shirriff Pi in the Pentium https://www.righto.com/2025/01/pentium-floating-point-ROM.html
in spezieller Hardware (Wertetabelle)
Ken Shirriff Reverse Engineering the Yamaha DX7 synthesizer’s sound chip https://www.righto.com/2021/11/reverse-engineering-yamaha-dx7.html
WS26 empfohlen: 2, 4, 6 (andere sind nicht verboten)
Multiplikation in GMP (GNU Multiprecision Library) https://gmplib.org/manual/Multiplication-Algorithms
Karatsuba-Rechnung ist dort etwas anders als hier auf der Folie, warum?
GHC verwendet GMP für den Typ Integer.
Bestimmen Sie experimentell den Anstieg der Rechenzeit bei Verdopplung der Stellenzahl, z.B.
:set +s
x = 10^10^8 :: Integer
odd x -- damit x ausgewertet wird
odd ((x-1)*(x+1)) -- die eigentliche Messung
True
(3.73 secs, 166,159,792 bytes)
y = x*x -- hat doppelte Stellenzahl
Ist die Anzahl der Bytes plausibel?
Diskutieren Sie mögliche verkürzte Auswertungen für
odd .... Kann GMP/GHC das?
Zusatz: warum ist (oder erscheint) (x+1)^2 schneller
als (x+1)*(x+1)?
zu Multiplikation nach Toom (3 Blöcke): ergänzen Sie den Ausdruck sowie die fehlenden Linearkombinationen
diskutieren (Zusatz: implementieren) Sie die Darstellung von ganzen Zahlen mit negativer Basis
(und nichtnegativen Ziffern wie bisher)
Bsp: ,
Eindeutigkeit, Konstruktion
Arithmetik (Nachfolger, Addition, Multiplikation)
Bestimmen Sie die Taylor-Reihe für den Arcustangens an der Stelle 0
wie auf Folie Potenzreihe für Wurzelfunktion
Bestimmen Sie damit auf (z.B.) 20 Stellen.
Begründen Sie . Rechnen Sie den Wert für aus und vergleichen Sie mit einer verläßlichen Quelle.
Kann man nach diesem Verfahren, aber mit anderen Parametern, besser bestimmen? (mehr Stellen bei gleichem Aufwand)
Bestimmen Sie die Taylor-Reihe für den (natürlichen) Logarithmus an der Stelle 1. Bestimmen Sie damit auf (z.B.) 100 Stellen und daraus als eine Linearkombination.
wie bestimmt man , ,
Hinweis: als Fixpunkt von ,
diese Gewichte ergeben quadratische Konvergenz,
ist äquivalent zu Bestimmung der Nullstelle von nach Newton-Verfahren:
Was macht dieses Programm?
int n = 1000;
int [] d = new int [n];
for (int i=2; i<n; i++) { d[i]=1; }
for (int j=2; j<n; j++) {
int c = 0;
for (int i=n-1; i>=1; i--) {
int h = 10 * d[i] + c;
d[i] = h % i; c = h / i;
}
System.out.print(c); System.out.flush();
}
Ist die Ausgabe korrekt? Wie weit darf man n
erhöhen?
Jerzy Karczmarczuk: The Most Unreliable Technique in the World to compute pi, 2003? https://web.archive.org/web/20051017081559/http://users.info.unicaen.fr/~karczma/arpap/lazypi.ps.gz
(15) Einleitung, symbolisches Diff.
(17) Automatisches Differenzieren
(19) Polynome (Repräsent., Operationen) Polynomideale
(20) Monom-Ordnungen, Gröbnerbasen (GB)
(21) Anwendung GB in Geometrie
(23) abstrakte Reduktionssysteme (ARS) Term-Ersetzungs-Systeme (TRS)
(24) Termination
(25) Unifikation, Vervollständigung
(26) Curry-Howard-Isomorphie (Programm Beweis), (daten)abhängige Typen
(27) interaktives Beweisen
(28) Zusammenfassung, Ausblick