Computer-Algebra
aus Wikipedia, der freien Enzyklopädie
Die Computer-Algebra ist das Teilgebiet der Mathematik, das sich mit der symbolischen Manipulation algebraischer Ausdrücke beschäftigt. Hauptziel dieses Teilgebiets ist es, für alle denkbaren Aufgaben im Umfeld des exakten Rechnens mit algebraischen Ausdrücken möglichst effiziente Algorithmen zu finden sowie deren Komplexität zu ermitteln (über die Komplexitätstheorie sind hier die Disziplinen Mathematik und Informatik ganz eng miteinander verwoben). Einen Schwerpunkt bildet das exakte Rechnen mit ganzen, rationalen und algebraischen Zahlen sowie mit Polynomen über diesen Zahlenräumen.
Praktische Anwendung erfahren solche Ergebnisse durch den Einsatz effizienter Algorithmen bei der Entwicklung und Verbesserung von Computer-Algebra-Systemen, die die rechnergestützte Manipulation algebraischer Ausdrücke ermöglichen. Diese Systeme sind auch ein immer wichtiger werdendes Werkzeug für Mathematiker und Naturwissenschaftler verschiedenster Fachrichtungen. Damit mit Computer-Algebra-Systemen erzeugte Ergebnisse in der Mathematik als Beweis anerkannt werden können, muss allerdings erheblicher Entwicklungsaufwand betrieben werden, um sie 100 % zuverlässig machen zu können. Kommerziell erfolgreiche Computer-Algebra-Systeme erfüllen diese Zuverlässigkeit derzeit nur in stark eingeschränkten Teilbereichen.
Die Fülle an verfügbarem Wissen aus der Computer-Algebra ist in der Literatur überwiegend schwer auffindbar, da es meist in anderen Teilgebieten der Mathematik und noch mehr der Informatik veröffentlicht wird.
[Bearbeiten] Effiziente exakte Arithmetik mit ganzen Zahlen
Will man die Zeitkomplexität von Aufgaben und Algorithmen zur exakten Arithmetik mit ganzen Zahlen klassifizieren, so muss zunächst ein Rechnermodell zugrunde gelegt werden. Eine Diskussion diverser Rechnermodelle findet sich im Kapitel Komplexität. Ein relativ eingängiges Modell ist die Mehrband-Turingmaschine, eine Variante der klassischen Turingmaschine, die mehrere Bänder mit je einem Schreib-/Lesekopf besitzt. Für Komplexitätsabschätzungen mit der Landau-Notation wird bei Bedarf unter der Bezeichnung ein Logarithmus zu einer nicht spezifizierten Basis B > 1 verwendet. Als Maß für die Zeit wird die Zahl der benötigten Bitoperationen gewählt, die in Landau-Notation von der Bitlänge des Inputs abhängig gemacht wird.
Die präzise mathematische Angabe von (Bit-)Komplexitäten für die exakte Arithmetik mit ganzen Zahlen muss zunächst mit der genauen Festlegung der Bitlänge einer ganzen Zahl starten: Ist die Zahl nichtnull, so wird
gesetzt; zusätzlich wird L(0): = 1 definiert. Man beachte, dass für eine konkrete Abspeicherung einer ganzen Zahl zusätzlich mindestens noch ein Bit für das Vorzeichen der Zahl benötigt wird.
Eine - oft vernachlässigte - Aufgabe eines Algorithmus ist das Herausschreiben des Outputs; hier sind zunächst folgende Abschätzungen dienlich:
Für alle Zahlen und gilt:
- ,
- ,
- .
Die Aufgaben der Vorzeichenbestimmung , der Berechnung des Negativen − a sowie der Betragsbildung | a | sind alle in linearer Zeit O(l) mit l = L(a) durchführbar; die Addition a + b sowie der Vergleich zweier Zahlen a < b sind in linearer Zeit O(l) mit l = max(L(a),L(b)) zu bewältigen. Der n-Shift ist in O(n + l) durchführbar.
Sind zwei „ungleich“ große Zahlen a und b zu addieren, so definieren wir mit
die kleinere der beiden Bitlängen des Inputs. Es wird immer wieder behauptet, dass die Addition in durchführbar sei. Dies ist allerdings aufgrund der Möglichkeit eines Übertrages bis zum höchstwertigen Bit der größeren Zahl (englisch „carry propagation“) falsch.
Ein erstes schönes, echt nicht-triviales Ergebnis der Computer-Algebra ist die Erkenntnis, dass die Multiplikation wesentlich schneller als in (was dem naiven Multiplikationsalgorithmus entspricht) lösbar ist. Eine Beschleunigung erreichte zunächst Karatsuba mit dem Karatsuba-Algorithmus; dieser wurde dann als ein Spezialfall einer noch allgemeineren Algorithmenfamilie erkannt, die unter den Begriff Toom-Cook-Algorithmus subsumiert werden. Bahnbrechend war dann der von Arnold Schönhage und Volker Strassen 1971 vorgestellte auf diskreten Fourier-Transformationen basierende Schönhage-Strassen-Algorithmus, für den die Autoren selbst eine Komplexität von
nachwiesen. Bedenkt man, wie aufwendig der „naive“ Multiplikationsalgorithmus ist, so erscheint diese Komplexität unglaublich „schnell“. Da der Algorithmus allerdings ziemlich komplex und schwierig programmierbar ist, haben Scharen von Programmierern einen Bogen um ihn gemacht; er wartet bis heute auf eine effiziente Implementierung in einem Computer-Algebra-System. Eine Teilimplementierung des Algorithmus von Schönhage und Strassen wurde von Daniel J. Bernstein verwirklicht.
Da diese Komplexität der Integer-Multiplikation in der gesamten Computer-Algebra von absolut tragender Bedeutung ist, wurde hierfür eine Kurznotation
eingeführt.
Sind zwei „ungleich“ große Zahlen a und b zu multiplizieren, so kann man eine für Folgeabschätzungen sehr wichtige Verfeinerung der Komplexitätsabschätzung vornehmen: Dann ist die Multiplikation sogar in
durchführbar. Der Beweis hierfür ist durchaus schon etwas aufwändiger.
Ausgestattet mit dieser „schnellen“ Integer-Multiplikation kann nun der Katalog der Grundrechenarten für die Arithmetik in wie folgt vervollständigt werden:
Die Aufgabe der Berechnung von an ist in durchführbar; für die (simultane) Berechnung der Binomialkoeffizienten wird benötigt. Die ganzzahlige Division a / b (mit Quotient und Rest als Ergebnis) benötigt
- .
Die Berechnung des größten gemeinsamen Teilers gcd(a,b) benötigt
- .
In gleicher Komplexität ist auch gcdex(a,b) berechenbar, d. h. die Kofaktoren u,v mit gcd(a,b) = ua + vb werden mitberechnet.
[Bearbeiten] Effiziente exakte Arithmetik mit rationalen Zahlen
Bevor exakte Arithmetik in konkret durchgeführt werden kann, muss erst eine kanonische Darstellung (Repräsentation) rationaler Zahlen gefunden werden; dieses Problem tauchte bei der exakten Arithmetik der ganzen Zahlen noch nicht auf. Rationale Zahlen sind Äquivalenzklassen „bedeutungsgleicher“ Brüche aus ganzen Zahlen; zum Beispiel sind und unterschiedliche Repräsentanten der gleichen rationalen Zahl.
Die gängigste kanonische Darstellung rationaler Zahlen wird festgelegt, indem alle gemeinsamen Teiler aus Zähler und Nenner herausgekürzt werden: Jede rationale Zahl ist dann eindeutig durch einen gekürzten Bruch
- mit , und ggT(p,q) = 1
repräsentierbar. Ist diese Festlegung einmal getroffen, so beinhaltet jede elementare Operation in wie Addition und Multiplikation auch notwendigerweise die Aufgabe des Herauskürzens des größten gemeinsamen Teilers aus Zähler und Nenner des Ergebnisbruches.
Dank der Resultate der exakten Arithmetik in sind damit die Operationen alle in der Komplexität
durchführbar. Von der Hoffnung, die Addition rationaler Zahlen in linearer Komplexität bewerkstelligen zu können, muss man hierbei Abschied nehmen.
Glücklicherweise kann die Berechnung des größten gemeinsamen Teilers sehr effizient mit Hilfe des Euklidischen Algorithmus berechnet werden. Der Euklidische Algorithmus spielt an vielen Stellen in der Computeralgebra in wechselnden Varianten eine tragende Rolle.
[Bearbeiten] Effiziente exakte Arithmetik mit rationalen Polynomen in
Es genügt hierbei, die Arithmetik in zu betrachten, da Operationen mit rationalen Polynomen in naheliegender Weise durch jeweiliges Ausklammern der Hauptnenner auf Operationen mit ganzzahligen Polynomen zurückgeführt werden können. Für Polynome definiert man die (Koeffizienten-) Länge L(f) als das Maximum der Längen der einzelnen Koeffizienten.
Für die folgende Laufzeitentabelle wichtiger Berechnungsprobleme in setzen wir folgendes voraus:
- vom Grad df = degf bzw. dg = degg, ferner ,
- von der Länge lf = L(f) bzw. lg = L(g), ferner l = max(lf,lg) und lm = min(lf,lg),
- daneben sei mit Bitlänge la = L(a).
Dann führen die (gemäß Bitkomplexität) schnellsten bislang bekannten Algorithmen zu folgender Laufzeittabelle:
Operation | Komplexität als | bei ungleichen Eingabegrößen |
f + g | ||
ψ(d(l + logd)) | ||
f / g Division mit Rest | ψ(d(l + logd)) | |
− | ||
fk | ψ(kd(l + logd)) | − |
f(ax) Skalierung | − | |
Skalierung | − | |
f(2x) Skalierung | d(l + d) | − |
Skalierung | d(l + d) | − |