Dieses Tutorial behandelt die Programmierverfahren, die für die Bearbeitung mathematischer Aufgaben nützlich sind. Dabei werden Aufgaben aus zwei sehr unterschiedlichen Bereichen der Mathematik unter dem gemeinsamen Aspekt der Entwicklung anpassbarer Programme behandelt:
In der Numerischen Mathematik rechnet man mit Gleitkommazahlen. Gleitkommazahlen sind eine technische Realisierung einer endlichen Teilmenge der reellen Zahlen. Die Menge der Gleitkommazahlen ist so konstruiert, dass eine Rechengenauigkeit erzielt werden kann, die für sehr unterschiedliche praktische Probleme ausreichend ist. Trotzdem sind Rundungsfehler gelegentlich ein ernstes Problem.
Die heute meist verwendete Implementierung von Gleitkommazahlen ist durch die Norm IEEE 754 beschrieben. Diese Norm sieht mehrere Zahlenformate unterschiedlicher Genauigkeit vor. Die Zahlenformate in 32-bit-Darstellung (einfache Genauigkeit) und in 64-bit-Darstellung (doppelte Genauigkeit) werden von allen mordernen Rechnern unterstützt. Eine 128-bit-Darstellung (vierfache Genauigkeit) kann in vielen Linux-Systemen mit den Programmiersprachen C und Fortran verwendet werden.
Für Aufgaben, die die Verwendung komplexer Zahlen verlangen, wird aufbauend auf einer zur Verfügung stehenden Realisierung von Gleitkommazahlen eine endliche Teilmenge der komplexen Zahlen konstruiert.
Beim algebraischen Rechnen, das vor allem in der Computeralgebra Anwendung findet, verzichtet man auf das Rechnen mit Gleitkommazahlen. Stattdessen konstruiert man für die Elemente der verwendeten Zahlenmengen Darstellungen, die das exakte Rechnen ermöglichen.
Zu den Zahlenbereichen, die beim algebraischen Rechnen verwendet werden, gehören:
Die Menge der ganzen Zahlen. Elementare Datentypen für die Darstellung ganzer Zahlen stellen eine endliche Teilmenge zur Verfügung. | |
Die Menge der Reste bei Division durch p, wo p meist als Primzahl gewählt wird. Implementierungstechnisch wird zwischen vorzeichenlosen und vorzeichenbehafteten Resten unterschieden. | |
Die Menge der rationalen Zahlen. Der Zähler und der Nenner werden als teilerfremde ganze Zahlen gespeichert; in der Regel wird der Nenner nicht-negativ gespeichert, womit das Vorzeichen im Zähler mitgeführt wird. | |
Die Menge der Gaußschen Zahlen. | |
Die Menge der komplexen Zahlen mit rationalen Koeffizienten. |
Aus diesen Zahlenbereichen kann man durch Hinzunahme (Adjunktion) einer irrationalen Zahl weitere Zahlenbereiche herstellen. So ist etwa
ein Körper, der durch Hinzunahme der Wurzel aus 2 zu den rationalen Zahlen entsteht.
Diese Zahlenbereiche können überdies für die Konstruktion weiterer algebraischer Strukturen verwendet werden. Zu denken ist insbesondere an Polynomringe und an Matrizenringe.
Besonderes Interesse verdienen Algorithmen, die sowohl für das numerische als auch für das algebraische Rechnen bereitgestellt werden können. Zu diesen Algorithmen gehören neben anderen:
Es sollte angestrebt werden, solche Algorithmen so allgemein zu schreiben, dass sie sowohl für die Ausführung mit Gleitkommazahlen als auch für die Ausführung in anderen Zahlenbereichen konkretisiert werden können. Diese Anforderung stellt an die verwendete Programmiersprache hohe Anforderungen. In neueren Programmiersprachen wird man häufig das Sprachmittel Generizität verwenden.
Die Programmierbeispiele sind im Wesentlichen den folgenden Bereichen der Numerik entnommen:
Bei der Programmierung aller behandelten Verfahren wird vor allem angestrebt, Programme zu entwickeln, die möglichst allgemeingültig sind und einfach an spezielle Aufgabenstellungen angepasst werden können.
Die Anpassbarkeit eines allgemeingültig geschriebenen Programms an spezielle Aufgabenstellungen begründet unter anderem die folgenden Anforderungen:
In diesem Themenbereich wird der Aspekt der Anpassbarkeit einer Rechenvorschrift an unterschiedliche Zahlenbereiche ausgeweitet auf die wesentlichsten Strukturen der abstrakten Algebra. Es sind dies:
Unter Anpassbarkeit eines allgemeingültig geschriebenen Programms wird hier die Möglichkeit verstanden, kompliziertere algebraische Strukturen aus einfacheren Strukturen aufzubauen.
In einem Programmierkurs werden einige der behandelten Rechenverfahren ohne Herleitung angegeben und mit der im Kurs verwendeten Programmiersprache implementiert.
In einem Einführungskurs "Numerische Mathematik" werden einige der behandelten Verfahren hergeleitet und ihre Eigenschaften mit verschiedenen Methoden untersucht.
In einem Einführungskurs "Algebra" werden einige der behandelten Aufgaben als Beispiele gezeigt und vielleicht auch mit einem Computeralgebrasystem gerechnet.
Bleibt die Frage, wie der Inhalt dieses Tutorials einzuordnen ist:
Das ist nicht leicht zu sagen, weil mögliche Antworten auch von persönlichen Präferenzen abhängen.
Ein Informatiker würde vielleicht sagen:
Viel zu viel Mathematik! Das braucht kein Mensch!
Ein Mathematiker würde wohl entgegnen:
Viel zu viel Informatik! Das braucht kein Mensch!
Jede dieser Meinungen ist vertretbar. Es ist allerdings nicht möglich, beide Meinungen zugleich zu vertreten.