Rechner-Arithmetik

Werbung
Rechner-Arithmetik
Vorlesung im SS 2001/2002
Norbert Th. Müller
Abteilung Informatik
Universität Trier
Wenn man den Rechner zu seiner namensgebenden Aufgabe, dem Rechnen, einsetzen will, sollte man die
Arbeitsweise und die Grenzen der einbauten Arithmetik kennen. Als Beispiel kann die folgende einfache
Iteration dienen, bei der nach wenigen Operationen das Resultat bereits vollkommen verfälscht ist:
xi+1 = 3.75 · xi · (1 − xi ),
x0 = 0.5
Bereits bei x100 sind alle mit herkömmlicher Arithmetik berechneten Stellen falsch:
x60
x70
x80
x90
x100
x110
exakte Arithmetik
+.7990863343...
+.4521952998...
+.8561779966...
+.7399137486...
+.8882939922...
+.7156795292...
Java double
0.79908633 70...
0.4521952 586...
0.85617 59906...
0.7 400517104...
0. 9017659679...
0. 2201217854...
In der Vorlesung werden die grundlegenden Algorithmen und Datenstrukturen besprochen, die für die
Arithmetik bei existierender Hardware und insbesondere bei Software-Lösungen eingesetzt werden, und
mit deren Hilfe man Effekte wie oben verstehen und oft auch vermeiden kann. Themen sind unter anderem:
Vom Bit zur Zahl — elementare Arithmetik — schnelle Multiplikation — rationale Arithmetik — Fließkomma-Zahlen — IEEE 754/854 Fließkomma-Standard — MP-Pakete: GMP und
MPFR — Reduktionsmethoden in der Arithmetik — Intervall-Arithmetik — Pi und das AGM
— modulare und redundante Zahl-Darstellungen — exaktes Rechnen mit reellen Zahlen —
Zahldarstellungen in Highlevel-Paketen — symbolisches Rechnen — Rechnen mit arithmetischen Zahlen
Inhaltsverzeichnis
Literatur
Inhaltsverzeichnis
1 Einleitung
1.1 ganzzahlige Arithmetik .
1.2 Lineare Algebra . . . . .
1.3 Grenzwerte . . . . . . .
1.4 Iterierte Funktionen . . .
1.5 Die Ariane-5-Explosion .
1.6 Der Pentium-Bug . . . .
1.7 Der Patriot-Scud-Vorfall
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
6
7
7
9
9
10
12
2 Natürliche / ganze Zahlen
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2.2 Ganze Zahlen . . . . . . . . . . . . . . . . . . . .
2.3 Die Multiplikation natürlicher Zahlen . . . . . . .
2.4 Divisions-Algorithmen . . . . . . . . . . . . . . .
2.5 Redundante Zahl-Notationen . . . . . . . . . . . .
2.6 Modulare Arithmetik . . . . . . . . . . . . . . . .
2.7 Kompakte Notationen . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
13
26
28
31
33
35
36
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Rechnen mit rationalen Zahlen
38
4 Fließkomma-Arithmetik
42
5 Intervall-Arithmetik
68
6 Darstellungen und Orakel-Turingmaschinen
72
7 Berechenbarkeit und topologische Räume
85
Literatur
[Av61] A. Avizienis, Signed-Digit Number Representations for Fast Parallel Arithmetic, IRE Transactions on Electronic Computers Vol. EC-10 (1961) 389-400 34
[Ba88] D.H. Bailey, The computation of π to 29,360,000 Decimal Digits Using Borweins Quartically Convergent
Algorithm Mathematics of Computation Vol. 50 Number 181 (1988) 238-296
[Bo87] J.M. Borwein & P.B. Borwein, Pi and the AGM, A study in analythic number theory, Wiley, New York,
1987
[BoCa90] H. Boehm & R. Cartwright, Exact Real Arithmetic: Formulating real numbers as functions. In T. D.,
editor, Research Topics in Functional Programming, 43-64 (Addison-Wesley, 1990)
[BSS89] L. Blum & M. Shub & S. Smale, On a theory of computation and complexity over the real numbers:
NP-completeness, recursive functions and universal machines, Bulletin of the AMS 21, 1, July 1989
[Bt75] R.P. Brent, The complexity of multiple precision arithmetic, Proc. Seminar on Complexity of Computational
Problem Solving, Queensland U. Press, Brisbane, Australia (1975) 126-165
2
Literatur
Literatur
[Bt76] R.P. Brent, Fast multiple precision evaluation of elementary functions, J. ACM 23 (1976) 242-251
[Bt78] R.P. Brent, A Fortran multiple precision package, ACM Trans. Math. Software 4 (1978), pp 57-70
[Br96] V. Brattka, Recursive characterisation of computable real-valued functions and relations, Theoret. Comput.
Sci. 162 (1996),47-77
[Br99] V. Brattka, Recursive and Computable Operations over Topological Structures, Thesis, Informatik Berichte
255 - 7/1999, FernUniversität Hagen
[BrHe94] V. Brattka & P. Hertling, Continuity and Computability of Relations, Informatik Berichte 164 - 9/1994,
FernUniversität Hagen,
[BrHe95] V. Brattka & P. Hertling, Feasible Real Random Access Machines, Informatik Berichte 193 - 12/1995,
FernUniversität Hagen,
[BrHe98] V. Brattka & P. Hertling, Feasible Real Random Access Machines, Journal of Complexity 14(4):490526,1998
[Bro12] L. E. J. Brouwer, Über Abbildungen von Mannigfaltigkeiten. Math. Ann.,71:97-115, 1912 71
[CoAa89] Cook, S.A. und Aanderaa, S.O., On the minimum computation time of functions, Trans. Amer. Math. Soc.
142 (1969) 291-314
[EdPo97] A. Edalat & P. Potts, A new representation for exact real numbers, Proc. of Mathematical Foundations of
Programming Semantics 13, Electronic notes in Theoretical Computer Science 6, Elsevier Science B.V., 1997,
URL: www.elsevier.nl/locate/entcs/volume6.html
[FiSt74] Fischer, M.J. und Stockmeyer, L.J. Fast on-line integer multiplication, J. Comput. System Scis. 9 (1974)
317-331
[Gr02] T. Granlund, GMP 4.0, http://www.swox.com/gmp/ 24
[GL00] P. Gowland, D. Lester, The Correctness of an Implementation of Exact Arithmetic, 4th Conference on Real
Numbers and Computers, 2000, Dagstuhl, 125-140
[HM00] S. Heinrich & E. Novak et al., The Inverse of the Star-Discrepancy depends linearly on the Dimension,
Acta Arithmetica, to appear
[HS66] F. C. Hennie and R. E. Stearns, Two-tape simulation of multitape Turing machines Journal of the ACM,
13(4):533-546, 1966 18
[Ka96] W. Kahan, IEEE Standard 754 for Binary Floating Point Arithmetic, URL: www.cs.berkeley.edu/˜wkahan/ieee754status/ieee754.ps, 1996
[Ke96] R. B. Kearfott. Interval computations: Introduction, uses, and resources. Euromath Bulletin, 2(1):95-112,
1996. 68, 71
[Kl93] R. Klatte & U. Kulisch et al., C-XSC , a C++ Class Library for Extended Scientific Computing (Springer,
Berlin 1993)
[Kn73] Knuth, Donald Ervin : The Art Of Computer Programming (Volume 1 / Fundamental Algorithms ). Second
Edition. Reading: Addison-Wesley, 1981. 39
[Kn81] Knuth, Donald Ervin : The Art Of Computer Programming (Volume 2 / Seminumerical Algorithms ). Second
Edition. Reading: Addison-Wesley, 1981. 13, 31, 32, 36
3
Literatur
Literatur
[Ko91] K. Ko, Complexity Theory of Real Functions, (Birkhäuser, Boston 1991) 72
[KoFr88] Ko, K., Friedman, H., Computing Power Series in Polynomial Time, Adv. in Appl. Mathematics 9 (1988)
40-50
[Ku96] U. Kulisch, Memorandum über Computer, Arithmetik und Numerik (Universität Karlsruhe, Institut für angewandte Mathematik) 7, 9
[Mm96] V. Ménissier-Morain, Arbitrary precision real arithmetic: design and algorithms, J. Symbolic Computation,
1996, 11 8
[MJM89] Jean-Michel Muller, Arithmetique des Ordinateurs, Masson, Paris, 1989 7
[MJM97] Jean-Michel Muller, Elementary Functions, Birkhäuser, Boston, 1997 47
[Mo62] R. E. Moore, Interval Arithmetic and Automatic Error Analysis in Digital Computing, Ph.d. Dissertation, Department of Mathematics, Stanford University, Stanford, California, Nov. 1962. Published as Applied
Mathematics and Statistics Laboratories Technical Report No. 25. 68
[Mu86] N.Th. Müller, Subpolynomial complexity classes of real functions and real numbers, Proc. 13th ICALP,
Lecture notes in computer science 226 (Springer, Berlin) pages 284-293 (1986) 34
[Mu87] N.Th. Müller, Uniform computational complexity of Taylor series, Proc. 14th ICALP, Lecture notes in
computer science 267 (Springer, Berlin) pages 435-444 (1987) 34
[Mu88] N.Th. Müller, Untersuchungen zur Komplexität reeller Funktionen, Dissertation (FernUniversität Hagen,
1988)
[Mu93] N.Th. Müller, Polynomial Time Computation of Taylor Series, Proc. 22 JAIIO - PANEL ’93, Part 2, Buenos
Aires, 1993, 259-281
(also available at http://www.informatik.uni-trier.de/˜mueller)
[MuMo93] Müller, N.Th. & Moiske, B., Solving initial value problems in polynomial time, Proc. 22 JAIIO - PANEL ’93, Part 2, Buenos Aires, 1993, 283-293 (URL:
http://www.informatik.uni-trier.de/˜mueller)
[Mu96] N.Th. Müller, Towards a real Real RAM: a Prototype using C++, (preliminary version), Second Workshop
on Constructivity and Complexity in Analysis, Forschungsbericht Mathematik-Informatik, Universität Trier 9644, Seiten 59-66 (1996) (URL: http://www.informatik.uni-trier.de/˜mueller)
[Mu97] N.Th. Müller, Towards a real RealRAM: a Prototype using C++, Proc. 6th International Conference on
Numerical Analysis, Plovdiv, 1997
[Mu98] N.Th. Müller, Implementing limits in an interactive RealRAM, 3rd Conference on Real Numbers and Computers, 1998, Paris, 13-26 (URL: http://www.informatik.uni-trier.de/˜mueller)
[Mu01] N.Th. Müller, The iRRAM: Exact Arithmetic in C++, Computability and Complexity in Analysis CCA2000, Lecture notes in computer science 2064 (Springer, Berlin, 2001) 222-252 40, 48
[Mu02] N.Th. Müller, Real Numbers and BDDs, Electronic Notes in Theoretical Computer Science, Vol. 66.1, 2002
35
[Pa00] B. Parhami, Computer Arithmetic: Algorithms and Hardware Designs, Oxford University Press, New York,
2000 24, 28, 29, 34, 42
[PFM74] Patteron, Fischer, Meyer, An Improved Overlap Argument for On-Line Multiplication SIAM-AMS Proceedings Vol 7, 97-111, 1974 31
4
Literatur
Literatur
[Rio94] M. Riordan, ftp://ripem.msu.edu/pub/bignum/BIGNUMS.TXT
[Sch80] A. Schönhage, Storage Modification Machines, SIAM J. on Computing 9(3):490-508, 1980 31
[Sch90] A. Schönhage, Numerik analytischer Funktionen und Komplexität, Jber. d. Dt. Math.-Verein. 92 (1990)
1-20
[TZ99] J.V. Tucker, J.I. Zucker, Computation by ‘While’ programs on topological partial algebras, Theoretical Computer Science 219 (1999) 379-420
[We87] K. Weihrauch, Computability (volume 9 of: EATCS Monographs on Theoretical Computer Science), (Springer, Berlin, 1987) 13
[We94] Weihrauch, K., Grundlagen der effektiven Analysis, correspondence course, FernUniversität Hagen, 1994
[We95] K. Weihrauch, A Simple Introduction to Computable Analysis, Informatik Berichte 171 - 2/1995, FernUniversität Hagen 72
[We96] Weihrauch, K., Computability on the probability measures on the Borel sets of the unit interval, in: Second
workshop on computability and complexity in analysis, Universität Trier, Mathematik - Informatik, technical
report 96-44
[We97] K. Weihrauch, A Foundation for Computable Analysis, Proc. DMTCS´96, (Springer, Singapore, 1997) 6689 72
[We00] K. Weihrauch, Computable Analysis. An Introduction, Springer, Berlin 2000 36, 48, 72
[Zi00] P. Zimmermann, MPFR: A Library for Multiprecision Floating-Point Arithmetic with Exact
Rounding, 4th Conference on Real Numbers and Computers, 2000, Dagstuhl, 89-90, see also
http://www.loria.fr/projets/mpfr/ 46
5
1 EINLEITUNG
1 Einleitung
Stichworte: Integer-Überlauf, Beispiele von Kulisch und Jean-Michel Muller... Ariane-5, Patriot-Scud,
Pentium-Bug
Wenn man mit dem Rechner rechnet, so treten gelegentlich unerwartete Effekte auf, die zeigen, dass es
wichtig ist, sich der Möglichkeiten und Grenzen der Arithmetik von Computern bewusst zu werden. In
dieser Vorlesung werden wir Hardware- und Software-Lösungen zur Arithmetik auf verschieden Zahlmengen untersuchen, wobei sowohl praktische als auch theoretische Aspekte Beachtung finden.
In der englischen Sprache bedeuted hat das Wort arithmetic ebenso wie das Wort compute auch die einfache Bedeutung Rechnen, frei übersetzt heißt der Titel Rechnerarithmetik dieser Vorlesung also RechnerRechnen. Viele heutige Anwendungen von Rechner rechnen kaum noch, sondern sie werten nur noch aus,
was einer weiteren Bedeutung des Wortes Computer (der Auswerter) eigentlich näher kommt.
Im Internet findet man eine Bibliography zum Thema Computer Arithmetic unter liinwww.ira.uka.de/bibliography/Th
(von Peter Kornerup, eher praxisorientiert, mit z.Zt. ca. 600 Artikeln) unv zum Thema Constructivity, Computability and Complexity in Analysis (eher theorieorientiert, Vasco Brattka et.al. ca 500 Artikel) unter www.informatik.fernuni-hagen.de/import/cca/publications/bibliography.html Weitere themenrelevante Links sind:
• www.cs.wisc.edu/ arch/www/
• www.cs.wisc.edu/ arch/sigarch/SIGARCH.html ACM Special Interest Group on Computer Architecture, eher praxisorientiert
Als Motivation werden wir zunächst einige eher theoretische Beispiele für problembehaftete Berechnungen
betrachten, bevor wir anhand dreier realer Katastophen kurz die möglichen Auswirkungen des falschen
Umgangs mit Zahlen beleuchten.
Beispiele für Arithmetik-bezogene Software-Fehler finden sich im Internet unter www5.in.tum.de/persons/huckle/bu
Wir werden hier drei dieser Fehler ansprechen: die Ariane-5-Explosion (4. Juni 1996), der Patriot-ScudVorfall (25. Februar 1991) und den Pentium-Bug (1994/1995).
1.1 ganzzahlige Arithmetik
Wir betrachten folgendes kleine C++-Programm ganze_zahlen.cc:
#include <iostream.h>
int main (){
long x=3, i;
for ( i=1;i<=10;i++ ) {
x=x*x;
cout << x << endl;
}
}
Übersetzt mit g++ -Wall -g -o ganze_zahlen ganze_zahlen.cc, entstehen als Ausgabe
hier die folgenden eher zufällig aussehenden Zahlen:
6
1.2 Lineare Algebra
1 EINLEITUNG
9
81
6561
43046721
-501334399
2038349057
-1970898431
120648705
1995565057
-1876701183
Eine allgemeine Erklärung dieses Verhaltens finden wir in Kapitel über natürliche Zahlen.
1.2 Lineare Algebra
In [Ku96] findet man folgendes Beispiel: Betrachte das einfache lineare Gleichungssystem A ∗ x = b mit
µ
¶
µ ¶
64919121 −159018721
1
A = (aij ) =
und b = (bi ) =
41869520.5 −102558961
0
Als Lösungsformel ergibt sich
x1 = a22 /(a11 · a22 − a12 · a21 )
x2 = −a21 /(a11 · a22 − a12 · a21 )
Mit double precision Variablen erhält man für die Lösung:
x̃1 = 102558961, x̃2 = 41869520.5
Die exakten Werte sind jedoch:
x1 = 205117922, x2 = 83739041
Vier einfache Rechenoperationen führen also bereits zu komplett falschen Resultaten!
Ähnliche Probleme gibt es bei computergestützer Geometrie, wo es beispielsweise sehr schwer sein kann,
festzustellen, ob ein Punkt der Ebene im Innern eines Polygones liegt oder nicht.
1.3 Grenzwerte
Das folgende Beispiel stammt aus [MJM89]: Betrachte die Folge
a0 =
61
1130 − 3000/an−1
11
, a1 = , an+1 = 111 −
2
11
an
Wogegen konvergiert diese Folge?
Das folgende kleine Programm liefert eine Lösung (?)
7
1.3 Grenzwerte
1 EINLEITUNG
#include <iostream.h>
int main (){
float a=11.0/2.0, b=61.0/11.0, c;
for (long i=1;i<=20;i++ ) {
cout << a << endl;
c=111-(1130-3000/a)/b;
a=b; b=c;
}
}
Als Resultat ergibt sich (gerundet auf eine Nachkommastelle):
i
1
2
3
4
5
6
7
8
9
10
float
5.5 5.6 5.6 5.7 .5.7 5.7 4.6 −20.5 134.1 101.5
double 5.5 5.6 5.6 5.7 5.7 5.7 5.8
5.8
5.8
5.9
exakt
5.5 5.6 5.6 5.7 5.7 5.7 5.8
5.8
5.8
5.9
i
11
12 13 14
15
16
17
18
19
20
float 100.1
100.0
double 5.9 5.9 6.5 15.4 67.5 97.1 99.8
100.0
exakt
5.9 5.9 5.9 5.9 5.9 5.9
6.0
Die exakten Werte können dabei mit rationaler oder exakter reeller Arithmetik bestimmt werden. Die Berechnungen liefern also ziemlich schnell komplett falsche Werte. Man kann leicht zeigen, dass der exakte
Wert der Iteration bei
6n+1 + 5n+1
an =
6n + 5n
liegt, also lim an = 6.
Eine Erklärung des Phänomens ist , dass die Funktion
f (x) := 111 −
1130 −
x
3000
x
drei Fixpunkte besitzt: 5,6 und 100, wobei 100 ein anziehender Fixpunkt ist, während 5 und insbesondere
6 abweisende Fixpunkte sind (vgl.z.B. [Mm96]). Die folgenden Graphiken zeigen den Funktionsverlauf
von f allgemein und in Nähe der Fixpunkte:
120
111-(1130-3000/x)/x
111-(1130-3000/x)/x
5.4
100
5.2
80
60
5
40
4.8
20
4.6
0
20
40
60
80
100
4.6
8
4.8
5
5.2
5.4
1.4 Iterierte Funktionen
1 EINLEITUNG
111-(1130-3000/x)/x
111-(1130-3000/x)/x
6.4
100.4
6.2
100.2
6
100
5.8
99.8
5.6
99.6
5.6
5.8
6
6.2
6.4
99.6
99.8
100
100.2
100.4
1.4 Iterierte Funktionen
Sehr hartnäckig ist die folgende einfache Iteration, bei der nach wenigen Operationen das Resultat bereits
vollkommen verfälscht ist. Auch sie findet sich z.B. in [Ku96] (logistische Gleichung, chaotisches System
ohne Konvergenz):
xi+1 = 3.75 · xi · (1 − xi ), x0 = 0.5
Bereits bei x100 sind alle mit herkömmlicher Arithmetik berechneten Stellen falsch:
x60
x70
x80
x90
x100
x110
exakte Arithmetik
+.7990863343...
+.4521952998...
+.8561779966...
+.7399137486...
+.8882939922...
+.7156795292...
Java double
0.79908633 70...
0.4521952 586...
0.85617 59906...
0.7 400517104...
0. 9017659679...
0. 2201217854...
Während bei der Grenzweriteration im vorigen Abschnitt rationale Arithmetik verwendet werden konnte,
um richtige Werte zu finden, versagt sogar diese hier. Im Abschnitt über exakte Arithmetik werden wir
untersuchen, wie die Vergleichswerte bestimmt wurden.
1.5 Die Ariane-5-Explosion
Am 4. Juni 1996 endete der Jungfernflug der Ariane-5 bereits nach ca. 40 Sekunden:
Der offizielle Report der ESA zu dieser milliardenteuren Panne findet sich unter www.esa.int/export/esaCP/Pr_33_19
Ein kurzer Film zur Explosion findet sich bei CNN: www.cnn.com/WORLD/9606/04/rocket.explode/ariane.mov.
9
1.6 Der Pentium-Bug
1 EINLEITUNG
Grund der Explosion war folgender: Ein Leitsystem (mit Gyroskopen und Beschleunigungsmessern) versuchte, die Horizontalgeschwindigkeit aus einer 64bit Variablen in 16 Bit zu speichern, machte wegen des
entstehenden Überlaufes eine Fehlermeldung und schaltete sich ab. Redundante Auslegung dieses Systems
half nicht: Das zweite Leitsystem benutzte die gleiche Software.
Der On-Board-Computer der Ariane interpretierte die Fehlermeldungen als Flugdaten und versuchte daraufhin eine abrupte Kurskorrektur. Als die Booster-Raketen abzureissen drohten, wurde die Rakete sicherheitshalber gesprengt.
Bei den Ariane-4-Raketen hatte die selbe Zuweisung keine Probleme gemacht, aber die Ariane-5 war
schneller... Weitere Absurdität: Die Bestimmung der Horizontalgeschwindigkeit wäre nach dem Start gar
nicht mehr notwendig gewesen...
1.6 Der Pentium-Bug
Die ersten Pentium-Chips von Intel (von 1994) hatten einen Fehler in der Divisionsroutine, aufgedeckt von
Prof. Thomas Nicely, Lynchburg College. Kosten: ca. 400Mio $
Aus www.mackido.com/History/History_PentBug.html:
In mid ’94 Intel (and independant parties) found a floating point bug in their processor. While it
is not unusual for Hardware bugs in processors it is rare that they are this serious, furthermore
Intel went out of their way to hide the bug. It was about 6 months later that Intel finally went
public with the bug (1). Even then Intel did not valuntarily go public with the bug, it was
because other people were discovering it and a thread started on the internet.
Dr. Thomas Nicely was the first guy to publicly discover the bug, and he contacted Intel Tech
Support regarding this bug on Monday 24 October (call reference number 51270). But he was
soon silenced by Intel with an NDA as Intel tried to bury the problem. (2) The bug was found
on many different pentiums including the 60, 66, 75 and 90 mhz pentium chips, and effected
millions of users.
Erläuterung von Intel zu dem Problem: support.intel.com/support/processors/pentium/fdiv/wp/
www.eee.bham.ac.uk/dsvp_gr/roxby/ee4a3/Lecture2/sld013.htm
A software bug encoded in hardware (Halfhill, 1995)
Divide algorithm uses a look up table with 1066 entries, but when downloading the coefficients
to the PLA section, only 1061 were loaded due to an error in a for loop! Committed to silicon
and never checked...
Aus www.ku.edu/cwis/units/IPPBR/pentium_fdiv/pentgrph.html :
Intel Pentium chips manufactured before a certain date have a bug in their floating point processor which returns less than full precision results for some combinations of divisor and
dividend when performing a Floating point DIVision (FDIV). A well known operation which
exhibits this phenomenon is 4195835/3145727. You can check to see if your Pentium has the
FDIV bug by entering the following formula in the Windows calculator:
(4195835/3145727) ∗ 3145727 − 4195835
10
1.6 Der Pentium-Bug
1 EINLEITUNG
The image below is a 3d graph of the function x/y in the region of 4195835/3145727. Specifically, the region is:
4195833.0 <= x <= 4195836.4
3145725.7 <= y <= 3145728.4
On a 486/66, the function graphs as a monotonically increasing surface with the low point in
the foreground corner (where x is low and y is high) and a high point in the background corner
(where x is high and y is low). On a Pentium with the FDIV bug there are two triangular areas
in the region where an incorrect result is returned. The correct values all would round to 1.3338
and the incorrect values all would round to 1.3337, an error in the 5th significant digit.
An archive of principal papers on the Pentium FDIV bug is available at: www.mathworks.com/company/pentiu
Spott:
Q: Why didn’t Intel call the Pentium the 586?
A: Because they added 486 and 100 on the first Pentium and got 585.999983605.
Eine Untersuchung der Ursachen des Fehler findet sich z.B. in citeseer.nj.nec.com/pratt95anatomy.html
Weitere Links:
www.maa.org/mathland/mathland_5_12.html
www.mathworks.com/company/pentium/index.shtml
11
1.7 Der Patriot-Scud-Vorfall
1 EINLEITUNG
1.7 Der Patriot-Scud-Vorfall
Am 25.2.1991, während des Golfkrieges, versagte eine Amerikanische Patriot-Abwehrbatterie bei einer
heranfliegenden Irakischen Scud-Rakete. Diese traf ein Lager, tötete 28 Soldaten und verletzte etwa 100
weitere.
Weitere Links dazu:
www.ima.umn.edu/ arnold/disasters/patriot.html
www.fas.org/spp/starwars/gao/im92026.htm
Als Grund stellte sich heraus, dass die Umrechnung der Uhrzeit zu ungenau war: Die Systemuhr (Hardware
mit einer Auflösung von 0.1 s) der Abschussanlage wurde in einer Routine mit 0.1 multipliziert (dargestellt
als 24-Bit-Fixpunktzahl), um die Zeit in Sekunden zu berechnen. Wegen der ungenauen internen Darstellung der Zahl 0.1 war nach 100 Stunden Betriebszeit ein Fehler von ca. 0.34 Sekunden entstanden. Da eine
Scud mit 1,676 m/s fliegt, konnte sie sich in dieser Zeit mehr als 500 Meter bewegen und war daher nicht
mehr erreichbar.
Da folgende einfache C++-Programm zeigt den gleichen Effekt auf. Wegen anderer Hardware ist der Fehler
hier allerdings etwas kleiner, nämlich ‘nur’ 0.00536442:
#include <iostream.h>
int main (){
float tenth = 1.0 / 10.0;
long dauer= 1000*3600;
cout << "Fehler: " << dauer * tenth - dauer/10 << endl;
}
12
2 NATÜRLICHE / GANZE ZAHLEN
2 Rechnen mit natürlichen und ganzen Zahlen
Stichworte: Berechenbarkeitsmodelle, Zweier-Komplement-Darstellung, modulare Arithmetik, elementare Algorithmen, schnelle Multiplikation, GMP, redundante Zahl-Darstellungen, signed-digits,...
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
Reale Rechner basieren (auf unterster Ebene) auf binärer Logik, d.h. sie verarbeiten Worte über dem Alphabet B = {0, 1}. Wenn wir nun mit anderen Daten, insbesondere mit Zahlmengen wie N, Z, Q, R, . . .
rechnen möchten, müssen wir die darzustellenden Mengen geeignet codieren. Daher verschlüsselt man
üblicherweise die Elemente der Mengen, auf denen man rechnen möchte. Wir werden hier die Begriffe in
der Form verwenden, wie sie üblicherweise in der Rekursionstheorie verwendet werden, vgl. z.B. [We87].
Basis ist dabei immer die Menge Σ∗ aller Worte über einem endlichen Alphabet Σ. Σk sei die Menge der
Worte der Länge k, λ sei das leere Wort.
Viele der in diesem Abschnitt angesprochenen praxis-orientierten Algorithmen werden auch im Standardwerk [Kn81] von Knuth behandelt.
2.1 Definition. Eine Notation ν einer Menge X ist eine (evtl. partielle) surjektive Abbildung
ν : Σ∗ ÂX
2
Anmerkungen: (i) Ist ν eine Notation von X, so gibt es für jedes x ∈ X (mindestens) ein w ∈ Σ∗ mit
ν(w) = x. Dann wird w als ‘Name’ von x bezeichnet. Jedes x ∈ X hat also einen oder mehrere Namen,
aber nicht jedes w ∈ Σ∗ muß Name eines x ∈ X sein.
(ii) Da Σ∗ abzählbar ist und Notationen surjektiv sind, muß jede ‘notierbare’ Menge X ebenfalls abzählbar
sein. Insbesondere sind damit die reellen Zahlen nicht ‘notierbar’.
(iii) Meist werden wir als Alphabet B verwenden. Bereits die Betrachtung der gesamten Menge B∗ ist
eine Abstraktion, da reale Rechner ja nur einen endlichen Speicher besitzen. Zudem ist die Hardware des
Rechners auf feste Wortlängen festgelegt, etwa Bi mit i ∈ {8, 16, 32, 64}.
Bei natürlichen Zahlen ist folgende binäre (totale) Notation (·)2 naheliegend, bei der wir die Bits 0 und 1
mit den natürlichen Zahlen 0 und 1 identifizieren:
2.2 Definition. Die Binär-Notation (·)2 : B∗ → N sei definiert durch:
(bn . . . b0 )2 :=
n
X
bi · 2i
i=0
sowie (λ)2 := 0 .
2
Damit sind zum Beispiel 101 und 0101 beides „Namen“ der natürlichen Zahl 5 in Binärnotation.
Anstelle der Zahl 2 kann man jede beliebige natürliche Zahl r ≥ 2 als Basis der Notation verwenden:
13
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
2.3 Definition. Es sei Σr := {0, 1, . . . , r−1}. Die r-adische Notation (·)r : Σ∗r → N sei definiert durch:
(dn . . . d0 )r :=
n
X
di · ri
i=0
sowie (λ)r := 0 .
2
Um zu zeigen, dass jedes (·)r surjektiv ist, kann man induktiv die folgende Eigenschaft nachprüfen:
2.4 Lemma. Für alle r und k ∈ N gilt:
{(w)r | w ∈ Σkr } = {0, . . . rk − 1}
2
(·)2 ist auch die Form, in der natürliche Zahlen in der Rechnerhardware dargestellt werden. Da hier die
Wortlänge fest ist, kann man nur zunächst einmal nur endliche Bereiche notieren.
Beispiele:
typedef unsigned int u_int32_t mit 32 Bit, Werte-Bereich {0, . . . , 4294967295}
typedef unsigned short u_int16_t mit 16 Bit, Werte-Bereich {0, . . . , 65535}.
Damit haben wir viele verschiedene Möglichkeiten, natürliche Zahlen zu notieren. Im Wesentlichen sind
diese jedoch gleichwertig. Da dies bei den später definierten Darstellungen reeller Zahlen nicht der Fall
sein wird, führen wir hier schon die Begriffe ein, die in analoger Form bei R wichtig sein werden. Zunächst
definieren wir Turing-Maschinen (nach Alan M. Turing, 1936) und die dadurch implizierten Begriffe von
Berechenbarkeit und Komplexität. Wohl allgemein akzeptiert ist die Church’sche These (erstmals 1935
formuliert, wenn auch für ein anderes Berechnungs-Modell):
Die mit Turing–Maschinen berechenbaren Funktionen sind genau die im
intuitiven Sinne „berechenbaren“ Funktionen (auf Worten).
Eine einheitliche Definition dieser Turingmaschinen existiert nicht, aber die wesentlichen Komponenten
sind stets ähnlich. Ferner sind viele der mit Turingmaschinen erzielten Resultate von den Feinheiten der
Definitionen unabhängig. Dennoch ist eine exakte Angabe der hier verwendeten Definition sinnvoll, um
später Beweisideen ausformulieren zu können.
Eine Turingmaschine wird bei uns wie folgt arbeiten: Mit Hilfe einer endlichen ‘Kontrolleinheit’ kann sie
verschiedene ‘Bänder’ bearbeiten: (a) ein endliches Band, auf dem die Maschine ihre Eingabe erhält, (b)
ein einseitig unendliches Band, auf das die Ausgabe geschrieben wird und (c) eine feste Anzahl beidseitig
unendlicher Arbeitsbänder, auf denen Daten gespeichert werden können.
Jedes dieser Bänder ist in Zellen unterteilt, in denen jeweils ein Zeichen eines vorgebenen endlichen Alphabetes gespeichert werden kann. Zu jedem Band existiert genau ein beweglicher ‘Kopf’, der auf einer
der Zellen des Band positioniert ist. Die Turingmaschine kann in einem Schritt genau ein Zeichen eines
Bandes verarbeiten (also das Zeichen unter dem Kopf des Bandes lesen oder überschreiben) oder aber den
Kopf eines Bandes um eine Zelle verschieben.
Damit die Turingmaschine die Möglichkeit hat, Anfang und Ende des (endlichen) Eingabebandes zu erkennen, ist dieses mit Bandendemarkierungen versehen. Graphisch können wir eine Turingmaschine mit
zwei Arbeitsbändern also wie folgt darstellen:
14
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
#
$
6 Eingabeband (nur lesen)
...
#
Ã
endliche
Kontrolle
"
!
...
6 Arbeitsband (lesen/schreiben)
...
...
6 Arbeitsband (lesen/schreiben)
...
Ausgabeband (nur schreiben)
6
2.5 Definition. Eine Turingmaschine M mit k Arbeitsbändern ist definiert als ein 7-Tupel (Z, Σ1 , Σ2 , ∆, δ, z0 , ze )
mit den folgenden Komponenten:
• Z endliche ‘Zustandsmenge’,
• Σ1 endliches Eingabealphabet, Σ2 endliches Ausgabealphabet,
• ∆ endliches ‘Bandalphabet’ mit einem ‘Leer’-Zeichen (‘Blank’) B ∈ ∆,
• z0 ∈ Z ‘Anfangszustand’,
• ze ∈ Z ‘Endzustand’,
• δ ‘Übergangsfunktion’.
δ ist dabei eine Abbildung von Z \ {ze } in die Menge der bei der Turingmaschine möglichen Operationen,
die wir erst später angeben werden.
Zur Beschreibung der Auswirkungen dieser Operationen auf die Bänder und die Kontrolleinheit der Turingmaschine verwenden wir ‘Konfigurationen’. Den Inhalt eines Bandes werden dabei in einem Wort
u↑av festhalten, wobei der Pfeil ↑ vor dem Zeichen a steht, auf dem der Kopf des Bandes positioniert ist.
Entsprechend gibt das Wort u den Inhalt des Bandes links vom Kopf und v den Inhalt des Bandes rechts
vom Kopf an. Vom Ausgabeband, das ja nur beschrieben werden darf, brauchen wir uns nur den bereits
beschriebenen linken Teil u zu merken. Die Menge K der Konfigurationen der Turingmaschine M wird
also definiert als die Menge
∗
+
K := Z × Σ∗2 × Σ1 ◦{↑}◦Σ1 × (∆∗ ◦{↑}◦∆+ )k
Dabei sei Σ1 := Σ1 ∪ {#, $} das um die ‘Bandendemarker’ # und $ erweiterte Eingabealphabet. Bei
einer solchen Konfiguration
κ = (z, ua , ue ↑ae ve , u1 ↑a1 v1 , . . . , uk ↑ak vk )
15
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
wird ua als Inhalt des Ausgabebandes bezeichnet, ue ↑ae ve als Inhalt des Eingabebandes und ui ↑ai vi als
Inhalt des Arbeitsbandes i; z ist der Zustand der Konfiguration κ.
Zu einer ‘Eingabe’ w ∈ Σ∗1 definieren wir eine ‘initiale’ oder ‘Anfangskonfiguration’ IM (w) durch:
IM (w) := (z0 , λ, ↑#w$, ↑B, . . . , ↑B)
Hier steht der Kopf des Eingabebandes also auf dem linken Bandendemarker. Die Menge Ke der Endkonfigurationen ist definiert als
Ke := {κ ∈ K | der Zustand von κ ist der Endzustand ze }
Ein Schritt der Turingmaschine wird dann über die Einzelschritt-Funktion −→
: K ÂK beschrieben. Mit
M
ihr werden die Auswirkungen aller bei der Turingmaschine möglichen Operationen beschrieben: Es sei
κ = (z, ua , ue ↑ae ve , u1 ↑a1 v1 , . . . , uk ↑ak vk )
eine Konfiguration. Dann gilt κ−→
κ0 , falls einer der folgenden Fälle eintritt (abhängig von der beim
M
Zustand z von κ auszuführenden Operation):
1. (Schreiben auf das Ausgabeband)
Ist δ(z) = (A, x, z 0 ) (mit x ∈ Σ2 , z 0 ∈ Z), so ist
κ0 = (z 0 , ua ◦ x, ue ↑ae ve , u1 ↑a1 v1 , . . . , uk ↑ak vk )
2. (Testen auf Eingabeband und Verzweigen)
Ist δ(z) = (E, x, z1 , z2 ) (mit x ∈ Σ1 ∪ {#, $}, z1 , z2 ∈ Z), so ist
κ0 = (z 0 , ua , ue ↑ae ve , u1 ↑a1 v1 , . . . , uk ↑ak vk )
½
mit
0
z :=
z1 ,
z2 ,
falls x = ae
falls x 6= ae
3. (Kopf auf Eingabeband nach rechts)
Ist δ(z) = (E, R, z 0 ) (mit z 0 ∈ Z), so ist
κ0 = (z 0 , ua , w0 , u1 ↑a1 v1 , . . . , uk ↑ak vk )
½
mit
0
w =
ue ae ↑ve
ue ↑ae ve ,
falls ve =
6 λ
falls ve = λ
4. (Kopf auf Eingabeband nach links)
Ist δ(z) = (E, L, z 0 ) (mit z 0 ∈ Z), so ist
κ0 = (z 0 , ua , w0 , u1 ↑a1 v1 , . . . , uk ↑ak vk )
½
mit
0
w =
u↑xae ve
ue ↑ae ve ,
falls lg(ue ) ≥ 1, d.h. ue = ux mit x ∈ Σ1
falls ue = λ
16
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
5. (Schreiben auf Arbeitsband i)
Ist δ(z) = (i, x, z 0 ) (mit 1 ≤ i ≤ k, x ∈ ∆, z 0 ∈ Z), so ist
κ0 = (z 0 , ua , ue ↑ae ve , u1 ↑a1 v1 , . . . , ui ↑xvi , . . . , uk ↑ak vk )
6. (Testen auf Arbeitsband i und Verzweigen)
Ist δ(z) = (i, x, z1 , z2 ) (mit 1 ≤ i ≤ k, x ∈ ∆, z1 , z2 ∈ Z), so ist
κ0 = (z 0 , ua , ue ↑ae ve , u1 ↑a1 v1 , . . . , uk ↑ak vk )
½
mit
0
z :=
z1 ,
z2 ,
falls x = ai
falls x 6= ai
7. (Kopf auf Arbeitsband i nach rechts)
Ist δ(z) = (i, R, z 0 ) (mit 1 ≤ i ≤ k, z 0 ∈ Z), so ist
κ0 = (z 0 , ua , ue ↑ae ve , u1 ↑a1 v1 , . . . , w0 , . . . , uk ↑ak vk )
½
mit
0
w =
ui ai ↑vi
ui ai ↑B,
falls vi =
6 λ
falls vi = λ
8. (Kopf auf Arbeitsband i nach links)
Ist δ(z) = (i, L, z 0 ) (mit 1 ≤ i ≤ k, z 0 ∈ Z), so ist
κ0 = (z 0 , ua , ue ↑ae ve , u1 ↑a1 v1 , . . . , w0 , . . . , uk ↑ak vk )
½
mit
0
w =
u↑xai vi
↑Bai vi ,
falls lg(ui ) ≥ 1, d.h. ui = ua mit x ∈ ∆
falls ui = λ
2
Auf dem Eingabeband können die Bandendemarkierungen # und $ also erreicht und getestet, aber nicht
überschritten werden. Ferner kann die Eingabe nicht verändert werden. Das Ausgabeband kann nur beschrieben, aber nicht wieder gelesen werden. Geschriebene Zeichen werden jeweils rechts an die bereits
produzierte Ausgabe angefügt, eine explizite Bewegung des Kopfes des Ausgabebandes brauchen wir daher nicht. Bei der (endlichen) Darstellung der Arbeitsbänder werden bei Bedarf Blanks hinzugefügt, so daß
die Maschine hier kein Bandende erreichen kann. Damit scheinen für die Maschine diese Bänder unendlich
lang zu sein.
Die oben definierte initiale Konfiguration stellt damit eine leeres Ausgabeband, ein Eingabeband, bei dem
der Kopf auf dem linken Bandende steht, und Arbeitsbänder, auf denen (für die Maschine) nur Blanks
stehen, dar. Da δ für den Endzustand nicht definiert ist, ist die Einzelschrittfunktion auf Endkonfigurationen
nicht anwendbar.
n
Ausgehend von −→
wird die n-fache Iteration −→
: K ÂK der Einzelschrittfunktion wie bei Funktionen
M
M
n
n
0
üblich definiert: Es gilt κ−→
κ , wenn Konfigurationen κ0 , . . . , κn existieren mit κ0 = κ, κi−1 −→
κi für
M
M
1≤i≤n sowie κn = κ0 . Eine n-fache Iteration entspricht also n Schritten der Maschine M . Insbesondere
17
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
0
∗
gilt κ−→
κ0 genau dann, wenn κ = κ0 gilt. Schließlich sei −→
⊆ κ × κ die transitive und reflexive Hülle
M
M
∗
n
0
0
der Einzelschrittfunktion, d.h. κ−→
κ ⇐⇒ (∃n)κ−→
κ.
M
M
Da δ für Endzustände nicht definiert ist, gibt es bei Turingmaschinen zu jeder Anfangskonfiguration IM (w)
∗
maximal eine (aber gelegentlich auch keine einzige) Endkonfiguration κ mit IM (w)−→
κ. Im folgenden
M
wird also wohldefiniert einer Turingmaschine die von ihr berechnete Funktion als Semantik zugewiesen.
2.6 Definition. Die Funktion fM : Σ∗1 ÂΣ∗2 , die von der Turingmaschine M berechnet wird, ist definiert
durch: Es gilt fM (w) = v genau dann, wenn eine Endkonfiguration κ existiert, die als Inhalt des Ausgabe∗
bandes das Wort v hat und für die IM (w)−→
κ gilt. Existiert keine solche Endkonfiguration, so ist fM (w)
M
undefiniert.
2
2.7 Definition. Die (Zeit-)Komplexität TM : Σ∗1 ÂN einer Turingmaschine M ist definiert durch
½
n
n
(∃κ ∈ Ke )IM (w)−→
κ
M
TM (w) :=
undefiniert sonst
Wir sagen: M arbeitet in Zeit O(t) (für t : N → N) auf einer Menge G ⊆ Σ∗1 , wenn es eine Konstante
c ∈ N gibt, so daß TM (w) ≤ c · t(lg(w)) + c für alle w ∈ G gilt. M arbeitet in polynomialer (bzw.
linearer) Zeit, wenn M in Zeit O(nk ) für ein k ∈ N (bzw. O(n)) arbeitet. Entsprechend sagen wir, daß
eine Funktion f in Zeit O(t) (polynomialer Zeit/linearer Zeit) auf G berechenbar ist, wenn eine Maschine
M mit f = fM existiert, die in entsprechender Zeit auf G arbeitet.
2
Anmerkung: Später wird meist Def(f ) 6= Σ∗1 sein, so daß TM (w) nicht auf ganz Σ∗1 definiert ist. Die
Komplexität einer Maschine M wird uns zudem meist nur für spezielle Eingaben interessieren (also auf
Def(fM )).
einer Menge G ⊂
6=
Bei der Definition der Turingmaschinen hatten wir Arbeitsbänder in beliebiger Anzahl und ein beliebig
großes Arbeitsalphabet zugelassen. Beide Komponenten können reduziert werden (ohne Beweis):
2.8 Lemma. Reduktion des Arbeitsalphabetes:
Zu jeder Turingmaschine M gibt es eine Turingmaschine M 0 mit der gleichen Zahl von Arbeitsbändern
und dem Arbeitsalphabet Σ = {B, 1}, so daß fM = fM 0 und TM 0 (w) ≤ c · TM (w) für alle w ∈ Def(fM )
und eine Konstante c gilt.
Reduktion der Zahl der Arbeitsbänder:
Zu jeder Turingmaschine M mit k Arbeitsbändern gibt es eine Turingmaschine M 0 mit nur einem Arbeitsband, so daß fM = fM 0 und TM 0 (w) ≤ c · TM (w)2 für alle w ∈ Def(fM ) und eine Konstante c gilt.
2
Anmerkungen: (i) Stehen zwei Arbeitsbänder zur Verfügung, so kann die obige Zeitschranke verbessert
werden: Zur Simulation einer beliebigen festen Zahl von Arbeitsbändern mit zwei Arbeitsbändern reichen
c · TM (w) · log TM (w) + c Schritte aus [HS66].
(ii) Für Aussagen zur Fragen der Berechenbarkeit sind die Zahl der Arbeitsbänder und die Größe des
Arbeitsalphabetes damit offensichtlich nicht relevant.
(iii) Wegen der nur linearen Änderung der Komplexität bei der Reduktion des Arbeitsalphabetes können
wir dessen Größe in Zukunft ignorieren. Nur ein oder zwei Arbeitsbänder zu benutzen, könnte die Komplexität der in folgenden betrachteten Algorithmen jedoch signifikant verändern. Die Komplexitätaussagen
werden also im folgenden stets für Turingmaschinen mit fester, aber beliebig hoher Zahl von Bändern formuliert werden, selbst wenn dies nicht jedes Mal ausdrücklich gesagt wird.
18
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
2.9 Definition. Eine Funktion f : Σ∗1 ÂΣ∗2 heißt berechenbar (oder partiell–rekursiv), wenn es eine Turingmaschine M mit f = fM gibt. Es sei
PR := {f : Σ∗1 ÂΣ∗2 | f ist berechenbar }
2
Anmerkung: Die Abkürzung PR ergibt sich aus partiell–rekursiv: Da es Turingmaschinen M gibt, die
nicht bei jeder Eingabe ihre Berechnung beenden, ist fM nicht unbedingt eine totale Funktion. Die Beziechnung ‘rekursiv’ kommt von einer ersten Definitionen von Berechenbarkeit mit einem rekursiven Definitionsmechanismus (Kleene, 1937, ‘µ–rekursive’ Funktionen).
2.10 Satz. Für alle berechenbaren Funktionen f, g ∈ PR ist auch f ◦ g berechenbar.
2
Anmerkung: Es ist f ◦g(w) := f (g(w)), dabei ist insbesondere f ◦g(w) undefiniert, wenn g(w) undefiniert
ist oder aber f (g(w)) undefiniert ist.
Die damit exakt definierten Begriffe von Berechenbarkeit und Komplexität kann man nun auch auf notierte
Mengen übertragen:
2.11 Definition. Seien ν1 : Σ∗1 ÂX und ν2 : Σ∗2 ÂY Notationen von X bzw. Y . Eine Funktion g : X ÂY
heißt (ν1 , ν2 )–berechenbar , wenn eine Funktion f ∈ PR existiert, so daß für alle w ∈ Σ∗1 gilt: Existiert
g(ν1 (w)), so auch ν2 (f (w)) und
g(ν1 (w)) = ν2 (f (w)).
2
Die (ν1 , ν2 )–Berechenbarkeit einer Funktion g : X ÂY kann wie folgt in einem Diagramm veranschaulicht werden:
- Y (ideelle Ebene)
X
g
6
6
ν1
ν2
Σ∗1
f
- Σ∗ (reale Ebene)
2
Die obigen Definition fordert nun, dass das Diagramm für alle w ∈ Def(g ◦ ν1 ) kommutiert:
g ◦ ν1 (w) = ν2 ◦ f (w).
Gegeben ist also eigentlich w (was wir über ν1 als Element von X interpretieren). Daraus berechnen wir
(mit dem „realen“ Turingmaschinen–Modell) einen Wert f (w), den wir wiederum als Element von Y und
als Wert der Funktion g interpretieren.
2.12 Beispiel. Als wichtiges Beispiel für die Programmierung mit Turingmaschinen betrachten wir binäres
Zählen, hier in Form einer Funktion fbin : B∗ → N mit
fbin (x) = (Länge von x)2
19
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
Bei der Angabe der Turingmaschine werden wir ein Flußdiagramm verwenden. Operationen mit nur einem
möglichen Folgezustand werden durch ein Rechteck dargestellt, bei zwei möglichen Folgezuständen nehmen wir ein Karo. Jedem Zustand der Maschine entspricht dabei ein solches Viereck im Flußdiagramm; in
den einzelnen Vierecken steht die jeweils zu auszuführende Operation. Bei δ(z) = (i, x, z1 , z2 ) steht also
i : x im Karo für den Zustand z, die Verbindung zu z1 und z2 wird mit Pfeilen im Diagramm markiert (Beschriftung ‘ja’ am Pfeil zu z1 , ‘nein’ am Pfeil zu z2 ). Der Anfangszustand wird durch einen einlaufenden
Pfeil markiert, im Rechteck des Endzustandes steht ‘HALT’. Da die Bezeichnung der einzelnen Zustände
meist unwichtig ist, werden wir im Diagramm die Zustände selbst nur selten angeben. Die Zahl der Arbeitsbänder und das Arbeitsalphabet werden wir meist gesondert angeben, sie lassen sich häufig aber auch
aus dem Diagramm leicht ablesen.
Das folgende Flußdiagramm definiert damit eine Turingmaschine mit einem Arbeitsband und dem Arbeitsalphabet ∆ = {0, 1, B}:
?
1:0
-
?
E:R
?
´Q ja
´
Q
´E : $Q
- Kopie Arbeitsband
´
Q
auf Ausgabeband
Q
´
Q´
nein
?
Erhöhe Inhalt vom
Arbeitsband um 1
?
HALT
Die beiden „Teilroutinen“ zum Inkrementieren bzw. Kopieren lassen sich wie folgt genauer spezifizieren
(am Ende des Inkrementierens steht der Kopf des Arbeitsbandes am rechten Ende der gespeicherten Daten):
20
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
Inkrementieren
-
?
´Q nein
´1 : 1Q
´
Q
Q´
?
1:0
1:1
-
?
1:R
?
?
´Q
nein
Q
´
1:L
Q1 : B´
Q´
ja
?
1:L
?
Kopieren
-
?
1:L
?
´Q
nein
Q
´
Q1 : B´
Q´
ja ¾
?
1:R
6
A:0
A:1
6
ja
?
´Q
´Q
ja ´1 : BQ nein
- ´1 : 0Q nein
´
´
Q
Q
Q´
Q´
6
?
Hier ergibt sich als Komplexität beispielsweise TM (λ) = 11. Zur Abschätzung der Komplexität im Fall
w 6= λ setzen wir n := lg(w) und wählen k ∈ N0 minimal mit n < 2k ≤ 2n. Insbesondere ist dann
sicherlich TM (w) ≤ TM (w̄) mit lg(w̄) = 2k .
Beim Inkrementieren von 0 bis 2k haben wir dann die folgenden Fälle vorliegen (in Klammern die Zahl
des Auftretens dieser Fälle):
1
( · 2k -fach)
2
1
( · 2k -fach)
4
1
( · 2k -fach)
8
letztes Zeichen wird 1
letztes Zeichen wird 0, vorletztes wird 1
zwei letzte Zeichen werden 0, drittletztes wird 1
...
21
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
also ergibt sich als Schranke für den Gesamtaufwand zum Inkrementieren:
∞
∞
X
X
1 k
i (∗)
k
· 2 · (5i) = 5 · 2
= 5 · 2k · 2 = 10 · 2k ≤ 20n
i
i
2
2
i=1
i=1
f 0 (p) =
1
(1−p)2
=
∞
P
i=1
i · pi−1 , insbesondere also:
∞
P
i=1
i
2i
=
∞
P
1
pi = 1−p
für
i=0
∞ ¡ ¢
P
i−1
1
i 21
= 12 11 2 = 2.
2
(1− 2 )
i=1
Die Abschätzung (∗) erhalten wir dabei wie folgt: Setze f (p) :=
0 < p < 1, also
Beim Kopieren erhalten wir als Schranke für den Aufwand 6k + 2 Schritte, da n in binärer Notation aus k
Zeichen besteht. Damit ist TM (w) ≤ 20 lg(w) + 6 log lg(w) + 2, d.h. M arbeitet in linearer Zeit.
2
2.13 Beispiel. Für die Notation endlicher Alphabete Σ und der jeweiligen Wortmenge Σ∗ eignen sich
„Blockcodes“: Wähle k mit 2k ≥ n und eine beliebige surjektive Funktion ι : Bk ÂΣ.
Dann kann man νΣ : B∗ ÂΣ∗ wie folgt definieren: Es sei νΣ (w) := x1 . . . xm (mit xi ∈ Σ), wenn
w = ι(x1 ) ◦ ι(x2 ) ◦ . . . ◦ ι(xm ) ◦ w0 für ein w0 ∈ B∗ mit lg(w0 ) < k gilt, ansonsten sei νΣ (w) undefiniert.
Ist ι eine bijektive Funktion, so ist die resultierende Notation νΣ damit sogar total.
Wählen wir zum Beispiel Σ = B, k = 1 und ι(1) = 1, ι(0) = 0, so ergibt sich insbesondere νB (w) = w als
„Notation“ der Worte über B.
2
Im folgenden werden wir uns daher oft auf Σ1 = Σ2 = B beschränken können.
Um mehrstellige Funktionen zu betrachten, benutzen wir eine Standardmethode, wie man aus gegebenen
Notationen νi von Mengen Xi Notationen von Tupeln aus Elementen dieser Mengen erzeugen kann. Dazu
verwenden wir (möglichst einfach gehaltene) surjektive Abbildungen
prk : B∗ → (B∗ )k (für k ∈ N),
und
pr∗ : B∗ →
[
(B∗ )k
k∈N
mit denen wir Worte w in voneinander unabhängige Komponenten pr1k (w), . . . prkk (w) bzw. pr1∗ (w), pr2∗ (w), . . .
zerlegen können,
Zunächst definieren wir prk durch die Angabe der einzelnen Komponentenfunktionen (oder Projektionen)
prik für 1 ≤ i ≤ k: Zur Definition von prik (w) für ein Wort w = x1 . . . xn , xj ∈ B, wählen wir m ∈ N
maximal so, daß bei der Teilfolge
xi xk+i x2k+i x3k+i x4k+i . . .
von w alle vorkommenden x(2j+1)k+i für 0 ≤ j < m den Wert 1 haben. Dann setzen wir
prik (w) := xi x2k+i x4k+i . . . x2(m−1)k+i
Die Werte x(2j+1)k+i sind damit Indikatoren, ob x2jk+i noch „gültig“ ist, w = x1 . . . xn wird also so
interpretiert, daß auf eine Gruppe von jeweils k „Wert-Bits“ eine Gruppe von ebenfalls k „Indikator-Bits“
folgt. prk sei schließlich definiert durch prk (w) := (pr1k (w), . . . , prwk (w)). Damit ist zum Beispiel
pr2 (10 11 01 11 10 1) = (101, 01)
22
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
Die Funktion pr∗ definieren wir durch pr∗ (w) := prk (w̄) mit k := lg(pr12 (w)) und w̄ := pr22 (w).
Als ‘Inverse’ zu den prk definieren wir die ‘Paarung’ <w1 , . . . , wk > von Worten:
<w1 , . . . , wk > := das (eindeutig bestimmte) w mit:
prk (w) = (w1 , . . . , wk ),
lg(w) = 2 · k · max{lg(wi ) | 1 ≤ i ≤ k} und
w enthält möglichst viele 0-en.
Damit ist z.B. <10, 000> = 101100110001.
Anmerkung: (i) Die Surjektivität von prk und damit auch von pr∗ ist offensichtlich, da die einzelnen prik
voneinander unabhängig sind.
(ii) Der Nachweis, daß prik ∈ PR für alle k und i mit i ≤ k gilt, ist eine einfache Programmierübung mit
Turingmaschinen.
(iii) Bei der Funktion prk (w) sind die einzelnen ‘verschlüsselten’ Worte in w verzahnt gespeichert, dazu
müssen die Worte zum Teil künstlich verlängert werden. Als Alternative könnten die Worte einfach hintereinander gespeichert werden, unter Verwendung eines geeigneten Trennmechanismus (der natürlich auch
das Gesamtwort auch verlängert). Die gewählte Variante hat den Vorteil, daß die Komplexität beim Zugriff
auf eine der Komponenten prik (w) nur von k und der Länge von prik (w) abhängt, aber völlig unabhängig
ist von den anderen Komponenten.
2.14 Beispiel. Sind ν1 , . . . , νk Notationen von Mengen X1 , . . . , Xk , so definieren wir eine Notation
(ν1 , . . . , νk ) : B∗ ÂX1 × . . . × Xk
durch
(ν1 , . . . , νk )(w) := (ν1 pr1k (w), . . . , νk prkk (w))
Ist ν Notation einer einzelnen Menge X, so definieren wir ν k : B∗ → X k durch
ν k := (ν, . . . , ν)
| {z }
k
und ν ∗ : B∗ Â
S
k∈N
X k durch
ν ∗ (w) := (ν(v1 ), . . . , ν(vm )),
wobei m und die einzelnen vi sich aus pr∗ (w) = (v1 , . . . , vm ) ergeben.
2
2.15 Lemma. Die Addition natürlicher Zahlen + : N2 → N ist für jedes r in linearer Zeit ((·)2r , (·)r )berechenbar.
2
Beweis: Die Projektionsfunktionen sind so definiert, dass es in linearer Zeit möglich ist, die einzelnen
Komponenten einer Eingabe zu extrahieren und jeweils auf ein eigenes Arbeitsband zu kopieren. Wir werden daher im folgenden stets implizit annehmen, dass die Argumente so vorliegen. Da führende Nullen den
Wert bei r-adischer Notation nicht verändern, können wir hier zudem annehmen, dass die zwei Argumente
v und w, die wir zu addieren haben, gleich lang sind.
23
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
2 NATÜRLICHE / GANZE ZAHLEN
Es seien also v = vk−1 . . . v0 und w = wk−1 . . . w0 aus Σ∗r gegeben, gesucht ist ein Wort u mit (u)r =
(v)r +(w)r . Diese Addition können wir dann analog zur Schulmethode für die Addition von Dezimalzahlen
durchführen: Wir definieren einen „Start-Übertrag“ s0 := 0 und berechnen wir induktiv die eindeutig
bestimmten Werte ui ∈ Σr und die neuen Überträge si+1 ∈ B mit ui + r · si+1 = vi + wi + si :
ui := (vi + wi + si ) mod r und si+1 := (vi + wi + si ) div r
Induktiv ergibt sich 0 ≤ vi + wi + si ≤ 2r − 1 und damit auch si+1 ∈ B. Ebenfalls induktiv ergibt
sich (vi . . . v0 )r + (wi . . . w0 )r = (si+1 ui . . . u0 )r . Wir können das gesuchte u also als u := sk uk−1 . . . u0
definieren.
2
Die lineare Zeitkomplexität ergibt sich sofort.
In der Rechnerhardware (mit r = 2) hat notwendigerweise das Resultat u einer Addition die gleiche Länge
wie die Argumente v und w. Dort wird daher u := uk . . . u0 gesetzt, was natürlich nur bei sk = 0 korrekt
ist. Daran kann also ein Overflow erkannt werden. Zudem erhalten wir dann (u)r = (v)r + (w)r mod 2k .
Bei 32-Bit-Rechnern ergibt sich daher auch i.A. (ohne Warnung!) 0 als Summe von 4294967295 + 1.
Der obige Algorithmus erfordert eine strikte Sequentialisierung der Addition. Bei einer Hardware-Implementierung
bedeuted dies jedoch eine große Schaltkreistiefe und damit eine lange Signallaufzeit, wenn einfache Volladdierer verwendet werden. Durch Methoden wie Carry-look-ahead kann diese Zeit deutlich reduziert
werden [Pa00].
Wenn wir natürliche Zahlen voneinander subtrahieren wollen, ergibt sich das Problem, dass negative Resultate entstehen können. Daher verwenden wir hier folgende Form:
½
2.16 Korollar. Die Funktionen
• y :=
x−
x − y, falls x ≥ y
0,
falls x < y
½
und
GEQ(x, y) :=
1, falls x ≥ y
0, falls x < y
sind für jedes r in linearer Zeit (((·)r , (·)r ), (·r ))-berechenbar.
2
Beweis: Wie oben können wir uns auf die Betrachtung von v = vk−1 . . . v0 und w = wk−1 . . . w0 aus Σ∗r
beschränken. Jetzt setzen wir jedoch
ui := (vi − wi − si ) mod r und si+1 := (vi − wi − si ) div r
woraus sich induktiv (vi . . . v0 )r − (wi . . . w0 )r = (ui . . . u0 )r − si+1 · ri+1 . ergibt. Damit erhalten wir
GEQ(x, y) = sk und (v)r − (w)r = (uk−1 . . . u0 )r im Falle von sk = 0.
2
2.17 Beispiel. Die Addition- und Subtraktionsroutinen für gleich lange Worte finden sich auch in der
GMP[Gr02]. Wir betrachten hier nur die “generische“ C-Fassung dieser Routinen, die auf AssemblerCode verzichtet. Als Alphabet Σr wird dabei im Falle von 32-bit-Rechnern der volle Umfang von unsigned long
verwendet, hier „limb“ als Verallgemeinerung von „digit“ genannt: typedef unsigned long int mp_li
Das folgende Programm ist ein leicht modifizierter Auszug aus der Datei aors_n.c, in der diese maschinenungebunde Fassungen von Addition und Subtraktion eingeführt werden. Die Bibliothek enthält jedoch
auch für viele CPU-Typen handoptimierte Assembler-Routinen.
24
2.1 Notationen, natürliche Zahlen und Berechenbarkeit
mp_limb_t
mpn_add_n (mp_ptr res_ptr,
{
register mp_limb_t x, y,
register mp_size_t j;
...
cy = 0;
do
{
y = s2_ptr[j];
x = s1_ptr[j];
y += cy;
/*
cy = (y < cy);
/*
y = x + y;
/*
cy += (y < x);;
/*
res_ptr[j] = y;
}
while (++j != 0);
2 NATÜRLICHE / GANZE ZAHLEN
mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
cy;
previous carry/borrow into second operand */
new carry from that
*/
add
*/
and its carry
*/
return cy;
}
Interessant ist dabei, wie die (hier regelmäßigen!) Overflows bei der Addition von limbs durch einen
anschließenden Größenvergleich abgefangen werden. Viele (aber nicht alle!) Prozessortypen bieten als
Maschinen-Operation bereits analoge Addition oder Subtraktion mit Carry an, die aber in der Regel aus
Hochsprachen nicht zugänglich sind.
2
Wie bereits angegeben, ist die Menge PR der berechenbaren Funktionen unter Substitutionen abgeschlossen. Daraus ergibt sich die Transitivität der Berechenbarkeit bzgl. Notationen:
2.18 Satz. Seien ν1 , ν2 , ν3 Notationen von M1 , M2 , M3 , sei g : M1 ÂM2 und h : M2 ÂM3 . Ist g (ν1 , ν2 )–
berechenbar und ist h (ν2 , ν3 )–berechenbar, so ist h ◦ g : M1 ÂM3 (ν1 , ν3 )–berechenbar.
2
Beweis: Seien f1 , f2 ∈ PR gegeben mit
∀w ∈ Def(gν1 ) gν1 (w) = ν2 f1 (w),
∀v ∈ Def(hν2 ) hν2 (w) = ν3 f2 (w),
Dann gilt für alle w ∈ Def(h ◦ g ◦ ν1 ) ⊆ Def(g ◦ ν1 )
h ◦ g ◦ ν1 (w) = h ◦ (ν2 ◦ f1 (w))
= ν3 ◦ f2 ◦ f1 (w).
Mit f2 ◦ f1 ∈ PR ist h ◦ g also (ν1 , ν3 )–berechenbar.
(⇒ f1 (w) ∈ Def(h ◦ ν2 ))
2
Bei den als Beispiel verwendeten Notationen sind die Definitionen zum Teil recht willkürlich, zum Teil
auch nicht vollständig ausgeführt. Schon kleine Modifikationen an den Definitionen führen zu anderen
Notationen, etwa die Änderung von ι bei νΣ . Es stellt sich also die Frage, wie man zwei Berechenbarkeitsbegriffe auf einer Menge vergleicht, die von zwei verschiedenen Notationen herrühren:
25
2.2 Ganze Zahlen
2 NATÜRLICHE / GANZE ZAHLEN
2.19 Definition. Seien ν, ν 0 Notationen einer Menge X.
(a) ν 0 heißt auf ν reduzierbar ( in Zeichen ν 0 ≤ ν), wenn ein f ∈ PR existiert mit
(∀w ∈ Def(ν 0 )) ν 0 (w) = νf (w).
(b) ν 0 und ν heissen (berechenbar) äquivalent (in Zeichen ν 0 ≡ ν), wenn ν 0 ≤ ν und ν ≤ ν 0 gilt.
2
Anmerkung: Bei ν 0 ≤ ν kann man also Namen bzgl. ν 0 mit einem f ∈ PR in Namen bzgl. ν übersetzen. Ferner ist „ν 0 ≤ ν“ gleichwertig mit „idX ist (ν 0 , ν)-berechenbar“ für die Identität idX : X →
X, idX (x) := x. Damit ergibt sich sofort:
2.20 Satz. Seien ν1 , ν2 äquivalente Notationen einer Menge X und ν 0 Notation einer weiteren Menge X 0 .
Dann gilt:
(a) g : X ÂX 0 ist (ν1 , ν 0 )-berechenbar genau dann, wenn g (ν2 , ν)-berechenbar ist.
(b) h : X 0 ÂX ist (ν 0 , ν1 )-berechenbar genau dann, wenn h (ν 0 , ν2 )-berechenbar ist.
2
Modifikationen bei der Definition einer Notation sind also erlaubt und ohne (wichtige) Auswirkungen,
wenn dabei äquivalente Notationen entstehen.
2.21 Lemma. Die Notationen (·)r sind alle äquivalent!
2
Beweis: als Übung
2.2 Ganze Zahlen
Ganze Zahlen werden in Rechnerhardware meist in der „Zweierkomplement-Notation“ notiert:
2.22 Definition. Die „Zweierkomplement-Notation“ (·)zk : B∗ \ {λ} → Z ist definiert durch:
½
(vk vk−1 . . . v0 )zk :=
(vk−1 . . . v0 )2
−2k + (vk−1 . . . v0 )2
falls vk = 0
falls vk = 1
¾
=
k−1
X
vi · 2i − vk · 2k .
i=0
2
Beispiele sind (010101)zk = (10101)2 = 21, (101010)zk = −25 + (01010)2 = −22. Es ergibt sich:
2.23 Lemma. Für alle k ∈ N gilt:
(Bk )zk = {x ∈ Z | 0 ≤ x ≤ 2k − 1 ∨ 0 − 2k ≤ x ≤ 2k − 1 − 2k }
= {x ∈ Z | −2k ≤ x ≤ 2k − 1}
2
26
2.2 Ganze Zahlen
2 NATÜRLICHE / GANZE ZAHLEN
Damit ist (·)zk sicher surjektiv. Ferner kann man am ersten Zeichen eines Wortes v = vk . . . v0 das Vorzeichen von (v)zk ablesen: Es gilt (v)zk ≥ 0 ⇔ vk = 0.
Normalerweise kann die Länge der Worte bei der Zweierkomplementdarstellung im Computer nur einige
wenige, feste Werte annehmen; in C++ sind dies beim Typ short int 16 Bit (= 2 Byte) und beim Typ
long int 32 Bit (= 4 Byte). Damit ergeben sich folgende Bereiche, die dargestellt werden können:
short int −215 .. 215 − 1, d.h. − 32768 .. 32767
long int −231 .. 231 − 1, d.h. − 2.147.483.648 .. 2.147.483.647
Der entscheidende Vorteil der Zweierkomplement-Notation
ist die
einfache Realisierung von AdPk−1 i
Ptechnisch
k
k
i
dition (und Subtraktion): Da (vk . . . v0 )zk = i=0 vi 2 −vk 2 = i=0 vi 2 −vk 2k+1 = (vk . . . v0 )2 −vk 2k+1
gilt, kann man die Zweierkomplementaddition auf die normale Addition von Dualzahlen zurückführen: Es
seien v = vk . . . v0 und w = wk . . . w0 gegeben. Zur Addition von (v)zk und (w)zk führen wir zunächst
eine normale Dualaddition von vk . . . v0 und wk . . . w0 mit Ergebnis uk . . . u0 =: u und letztem Übertrag
sk+1 durch, d.h. es ergibt sich (v)2 + (w)2 = (u)2 + sk+1 2k+1 . Damit folgt
(v)zk + (w)zk = (v)2 − vk 2k+1 + (w)2 − wk 2k+1
= (u)2 + 2k+1 (sk+1 − vk − wk )
= (u)zk + 2k+1 (uk + sk+1 − vk − wk )
Auf jeden Fall gilt also (v)zk + (w)zk mod 2k+1 = (u)zk mod 2k+1 . Wir unterscheiden nun zwei Fälle:
• Die Summe (v)zk + (w)zk ist im Zweierkomplement als Wort der Länge k+1 darstellbar: Dann gilt
−2k ≤ (v)zk + (w)zk < 2k ,−2k ≤ (u)zk < 2k und damit |(u)zk − ((v)zk + (w)zk )| < 2k+1 . Es folgt
(u)zk = (v)zk + (w)zk und uk + sk+1 = vk + wk .
• Die Summe (v)zk + (w)zk ist nicht mit nur k+1 Zeichen darstellbar (d.h. es liegt ein overflow vor):
Es sei also (v)zk + (w)zk < −2k oder (v)zk + (w)zk ≥ 2k . Wegen −2k ≤ (u)zk < 2k ergibt sich
uk + sk+1 6= vk + wk .
Overflow liegt genau dann vor, wenn uk + sk+1 6= vk + wk gilt, ansonsten ist (u)zk = (v)zk + (w)zk .
Eine alternative Notation der ganzen Zahlen benutzt stellt Vorzeichen und Betrag der Zahl getrennt dar
(„sign-magnitude“):
2.24 Definition. Die „sign-magnitude-Notation“ (·)sm : B∗ \ {λ} → Z ist definiert durch:

 (w)2 , falls v = 0w für ein w ∈ B∗
−(w)2 , falls v = 1w für ein w ∈ B∗
(v)sm =

0
falls v = λ
2
Das erste Bit eines Wortes stellt also das Vorzeichen dar. Der Wertebereich ergibt sich zu
2.25 Lemma. Für alle k ∈ N gilt(Bk+1 )sm = {x ∈ Z | 1 − 2k ≤ x ≤ 2k − 1}.
27
2
2.3 Die Multiplikation natürlicher Zahlen
2 NATÜRLICHE / GANZE ZAHLEN
Insbesondere hat dann die Zahl Null auch bei jeder festen Wortlänge zwei Namen: 000 . . . und 100 . . ..
Diese Notation wird oft benutzt, wenn die Wortlänge nicht fixiert ist, sondern variabel bleibt (d.h. bei
Software-Lösungen). Als Beispiel kann hier GMP (GNU Multiple Precision Arithmetic Library) dienen.
Die entsprechende Deklaration in GMP.h lautet:
typedef struct
{
int _mp_alloc;
int _mp_size;
mp_limb_t *_mp_d;
} __mpz_struct;
/* Number of *limbs* allocated and pointed
to by the _mp_d field. */
/* abs(_mp_size) is the number of limbs the
last field points to. If _mp_size is
negative this is a negative number. */
/* Pointer to the limbs. */
2.26 Lemma. (·)zk und (·)sm sind äquivalent. Die Umrechnung ist in linearer Zeit möglich.
Die Addition und die Subtraktion ganzer Zahlen sind in linearer Zeit ((·)2sm , (·)sm )-berechenbar.
2
Beweis: Bei gegebenem v = (vk . . . v0 ) gilt im FallePvk = 0 sofort (v)zk =
wi = 1 − vi ,
sm . Setzen
P(v)
Pwir
k−1
k−1 i
i
k
i
so erhalten wir für vk = 1 sofort (v)zk = −2k + k−1
v
2
=
−2
−
w
2
−
2
= −(1 +
i
i=0
i=0
Pk−1 i
Pk−1 i=0 i i Pk−1 i
k
(wk−1 . . . w0 )2 ) und (v)sm = − i=0 vi 2 =
i=0 wi 2 −
i=0 2 = −2 + 1 + (wk−1 . . . w0 )2 . Ein
Algorithmus zum Nachweis der Äquivalenz muß also lediglich Bits invertieren und dann binär 1 addieren
oder subtrahieren.
Die Algorithmen zur Addition und Subtraktion könnte man durch Umwandlung ins Zweierkomplement
ausführen. Es ist jedoch schneller, entsprechend der Vorzeichenkombination der Argument eine einfache
Binäraddition oder Subtraktion durchzuführen. Tritt der Fall ein, dass bei einer Binärsubtraktion das Ergebnis negativ würde, so vertauscht man die zwei Argumente, subtrahiert erneut und korrigiert dies über
das Vorzeichen des Resultates.
2
2.3 Die Multiplikation natürlicher Zahlen
Während für Additionen ganzer Zahlen die Zweierkomplement-Notation von Vorteil ist, ist bei Multiplikationen und Divisionen die Sign-Magnitude-Notation einfacher in der Handhabung. Hier kann man nun
zwei Teile unterscheiden: Die (triviale) Bestimmung des Vorzeichens des Resultates und die Multiplikation
(oder Division) der natürlichwertigen Anteile der Argumente. Aus diesem Grund werden wir im folgenden
auch nur die Multiplikation natürlicher Zahlen untersuchen.
Die Computer-Hardware wird wieder auf binärer Darstellung aufbauen (müssen), während Softwarelösungen wie GMP diese Hardware-Multiplikationen als Basisoperationen verwenden können. Hier ist es
also auch wieder sinnvoll, die r-adischen Zahlen mit großer Basis r zugrunde zu legen (d.h. r = 232 bei
32-Bit-Rechnern), da dann die Algorithmen im praktischen Einsatz wesentlich schneller werden.
Wie Multiplikationen in Hardware durchgeführt werden können, werden wir nur am Rande streifen. In
[Pa00] wird dieses Thema ausführlich behandelt.
28
2.3 Die Multiplikation natürlicher Zahlen
2 NATÜRLICHE / GANZE ZAHLEN
P
Sind v = vk−1 . . . v0 und w = wk−1 . . . w0 gegeben, so erhalten wir (v)r · (w)r = 0≤i<k wi ri · (v)r . Damit
können wir zunächst die Multiplikation mit (w)r auf die Multiplikationen von (v)r mit den einzelnen
Stellen wi reduzieren, deren Resultate dann nach entsprechendem Links-Shifts (für die Multiplikationen
mit den Potenzen ri von r) addiert werden.
Für die Einzel-Multiplikationen brauchen wir zusätzlich noch das „kleine Ein-mal-Eins“, d.h. eine Tabelle
(oder Funktion) (x, y) 7→ (u, s) mit x · y = s · r + u für x, y, u, s ∈ Σr .
2.27 Lemma. (Multiplikation mit Konstanten)
Eine natürliche Zahl kann in r-adischer Notation mit einer konstanten Zahl in linearer Zeit multipliziert
werden.
2
Beweis: Wir betrachten zunächst den Fall (vk−1 . . . v0 )r · m mit einer Zahl m ∈ Σr . Ähnlich wie bei
der Addition setzen wir s0 := 0 und induktiv ergeben sich mit dem kleinen Ein-mal-Eins ui , si+1 aus
si+1 · r + ui = vi · m + si .
Allerdings ist hier nicht mehr si ∈ B, stattdessen kann si beliebige Werte aus Σr annehmen. Wegen
vi · m + si ≤ (r−1)2 + r−1 = (r−1) · r bleibt der Übertrag jedoch stets einstellig.
Induktiv ergibt sich (vi . . . v0 )r · m = (ui . . . u0 )r + si+1 · ri+1 , d.h. als Produkt ergibt sich (sk uk−1 . . . u0 )r .
Ist der Multiplikator mehrstellig, so zerlegen wir in in seine einzelnen Stellen, die wir getrennt multiplizieren und jeweils direkt aufaddieren. Bei festen Multiplikator ergibt sich also insgesamt ein linearer
Aufwand.
2
Anmerkung: Bei den üblichen PC-Prozessoren gibt es einen Assemblerbefehl, der zwei 32-Bit-Zahlen
multipliziert und eine 64-Bit-Zahl als Resultat ergibt. Beim ebenfalls vorhandenen Multiplikationsbefehl
mit 32-Bit-Ergebnis werden wie üblich die oberen 32 Bit abgeschnitten. In der GNU-C-Bibliothek (und
entsprechend dem GCC-Compiler) können die 64-Bit-Werte als unsigned long long int angesprochen werden.
Es ergibt sich sofort:
2.28 Lemma. (Schul-Methode zur Multiplikation)
Natürliche Zahlen können in r-adischer Notation in quadratischer Zeit O(n2 ) multipliziert werden.
2
Im Spezialfall r = 2 ist das kleine Ein-mal-Eins ziemlich trivial, daher reduziert sich die Multiplikation
dort auf folgende einfache Additionen:
X
(v)2 · (w)2 =
(v0i )2
i:wi =1
Weitere Möglichkeiten, die Multiplikation auf der Hardware-Seite, d.h. mit fester Wortlänge k, zu optimieren, findet man in [Pa00]. Wir werden im folgenden die Asymptotik für k → ∞ untersuchen, wo
wesentlich bessere Resultate als die gezeigte quadratische Laufzeit zu erreichen sind.
Wir beginnen mit dem Algorithmus des russischen Mathematikers Karatsuba, 1963 veröffentlicht. Die
Grundidee besteht darin, die Multiplikation langer Zahlen rekursiv auf kürzere Multiplikationen zurückzuführen, unter Inkaufnahme einiger zusätzlicher Schiebe- und Additionsoperationen.
29
2.3 Die Multiplikation natürlicher Zahlen
2 NATÜRLICHE / GANZE ZAHLEN
2.29 Lemma. (Karatsuba-Algorithmus)
Natürliche Zahlen können in r-adischer Notation in Zeit O(nlog2 3 ) ≈ O(n1.58496 ) multipliziert werden. 2
Beweis: Seien v und w gegeben, wobei wir o.B.d.A annehmen, dass sie gleiche gerade Länge 2n haben
(evtl. durch führende Nullen). Es ist als v = v2n−1 . . . v0 und w = v2n−1 . . . v0 . Wir zerlegen beide in zwei
Hälften:
vh := v2n−1 . . . vn vl := vn−1 . . . v0
wh := w2n−1 . . . wn
wl := wn−1 . . . w0
Damit ist z.B. (v)r = (vh )r · rn + (vl )r
Somit haben wir für das Produkt beider Zahlen die Gleichung
(v)r · (w)r = (r2n +rn ) · ((vh )r · (wh )r )
+rn · ((vh )r − (vl )r ) · ((wl )r − (wh )r )
+(rn +1) · ((vl )r · (wl )r )
Diese Gleichung reduziert die Multiplikation zweier 2n-stelliger Zahlen auf drei Multiplikationen von nstelligen Zahlen, da sich die „überzähligen“ Terme genau aufheben. Diese n-stelligen Multiplikationen
können nun entweder rekursiv über die gleiche Formel oder aber direkt mit der obigen „Schul-Methode“
berechnet werden.
Wenn T (n) die benötigte Zeit für eine Multiplikation n-stelliger Zahlen ist, ergibt sich also T (2n) ≤
3T (n) + cn. Wählt man c0 = 3T (1) + c, so ergibt sich induktiv T (2k ) ≤ c0 (3k − 2k ), also sicherlich
T (2k ) ≤ c0 3k . Es folgt
T (n) ≤ T (2dlog2 ne ≤ c0 3dlog2 ne ≤ c0 31+log2 n ≤ 3c0 2log2 n·log2 3 = 3c0 nlog2 3
2
Die Karatsuba-Methode ist nur eine Spezial-Form einer allgemeineren Vorgehensweise, bei der man eine
Zahl in d + 1 kürzere Komponenten zerlegt, die mittels 2d + 1 Multiplikationen und durch geeignete Linearkombinationen zusammengesetzt das Gesamt-Produkt ergeben. Die Grundidee dieser Methode stammt
vom russischen Mathematiker A.L. Toom; S.A. Cook zeigte 1966, wie diese Idee für schnelle Computerprogramme eingesetzt werden konnte:
2.30 Lemma. (Toom-Cook-Algorithmus mit fester Teilung)
Für jedes gegebene ε > 0 können natürliche Zahlen in r-adischer Notation in Zeit c(ε)n1+ε multipliziert
werden. Dabei ist c(ε) von n unabhängig.
2
Einschub:
Toom-Cook-Multiplikationsmethode
30
2.4 Divisions-Algorithmen
2 NATÜRLICHE / GANZE ZAHLEN
Wählt man die Anzahl d + 1 der Teile, in die man die Argumente v und w zerlegt, in Abhängigkeit
von der Länge von v und w, so läßt sich die asymptotische Entwicklung der Komplexität weiter nach
unten drücken. Allerdings muß man dann auch die Polynom-Koeffizienten explizit berechnen (statt sie wie
oben einer festen Tabelle entnehmen zu können). Daher werden statt der Lagrange-Interpolationsformel
auch Differenzenschemata zur Interpolation verwendet. Damit lässt sich die aymptotische Schranke für die
Komplexität der Multiplikation weiter sehr stark drücken:
2.31 Lemma. (Toom-Cook-Algorithmus mit variabler Teilung, ohne Beweis,
vgl. [Kn81])
√
2 log n
Natürliche Zahlen können in r-adischer Notation in Zeit O(n log n · 2
) multipliziert werden.
2
Verwendet man statt der hier benutzten r−adischen Notation in Zwischenschritten eine „modulare“ Notation, so kann man noch schneller multiplizieren: Der schnellste bekannte Algorithmus zur Multiplikation
mit dem Turingmaschinen-Modell stammt von Schönhage und Strassen:
2.32 Lemma. (Schönhage-Strassen-Algorithmus, ohne Beweis, vgl. [Kn81])
Natürliche Zahlen können in r-adischer Notation in Zeit O(n log n · log log n) multipliziert werden.
2
Es ist nicht bekannt, ob bei dem von uns benutzten Turing-Maschinen-Modell schneller multipliziert werden kann als angegeben. Auf anderen Rechnermodellen (pointer machine, storage modification machine
[Sch80]) ist es allerdings sogar möglich, in linearer Zeit zu multiplizieren.
Als untere Schranke gibt es für den allgemeinen Fall nur die (triviale) lineare Laufzeit. Für spezielle Berechnungsmodelle (online-Arithmetik) gibt es die untere Schranke n log n/ log log n [PFM74]
Der Karatsuba-Algorithmus, einfache Fassungen des Toom-Cook (Zerlegung in drei Teile) und die SchönhageStrassen-Methode sind z.B. in der GMP-Bibliothek implementiert. Eine Tuning-Routine aus GMP 4.0
lieferte zum Beispiel für Pentium-III-5ooMHz CPUs, dass es sinnvoll wäre, Karatsuba ab n = 23, ToomCook ab n = 139 und die Schönhage-Strassen-Methode ab n = 4864 einzusetzen. (Für einen 900-MHzAthlon ergaben sich als Werte analog: n = 26, 177, 9472.)
Da die Komplexität der Multiplikation noch nicht eindeutig bestimmt werden konnte, werden wir im
folgenden einfach eine Funktion M dafür ansetzen. Bei heutigen Kenntnisstand wäre also M(n) =
n log n log log n. Wir werden bei der Definition zwei Bedingungen an diese Komplexitätsschranke stellen, die erstmals bei [PFM74] auftauchen und benutzt werden, um Glattheitseigenschaften der Schranke
vorzuschreiben. In ähnlicher Bedeutung werden diese Bedingungen öfter benutzt. Wir werden sie erst später motivieren können, da wir hier den Beweis der unteren Schranke nicht weiter verfolgen.
2.33 Definition. M : N → N sei im folgenden die beste (bekannte) Komplexitätsschranke für die Multiplikation von natürlichen Zahlen bei r-adischer Notation und dem Turingmaschinen-Modell mit beliebiger
fester Zahl von Arbeitsbändern. Wir verlangen zudem, dass M monoton ist und 2M(n) ≤ M(2n) ≤
cM(n) + c für alle n ∈ N und eine Konstante c gilt.
2
2.4 Divisions-Algorithmen
Im Bereich der natürlichen Zahlen ist unter einer Division immer einer Division mit Rest zu verstehen, d.h.
bei gegebenem y 6= die Zerlegung einer Zahl x in zwei Zahlen p und q < y mit x = p · y + q, d.h. p = b xy c,
q = x mod y.
31
2.4 Divisions-Algorithmen
2 NATÜRLICHE / GANZE ZAHLEN
Wir werden in einem späteren Kapitel zeigen, dass die Division so schnell ausgeführt werden kann wie
eine Multiplikation. Zunächst werden wir jedoch die Schul-Methode zur Division analysieren, bei der man
eine Stelle des Quotienten „errät“ und dann entsprechend den Dividenden korrigiert.
Als Basis-Operation brauchen wir hier die Möglichkeit, zweistellige Zahlen durch einstellige Zahlen mit
Rest zu dividieren. Genauer: wir nehmen an, dass wir zu v, w ∈ Σr , w 6= 0 und s < w Werte u ∈ Σr und
s0 < w bestimmen können, so daß
u · w + s0 = (sv)r
Bei r = 2 ist dies trivial: Hier ist nur w = 1 und damit s = 0 von Interesse, also muß hier s0 = 0 und
u = v gelten.
Wir betrachten zuerst den Fall, dass der Divisor nur einstellig ist:
2.34 Lemma. (Schul-Methode zur Division, einstellig)
Division mit Rest ist bei natürlichen Zahlen in r-adischer Notation bei einem einstelligen Divisor in Zeit
O(n) möglich.
2
Beweis: Wir betrachten die Division einer als (v)r gegebenen Zahl durch ein w ∈ Σr Der Einfachheit
halber indizieren
P k−i wir die einzelnen Stellen von v jetzt von links nach rechts, also v = v0 . . . vk−1 mit
(v)r =
vi r .
Wir setzen zunächst s0 = 0 und dann wieder iterativ ui und si so daß ui · w + si+1 = (si vi )r : Hier gilt dann
(v0 . . . vi )r = (u0 . . . ui ) · w + si+1
Insgesamt erhalten wir also (v0 . . . vk−1 )r div w = (u0 . . . uk−1 )r Rest sk
2
Hat der Divisor mehr als eine Stelle, so können wir zwar den gleichen Ablauf wie bei der einstelligen
Division verwenden, aber wir brauchen eine mächtigere Basisoperation: Zu v ∈ Σr , w ∈ Σkr , w 6= 0 und
s ∈ Σkr mit (s)r < (w)r brauchen wir Werte u ∈ Σr und s0 ∈ Σkr mit (s0 )r < (w)r , so daß u · (w)r + (s0 )r =
(sv)r .
Diese bedeutet i.W., dass wir zu s, v, w dasjenige u ∈ Σr finden müssen, für das u · (w)r ≤ (sv)r <
(u + 1) · (w)r . Hieraus lässt sich dann das gesuchte s0 durch Berechnung von (sv)r − u · (w)r bestimmen.
Beim Erlernen der Division in der Schule wurde dieser Wert von u einfach geraten. In [Kn81] findet man
eine einfache deterministische Methode, mit der man einen Wert û bestimmen kann, der fast immer passt.
Es sei dazu s = s0 s1 . . . sk .
2.35 Lemma. Setze û = min {(s0 s1 )r /w0 , r−1}. Dann gilt u ≤ û.
Ist zudem w0 ≥ br/2c, so gilt sogar û−2 ≤ u ≤ û.
2
Beweis:
Einschub:
Quotienten-Bestimmung
32
2.5 Redundante Zahl-Notationen
2 NATÜRLICHE / GANZE ZAHLEN
2
Die Bedingung w0 ≥ br/2c lässt sich erzwingen, indem man w (und natürlich auch v) entsprechend mit
br/(w0 + 1)c erweitert. Man muß danach also nur noch maximal 3 drei Werte für u austesten. Pro Stelle
des Ergebnisses bei der Division ist dies mit einem Aufwand durchzuführen, der linear in der Länge von
w ist. Damit ergibt sich sofort:
2.36 Lemma. (Schul-Methode zur Division)
Division mit Rest von (v0 . . . vk−1 )r und (w0 . . . wn−1 )r ist in Zeit O(k · n) möglich.
2
Ist n das Maximum der Längen von Dividend und Divisor, so ist die Division damit in Zeit O(n2 ) möglich.
Schnellere Algorithmen zur Division lassen sich besser im Bereich reeller Zahlen motivieren, daher werden
wir sie erst später behandeln. Wir geben hier jedoch schon einmal das Ergebnis an, das im wesentlichen
darauf zurückzuführen ist, dass ein Kehrwert 1/a durch die Bestimmung des Fixpunktes der Funktion
Φ(x) = 2x − ax2 berechnet werden kann:
2.37 Lemma. (Konvergenz-Methode zur Division, Beweis folgt später)
Division mit Rest von (v0 . . . vk−1 )r und (w0 . . . wn−1 )r ist in Zeit O(M(k + n)) möglich.
2
Die folgende Graphik zeigt f (x) = 2x − ax2 für den Spezialfall a = 3, wo man die sehr gute Konvergenz
der Fixpunktiteration bereits erkennen kann, da hier die Ableitung im Fixpunkt x = 1/3 sogar 0 ist:
Bestimmung des Kehrwertes von a=3
0.4
2*x-a*x*x
0.38
0.36
0.34
0.32
0.3
0.3
0.32
0.34
0.36
0.38
0.4
2.5 Redundante Zahl-Notationen
Der wichtigste Punkt beim Nachweis der Surjektivität r-adischer Notationen war die Eigenschaft, dass
man jede Zahl x ∈ Z in der Form x = q · r + p mit q ∈ Z und p ∈ Σr schreiben kann. Dies ist
jedoch auch möglich, wenn man andere Ziffernmengen verwendet: Bereits 1961 untersuchte Avizienis die
Ziffernmenge {−1, 0, 1} bei Basis r = 2 auf ihre Eignung zu carry-freier Addition.
Man spricht hier von signed digits, wobei man im allgemeinen für eine gegebene Basis r die Ziffern
{d | r > |d|} meint.
Damit gibt es nun offensichtlich mehrere Möglichkeiten der Zerlegung x = q ·r +p: Wenn x = q ·r +d gilt,
so ist auch x = (q+1) · r + (d−r). Da man jede natürliche Zahl n r-adisch hinschreiben kann, kann man
sie damit trivialerweise auch im Ziffern-System {d | r > |d|} notieren. Ebenso kann man natürlich auch
33
2.5 Redundante Zahl-Notationen
2 NATÜRLICHE / GANZE ZAHLEN
−n notieren, indem man bei der jedes Ziffer d durch die Ziffer −d ersetzt. Man erhält also eine Notation
(·)r von Z.
Die Idee des folgenden Algorithmus zur Carry-freien Addition findet sich bereits in [Av61]: Sind zwei
Zahlen x = (. . . xj xj−1 . . .)r und y = (. . . yj yj−1 . . .)r in einem signed digit-Zahlsystem mit Basis r
gegeben, werden zunächst zwei neue Folgen von Transferziffern (. . . tj tj−1 . . .) und Zwischensummen
(. . . wj wj−1 . . .) berechnet. Die Transferstellen werden um 1 geshifted (d.h. uj := tj−1 ) schließlich summiert man sj := wj + uj mit Resultat (. . . sj sj−1 . . .)r = x + y.
Genauer:
r · tj + wj := xj + yj
Wegen der Redundanz im Zahlensystem sind dadurch tj und wj nicht eindeutig definiert, wir setzen z.B.
xj + yj ≥ r/2
⇒ tj := 1,
wj := xj + yj − r
|xj + yj | < r/2
⇒ tj := 0,
wj := xj + yj
xj + yj ≤ −r/2 ⇒ tj := −1, wj := xj + yj + r
Es ist leicht nachweisbar, dass (. . . sj sj−1 . . .)r = x+y gilt. Die einzige fehlende Stelle ist noch der Nachweis, dass sj eine erlaubte Ziffer ist. Im Falle der üblichen vollen Ziffernmenge xj , yj ∈ {1−r, . . . , r−1}
ist die notwendige Bedingung hier |wj | ≤ r − 2. Wir brauchen also r > 2. Für r = 2 gibt es allerdings ebenfalls die Möglichkeit, fast Carry-frei zu addieren, allerdings braucht man (wenige) zusätzliche
Shift-Operationen. Beispiele für solche Algorithmen finden sich in [Pa00].
In theoretischen Arbeiten zur Berechenbarkeit auf reellen Zahlen wurden signed digits eingesetzt, um die
Komplexität reeller Funktionen definieren zu können, z.B. [Mu86, Mu87]. Dabei muß eine Normalisierungsbedingung beachtet werden: Um topologisch kompakte Namensmengen reeller Zahlen zu erhalten,
dürfen die führenden zwei Ziffern eines Namens für r = 2 weder ‘1 −1’ noch ‘−1 1’ sein, beide könnten
zu ‘0 1’ bzw. ‘0 −1’ vereinfacht werden. Bei einer Basis r > 2 sind als Normalisierungsbedingung die
Folgen ‘1 1−r’ und ‘−1 r−1’ als führende Werte verboten.
Leider erzeugt der Additionsalgorithmus in der obigen Form solche „verbotenen“ Folgen: Ein Beispiel
(passend für beliebiges r > 3) ist die Addition von (. . . 0 3 1−r 1−r . . .) und (. . . 0 −1 1−r 1−r . . .) mit
Summe (. . . 0 1 1−r . . .).
Eine mögliche Lösung ist es, die Ziffern r−1 und 1−r ganz zu verbieten. Man kann sogar soweit gehen,
sich auf die Ziffern Dr := {−d r+1
e, ..., 0, ..., d r+1
e} zu beschränken. Hier gilt d r+1
e < r−1, sobald r > 4.
2
2
2
Dieser Ziffernsatz ist immer noch ausreichend groß, um die Surjektivität der Notation zu gewährleisten.
Auch die Carry-freie Addition ist noch möglich: Beim obigen Algorithmus ergibt sich |xi +yi | ≤ r+2 ,
damit |wi | ≤ d r+1
e − 1 und sj ∈ Dr .
2
2.38 Lemma. (a) Trotz der Redundanz der Notation bestehen die Namen für die Zahl Null nur komplett
aus Nullen.
(b) Das Vorzeichen einer Zahl ist das Vorzeichen der ersten Ziffer der Namens, die nicht die Ziffer Null ist.
(b) Beim Ziffernsatz Dr := {−d r+1
e, ..., 0, ..., d r+1
e} mit r > 4 lässt sich die Größe einer Zahl aus der
2
2
Position der ersten Nicht-Null-Ziffer abschätzen: Für jede Folge (. . . xj xj−1 . . .) gilt
¯
¯
¯
¯ X
¯
¯
xj · rj ¯ > rm−1
rm+1 > ¯
¯
¯
j∈Z,j≤m
wenn m die Position der ersten Ziffer ist, die nicht Null ist.
34
2
2.6 Modulare Arithmetik
2 NATÜRLICHE / GANZE ZAHLEN
Durch die Möglichkeit Carry-freier Addition verringern sich die Abhängigkeiten zwischen den einzelnen
Stellen der Argumente und des Ergebnisses der Operation. Dies kann man bei Vektorrechnern für ein besseres Pipelining der Daten ausnutzen. Da auch Alltags-CPUs jedoch mittlerweile ähnliche Eigenschaften
aufweisen, könnte die Verwendung der redundanten Darstellung zu einem deutlichen Geschwindigkeitsvorteil führen. Die Beschränkung auf die minimale Ziffernmenge Dr vermeidet zudem Nachteile dieser
Notation durch evtl. fehlende Normierung. Eine entsprechende Implementierung ist jedoch noch nicht
bekannt, ein erster Ansatz wird in [Mu02] beschrieben.
2.6 Modulare Arithmetik
Statt der vom Dezimalsystem gewohnten Ziffer-Schreibweise kann man Zahlen auch unter Verwendung
des chinesischen Restsatzes notieren. Grundidee ist die Verwendung mehrerer Moduli m1 , m2 , m3 , . . ., die
wechselseitig teilerfremd sind. Eine natürliche Zahl x wird dann notiert durch die Reste x1 = x mod m1 ,
x2 = x mod m2 , . . .:
2.39 Definition. Bei einer gegebenen Folge M = (m1 , m2 . . .) teilerfremder Zahlen definieren wir eine
Notation νM der natürlichen Zahlen durch
νM (w) := x
⇔ pr∗ (w) = (v1, v2, ..., vm ) und x = die eindeutig bestimmte Zahl ≤
x mod mi .
Qm
i=1
mi mit (vi )2 =
2
Die Eindeutigkeit der Zahl x in der obigen Definition ist der Kern des genannten chinesischen
Q Restsatzes
(ca. 400 a.D.!) Er lässt sich z.B. durch ein einfaches Zählargument beweisen: Mit M (m) := m
i=1 mi gibt
es genau M (m) Zahlen x mit 0 ≤ x < M (m) und ebenfalls genau M (m) mögliche Tupel von Resten
x mod mi .
Die Grundrechenarten Addition, Subtraktion und Multiplikation können nun sehr einfach auf die einzelnen
„Ziffern“ xi := (vi )2 übertragen werden, wenn die Argumente mit gleicher Zahl m von Moduln gegeben
sind und solange dabei kein Overflow passiert, d.h. das Ergebnis einer Operation negativ wird oder größer
als M (m) wird:
Ist xi = x mod mi und yi = y mod mi , so gilt
(x + y) mod mi = (xi + yi ) mod mi
(x − y) mod mi = (xi − yi ) mod mi
(x · y) mod mi = (xi · yi ) mod mi
Damit können alle Einzelreste unabhängig voneinander und damit evtl. parallel berechnet werden.
Mit Hilfe elementarer Arithmetik für die Binärnotation (und etwas Zahlentheorie) kann man zeigen:
2.40 Lemma. Ist die Folge M = (m1 , m2 . . .) berechenbar, so sind νM und (·)2 äquivalente Notationen.
2
35
2.7 Kompakte Notationen
2 NATÜRLICHE / GANZE ZAHLEN
Während bei gegebenem M die Umwandlung aus binärer Notation in die modulare Notation einfach ist,
ist die umgekehrte Übersetzung nicht ganz trivial: Naheliegend, aber von der Komplexität her völlig unbefriedigend wäre eine vollständige Suche im Raum aller möglichen Zahlen 0 ≤ x < M (m) zu einem
gegebenen Tupel (x1 , . . . , xm ) von Resten. Stattdessen kann man auch verwenden, dass es wegen der Teilerfremdheit der mi Zahlen mi geben muß, so dass 1 = mi mod mi und 0 = mi mod mj für j 6= i gilt.
Dann ist einfach
³X
´
x=
xi mi mod M (m)
Weitere Details zu dieser Notation νM findet man z.B. in [Kn81]. Es sei nur angemerkt, dass es relativ
aufwendig ist, den Overflow-Fall bei der Berechnung zu testen oder etwa die Operationen ≤ auszuführen.
Dennoch ist diese Art der Notation Basis des bereits angesprochenen Schönhage-Strassen-Algorithmus.
2.7 Kompakte Notationen
Die Komplexitätsaussagen dieses Kapitels sind bisher immer auf den notierenden Namen, aber nicht auf
die notierte Zahl bezogen worden. So besagt die Aussage der Berechenbarkeit der Division in quadratischer
Zeit „nur“, dass bei einem Argument w mit Länge n die Laufzeit des Algorithmus durch O(n2 ) beschränkt
ist. Diese Aussage ist jedoch in zweierlei Hinsicht unzureichend:
• Wenn wir die unäre Notation νu : B → N mit νu (w) :=Länge(w) betrachten, so ergibt sich, dass
die Division hier sogar in linearer Zeit berechenbar ist: Die Umrechnung aus der unären Notation
in Binärnotation ist in linearer Zeit möglich, wie man am Beispiel des Zählens in Binärnotation
erkennen kann. Die binären Argumente kann man dividieren und das Ergebnis wieder umwandeln.
Diese letzte Umwandlung ist linear in der Länge der Ergebnisses der Umwandlung, und damit linear
in der Länge n der ursprünglichen Argumente. Insgesamt ergibt sich also ein Aufwand von O(n +
(log2 n)2 + n) = O(n).
Allgemein kann man zeigen, dass es zu jeder berechenbaren Funktion f : Nk → N eine Notation
gibt, die gerade dieses f in linearer Zeit berechenbar macht (vgl.[We00]).
bxc
• Betrachten wir andererseits die Berechnung der Funktion b zy c. Es ist naheliegend, diese aus zwei
Divisionen mit Rest zusammenzusetzen. Wenn wir die Komplexität dieser zusammengesetzten Funktion abschätzen wollen, können wir jedoch als Schranke für die Länge der Zwischenresultate nur die
Rechenzeit der Zwischenberechnung annehmen (pro Rechenschritt wird maximal ein Zeichen ausgegeben). Damit erhalten wir jedoch als Komplexitätsschranke nur O(O(n2 )2 ) = O(n4 ) statt der zu
erwartenden O(n2 )-Schranke
In beiden Fällen wäre es also hilfreich, wenn man die Komplexität einer Funktion nicht an den Namen
eines Argumentes, sondern an das Argument selbst binden könnte. Für Komplexitätsbetrachtungen sollte
man aber allen Argumenten zusätzlich in sinnvoller Weise eine „Größe“ zuordnen können:
2.41 Definition. Gegeben seien Mengen X und Y mit Notationen νX und νY sowie eine Abbildung G :
X → N.
Eine Funktion f : X ÂY ist bezüglich des Größenmaßes G in Zeit t : N → N auf einer Menge A ⊆
X (νX , νY )-berechenbar, wenn eine Turingmaschine M existiert, die f bzgl. der Notationen νX und νY
berechnet und für deren Laufzeit TM (v) gilt:
36
2.7 Kompakte Notationen
2 NATÜRLICHE / GANZE ZAHLEN
(∀v : νX (v) ∈ A) G(νX (v)) = n ⇒ TM (v) ≤ t(n)
2
Es ist naheliegend, bei den natürlichen oder ganzen Zahlen als Größenmaß G(x) = log2 |x| zu wählen.
Bei den bisher angegebenen Notationen tauchen hier neue Probleme auf: Es gibt plötzlich keine Komplexitätsschranken mehr! Durch die Möglichkeit führender Nullen in der Binärnotation gibt es zu jeder
Zahl beliebig lange Namen. Komplexitätsschranken sind jedoch jetzt an den Wert gebunden. Damit reicht
keine endliche Zahl von Schritten t(x) aus, um für eine gegebene Zahl x auch nur festzustellen, ob sie von
Null verschieden ist. Wir werden daher zusätzliche Bedingungen an die Notationen stellen, um sinnvoll
Komplexität definieren zu können.
2.42 Definition. Eine Notation νX : B∗ ÂX heißt kompakt bezüglich des Größenmaßes G : X → N,
wenn für jedes n die Menge {v : G(νX (v)) = n} endlich ist.
2
Keine der bisher explizit angegebenen Notationen ist damit kompakt, da stets zu einem x unedlich viele
Namen existieren. Durch einfache Normierung können wir dies jedoch erreichen. So werden wir im folgenden fast ausschließlich normierte Fassung der Binär- oder der Signed-Magnitude-Notation verwenden:
2.43 Definition. Die Notation (·)N : B∗ → N sei definiert durch Def((·)N ) = {v ∈ B∗ | v beginnt nicht mit 0}
und (v)N := (v)2 .
Die Notation (·)Z : B∗ → Z sei definiert durch Def((·)Z ) = {v ∈ B∗ | v beginnt nicht mit 00 oder 10} und
(v)Z := (v)sm .
2
Da die obigen Notationen durch Einschränkung der Original-Notationen definiert sind, gilt trivialerweise
(v)N ≤ (v)2 und (v)Z ≤ (v)sm . Die anderen Richtungen (v)N ≥ (v)2 und (v)Z ≥ (v)sm ergeben sich
durch einfaches Streichen führender Nullen und sind damit ebenfalls in linearer Zeit (bezogen auf die
Argument-Länge) berechenbar. Dies kann man als ein Normieren am Ende der Berechnung interpretieren.
Für Komplexitätsuntersuchungen wird nun auch wichtig, dass die Projektionsfunktionen so gewählt worden sind, dass der Aufwand zur Extraktion einer Komponente nur von dieser selbst abhängt.
Offensichtlich sind diese Notationen nur für Hardware- sondern nur für Software-Implementierungen von
Interesse. Die GMP-Bibliothek verwendet eine analog normierte Signed-Magnitude-Notation (d.h. der
signifikanteste „Limb“ darf nicht Null sein).
37
3 RECHNEN MIT RATIONALEN ZAHLEN
3 Rechnen mit rationalen Zahlen
Stichworte: Zähler/Nenner-Notation, Euklidischer Algorithmus, Normierung, Rundungen, untere Schranken für den g.g.T.
Für numerische Berechnungen ist der Bereich der ganzen Zahlen unzureichend. Als Erweiterung bieten
sich zunächst die rationalen Zahlen an. Viele der Beispiele aus der Einleitung lassen sich auch im Prinzip
bereits mit rationalen Zahlen behandeln. Hier ist es naheliegend, eine rationale Zahl, die per Definition
durch die Division zweier ganzer Zahlen entsteht, durch die Aufzählung von Zähler und Nenner zu notieren.
Allerdings gibt es für jede rationale Zahl unendlich viele Brüche, die die gleiche Zahl repräsentieren.
Daher normiert man hier, indem man verlangt, dass Zähler und Nenner teilerfremd sind, d.h. dass ihr
größter gemeinsamer Teiler (g.g.T.) den Wert 1 hat:
3.1 Definition. Die Notation (·)Q : B∗ ÂQ sei definiert durch

 (z)Z
,
wenn (n)Z 6= 0 und g.g.T ((n)Z , (z)Z ) = 1
<z, n>Q :=
(n)Z

undefiniert, sonst
für alle <z, n> ∈ B∗ .
2
In GMP findet man entsprechend die folgende Deklaration
typedef struct
{
__mpz_struct _mp_num;
__mpz_struct _mp_den;
} __mpq_struct;
...
typedef __mpq_struct mpq_t[1];
...
/* Allow direct user access to numerator and denominator of a mpq_t object.
#define mpq_numref(Q) (&((Q)->_mp_num))
#define mpq_denref(Q) (&((Q)->_mp_den))
*/
Durch Übertragung der herkömmlichen Bruchrechnung auf diese Notation ergibt sich ganz leicht:
3.2 Lemma. Die Grundrechenarten Addition, Subtraktion, Multiplikation und Division sind ((·)2Q , (·)Q )berechenbar.
2
Beweis: Zum Nachweis der Berechenbarkeit braucht man sich nur die Regeln zur Bruchrechnung zu betrachten, wo nur die Funktionen benötigt werden, die auf Z berechenbar sind:
z2
z1 · n2 + z2 · n1
z1
+
=
n1 n2
n1 · n2
,
z1
z2
z1 · n2 − z2 · n1
−
=
n1 n2
n1 · n2
z1 z2
z1 · z2
·
=
n1 n2
n1 · n2
,
z1 z2
z1 · n2
/ =
n1 n2
n1 · z2
38
3 RECHNEN MIT RATIONALEN ZAHLEN
Wir müssen nun nur noch dafür sorgen, dass die Zähler und Nenner jeweils teilerfremd sind.
2
Die Teilerfremdheit kann man mit Hilfe des Euklidischen Algorithmus erreichen, indem man zunächst den
g.g.T. bestimmt und dann Zähler und Nenner dadurch teilt:
3.3 Lemma. Die Funktion g.g.T. : Z2 → Z ist ((·)2Z , (·)Z )-berechenbar in Zeit O(n · M(n))
2
Beweis: Zur Bestimmung von d := g.g.T.(x0 , x1 ) (wobei wir o.B.d.A.annehmen können, dass x0 > x1 >
0 gilt) können wir die Iteration xj+1 := xj−1 mod xj verwenden, wobei wir solange iterieren, bis sich ein
xi+1 = 0 ergibt. Dann gilt d = xi .
Zum Nachweis der Korrektheit nutzen wir aus, dass xi+1 := xi−1 mod xi auch xi−1 = xi · yi + xi+1 für
ein yi ∈ N impliziert.
Da sicherlich xj > xj+1 ≥ 0 gilt, muß die Iteration nach endlich vielen Schritten i mit xi+1 = 0 aufhören.
Dann gilt jedoch xi−1 = xi · yi und per Induktion ist xi auch ein Teiler aller xj für j ≤ i, insbesondere
also auch von x0 und x1 , woraus xi ≤ d folgt. Andererseits ist d per Induktion auch ein Teiler aller xj für
j ≤ i, woraus die auch die Umkehrung d ≤ xi folgt.
Die Zahl i der notwendigen Iterationen können wir wie folgt abschätzen: Sicherlich ist stets xj−1 ≥ xj +
xj−1 . Damit muss xi−j ≥ fj√für die j-te Fibonacci-Zahl gelten, bei denen man zeigen kann
√ (vgl z.B.
[Kn73]), dass sie als Wert Φj / 5, gerundet zur nächsten natürlichen Zahl, haben, wobei Φ = ( 5+1)/2 ≈
1.618. Daraus ergibt sich sofort i = O(log x1 ), d.h. i ist linear in der Zahl der Stellen von x1 . In jeder
Iteration brauchen wir zudem eine Division mit Rest bei Zahlen, die höchstens n = log max(x0 , x1 ) Stellen
haben.
2
Die obige Analyse ist eine Worst-Case-Analyse, man könnte also bei einer Implementierung auf ein besseres mittleres Verhalten hoffen. Dies trifft jedoch nicht zu. Bei xi+1 = xi−1 mod xi liegt der Wert xi+1
ziemlich gut gleichverteilt im Intervall [0, xi ], was dafür sorgt, dass die asymptotische Wachstum der
Fibonacci-Zahlen gut eingehalten wird. Zudem ist mit hoher Wahrscheinlichkeit der g.g.T. klein, so dass
auch im Allgemeinen fast die Maximalzahl an Iterationen notwendig ist:
3.4 Lemma.(Dirichlet, 1849)
Wählt man zu gegebenem n zwei Zahlen x und y gleichverteilt aus {1, . . . , n}, so konvergiert die Wahrscheinlichkeit für g.g.T.(x, y) = 1 mit wachsendem n gegen 6/π 2 ≈ 0.60793.
2
Einschub:
g.g.T.=1 mit 60%
Wie man leicht nachrechnet, ist g.g.T.(x, y) ≤ 10 sogar mit einer Wahrscheinlichkeit von rund 95%.
Wegen der mehr als quadratischen Laufzeit ist die Normierung der Resultate bei der rationalen Arithmetik
ein Faktor, der die Komplexität wesentlich beeinflußt. Wichtig ist dies bei der Implementierung: Nehmen
wir an, das wir zwei rationale Zahlen mit ungefähr gleicher Anzahl n von Stellen bei Zähler und Nenner
·z2
kostet der g.g.T. von z1 · z2 und n1 · n2 etwa c · 2n · M(2n).
haben. Bei der Multiplikation mit Resultat nz11 ·n
2
39
3 RECHNEN MIT RATIONALEN ZAHLEN
Es ist jedoch auch möglich, bereits vor der Ausführung der Multiplikationen bei den Paaren z1 , n2 und
z2 , n1 zu kürzen, wozu man dann zwei g.g.T.-Berechnungen mit n Stellen ausführen muß. Diese würden
in etwa einen Aufwand von 2 · c · n · M(n) erfordern und wären damit um etwa 50% schneller. Ähnliches
gilt für die anderen arithmetischen Operationen.
Aufbauend auf den rationalen Zahlentyp aus GMP enthält auch die iRRAM-Bibliothek [Mu01] rationale
Zahlen. Wir werden diese Bibliothek im folgenden für Beispiele verwenden. Für das Beispiel zur schwierigen Grenzwertbestimmung von Jean-Michel Muller erhalten wir hier z.B. folgendes Programm:
#include "iRRAM.h"
/* Compute iteration by J.M.Muller */
void compute(){
int test,count;
rprintf("JMM-example: c=111-(1130-3000/a)/b");
rscanf("%d",&test);
rprintf("how many values: ");
rscanf("%d",&count);
RATIONAL a=RATIONAL(11)/2, b=RATIONAL(61)/11, c;
for (long i=1;i<=count;i++ ) {
rwrite(REAL(a),18); rprintf(" %d\n",i);
c=111-(1130-3000/a)/b;
a=b; b=c;
}
}
Zur Bestimmung von 10000 Werten benötigt das Programm auf einem Athlon mit 900 MHz ca 1min
und hat einen vernachlässigbaren Speicherbedarf. Ein großer Teil der Rechenzeit wird dabei sogar für die
Ausgaben verwendet.
Wie in der Einleitung bereits angegeben, gilt hier:
an =
6n+1 + 5n+1
6n + 5n
Daraus ergibt sich, dass die Größe von Zähler und Nenner jeweils linear in n ist. Daraus ergibt sich ein
Aufwand zur Bestimmung von an , der in der Größenordnung von n g.g.T-Bestimmungen der Länge n,
also in O(n2 · M(n)) liegt.
Dies ist jedoch nicht der Normalfall: Da der g.g.T. sehr häufig klein ist, ergibt sich üblicherweise, dass der
Wert von Zähler und Nenner nach einer rationalen Rechenoperation in der Größenordung des Produktes
der beteiligten Zähler bzw. Nenner liegt. Mit anderen Worten: Pro Operation verdoppelt sich ungefähr die
Platzbedarf der Zahlen, d.h. nach n Operationen in Folge haben wir einen Platzbedarf in der Größe O(2n )
und für die jeweils nächste Operation einen Zeitbedarf von O(2n · M(2n )). Dieses Verhalten findet man
zum Beispiel bei der logistischen Funktion aus der Einleitung. Der Kern der Berechnung kann hier wie
folgt implementiert werden:
RATIONAL x = RATIONAL(1)/RATIONAL(2);
RATIONAL c = RATIONAL(375)/RATIONAL(100);
for ( int i=0; i<=count; i++ ) {
40
3 RECHNEN MIT RATIONALEN ZAHLEN
if ( (i<100) || (i%10)==0 ) {
rwrite(REAL(x),18); rprintf(" %d\n",i);
}
x= c*x*(RATIONAL(1)-x);
}
Für nur 25 Iterationsschritte benötigt das Programm auf einem Athlon mit 900 MHz bereits rund 6 min und
rund 200 MB an Hauptspeicher! Die exakte Berechnung von x30 ist damit in der Praxis bereits unmöglich.
Rationale Arithmetik ist also nur sehr eingeschränkt nutzbar, wenn der zu implementierende Algorithmus
vorher gründlich auf seien Eignung untersucht wurde. Um dem Problem der explositionsartig wachsenden
Werte zu begegnen, wurde vorgeschlagen, Rundungsalgorithmen zu verwenden, d.h. eine Zahl z/n mit
langen Komponenten durch eine Zahl z 0 /n0 mit wesentlich kleineren Werten z 0 und n0 zu ersetzen, für die
aber immerhin noch z 0 /n0 ≈ z/n gilt. Damit geht jedoch der Hauptgrund für die Verwendung rationaler
Arithmetik, die Exaktheit der Werte, unwiederbringlich verloren. Dann ist es sinnvoller, Fließkommaberechnungen mit verifizierbarer Genauigkeit zu verwenden.
41
4 FLIESSKOMMA-ARITHMETIK
4 Fließkomma-Arithmetik
Stichworte: IEEE 754/854 Fließkomma-Standard, gerichtetes Runden, MPFR, Reduktionsmethoden
in der Arithmetik,
Die Fließkomma-Notation entspricht der sicher bereits bekannten halblogarithmischen Schreibweise von
Zahlen:
4.1 Definition. Eine Notation (·)hl : Σ∗r → Dr der r-adischen Zahlen Dr = {m · re | m, e ∈ Z} sei
definiert durch
ve
<vm , ve , m, e>hl := (−1)vm (m)r · r(−1) (e)r
für alle <vm , ve , m, e> ∈ Σ∗r .
2
Die hier definierten r-adischen Zahlen sind „nur“ eine relativ kleine Teilmenge der rationalen Zahlen. Die
Zahlmenge ist sogar, ähnlich wie die ganzen Zahlen, nicht unter Division abgeschlossen: Eine rationale
Zahl z/n mit 0 < z < n besitzt nur dann eine endliche r-adische Entwicklung, wenn n selbst eine Potenz
von r ist. Als Konsequenz werden die Berechnungen hier i.A. nicht exakt, sondern fast immer nur von
approximativer Natur sein.
Algorithmen werden sich im Wesentlichen auf folgende Eigenschaften von Produkten der Form mi · rei
mit ganzen Zahlen mi , ei stützen:
• Sei e := min{e1 , e2 }. Dann ist
(m1 · re1 ) + (m2 · re2 ) = (m1 · re1 −e + m2 · re2 −e ) · re
Einer der Werte ei − e ist nach Konstruktion = 0, der andere ist ≥ 0. Zur Addition (und analog zur
Subtraktion) reichen also ganzzahlige Additionen/Subtraktionen und Shifts aus.
• Stets gilt
(m1 · re1 ) · (m2 · re2 ) = (m1 · m2 ) · re1 +e2
Für eine Multiplikation brauchen wir also eine ganzzahlige Multiplikation und wiederum ganzzahlige Additionen.
• Die Division ist komplexer, da wir kein exaktes Ergebnis erwarten können. Für beliebiges e ∈ Z ist
(m1 · re1 ) / (m2 · re2 ) = bm1 · re /m2 c · re1 −e2 −e + (m1 · re mod m2 ) · re1 −e2 −e
Als Ergebnis der Division wird nun bm1 · re /m2 c · re1 −e2 −e benutzt, wobei wir über die Wahl von
e den entstehenden Fehler, der durch m2 · re1 −e2 −e beschränkt ist, im Prinzip beliebig klein halten
könnten.
Wir werden uns in diesem Abschnitt zunächst den in heutigen CPUs benutzten Fließkomma-Standard
„IEEE 754-1985 Standard for Binary Floating-Point Arithmetic“, bei dem im Allgemeinen nur 4 oder 8
Byte zur Repräsentation von Zahlen verwendet werden. Der Standard wurde später noch einmal als „IEEE
854-1990 Standard for Radix-Independent Floating-Point Arithmetic“ aktualisiert. Als Basis verwenden
wir hier [Pa00]. In diesem Standard wird die obige Notation in leicht modifizierter Form angewendet:
Eine Bitgruppe w fester Länge 1 + le + lm wird in drei Komponenten mit ebenfalls fester Länge zerlegt,
w = v ◦ e ◦ m:
42
4 FLIESSKOMMA-ARITHMETIK
• ein Vorzeichen-Bit v
• eine Bit-Gruppe e mit Länge le zur Notation des Exponenten und
• eine Bit-Gruppe m mit Länge lm zur Notation der Mantisse
Zwei Besonderheiten sind nun zu beachten: Der Exponent wird über eine um einen festen Wert bias „verschobene“ Binärnotation festgelegt. Der Wert der Mantisse wird so interpretiert, als ob sie die Form ‘1.m’
hätte, wobei diese führende 1 nicht aufgeschrieben wird. m wird also als ein Wert aus dem halboffenen
Intervall [1, 2) interpretiert, indem man eine Multiplikation des binären Wertes (1m)2 mit 2−lm vornimmt.
Damit erhält man explizit:
(v e m)IEEE = (−1)v · (1m)2 · 2(e)2 −bias−lm
Dabei sind zunächst explizit die Fälle mit e = 0 . . . 0 und e = 1 . . . 1 ausgenommen. Der Fall e = 1 . . . 1
wird benutzt, um zusätzliche spezielle Werte zu kodieren: ±∞ und NaN (not a number). Dabei wird NaN
benutzt, um weiterzugeben, dass ein Operationsergebnis nicht definiert war, etwas bei der Division 0/0.
Als Konsequnez aus der Existenz der NaNs müssen bei Vergleichen von Zahlen auch 4 mögliche Resultate
zur Verfügung stehen: kleiner, gleich, größer und zudem ungeordnet, wobei der letztere Wert bei jedem
Vergleich mit einer NaN entsteht. Dargestellt wird NaN durch Bitfolgen der Art v 1 . . . 1 m mit m 6= 0 . . . 0.
Die Werte ±∞ entstehen bei Division x/0 mit x 6= 0 oder wenn ein Overflow vorliegt. Sie haben dabei
die Darstellung v 1 . . . 1 0 . . . 0.
Im Fall e = 0 . . . 0 werden „denormalisierte“ Zahlen benutzt, d.h. die führende 1 bei der Mantisse darf
dann fehlen. Es ergeben sich als Werte hier also
(v 0 . . . 0 m)IEEE = (−1)v · (m)2 · 2−bias−lm
Als Spezialfälle erhält man bei v ◦ 0 . . . 0 ◦ 0 . . . 0 eine positive oder negative Null!
Die folgende Tabelle zählt einige der bestimmenden Parameter sowie der Besonderheiten des ANSI/IEEEStandards auf:
Eigenschaft
32 bit / Single
64 bit / Double
Mantissenlänge lm in Bits
23 (+1 verstecktes Bit)
52 (+1 verstecktes Bit)
−23
Wertebereich normalisierter Mantissen [1 , 2 − 2 ]
[1 , 2 − 2−52 ]
Exponentenlänge le in Bits
8
11
127
1023
Bias des Exponenten
−126
−38
kleinste positive normalisierte Zahl
2
≈ 1.2 · 10
2−1022 ≈ 2.2 · 10−308
128
104
128
38
größte positive normalisierte Zahl
2 − 2 ≈ 2 ≈ 3.4 · 10
21024 − 2971 ≈ 21024 ≈ 1.8 · 10308
kleinste positive denormalisierte Zahl
2−150 ≈ 7 · 10−46
2−1075 ≈ 4.94 · 10−324
Wegen der festen Mantissenlänge ist bei Fließkomma-Operationen in der Regel das Ergebnis nicht exakt,
selbst bei einfachen Additionen. Daher muss normalerweise nach jeder Operation gerundet werden. Es
gibt dabei mehrere Möglichkeiten: Default-Modus ist das Runden zum nächsten Wert in der Form (round
to nearest even), wo auch explizit festgelegt wird, wohin gerundet werden soll, wenn der zwei gleich gute
Möglichkeiten zum Runden zur Verfügung stehen. Daneben sieht IEEE verschiedene Modi für gerichtetes
Runden (directed rounding) vor.
Die Rundungsverfahren kann man am einfachsten unterscheiden, wenn man sich ansieht, wie ein Bitmuster
± . . . x1 x0 • x−1 x−2 . . . zu einer ganzen Zahl gerundet wird:
43
4 FLIESSKOMMA-ARITHMETIK
• Round to Nearest Even (rtne)
Runden zu . . . x1 x0
Runden zu . . . x1 x0
Runden zu . . . x1 x0 + 1,
Runden zu . . . x1 x0 − 1,
x−1 = 0
x−1 x−2 . . . = 100 . . . , x0 = 0
sonst, bei positiver Zahl
sonst, bei negativer Zahl
Hierdurch wird erreicht, dass der Rundungsoperator symmetrisch arbeitet:
rtne(x)
4
3
2
1
−4
−3
−2
−1
0
1
2
3
4
1
2
3
4
x
−1
−2
−3
−4
• Round to Zero (rtz)
Hier werden einfach die Bits x−1 x−2 . . . gestrichen:
rtz(x)
4
3
2
1
−4
−3
−2
−1
0
x
−1
−2
−3
−4
• Round to +∞ (up)
Für negative Argumente entspricht dies dem Round to Zero, bei positiven Argumenten wird aufgerundet, sobald x−1 x−2 . . . nicht nur aus Nullen besteht:
up(x)
4
3
2
1
−4
−3
−2
−1
0
−1
−2
−3
−4
44
1
2
3
4
x
4 FLIESSKOMMA-ARITHMETIK
• Round to −∞ (down)
Dies ist da Analogon zu Round to +∞, aber mit vertauschten Rollen der Vorzeichen:
down(x)
4
3
2
1
−4
−3
−2
−1
0
1
2
3
4
x
−1
−2
−3
−4
Während Round to Nearest Even versucht, den mittleren Fehler beim Runden gleichmäßig zu verteilen, so
dass sich bei längeren Berechnungen die Fehler ausmitteln könnten, haben die gerichteten Rundungen den
Vorteil, dass man genau weiss, in welcher Richtung der Fehler liegt: Mit a = x + y, gerundet gegen −∞,
und b = x + y, gerundet gegen +∞, liegt das exakte Ergebnis von x + y im Intervall [a, b].
Da sich über eine Exception überprüfen lässt, ob eine Rundung stattgefunden hat, reicht es einen der Werte
a oder b zu bestimmen: Wurde nicht gerundet, so ist a = b, ansonsten differieren a und b um das letzte Bit
der Mantisse.
Der Fehler, der durch eine Rundung entsteht, hat als Größenordnung maximal die Stelligkeit des letzten
Bits des Resultates. Die durch die (unvermeidbaren) Rundungen entstehenden Fehler führen dazu, dass die
üblichen Rechenregeln für Fließkommazahlen nicht mehr gültig sind: Bezeichnen wir mit ⊕, ª, ⊗ und ®
die Varianten der arithmetischen Grundoperationen, die bei Fließkomma-Ausführung mit anschließender
Rundung entstehen, so gilt im Allgemeinen
(x ⊕ y) ⊕ z 6= x ⊕ (y ⊕ z)
Gerade diese Assoziativität der Addition wird
P jedoch in vielen mathematischen Formeln an zentraler Stelle
ausgenutzt, selbst bei einfachen Summen 1≤k≤n ak ist es für dem Computer nicht gleichgültig, in welcher
Reihenfolge man aufsummiert!
Auch das Distributionsgesetz ist nicht mehr gültig:
(x ⊕ y) ⊗ z 6= (x ⊗ z) ⊕ (y ⊗ z)
Wir greifen noch einmal das Beispiel des linearen Gleichungssystems aus der Einleitung auf:
µ
¶
µ ¶
64919121 −159018721
1
A = (aij ) =
und b = (bi ) =
41869520.5 −102558961
0
mit Lösung
x1 = a22 /(a11 · a22 − a12 · a21 )
x2 = −a21 /(a11 · a22 − a12 · a21 )
Bei den Multiplikationen a11 · a22 und a12 · a21 entstehen zwei fast gleiche Werte: -6658037598793281
und -.6658037598793280.5. Die Differenz der zwei Werte ist also 0.5. Allerdings wird der zweite
45
4 FLIESSKOMMA-ARITHMETIK
Wert bei 64-Bit-Fließkommazahlen zusätzlich um 0.5 nach unten abgerundet, so dass als Differenz im
Rechner 1 entsteht. Daraus ergeben sich die in der Einleitung genannten falschen Werte.
Der Standard verlangt, dass die implementierten Funktionen den obigen Rundungen entsprechend korrekt
sein müssen. Problematisch ist jedoch, dass diese Rundungen laut Standard auch für weitere Funktionen
wie etwa Sinus, Cosinus etc. korrekt erfüllt sein sollen. Bei heutiger Hardware ist dies nicht immer gewährleistet. Es kann hier sogar vorkommen, dass noch nicht einmal die Monotonie von Funktionen erhalten
bleibt!
Eine aktuelle Software-Lösung für Fließkomma-Arithmetik ist z.B MPFR [Zi00], www.loria.fr/projets/mpfr/,
für „Multiprecision Floating-Point Arithmetic with Exact Rounding“, die eine Erweiterung der GMPBibliothek darstellt.
Die Bibliothek verbindet eine Fließkomma-Notation mit variabler Länge mit den 4 IEEE-Rundungsmodi.
Dabei kann für Fließkomma-Variablen die Länge (in Bits) der Mantisse beliebig vorgegeben werden, Als
31
Exponent wird eine 32-Bit-LongInt verwendet, d.h es können hier Zahlen im Bereich von ±2±2 ≈
±10±646457000 mit einer Mantissenlänge bis zu rund 500 MByte notiert werden.
#include "gmp.h"
#include "mpfr.h"
main(int argc, char *argv[])
{
int prec;
mpfr_t x, z;
...
mpfr_init2(x, prec);
mpfr_set_d(x, 3.0, GMP_RNDN);
mpfr_log(z, x, GMP_RNDN);
...
}
Wir werden später noch zeigen, wie man mit dieser Bibliothek numerische Verfahren implementieren kann.
Eine für die Rundungsmodi wichtige Routine sei hier noch erwähnt: Sie macht auch erkenntlich, warum
die Hardware-Implementierung der korrekten Rundungen sich sehr schwer gestalten kann:
int mpfr_can_round (mpfr_t b, mp_exp_t err,
mp_rnd_t rnd1, mp_rnd_t rnd2,
mp_prec_t prec)
Gegeben ist hier im Allgemeinen eine Variable b, die eine Approximation einer (nicht exakt bekannten)
Zahl z sei. Durch eine genaue Fehler-Analyse sei bekannt, dass dabei b von z aus in der (Rundungs)Richtung rnd1 mit einem Abstand von höchstens 2E(b)−err liegt, wobei E(b) der Exponent von b ist
(wieder bezogen auf das höchstwertige Bit). Das Resultat der Funktion gibt nun an, ob eine Rundung auf
Genauigkeit prec in Richtung rnd2 möglich ist oder nicht.
0
Beispiel: Betrachte b=0.100111100...·2
ˆ
, rnd1=rnd2=GMP_RNDZ und prec = 4. Hier ist E(b) = −1.
Bei err = 5 ergäbe sich z ∈ (0.10011110..., 0.101000100..), weshalb eine Rundung hier nicht möglich
wäre.
46
4 FLIESSKOMMA-ARITHMETIK
Bei err = 7 erhalten wir z ∈ (0.100111100..., 0.100111110..), was eine korrrekte Rundung zu 0.1001 · 20
erlaubt.
Ziel ist i.A. die Berechnung von z = f (x), wobei das Ergebnis in einer Variablen a gespeichert werden
soll und das Argument eine Fließkommazahl ist, bei der der Rundungstyp rnd2 sowie die Genauigkeit
prec der Variablen a vorgegeben sind. Bei einem Programm zur Berechnung von f , dass als Ergebnis
b liefert, müssen also nun alle Berechnungen so genau durchgeführt werden, dass der Fehler am Ende so
klein wird, dass auch die Rundung möglich wird. Dazu ist es notwendig, dass wir (je nach Rundungstyp)
im Bereich zwischen prec und err einen Wechsel von 0 auf 1 oder 1 auf 0 haben oder aber dass wir
wissen, dass die Zahl periodisch mit 0 oder 1 endet.
Bei Addition, Subtraktion und Multiplikation ist dies offensichtlich möglich: Hier können wir durch Wahl
einer ausreichend hohen Genauigkeit sogar exakte Ergebnisse erhalten (d.h. mit einer Periode 0). Bei der
Division erhalten wir auf jeden Fall ein periodisches Resultat, wo die Rundung auch leicht möglich ist.
Ein Beispiel für die Rundugns-Problematik bei IEEE-754-Zahlen findet sich in [MJM97]. Die ExponentialFunktion ist an der folgenden Stelle nur schwer exakt rundbar:
x = (0.1101011001100111110111110010011010110100111011110000)2
wo sich für ex der Wert
10.010011111000010111001001011110000011110111001110000 01111
11111111111111111111111111111111111111111111111111101...
ergibt. Man muß also hier zu dem 53 Bits des Ergebnisses noch zusätzliche 55 Bits berechnen, um korrekt
runden zu können!
Die am Anfang des Kapitels angegebenen Basis-Algorithmen für exakte Fließkomma-Arithmetik haben
noch den Nachteil, dass bei der direkten Umsetzung insbesondere bei der Multiplikation die Länge der
Mantisse sehr schnell wächst und damit die gleiche Problematik wie bei der rationalen Arithmetik entsteht.
Daher wird i.A. gerundet, selbst wenn exakte Resultate möglich wären.
Festgelegt werden muß jedoch, wie genau das Ergebnis zu berechnen ist. Dazu gibt es i.W. zwei Möglichkeiten: Rechnen mit absoluter oder mit relativer Genauigkeit.
Relative Genauigkeit entspricht i.W. der Hardware-Fließkomma-Arithmetik, da hier der Speicherplatz für
das Ergebnis im Voraus festgelegt wird. Der Sinn der oben definierten Rundungs-Modi ist zudem, dass der
Unterschied zwischen dem exakten Ergebnis und dem Resultat der implementierten Fließkommaoperation
nur eine Änderung im letzten Bit der Mantisse (evtl. mit Carry) betragen darf. Durch die Normierung der
Werte (führendes Bit der Mantisse 6= 0) ergibt sich, dass wir hier Fließkommaoperationen ‘}n ’ als Operationen mit folgender Fehler-Abschätzung interpretieren können. Dabei sei ‘}n ’ die ‘◦’ entsprechende
Fließkomma-Operation.
¯
¯
¯ a }n b − a ◦ b ¯
¯
¯ ≤ 2−n
¯
¯
a }n b
Der für das Resultat a }n b notwendige Speicher ist hier von a ◦ b unabhängig und wird direkt durch n
festgelegt.
Prinzipiell kann n hier alle Werte aus N annehmen. Problematisch ist hier, dass durch die relative Genauigkeit Abschätzungen erschwert werden, wenn das Resultat den Wert Null hat oder sehr klein ist.
47
4 FLIESSKOMMA-ARITHMETIK
Als Alternative kann man den Fehler bei Operationen über absolute Genauigkeit formulieren:
|a p b − a ◦ b| ≤ 2p
Hier kann p nun eine beliebige positive oder negative ganze Zahl sein. Hier hängt der zur Bestimmung eines
entsprechenden Resultates notwendige Speicher außer von p auch direkt von a ◦ b ab. Was zunächst wie ein
Nachteil aussieht, erlaubt jedoch einerseits leichter Fehlerabschätzungen und verlangt zudem von Anwender nicht, dass er sich Gedanken über die Platznutzung macht. Dieser Zugang wird i.A. in komplexitätsorientierten Arbeiten über exakte Arithmetik auf R wie [We00] oder in der iRRAM [Mu01] verwendet, da
sich dort die Problematik der undefinierten relativen Genauigkeit deutlich wiederspiegelt.
Wichtig sind diese Fehlerabschätzungen, wenn wir komplexere Ausdrücke oder ganze Berechnungen
analysieren wollen: Als Beispiel betrachten wir die Auswertung des Ausdrucks a + b + c + d durch
e := (a ¢p b) ¢p (c ¢p d) unter Verwendung der Dreiecksungleichung:
|e − (a + b + c + d)| ≤ |e − (a ¢p b) + (c ¢p d)| + |(a ¢p b) + (c ¢p d) − (a + b + c + d)|
≤ 2p + |(a ¢p b) − (a + b)| + |(c ¢p d) − (c + d)|
≤ 3 · 2p
Wenn wir nun das Ergebnis mit einem Fehler von 2p brauchen, reicht es hier, die Zwischenberechnungen
genauer auszuwerten: Bei e0 := (a ¢p−2 b) ¢p−1 (c ¢p−2 d) erhalten wir analog |e0 − (a + b + c + d)| ≤ 2p
Als komplexeres Beispiel betrachten wir nun die Bestimmung des Kehrwertes 1/a über die Iterationsformel Φ(x) = 2x − ax2 : Zunächst sei a ∈ [1, 2), was genau dem Wert der Mantisse entspricht, wenn wir den
Exponenten ignorieren.
Bei ε := 1/a − x erhalten wir dann
Φ(x) = 2(1/a − ε) − a(1/a − ε)2
= 2(1/a − ε) − a(1/a2 − 2ε/a + ε)2
= 1/a − a · ε2
Bei einer (exakten) Iteration xi+1 = Φ(xi ) wird der Fehler also i.W. quadriert. Starten wir also z.B. mit
i
einem Fehler von ε0 , so erhalten wir schließlich εi = (a · ε0 )2 /a. Bei 1 ≤ |a| < 2 und mit x0 := 0.75
i
ergibt sich ε0 = 2−2 und damit εi < 2−2 .
Verwendet man statt eines festen x0 eine Tabelle mit z.B. 1024 Werten, die aus den ersten Bits der Mantisse
von a bestimmt werden, ergibt sich sogar ε0 ≤ 2−11 und damit ε1 ≤ 2−21 , ε2 ≤ 2−41 und schließlich
ε3 ≤ 2−81 . Damit reichen bereits 3 Iterationen, um einen Kehrwert mit einer Genauigkeit zu bestimmen,
die für das 8-Byte-IEEE-Fließkommaformat reichten sollte.
Da wir statt einer exakten Iteration stets in der Praxies auch die Rundungsfehler betrachten müssen, müssen
wir jedoch hier auch noch bedenken, dass der Fehler ε noch durch die unexakte Berechnung von f steigen
wird. Wählen wir aber zum Beispiel x0 und p0 < 0 mit ε0 < 2p0 −2 und pi = 2 · pi−1 , so ergibt sich iterativ
εi ≤ 2pi −2 , wenn wir jede Funktionsauswertung xi = Φ(pi −3) (xi−1 ) mit einem Rechenfehler von maximal
2pi −3 ausführen:
εi ≤ aε2i−1 + 2pi −3 ≤ 2 · 22pi−1 −4 + 2pi −3 = 2pi −2
Hier ergibt sich also genauer bei einem Startfehler von 2−11 und damit p0 = −9 nach 3 Iterationen p3 =
−72 und damit ε3 ≤ 2−74 , was aber immer noch ausreichend genau ist.
48
4 FLIESSKOMMA-ARITHMETIK
Um jetzt Fließkomma-Algorithmen genauer angeben und ihre Komplexität zuverlässig abschatzen zu könne, werden wir von nun an die folgende Fassung der halblogarithmischen Notation der dyadischen Zahlen
D verwenden (bei fester Basis r = 2). Zur Zeit exitiert jedoch noch keine Implementierung, bei der in
ähnlicher Form auch variabel lange Exponenten verwendet werden. Wir werden dennoch den Exponenten
bei den Komplexitätsabschätzungen immer explizit beachten.
4.2 Definition. Die Notation (·)D : B∗ → D der dyadischen Zahlen D = {m · 2e | m, e ∈ Z} sei definiert
durch
<m, e>D := (m)Z · 21−lg(m) · 2(e)Z
für alle <m, e> ∈ B∗ .
2
Dabei entspricht (e)Z dem Exponenten der notierten Zahl und (m)Z · 22−lg(m) ihrer Mantisse. Da bei (·)Z
das erste Bit das Vorzeichen angibt und das zweite Bit (falls vorhanden) den Wert 1 haben muß, gilt damit
analog zu den IEEE-Formaten
(m)Z · 21−lg(m) ∈ [0.5, 1)
Durch diese Normierung der Mantisse brauchen wir bei Komplexitätsbetrachtungen im Allgemeinen die
Länge der Mantissen nicht zu betrachten, wie wir später noch sehen werden!
Die arithmetischen Operationen p betrachten wird im Folgenden dabei als dreistellig, wobei die ersten
zwei Parameter die Fließkomma-Argumente sind und der dritte Parameter die gewünschte absolute Genauigkeit im obigen Sinne angibt.
4.3 Lemma. Es gibt (((·)D , (·)D , (·)Z ), (·)D )-berechenbare Funktionen ¢, ¯, £: D × D × Z → D und
eine (((·)D , (·)Z ), (·)D )-berechenbare Funktion INV: D × Z ÂD, Def (INV)= D\{0} × Z mit folgenden
Eigenschaften für alle (x, y, p) bzw. (x, p) aus dem jeweiligen Definitionsbereich:
| (x + y) − x ¢p y |
| (x − y) − x ¯p y |
| (x · y) − x £p y |
| (1/x) − INV(x, p) |
≤
≤
≤
≤
2p
2p
2p
2p
2
Anmerkung: Durch die Kombination von Kehrwert und Multiplikation erhält man natürlich auch die Division mit der Eigenschaft |(x/y) − x p y| ≤ 2p für alle x, y ∈ D, y 6= 0.
Beweis: Wie zu Beginn des Kapitel bereits angesprochen, werden wir die elementaren Operationen auf D2
durch Transformation in die ganzen Zahlen durchführen. Dazu sind folgende Funktionen hilfreich:
SIGN: D → Z, SIZE:D\{0} → Z, NORM:Z × Z → D sowie DENORM:D × Z → Z mit folgenden
Eigenschaften für x ∈ D und m, n ∈ Z:

 1 , x>0
0 , x=0
SIGN(x) =

−1 , x < 0
SIZE(x) = min{i ∈ Z | |x| < 2i }
NORM(m, n) = m · 2n (∈ D)
DENORM(x, n) = trunc(x · 2−n ) (∈ Z)
49
4 FLIESSKOMMA-ARITHMETIK
Dabei ist trunc die Rundung in Richtung auf die Null, d.h.
½
max{i ∈ Z | i ≤ x} ,
trunc(x) =
min{i ∈ Z | i ≥ x} ,
falls x ≥ 0
falls x < 0
Bevor wir auf die Implementierung dieser Funktionen eingehen, werden wir sie zunächst einmal bei der
Arithmetik auf D anwenden. Wir betrachten zunächst den folgenden Algorithmus, der in einer an PASCAL
oder MODULA angelehnten Pseudosprache formuliert ist:
FUNCTION ADD (X,Y: DYADIC; P: WHOLE): DYADIC;
VAR A,B,C: WHOLE; Z:DYADIC
BEGIN
A:=DENORM (X, P-1);
B:=DENORM (Y, P-1);
C:=A+B;
Z:= NORM(C, P-1);
RETURN Z:
END;
Sind x, y, p, a, b, c, z die Werte der entsprechenden Variablen (am Ende der Funktion), so ergibt sich:
|x + y − z| = |x + y − c · 2p−1 | = |x + y − (a + b) · 2p−1 |
= 2p−1 · |x · 21−p − a + y · 21−p − b|
≤ 2p−1 · 2 = 2p
Damit berechnet die obige Funktion wie erwartet die Funktion ¢. Ersetzen wir C:=A+B durch C:=A-B,
so erhalten wir eine Implementierung der Funktion ¯. Bei der Multiplikation muss die Denormalisierung
sorgfältiger bedacht werden:
FUNCTION MULT (X,Y: DYADIC; P: WHOLE): DYADIC;
VAR A,B,C,E,EX,EY: WHOLE; Z:DYADIC
BEGIN
IF SIGN (X)=0 OR SIGN (Y)=0 THEN
Z:=0
ELSIF P>SIZE (X)+ SIZE (Y) THEN
Z:=0
ELSE
EX:=P-SIZE(Y)-2;
EY:=P-SIZE(X)-2;
E:=EX+EY
A:=DENORM (X, EX);
B:=DENORM (Y, EY);
C:=A*B;
Z:= NORM(C, E);
END;
RETURN Z:
END;
50
4 FLIESSKOMMA-ARITHMETIK
Es seien wiederum x, y, p, a, b, c, e, z, ex , ey die Werte der entsprechenden Variablen. Damit ergibt sich bei
x = 0 oder y = 0 sofort z = 0 = x · y. Im folgenden sei daher x 6= 0 und x 6= 0. Wir setzen sx := SIZE(x)
bzw. sy := SIZE(y), also ex = p − sy − 2, ey = p − sx − 2 und e = ex + ey .
Ist nun p > sx + sy , so ist |x · y| ≤ 2p , d.h. z := 0 hat einen ausreichend kleinen Abstand zu dem Produkt
x · y.
Ansonsten ist p ≤ sx + sy und wir erhalten
¯
¯
|x · y − z| = |x · y − ab2e | = 2e · ¯x2−ex · y2−ey − ab¯
= 2e · | x2−ex · (y2−ey − b) + (x2−ex − a)(b − y2−ey )
+(x2−ex − a) · y −ey |
≤ 2e · (2sx −ex · 1 + 1 · 1 + 1 · 2sy −ey )
= 2ey +sx + 2ex +ey + 2ex +sy
= 2p−2 + 2p−sy −2+p−sx −2 + 2p−2
≤ 2p−2 + 2p−4 + 2p−2 < 2p
Als letztes Beispiel betrachten wir die Bestimmung des Kehrwertes 1/x einer Zahl x 6= 0 durch Rückführung auf die ganzzahlige Division:
FUNCTION INV (X: DYADIC; P: WHOLE): DYADIC;
VAR A,C,EX,EZ: WHOLE; Z:DYADIC
BEGIN
IF SIGN (X)=0 THEN
ERROR („Division durch 0“ )
ELSIF P>-SIZE (X) THEN
Z:=0
ELSE
EX:=P + 2* SIZE(X) - 5;
EZ:=EX - SIZE(X) + P - 1;
A:=DENORM(X,EX);
C:=2**(-EZ-EX) DIV A
Z:= NORM(C,EZ);
END;
RETURN Z
END.
Wiederum seien x, z, p, a, c, ex , ez die Werte der entsprechenden Variablen. Wir können o.B.d.A. annehmen, daß x 6= 0 gilt. Es sei wieder sx := SIZE(x).
¯ ¯
Gilt nun p > −sx , so ist (ganze Zahlen!) p ≥ 1 − sx , mit 2sx −1 <| x |≤ 2sx erhalten wir ¯ x1 ¯ ≤ 21−sx ≤ 2p ,
d.h. z = 0 ist eine ausreichend genaue Näherung. Im folgenden sei daher p ≤ −sx . Dann erhalten wir
51
4 FLIESSKOMMA-ARITHMETIK
¯
¯
¯
¯
¯1
¯
¯1
¯
e
z
¯ − z¯ = ¯ − c · 2 ¯
¯x
¯
¯x
¯
¯
¯ ¯
¯
¯
¯ 1 2−ez −ex e ¯ ¯ 2−ez −ex e
ez
≤ ¯¯ −
· 2 z ¯¯ + ¯¯
· 2 z − c2 ¯¯
x
a
a
¯
¯
¯ −ez −ex
¯
¯
¯
¯
¯
1
1¯
−ex ¯
ez ¯ 2
= 2 ¯ −ex − ¯ + 2 ¯
− c¯¯
x2
a
a
¯
¯
(1)
¯
¯1
≤ 2−ex ¯¯ 2 (x2−ex − a)¯¯ + 2ez |a|
a
¯ ¯
¯1¯
≤ 2−ex ¯¯ 2 ¯¯ + 2ez |a|
a
µ
¶2
(1)
1
−ex
≤ 2
+ 2ez · 2sx −ex
23−p−sx
= 2−p−2sx +5−6+2p+2sx + 2ex −sx +p−1+sx −ex = 2p
(1) ergibt sich dabei einerseits mit dem Mittelwertsatz der Analysis ( x1 − y1 = − ξ12 (x − y), ξ zwischen x
und y) und mit |a| ≤ |x2−ex |, und andererseits, da der Rest bei der Division durch a natürlich betragsmäßig
kleiner als a ist,
(2) erhält man aus 2sx −ex ≥ |x| 2−ex ≥ |a| ≥ |x| 2−ex − 1 ≥ 2sx −1−ex − 1 = 2sx −1−p−2sx +5 − 1 =
24−p−sx − 1 ≥ 23−p−sx , da ja p ≤ −sx , d.h. 23−p−sx > 1.
Insbesondere ist zu beachten, daß −ez − ex > 0 gilt, so daß 2−ez −ex eine ganze Zahl ist:
ez + ex = 2ex − sx + p − 1 = 2p + 4sx − 10 − sx + p − 1
= 3(p + sx ) − 11 < 0
Für die Implementierung der Funktionen SIGN, SIZE, NORM und DENORM müssen wir noch einmal auf
(m)Z
mit m := pr12 (w)
die Einzelheiten der Definition der Notation (·)D zurückgreifen: (w)D := 2(e)Z 21−lg(m)
2
und e := pr2 (w).
Der Wert von SIGN((w)D ) läßt sich an m ablesen: Es gilt (w)D = 0 ⇔ (m)Z = 0 ⇔ m ∈ {0, 1}.
Ansonsten ist (w)D > 0 ⇔ erstes Bit von m = 0, die Bestimmung von SIGN ((w)D ) erfordert also nur
einen konstanten Aufwand für das Lesen der 2 ersten Bits von m.
(m)Z
< 1, gilt ganz einfach SIZE((w)D ) = (e)Z . Zur Bestimmung von SIZE((w)D ) sind also
Da 21 ≤ 21−lg(m)
O(lg e) Schritte ausreichend.
Um NORM(m, n) = m · 2n für zwei ganze Zahlen m, n zu berechnen, müssen wir nur den Exponenten
richtig behandeln:
NORM((v)Z , (u)Z ) = (v)Z · 2(u)Z =
(v)Z
1−lg(v)
2
· 2(u)Z +1−lg(v) = (<v, ū>)D
wobei sich ū die Bedingung (ū)Z = (u)Z + 1 − lg(v) erfüllen soll. Da sowohl die binäre Addition als auch
die Bestimmung von lg(v) als Binärzahl linear in der Länge der Argumente sind, sind O(max{lg(v), lg(u)})
Schritte zur Bestimmung von <v, ū> ausreichend.
52
4 FLIESSKOMMA-ARITHMETIK
Bei DENORM (x, n) = trunc(x · 2−n ) gehen wir wie folgt vor: Ist x = (w)D , pr12 (w) = m, pr22 (w) = e
und (u)Z = n, so gilt ja:
µ
¶
(m)Z
(e)Z −(n)Z
DENORM(x, n) = trunc lg(m)−1 · 2
2
Setzen wir i := (e)Z − (n)Z , so ergibt sich DENORM(x, n) = (v̄)Z mit
½
λ , falls i ≤ 0
v̄ :=
erste i + 1 Zeichen von m000 . . . , falls i > 0
Um zu testen, ob i = (e)Z − (u)Z ≤ 0 ist, sind O(lg(u)) Schritte ausreichend. (Wegen der Normierung
in der Definition von (·)Z muß e für diesen Test nicht unbedingt ganz gelesen werden!) Nur wenn i > 0
ist, bestimmen wir den Wert von i durch Ausführung der Subtraktion. Als Schranke für den Aufwand zur
Bestimmung von v̄ erhalten wir damit:
O(lg(u)),
falls (e)Z − (u)Z ≤ 0
O(max{lg(e), lg(u)}) + O((e)Z − (u)Z ), falls (e)Z − (u)Z > 0
2
Obwohl wir bei den Operationen auf den dyadischen Zahlen den ganzzahligen Operanden P für die Festlegung der gewünschten Genauigkeit benutzt haben, werden wir uns bei der Untersuchung der Komplexität
auf Werte n ∈ N beschränken, wobei uns vor allem das asymptotische Verhalten der Komplexität interessiert: Im wesentlichen werden wir Schranken für die Zeit suchen, die wir brauchen um einen Funktionswert
mit einem Fehler von höchstens 2−n zu bestimmen.
Allerdings gibt es keine Schranke, die für alle dyadischen Argumente gültig ist: Ist z.B. der Funktionswert
größer als 2i , so brauchen wir bereits i + n Schritte, um eine ausreichend lange Mantisse zu erzeugen. Dies
läßt sich durch eine Schranke mit alleinigem Parameter n nicht beschränken. Daher formulieren wir im
folgenden Komplexität abhängig von der gewünschten Genauigkeit und zusätzlich von dem Bereich, aus
dem die Argumente sind.
4.4 Lemma. Für die Operationen ADD, SUB, MULT und INV auf den dyadischen Zahlen gibt es Turingmaschinen MADD , MSUB , MMULT und MINV mit folgenden Eigenschaften (dabei ist c ∈ N eine Konstante):
Für alle m, n ∈ N, x, y ∈ D und für alle w mit ((·)D , (·)D , (·)Z )(w) = (x, y, −n) und |(x)D | , |(y)D | ≤ 2m
gilt:
TMADD (w) ≤ c · (m + n + 1)
TMSUB (w) ≤ c · (m + n + 1)
TMMULT (w) ≤ c · M(m + n + 1)
für alle m, n ∈ N, x, ∈ D \ {0} und für alle w mit ((·)D , (·)Z )(w) = (x, −n) und |(x)D | ≥ 2−m gilt:
TMINV (w) ≤ c · M(m + n + 1)
2
53
4 FLIESSKOMMA-ARITHMETIK
Anmerkung: Zur Abschätzung der Komplexität reichen also die Kenntnis des ‘Genauigkeitsparameters’ n
und einer oberen Schranke für den Betrag der betreffenden dyadischen Zahlen (bzw. einer unteren Schranke bei INV), die Länge der ‘Mantisse’ muß nicht bekannt sein! Die Komplexitätsuntersuchungen können
also auf der (‘ideellen’) Ebene der dyadischen Zahlen durchgeführt werden.
Beweis: Im folgenden verwenden wir wieder die Bezeichnungen für die Werte der Variablen, wie sie im
vorigen Lemma benutzt wurden. Allerdings haben wir jetzt p = −n und können bei den Abschätzungen
sx , sy ≤ m verwenden (bzw. sx ≥ −m bei INV).
(a) Bei der Bestimmung der Komplexität von Addition und Subtraktion sieht man zunächst, daß die zwei
notwendigen Denormalisierungen höchstens O(m + n) Schritte erfordern. Ferner sind die ganzzahligen
Werte a und b beide sicher durch 2m+n beschränkt, so daß ihre Addition (bzw. Subtraktion) ebenfalls
in O(m + n) Schritten abgeschlossen werden kann. Das Ergebnis c wiederum ist sicher durch 2m+n+1
beschränkt, so daß die abschließende Normalisierung von c auch nur O(m + n) Schritte erfordert.
(b) Bei der Multiplikation muß (nach dem in konstanter Zeit möglichen Vergleich der Argumente mit 0)
festgestellt werden, ob −n größer ist als sx + sy . Dazu dürfen wir jedoch auf keinen Fall zunächst sx und
sy einfach addieren: Beide Werte können einen beliebig großen Betrag haben, wenn x und y fast Null sind.
Daher gibt es keine (auch noch so große) Schranke für die Komplexität der Bestimmung von sx + sy , die
für alle x, y mit |x| , |y| ≤ 2m gilt. Wir implementieren den Test IF P > SIZE(X)+SIZE(Y) THEN...
daher wie folgt:
VAR TEST:BOOLEAN;
...
IF P <= 2*SIXE(X) THEN
TEST := ( P-SIZE(X) > SIZE(Y) )
ELSIF P <= 2*SIXE(Y)
TEST := ( P-SIZE(Y) > SIZE(X) )
ELSE
TEST := TRUE;
END
IF TEST THEN ...
Die Äquivalenz der zwei Programmstücke ist naheliegend: Ist P <= 2*SIXE(X) oder P <= 2*SIXE(Y),
so ergibt sich der Wert von TEST aus einer Umformulierung des ursprünglichen Ausdrucks P > SIZE(X)+SIZE(
Ansonsten ist P >2*SIXE(X) und P >2*SIXE(Y) und damit 2*P >2*SIXE(X)+ 2*SIXE(Y),
in diesem Fall sind also sowohl der Ausdruck P >SIXE(X)+ SIXE(Y) als auch die Variable TEST
wahr.
Für die Abschätzung der Komplexität ist das zweite Programmstück jedoch geeigneter: Für die Vergleich P <= 2*SIXE(X) reichen O(log n) Schritte. Fällt der Vergleich positiv aus, bestimmen wir
P - SIZE(X). Hier ist jedoch einerseits −n ≤ 2 · sx und andererseits sx ≤ m, also sicherlich |sx | ≤
m+n. Die Bestimmung von P - SIZE(X) und der Vergleich mit SIZE(Y) sind also in höchstens
O(log(n+m)) Schritten möglich. Das gesamte Programmstück kann also im O(log(n+m)) Schritten abgearbeitet werden.
Ergibt sich schließlich bei TEST der Wert FALSE, so gilt −n ≤ sx + sy zusätzlich zu sx , sy ≤ m. Es gilt
also −n − m ≤ sx , sy ≤ m und damit |sx | , |sy | ≤ m + n. Dies ergibt einerseits die (grobe) Abschätzung
|ex | , |ey | , |e| ≤ c1 · (m + n + 1) für eine geeignete Konstante c1 und andererseits wiederum die Schranke
O(log(n+m)) für die Komplexität ihrer Berechnung.
54
4 FLIESSKOMMA-ARITHMETIK
Der Aufwand für die Denormalisierungen ist also durch O(n+m) beschränkt; die Werte |a|, |b| und |c|
sind entsprechend durch 2c2 (n+m+1) für geeignetes c2 abschätzbar. Die Multiplikation c = a · b erfordert
maximal O(M(c2 (n+m+1))) Schritte, was wegen der Bedingung M(2i) ≤ 2M(i) durch O(M(n+m))
beschränkt ist. Die abschließende Normalisierung ist wiederum in O(n + m) Schritten möglich.
Insgesamt ist die Komplexität also durch O(M(n + m)) beschränkt.
(c) Bei der Berechnung des Kehrwertes ist der Test P>-SIZE(X) unkritisch, er kostet nicht mehr als
O(log n) Schritte. Fällt er negativ aus, so haben wir −n ≤ −sx zusätzlich zu der Voraussetzung sx ≥ −m,
also n ≥ sx ≥ −m. Daraus erhalten wir |ex | , |ez | ≤ c3 (m+n). Den Wert 2**(-EZ-EX) können wir
damit in O(m+n) Schritten bestimmen: er besteht i.W. aus einer Folge von ez + ex Nullen (bei νZ !).
Alle weiteren Zeitabschätzungen können analog zu oben durchgeführt werden, so daß sich schließlich
wiederum O(M(n + m)) als Schranke für die Komplexität ergibt.
2
4.5 Lemma.
Die Komplexität von a ¢p b und a ¯p b ist O(max(log2 a, log2 b, |p|)).
Die Komplexität von a £p b ist O(M(max(log2 a, log2 b, |p|))).
Die Komplexität von a p b ist O(M(max(log2 a, − log2 b, |p|))).
2
Beweis: In allen Fällen außer der Division sind die Abschätzungen naheliegend. Bei der Division erhalten wir für die Komplexität von 1 p a unter Verwendung des Iterationsverfahrens im Bereich [1, 2) die
Zeitschranke
dlog2 |p|e
dlog2 |p|e
X
X
i
M(2 + 3) ≤
2−i M(2dlog2 |p|e + 3) = O(M(|p|)
i=0
i=0
wenn wir die zusätzliche Eigenschaft 2M(n) ≤ M(2n) ≤ cM(n) aus der Festlegung der Komplexitätsschranke M verwenden.
2
Das Verfahren zur Berechnung des Kehrwertes ist nur ein Spezialfall einer allgemeineren Vorgehensweise:
Die verwendete Funktion Φ war quadratisch konvergent, d.h. es galt |Φ(x) − Φ(a)| ≤ L · |x − a|2 in einer
geeigneten Umgebung von a.
Solche quadratisch konvergenten Verfahren erhält man automatisch beim Newton-Raphson-Iterationsverfahren
zur Nullstellenbestimmung, das wir später noch exakt untersuchen werden. Zunächst werden wird jedoch
die Bedingungen an die Komplexitätsschranken genauer untersuchen. Sie haben den Vorteil, dass man mit
ihnen besonders leicht die Komplexität von Algorithmen abschätzen kann
4.6 Definition. Eine Zeitschranke t : N → N heißt regulär, wenn sie monoton wachsend ist, nicht konstant
den Wert 0 hat und zudem c, n0 ∈ N existieren, so dass für alle n ≥ n0 gilt
(1)
(2)
2t(n) ≤ t(2n) ≤ c · t(n)
2
4.7 Lemma. Für jede reguläre Zeitschranke t : N → N gilt
(a) t wächst mindestens linear, d.h. id ∈ O(t).
55
4 FLIESSKOMMA-ARITHMETIK
(b) Es gibt zu t ein k ∈ N, so daß t ∈ O(nk ) gilt.
(c) Für alle c̄ ∈ N ist t(c̄ · n + c̄) ∈ O(t).
(d) Es ist
dlog
2 ne
P
t(2k ) ∈ O(t).
k=0
2
Beweis: Sei t regulär und c, n0 seien die entsprechenden Konstanten. k1 sei so groß gewählt, daß sowohl
n1 := 2k1 > n0 als auch c1 := t(n1 ) > 0 gilt.
(a) Für n ≥ n1 gilt mit Bedingung (1)
¡
¢
t(n) ≥ t 2blog2 nc
≥ t(2k1 ) · 2blog2 nc−k1
≥ c1 · n · 2−1−k1
Also gilt sicherlich n ≤ c̄ t(n) für eine geeignete Konstante c̄ ∈ R.
(b) Für n ≥ n1 gilt mit Bedingung (2)
¡
¢
t(n) ≤ t 2dlog2 ne
¡ ¢
≤ t 2k1 · cdlog2 ne−k1
≤ c1 · nlog2 c · c1−k1
d.h. t ∈ O(nlog2 c ).
(c) Sei c̄ ∈ N. Für alle n ≥ n0 > 1 gilt dann mit Bedingung (2)
t(c̄n + c̄) ≤ t(2c̄n)
¡
¢
≤ t 2dlog2 c̄e+1 · n
≤ cdlog2 c̄e+1 · t(n)
(d) Setzen wir c2 :=
k1
P
t(2k ), so ergibt sich für alle n ≥ n1
k=0
dlog2 ne
X
k=0
k
t(2 ) =
k1
X
dlog2 ne
X
k
t(2 ) +
k=0
≤ c2 +
t(2k )
k=k1 +1
∞
X
¡
¢
2−k · t 2dlog2 ne
k=0
≤ c2 + t(2n) ·
∞
X
2−k = c2 + t(2n) · 2
k=0
≤ c2 + c3 · t(n)
2
56
4 FLIESSKOMMA-ARITHMETIK
4.8 Lemma.
(i) Die Identität auf N ist regulär.
0
0 0
(ii) Ist t regulär und t0 : N → R+
0 monoton wachsend, nicht identisch 0 mit t (2n) ≤ c · t (n) für gewisse
c0 , n00 ∈ N und für alle n ≥ n00 , so ist auch die Funktion bt(n) · t0 (n)c regulär.
2
Beweis: (i) ist offensichtlich: 2 id(n) = id(2n)
Bei (ii) ergibt sich mit der Regularitätsbedingung (1) für t und der Monotonie von t0
2bt(n) · t0 (n)c ≤ 2bt(n) · t0 (2n)c ≤ t(2n) · t0 (2n)
Mit der Regularitätsbedingung (2) für t und der analogen Bedingung für t0 erhalten wir für alle n ≥ n1 :=
max{n0 , n00 } (wobei wir o.B.d.A. t(n1 ) · t0 (n1 ) > 1 annehmen):
bt(2n) · t0 (2n)c ≤ bc · t(n) · t0 (2n)c
≤ bc · t(n) · c0 t0 (n)c ≤ c · c0 · t(n) · t0 (n)
≤ c · c0 (bt(n) · t0 (n)c + 1) ≤ 2cc0 bt(n) · t0 (n)c
2
Aus dem Lemma ergibt sich, daß zum Beispiel alle Funktionen t der Form t(n) = bnα (log n)β (log log n)γ c,
für α ≥ 1, β, γ ≥ 0, α, β, γ ∈ R, regulär sind.
Anmerkung: Die Bedingungen aus der Definition der regulären Zeitschranken implizieren außer einem (a)
Mindest- und einem (b) Höchstwachstum auch eine (c) Gleichmäßigkeit im Wachstum. Es gibt Funktionen,
die zwar (a) und (b) aus dem vorigen Lemma genügen, die aber dennoch nicht regulär sind: Betrachte
t(n) := n · max{i! | i! ≤ n}. Damit ist sicherlich n ≤ t(n) ≤ n2 und auch 2t(n) ≤ t(2n), aber
¡ m! ¢ die
2
Bedingung (2) aus der Definition ist nicht erfüllt: Für jedes m > 2 ist t(m!) = (m!) und t 2 =
1
m!
· (m − 1)! = 2m
(m!)2 . Für n = m!
ist also t(2n) = (m!)2 = 2mt(n).
2
2
Da bei einer Berechnung auf dyadischen Zahlen zum Erreichen einer Genauigkeit von 2−n in der Regel
auch ein Wert bestehend aus O(n) Bits erzeugt werden muß, ist das zumindest lineare Wachstum einer
regulären Zeitschranke keine spürbare Einschränkung. Andererseits ist jede reguläre Schranke durch ein
Polynom beschränkt, wir können also nur den Bereich der Polynomzeit-berechenbaren Funktionen mit
regulären Schranken erfassen! Nach dem obigen Lemma können wir in diesem Bereich jedoch sehr genaue
Aussagen über die (asymptotische) Komplexität von Funktionen machen.
Als erstes Beispiel, bei dem wir die Regularität der Komplexitätsschranken intensiv nutzen, betrachten wir
die Ableitung einer berechenbaren Funktion.
4.9 Lemma. Die Funktion f : R ÂR sei auf G = [a, b] (mit a, b ∈ D) stetig differenzierbar mit einer
Ableitung f 0 , die auf G sogar Lipschitz-stetig ist. Ist f auf G in Zeit O(t) berechenbar für eine reguläre
Schranke t, so ist f 0 ebenfalls auf G in Zeit O(t) berechenbar.
2
Beweis: Da f 0 Lipschitz-stetig ist, gibt es ` ∈ N mit |f 0 (x) − f 0 (y)| ≤ 2` |x − y| für alle x, y ∈ [a, b]. Ferner
¯
ist f selbst als differenzierbare Funktion auf [a, b] auch Lipschitz-stetig mit |f (x) − f (y)| ≤ 2` |x − y| für
57
4 FLIESSKOMMA-ARITHMETIK
ein `¯ ∈ N.
Um nun f 0 (x) für ein x ∈ [a, b] zu approximieren, verwenden wir den Mittelwertsatz, nachdem für jedes
y ∈ [a, b], y 6= x, ein z zwischen x und y existiert, so daß f 0 (z) = (f (y) − f (x))/(y − x) gilt. Ist |y − x|
ausreichend klein, so ist auch |f 0 (z)−f 0 (x)| ≤ 2` |z −x| ≤ 2` |y −x| klein. Wir können f 0 (x) also durch die
Auswertung von (f (y) − f (x))/(y − x) approximieren. Allerdings werden dann die Fehler, die wir bei der
Bestimmung von f (x) und f (y) machen, durch die Division durch (y − x) enorm vergrößert. Wir müssen
also f (x) und f (y) sehr genau auswerten, um bei f 0 (z) eine passable Näherung an f 0 (x) zu gewinnen. (Da
in der Praxis meist mit fest vorgegebenen Genauigkeiten gerechnet wird, wird die Differentiation auch als
numerisch nicht stabil bezeichnet!)
Bei gegebenem x ∈ [a, b] müssen wir ein y verwenden, das nahe bei x liegt und zudem noch im Intervall
[a, b] ist, damit wir f (y) überhaupt bestimmen können. Daher seien q ∈ D und d ∈ N so gegeben, daß
a ≤ q − 2−d und q + 2−d ≤ b gilt.
Die Einzelheiten der Bestimmung von f 0 finden sich im folgenden Algorithmus; der entsprechend Lemma
6.6 eine Funktion F : D × N ÂD zur Berechnung von f benutzt.
FUNCTION F_ABL (X:DYADIC; P: WHOLE)
VAR P1, P2, P3, P4: WHOLE;
Y, FX, FY, FZ: DYADIC;
BEGIN
P1:=MIN(P-`-2,-d-2);
P2:=P-2;
¯
P3:=MIN(P+P1-`-3,P1);
P4:=P+P1-3;
FX:=F(X,P4);
IF SUB (X,q,-d-1) ≥ 0 THEN
Y:= SUB(X,2P1 ,P3);
FY:=F(Y,P4);
FZ:=SUB(FX,FY,P4);
ELSE
Y:= ADD(X,2P1 ,P3);
FY:=F(Y,P4);
FZ:=SUB(FY,FX,P4);
END
RETURN SHIFT(FZ,-P1,P2);
END;
Dabei sei die Funktion SHIFT:D × Z × Z → D durch |SHIFT(x, q, p) − 2q · x| ≤ 2p festgelegt, d.h. sie
multipliziert x mit der Zweierpotenz 2q . Wie man sich leicht überlegt, kann SHIFT durch NORM(DENORM
(x, p − q), p) implementiert werden, so daß sich bei i, j, k ∈ N und |x| ≤ 2i die Komplexität von SHIFT
(x, j, −k) durch c(i + j + k + 1) abschätzen läßt .
Es seien wie üblich x, y, fx , . . . die Werte der Variablen X, Y, FX,. . .. Ferner sei z der Wert, der von der
Funktion berechnet und zurückgegeben wird. Insbesondere sei x so gegeben, daß a ≤ x ≤ b gilt.
Im folgenden sei zunächst SUB(x, q, −d − 1) ≥ 0. Dann ist sicher x − q + 2−d−1 ≥ 0, d.h. x ≥ q − 2−d−1 .
Wir erhalten dann auch x − 2p1 ≥ a, y ≥ x − 2p1 − 2p3 ≥ a sowie y ≤ x − 2p1 + 2−p3 ≤ x ≤ b. Damit
gilt sowohl x − 2p1 ∈ [a, b] als auch y ∈ [a, b].
58
4 FLIESSKOMMA-ARITHMETIK
Ferner erhalten wir mit dem Mittelwertsatz für ein ξ ∈ [x − 2p1 , x] die folgende Abschätzung
|f 0 (x) − z| ≤
≤
≤
≤
=
≤
≤
=
2p2 + |f 0 (x) − fz · 2−p1 |
2p2 + 2p4 −p1 + |f 0 (x) − (fx − fy ) · 2−p1 |
2p2 + 2p4 −p1 + 2 · 2p4 −p1 + |f 0 (x) − (f (x) − f (y)) · 2−p1 |
¯
2p2 + 3 · 2p4 −p1 + 2`+p3 −p1
+ |f 0 (x) − (f (x) − f (x − 2p1 )) · 2−p1 |
¯
2p2 + 3 · 2p4 −p1 + 2`+p3 −p1 + |f 0 (x) − f 0 (ξ)|
¯
2p2 + 3 · 2p4 −p1 + 2`+p3 −p1 + 2`+p1
2p−2 + 3 · 2p−3 + 2p−3 + 2p−2
2p
Die gleiche Abschätzung erhalten wir im Fall SUB(x, q, −d − 1) < 0. Der Algorithmus berechnet also wie
gewünscht die Ableitung f 0 .
Zur Abschätzung der Komplexität des Algorithmus sei n ∈ N gegeben, es sei p := −n. O.B.d.A sei
n so groß, daß n > `, −n − ` − 2 < −d − 2, also p1 = −n − ` − 2, und −n − `¯ − 3 < 0, also
¯
p3 = −2n−`− `−5,
gilt. Ferner sei m ∈ N so gewählt, daß 2m größer ist als |a|, |b|, max{f (t) | t ∈ [a, b]}
und max{f 0 (t) | t ∈ [a, b]}. Dann ist die Komplexität beschränkt durch
+
+
+
+
+
c1 (n + 1)
2 · t(2n + ` + 5)
c2
c3 (m + n + 1)
c4 (m + n + 1)
c5 (m + n + 1)
(Bestimmung von p1 bis p4 , grobe Abschätzung)
(Bestimmung von fx und fy )
(Vergleich x und q )
(Bestimmung von y)
(Bestimmung von fz )
(SHIFT)
Da t nach Voraussetzung regulär ist, liegt die Komplexität also in O(t).
2
Viele interessante Zahlen und Funktionen sind über Reihen definiert, z.B. e, π, sin(x), ex . . ., wobei einerseits die Reihenglieder durch elementare Rechnungen beliebig genau approximiert werden können und
andererseits der Restfehler bei einer nur endlichen Zahl von Summanden leicht abgeschätzt werden kann
(z.B. mit Hilfe des letzten Summanden bei alternierenden Reihen). Im folgenden betrachten wir das Konzept eines Algorithmus zur Auswertung einer konvergenten Reihe.
P∞
ai eine konvergente Reihe.¯ Wir nehmen
¯ an, daß uns Funktionen A : N × Z → D
P
¯
¯
∞
und R : N → Z mit |A(i, p) − ai | ≤ 2−p und 2R(i) ≥ ¯ j=i+1 aj ¯ zur Verfügung stehen. Mit diesen Mitteln
P
können wir nun den Wert der Reihe ∞
i=1 ai beliebig genau approximieren. Interessant dabei ist, daß wir
die Zwischenberechnungen mit unterschiedlicher Genauigkeit durchführen, da wir im Allgemeinen nicht
wissen, wieviele Glieder der Reihe wir auszuwerten haben.
4.10 Beispiel. Es sei
i=1
FUNCTION . . . (. . . , P:WHOLE):DYADIC;
VAR Z,Y: DYADIC;
(*Summe und Summand*)
S: NATURAL;
(*variable Zahl von ’Schutzziffern’*)
I: NATURAL;
(*Summationsindex*)
L: NATURAL;
(*Hilfsvariable für S*)
59
4 FLIESSKOMMA-ARITHMETIK
BEGIN
Z:=0; I:=0; S:=1; L:=1;
WHILE R(I)>P-1 D0
I:=I+1;
IF I≥L THEN S:=S+2; L:=2*L END;
Y:=A(I,P-S);
Z:=ADD(Z,Y,P-S);
END;
RETURN Z;
END;
p sei der Wert des Parameters P beim Aufruf der Funktion. zi , yi , li und si seien die Inhalte der entsprechenden Variablen Z, Y , L und S zum Zeitpunkt des Testes zu Beginn der i + 1-ten Durchlaufes der
WHILE-Schleife (also wenn I den Wert i hat). Dann gilt sofort
| yi − ai |≤ 2p−si
und mit Induktion li = 2(si −1)/2 (im Bereich 2k−1 ≤ i < 2k ist li = 2k und damit gilt si = 2k+1) sowie
¯
¯
i
i
¯
¯ X
X
¯
¯
aj ¯ ≤
2p−sj +1
¯zi −
¯
¯
j=1
denn für i = 0 gilt
j=1
¯
¯
¯
¯
0
P
¯
¯
aj ¯ = 0; für i > 0 folgt
j=1 aj = 0 = z0 , also ¯z0 −
¯
¯
j=1
P0
¯
¯
¯
¯
i
i−1
¯
¯
¯
¯
X
X
¯
¯
¯
¯
aj ¯ ≤ ¯zi−1 −
aj ¯ + |ai − zi + zi−1 |
¯zi −
¯
¯
¯
¯
j=1
j=1
≤
i−1
X
2p−sj +1 + |ai − yi | + |yi + zi−1 − zi |
j=1
≤
i−1
X
2p−sj +1 + 2p−si + 2p−si
j=1
=
i
X
2p−sj +1
j=1
60
4 FLIESSKOMMA-ARITHMETIK
d sei die Zahl der Durchläufe durch die WHILE-Schleife. Daraus ergibt sich nach Wahl der Funktion R für
den von der Funktion zurückgegebenen Wert zd :
¯
¯
¯ ∞
¯ ¯
¯
∞
d
¯
¯
¯X ¯ ¯
¯
X
X
¯
¯
¯
¯ ¯
¯
aj ¯ = ¯
aj ¯ + ¯zd −
aj ¯
¯zd −
¯
¯
¯
¯ ¯
¯
j=1
j=1
j=d+1
≤ 2p−1 +
d
X
2p−sj +1
j=1
= 2
p−1
+2
p+1
= 2p−1 + 2p+1
d
X
j=1
∞
X
2−sj
2−(2k+1) · card{j | 1 ≤ j ≤ d, sj = 2k+1}
k=1
= 2p−1 + 2p+1
≤ 2p−1 + 2p+1
∞
X
k=1
∞
X
2−(2k+1) · card{j | 1 ≤ j ≤ d, 2k−1 ≤ j < 2k }
2−(2k+1) · 2k−1
k=1
= 2
p−1
+2
p+1
· 1/4 = 2p
Der Algorithmus liefert also wie gewünscht eine Approximation mit einem Fehler von höchstens 2p an den
Wert der Reihe.
Wie man sieht, kann die Anzahl sj der ‘Schutzbits’ beliebig gewählt werden, solange sichergestellt ist, daß
P
die Summe dj=1 2−sj durch 1/4 beschränkt ist. Wäre die Zahl d der zu summierenden Reihenglieder (also
der Schleifendurchläufe) im voraus bekannt, so läge die Wahl von 2−sj ≈ 1/4d, d.h. sj ≈ 2 + log2 d, nahe.
Beim obigen Algorithmus entwickeln sich die Schutzbits wie folgt:
i 1 2 3 4 5 6 7 8 9 10 . . .
si 3 5 5 7 7 7 7 9 9 9 . . .
Dabei gelten die Beziehungen li = 2(si −1)/2 und li ≤ 2i für alle i ≤ d. Also ist hier stets sj ≤ 3 +
2 log2 d. Bei regulären Schrankenfunktionen und der Untersuchung asymptotischer Komplexität ist diese
Verdopplung der Zahl der Schutzbits ohne Belang.
Bei konkreten Reihen sind für die Komplexität der Reihenauswertung meist zwei Parameter ausschlaggebend: Die Zahl d(n) der Schleifendurchläufe bis zum Erreichen der Genauigkeit 2−n und die Komplexität der Bestimmung eines Reihengliedes mit Genauigkeit 2−n . Die Komplexität der anderen Operationen, etwa der Additionen oder die Auswertung von R, kann üblicherweise vernachlässigt werden. Falls
z.B. die Komplexität zur Bestimmung von A(i, −n) durch t(i+n) (für ein reguläres
³P t) beschränkt ist,´ erP
d(n)
0
0
=
halten wir als Schranke t für die Komplexität von
ai in etwa: t (n) = O
i=1 t(i + n+ log i)
O (d(n) · t(n+d(n))).
2
Mit dem obigen ‘Meta-Algorithmus’ können wir nun leicht die Komplexität vieler interessanter Funktionen abschätzen:
4.11 Lemma. Die Funktionen sin(x), cos(x) und ex sind auf jeder kompakten Menge G ⊆ R in Zeit
n/ log n · M(n) berechenbar.
2
61
4 FLIESSKOMMA-ARITHMETIK
P
i
2i−1
Beweis: Bekannterweise ist sin(x) = ∞
/(2i − 1)!. Wir beschränken uns im folgenden auf
i=1 (−1) · x
die Menge G := [−1, 1], x ∈ G sei beliebig, aber fest gewählt. Setze ai := (−1)i · x2i−1 /(2i − 1)! für
i ≥ 1.
Da die Sinus-Reihe alternierend ist, können wir den Restfehler bei der Summation durch den letzten bekannten Summanden abschätzen. Die Beschränkung |x| ≤ 1 erlaubt uns zudem eine sehr einfache Aus−x2
wertung dieser Summanden: Für i > 1 ist ai = ai−1 · (2i−2)·(2i−1)
. Da der ergänzende Faktor kleiner als 1
ist, wird der Fehler, den wir bei der Auswertung der ai machen, von Summand zu Summand kleiner!
Im folgenden bauen wir die Sinus-Reihe in den Rahmen-Algorithmus aus dem vorigen Beispiel ein.
FUNCTION SINUS (X: DYADIC, P: WHOLE): DYADIC;
VAR
Y, Z, R, Q: DYADIC;
S, I, L: WHOLE;
BEGIN
IF P≥0 THEN RETURN 0;
Z:=0; I:=0; S:=1; L:=1;
Q:=MULT(X,X,P-6);
REPEAT
I:=I+1
IF I≥L THEN S:=S+2; L:=2*L END;
IF I=1 THEN
Y:=COPY(X,P-S-6);
ELSE
R:=MULT(Y,Q,P-S);
Y:=DIV(R,-(2*I-2)*(2*I-1),P-S-1);
END;
Z:= ADD(Z,Y,P-S);
UNTIL SIGN(Y)=0 OR SIZE(Y) ≤ P-2
RETURN Z;
END;
Zur Untersuchung der Korrektheit des Algorithmus betrachte x ∈ D ∩ [−1, 1] und p ∈ Z als Parameter
beim Aufruf von SINUS. Bei p ≥ 0 liefert der Algorithmus sofort den Wert 0 zurück, der in diesem Fall
offensichtlich ausreichend genau ist. Im folgenden sei daher p < 0. q sei der Wert der Variablen Q, zi , ri , . . .
seien die Werte der anderen Variablen jeweils am Ende der i-ten Durchlaufes durch die REPEAT-Schleife.
Zum Nachweis der Korrektheit des Algorithmus müssen wir nur zeigen, daß |yi − ai | ≤ 2p−si gilt: Dann
haben die einzelnen yi die im Rahmen-Algorithmus geforderte Genauigkeit, ferner ist die Abbruchbedingung des Rahmenalgorithmus erfüllt:
¯
¯ ∞
¯X ¯
¯
¯
ak ¯ ≤ |ai | ≤ |yi | + 2p−si ≤ |yi | + 2p−3 ≤ 2p−1
¯
¯
¯
k=i+1
Zunächst stellen wir fest, daß sicherlich |q| ≤ 2 und stets si ≤ si−1 + 2 gilt. Daraus ergibt sich für alle
i ≥ 2 leicht ai ≤ 23−si .
62
4 FLIESSKOMMA-ARITHMETIK
Die Bedingung |y1 − a1 | ≤ 2p−s1 (mit s1 = 3) wird durch die Funktion COPY sofort erfüllt. Für i > 1 gilt
¯
¯
¯
¯
ri
|yi − ai | ≤ 2p−si −1 + ¯ai − (2i−2)(2i−1)
¯
≤ 2p−si −1 +
≤ 2p−si −1 +
≤ 2p−si −1 +
≤ 2p−si −1 +
1
|ai−1 x2 − ri |
(2i−2)(2i−1)
1
(2p−si + |ai−1 x2 − yi−1 q|)
(2i−2)(2i−1)
1
(2p−si + |x2 − q| · |ai−1 | + |q| · |ai−1 − yi−1 |)
(2i−2)(2i−1)
1
(2p−si + 2p−6 · |ai−1 | + 2 · |ai−1 − yi−1 |)
(2i−2)(2i−1)
Für i = 2 erhalten wir mit s2 = 5 und |y1 − a1 | ≤ 2p−6
1
|y2 − a2 | ≤ 2p−6 + (2p−6 + 1 · 2p−6 + 2 · 2p−6 ) ≤ 2p−5 = 2p−s2
6
und für i > 2 ergibt sich sofort mit der Induktionsvoraussetzung |yi−1 − ai−1 | ≤ 2p−si−1 :
1 p−si
(2
+ 2p−6 · 23−si−1 + 2 · 2p−si−1 )
20
1
= 2p−si −1 + (2 · 2p−si −1 + 2p−si−1 −1 + 16 · 2p−si −1 ) ≤ 2p−si
20
|yi − ai | ≤ 2p−si −1 +
Die Korrektheit des Algorithmus wäre damit sichergestellt. Zur Abschätzung seiner Komplexität sei p =
−n für n ∈ N. Hauptbestandteil der Untersuchung ist dann die Bestimmung einer (guten) oberen Schranke
d(n) für die Zahl der Schleifendurchläufe, also der benötigten Summanden ai bzw. yi .
Das Programm hält, sobald sich |yi | ≤ 2−n−2 ergibt; da stets |yi | ≤ |ai | + 2−n−si ≤ |ai | + 2−n−3 gilt, ist
dies spätestens erfüllt, wenn |ai | ≤ 2−n−3 ist. Wegen |x| ≤ 1 ist jedoch |ai | ≤ 1/(2i−1)!, d.h. wir können
d(n) := min{i | (2j−1)! ≤ 2n−3 } wählen,
Man kann leicht zeigen, daß d ∈ Θ(n/ log n) (d.h. d ∈ O(n/ log n) und n/ log n ∈ O(d)) gilt:
log2 (n/ log2 n − 1)! ≤ log2 ((n/ log2 n)n/ log2 n ) = n − n/log2 n · log2 log2 n
log2 (3n/ log n − 1)! ≥ log2 ((n/ log2 n)2n/|log2 n ) = 2n − 2n/ log2 n · log2 log2 n
Für ausreichend großes n ist damit n/ log2 n ≤ d(n) ≤ 3n/ log2 n.
Als Komplexitätsschranke für den Sinus-Algorithmus erhalten wir damit sofort t(n) = n/ log n · M(n).
Da die Taylor-Reihen für cos(x) und ex ähnlich aufgebaut sind (jeweils nächster Summand durch endlich
viele Multiplikationen aus dem vorigen Summanden bestimmbar, Größenbeschränkung der Summanden
über Fakultät), ergibt sich dort die gleiche Komplexitätsschranke (für Argumente x ∈ G = [−1, 1]).
Analoge Algorithmen für umfangreichere Mengen G lassen sich durch höhere Genauigkeiten bei der Bestimmung der Summanden erreichen. Man kann insbesondere auch die zu verwendende Genauigkeit an
die Größe des Argumentes x binden. Ferner wird sehr oft Range Reduction eingesetzt, um Argumente x
auf Bereiche zu transformieren, bei denen eine leichtere Auswertung möglich ist, z.B. durch Ausnutzung
der Periodiziät der Winkelfunktionen oder durch Verwendung von Formeln wie
sin(x) = 3 · sin(x/3) − 4 · sin(x/3)3
oder (Scaling and Squaring)
ex = ( ex/2 )2
63
4 FLIESSKOMMA-ARITHMETIK
bzw.
lnx = ln(x/2i ) + i · ln2
und
√
lnx = 2 · ln x
2
Schnellere Algorithmen (Komplexität log n · M(n)) sind 1976 von R. P. Brent entwickelt worden, er weist
die Gültigkeit dieser Schranke z. Bsp. für arctan(x), log(x), ex , sin(x), und cos(x) nach. Die notwendigen
Hilfsmittel werden wir zum Teil noch behandeln.
4.12 Beispiel. Ähnlich wie bei der Behandlung von Reihen können wir auch bei Iterationsverfahren einen
Rahmen für einen Algorithmus angeben: Es sei f : R ÂR eine Funktion mit einem Fixpunkt z, d.h.
f (z) = z. Ferner seien z1 ∈ D, α, ` ∈ Q und ε ∈ Z so gegeben, daß |z − z1 | ≤ 2ε und (∀x ∈ R)|x − z| ≤
2ε ⇒ |f (x) − z| ≤ 2` · |x − z|α gilt. Die Funktion F : D × Z ÂD approximiere f in üblicher Weise, d.h.
|F (x, p) − f (x)| ≤ 2p .
FUNCTION . . . (. . .,P:WHOLE):DYADIC;
VAR Z: DYADIC;
E: WHOLE;
BEGIN
Z:= z1 ; E:= ε;
WHILE E > P DO
E:= dα · E + `e + 1;
Z:= F (Z,E-1);
END;
RETURN Z;
END;
Es seien p der Wert der Variablen P und εi , zi die Werte der Variablen E bzw. Z beim i-ten Test der WHILEBedingung. Wir nehmen im folgenden an, daß stets εi < εi−1 sei, also auch εi ≤ ε − (i−1). Dann gilt mit
Induktion |zi − z| ≤ 2εi : Für i = 1 ist dies nach Voraussetzung erfüllt, bei i > 1 erhalten wir
|zi − z| =
≤
≤
=
|F (zi−1 , εi − 1) − z|
|F (zi−1 , εi − 1) − f (zi−1 )| + |f (zi−1 ) − z|
2εi −1 + 2` · (2εi−1 )α
2εi −1 + 2`+αεi−1
Wegen εi = d` + αεi−1 e + 1 gilt jedoch ` + αεi−1 ≤ d` + αεi−1 e ≤ εi − 1 und damit |zi − z| ≤ 2εi .
Nach maximal i = ε − p Schleifendurchläufen muß gelten εi ≤ p, also endet der Algorithmus und liefert,
wie verlangt, eine Approximation an z mit einem Fehler kleiner oder gleich 2p .
Für die Korrektheit des Algorithmus muß demnach nur noch sicher gestellt werden, daß die Folge (εi )i≥1
streng monoton fällt. Dies ist natürlich vom verwendeten Iterationsverfahren und dem Startwert abhängig,
d.h von den Parametern α, ε und `.
64
4 FLIESSKOMMA-ARITHMETIK
Ist α = 1, so liegt ein lineares Iterationsverfahren vor und es ist
εi = dεi−1 + `e + 1 = εi−1 + d`e + 1 = ε + (i − 1)(d`e + 1)
p−ε
Wir benötigen also ` ≤ −2. Als Gesamtzahl der Durchläufe durch die Schleife erhalten wir dann max{ d`e+1
, 0}.
Benötigen wir zur Auswertung von F (x, −n) für x ∈ [z − ε, z + ε] jeweils t(n) Schritte (für ein reguläres
t), so ist die Komplexität t0 (n) zur Approximation von z mit Genauigkeit 2−n beschränkt durch t0 (n) =
O(n · t(n)). Diese Schranke gilt auch bei einem beliebigen ` mit 0 > ` > −2. Allerdings müssen wir dann
den obigen Algorithmus modifizieren, z.B. indem wir statt f die Funktion fˆ(x) = f (f (. . . f (x) . . .) mit
| {z }
m
m = d−2/`e (und `0 = m · ` < −2) verwenden.
Ist α > 1, so liegt ein superlineares Iterationsverfahren vor und wir haben εi = dαεi−1 + ` + 1e ≤
αεi−1 + ` + 2 und damit
εi ≤ αεi−1 + ` + 2
= α(αεi−2 + ` + 2) + ` + 2
i−2
X
i−1
= . . . = α ε + (l + 2)
αj
j=0
i−1
α −1
α−1
l
+
2
l+2
= αi−1 (ε +
)−
α−1
α−1
= αi−1 ε + (l + 2)
l+2
Als hinreichende Bedingung für das streng monotone Fallen der Folge (εi ) erhalten wir also ε < − α−1
,
was wir durch geeignete Wahl des Startwertes stets erreichen können.
Um die Komplexität des Verfahrens zu bestimmen, sei wieder t(n) eine reguläre Schranke für den Aufwand
l+2
zur Bestimmung von F (x, −n), n ∈ N. Wir setzen γ1 := − α−1
und γ2 := ε + γ1 (< 0). O.B.d.A. sei n
2n
größer als γ1 . Dann gilt für k := dlogα −γ2 e
α k γ2 − γ 1 ≤
2n
· γ2 − γ1 = −2n − γ1 ≤ −n
−γ2
Also wird die WHILE-Schleife höchstens k-fach durchlaufen.
¡
¢ l+1
l+1
Ferner ist stets εi = dαεi−1 + l + 1e ≥ αεi−1 + l + 1 ≥ . . . ≥ αi−1 ε + α−1
− α−1 = −αi−1 γ3 − γ4 .
m−1
Sei m so groß, daß ab α
die Regularitätsbedingungen für t greifen; dann ist die Komplexität t0 bei
superlinearen Verfahren wie folgt beschränkt, wenn n ausreichend groß ist:
65
4 FLIESSKOMMA-ARITHMETIK
t0 (n) ≤
k
P
t(αi−1 γ3 + γ4 + 1)
i=1
≤ c1 + c1
≤ c2 + c2
=
≤
≤
≤
t(αi−1 )
i=1
k
P
t(αi−1 )
i=m
k
P
¡
¢
t 2d(i−1) log2 αe
i=m
∞ ¡
¢
P
t 2d(k−1) log2 αe · 2−j
c2 + c2
j=0 ¡
¢
d(k−1) log2 αe
c2 + c2 · 2t
2
¡
¢
c2 + c2 2t ³2αk−1 ´
2n
c2 + c2 2t 2b −γ
c
2
c3 + c3 t(n)
≤ c2 + c2
≤
k
P
(Die Komplexität des Tests der Schleifenbedingung und der Bestimmung der εi kann dabei vernachlässigt
werden.) Bei jedem superlinearen Verfahren bleibt also die Komplexität in der Klasse O(t) (wenn t regulär
ist)!
Anmerkung: Bei einer praktischen Anwendung sollte man darauf achten, daß das „letzte“ εi nicht wesentlich kleiner als p ist, da ein großer Teil des Gesamtaufwandes in den letzten Iterationen geschieht. Ist z.B.
εi = −2i und p = −2n − 1, so ergibt sich bei der vorletzten Iteration εk−1 = −2n und bei der letzten
Iteration εk = −2n+1 , d.h. eine Genauigkeit, die deutlich zu hoch ist.
2
Wir hatten bereits die Bestimmung des Kehrwertes mit einem quadratisch konvergenten Iterationsverfahren durchgeführt. Analog kann man die Quadratwurzel mit der Iterationsfunktion f (x) = (x + a/x)/2
berechnen (herleitbar über das Newton-Raphson-Verfahren). Daraus ergibt sich:
4.13 Korollar. Die Funktion
√
ist auf jedem beschränkten G ⊆ R+
0 in Zeit O(M) berechenbar.
2
4.14 Lemma. Die Funktion f : R ÂR sei auf dem Intervall [a, b] (für a, b ∈ D) differenzierbar, wobei die
Ableitung f 0 auf [a, b] Lipschitz-stetig sei und an keiner Stelle den Wert 0 habe. Dann besitzt f auf [a, b]
eine Umkehrfunktion f −1 . Ist f in Zeit O(t) auf [a, b] berechenbar, so ist f −1 ebenfalls in Zeit O(t) auf
{f (x)|x ∈ [a, b]} berechenbar.
2
Beweis: Da f 0 auf [a, b] stetig ist, aber den Wert 0 nicht annimmt, ist f auf [a, b] streng monoton, also
existiert auf [a, b] die Umkehrfunktion f −1 , wobei f −1 (y) die einzige Nullstelle von f (x) − y ist. Um
f −1 (y) aus y zu berechnen, verwenden wir das Newton-Raphson’sche Iterationsverfahren: Wir setzen I :=
{f (x) | x ∈ [a, b]} und definieren F : [a, b] × R −→ R durch F (x, y) := x − ff(x)−y
0 (x) . Da f auf [a, b] in Zeit
O(t) berechenbar ist, ist auch F (x, y) auf [a, b] × I in Zeit O(t) berechenbar.
¯
Es sei 2` eine Lipschitzschranke für f 0 , ferner sei s ∈ Z so gewählt, daß für x ∈ [a, b] stets 2s ≤ |f 0 (x)|
gilt.
66
4 FLIESSKOMMA-ARITHMETIK
Dann gilt für alle y ∈ I und x ∈ [a, b] mit z := f −1 (y):
¯
¯
¯ ¯
¯
¯ ¯ (x−z)f 0 (x)+f (z)−f (x) ¯
|F (x, y) − z| = ¯x − ff(x)−y
−
z
=
¯
¯ ¯
0 (x)
f 0 (x)
¯
¯
¯
¯
¯ (x−z)f 0 (x)+f 0 (ξ)(z−x) ¯
¯ f 0 (x)−f 0 (ξ) ¯
= ¯
¯ = |x − z| ¯ f 0 (x) ¯
f 0 (x)
¯ `¯
¯
¯
¯
¯
`−s
≤ |x − z| · ¯ 2 f(x−z)
|x − z|2
0 (x) ¯ ≤ 2
für ein ξ ∈ [a, b] zwischen x und z (Mittelwertsatz!).
Für jedes y ∈ I ist F (x, y) also eine quadratisch konvergierende Iterationsfunktion mit Fixpunkt z =
f −1 (y). Um unser allgemeines Verfahren zur Fixpunktbestimmung anwenden zu können, definieren wir
zunächst F̄ (x, y) : R × R → R durch

 F (a, y), x ≤ a
F (x, y), a ≤ x ≤ b
F̄ (x, y) :=

F (b, y), b ≤ x
Setzen wir ` := `¯ − s, so gilt für jedes y ∈ I und jedes x ∈ R |F̄ (x, y) − f −1 (y)| ≤ 2` |x − f −1 (y)|2 ,
wobei F̄ sogar auf R × I in Zeit O(t) berechenbar ist.
Für die Anwendung unseres Verfahrens zur Fixpunktbestimmung brauchen wir nur noch einen zu dem
`+1
jeweiligen y passenden Startwert z1 mit einer Ungenauigkeit von maximal 2ε mit ε < − α−1
(mit α = 2),
also etwa ε := −` − 2 (unabhängig von y!), zu wählen.
Diese Wahl können wir sogar in konstanter Zeit vornehmen:
Es sei 2s̄ eine Lipschitzschranke für f . Setze x0 := b und xi := a + (i − 1)2ε−1+s−s̄ ; k sei maximal mit
xk ∈ [a, b] gewählt. Zu jedem xi (0 ≤ i ≤ k) bestimme yi mit |yi − f (xi )| ≤ 2ε−2+s .
Damit gibt es sicher zu jedem y ∈ I ein i ≤ k mit |xi − f −1 (y)| ≤ 2ε−2+s−s̄ , damit auch |yi − y| ≤ 2ε−2+s .
Zu einem gegebenen y ∈ I können wir also (in konstanter Zeit!) ein i mit |yi − y| ≤ 2ε−1+s finden. Dann
ist |xi − f (y)| = |f (xi ) − y|/|f 0 (ξ)| ≤ 2−s (2ε−1+s + 2ε−2+s ) < 2ε (für ein geeignetes ξ ∈ [a, b]). Also ist
xi als Startwert für die Fixpunktbestimmung bei dem gegebenen Wert y verwendbar.
67
5 INTERVALL-ARITHMETIK
5 Intervall-Arithmetik
Stichworte: Intervall-Methoden, Fehlerkontrolle, Wachstum der Intervalle
In diesem Kapitel betrachten wir die grundlegenden Begriffe der Intervall-Arithmetik, mit der die aufwendigen Fehlerabschätzungen des letzten Kapitels zumindest teilweise automatisiert werden können. Als
bahnbrechende Arbeit auf diesem Gebiet gilt [Mo62], erste verwandte Arbeiten gehen jedoch wohl schon
auf die Jahre 1924 und 1932 zurück, wie z.B. in [Ke96] angemerkt (ein Preprint dieser Arbeit in PDF-Form
findet
sich
unter
interval.louisiana.edu/preprints/survey.pdf.
Im
WWW
finden
sich
umfangreiche
Literatur-Sammlungen
zu
diesem
Gebiet,
z.B. liinwww.ira.uka.de/bibliography/Math/intarith.html, in der über 2000 Artikel aufgenommen wurden.
Eine sehr ergiebige Quelle ist auch www.cs.utep.edu/interval-comp/.
Bei den Algorithmen des letzten Kapitels haben wir immer versucht, den durch Rundungen entstehenden
Fehler möglichst genau abzuschätzen. Eigentlich haben wir damit stets mit Zahlenpaaren (x, ε) an Stelle
eigenlich gemeinter einzelner Zahlen y gerechnet, wobei ε so gewählt war, dass |x − y| ≤ ε, also x − ε ≤
y ≤ x + ε galt. Bei jeder arithmetischen Operation f auf einem (gegebenen) x und einem (gedachten) ε
wurde darauf geachtet, dass für das (explizit berechnete) Resultat x0 und den (nur im jeweiligen Beweis
nachvollzogene) ε0 galt y ∈ [x − ε, x + ε] ⇒ f (y) ∈ [x0 − ε0 , x0 + ε0 ].
Besonders lästig war dabei, dass diese Eigenschaft von Programmierer für jede einzelne Operation gesondert sichergestellt werden musste. Eine Alternative ist es, diese Abbildung (x, ε) 7→ (x0 , ε0 ) von Computer
durchführen zu lassen. Dies bedeutet zwar einerseits, dass statt x nun auch die Fehler-Information ε zu
speichern ist, ermöglicht aber andererseits automatisierte verläßliche Berechnungen (reliable computing).
Die Basis bildet hier also Intervall-Arithmetik. Im Folgenden betrachten wir die grundlegenden Begriffe,
wie sie beispielsweise in [Ke96] definiert werden: Wir werden hier nur den Fall reeller Intervalle betrachten, oft werden jedoch auch Intervalle komplexer Zahlen betrachtet.
5.1 Definition. IR := { [a, b] | a, b ∈ R, a ≤ b} sei die Menge aller (abgeschlossenen) reellen Intervalle.
Intervalle der Form [a, b] mit a < b nennt man echte Intervalle, im Falle a = b spricht man von PunktIntervallen.
Ein Intervall-Vektor ist ein Tupel I = (I1 , . . . , In ) mit Ii ∈ IR. Er bezeichnet das Kreuzprodukt I1 × . . . ×
In ⊆ Rn der Einzel-Intervalle.
2
Zur Implementierung von Intervallen gibt es im Wesentlichen zwei Methoden: Es werden wie in der obigen Definition linke Grenze a und rechte Grenze b gespeichert oder aber Mittelpunkt x und Radius ε der
Intervalle. Prinzipiell sind beide Zugangsweisen äquivalent, allerdings legen die gerichteten Rundungsmodi der Fließkommaarithmetik die Implementierung über [a, b] nahe, so daß wir in diesem Kapitel auch
diese Form der Intervalle verwenden werden. Im darauf folgenden Kapitel werden wir jedoch auch noch
die Form x ± ε genau untersuchen.
Zunächst werden wir exakte Arithmetik auf den reellen Zahlen voraussetzen und auch beliebige reelle
Grenzen ai , bi erlauben.
Eine wichtige Grundlage der Intervallarithmetik bildet das folgende einfache Lemma:
68
5 INTERVALL-ARITHMETIK
5.2 Lemma. Es sei f eine Funktion, die auf einem Intervall [a, b] stetig ist. Dann ist f [a, b] := {f (x) | x ∈
[a, b]} ebenfalls ein Intervall, d.h. es gibt a0 , b0 mit [a0 , b0 ] = f [a, b]. Dabei ist a0 = min{f (x) | x ∈ [a, b]}
und b0 = max{f (x) | x ∈ [a, b]}
2
Beweis: Die Behauptung gilt offensichtlich, da jede stetige Funktion auf einer kompakten Menge sowohl
Maximum als auch Minimum annimmt. Auch bei mehrstelligen Funktionen ist das Ergebnis wieder ein
Intervall.
5.3 Definition. Eine Funktion F : IRn → IR heißt Intervall-Funktion, wenn es eine stetige Funktion
f : Rn → R gibt mit F (I) = {f (x) | x ∈ I}.
2
5.4 Korollar. Jede stetige Funktion f : Rn → R kann durch F (I) := {f (x) | x ∈ I} zu einer IntervallFunktion F : IRn → IR erweitert werden.
2
5.5 Lemma. Es seien I1 = [a1 , b1 ] und I2 = [a2 , b2 ] aus IR gegeben. Für die aus den elementaren arithmetischen Operationen abgeleiteten Intervall-Funktionen gilt dann
I1 + I2 = [a1 + a2 , b1 + b2 ]
I1 − I2 = [a1 − b2 , a2 − b1 ]
I1 · I2 = [min{ai · bi | i, j ∈ {1, 2}}, max{ai · bi | i, j ∈ {1, 2}}]
I1 /I2 = [min{ai /bi | i, j ∈ {1, 2}}, max{ai /bi | i, j ∈ {1, 2}}]
Im Fall I1 /I2 muß dabei allerdings 0 6∈ I2 gelten. Für den Durchschnitt von Intervallen gilt
I1 ∩ I2 = [max{a1 , b1 }, min{a2 , b2 }]
2
Einige wichtige Eigenschaften der elementaren Intervall-Arithmetik sind:
5.6 Lemma. Kommutativgesetz:
I1 + I2 = I2 + I1 , I1 · I2 = I2 · I1
Assoziativgesetz:
(I1 + I2 ) + I3 = I1 + (I2 + I3 ) , (I1 · I2 ) · I3 = I1 · (I2 · I3 )
Neutrale Elemente:
[0, 0] + I = I , [1, 1] · I = I
Subdistributivität:
I1 · (I2 + I3 )
⊆
I1 · I2 + I1 · I3
Inklusionsmonotonie:
I1 ⊆ I3 , I2 ⊆ I4
⇒
I1 ◦ I2 ⊆ I3 ◦ I4
2
69
5 INTERVALL-ARITHMETIK
Anmerkung: Bei echten Intervallen gibt es keine additiven und multiplikativen Inversen, ferner gilt das
‘normale’ Distributivitätsgesetz nicht.
Bei den einfachen arithmetischen Operationen wird der Wertebereich beim Übergang auf Intervalle exakt
eingehalten. Überträgt man jedoch Ausdrücke auf Zahlen in direkter Weise in Ausdrücke auf Intervallen,
so enstehen Intervalle, die im Allgemeinen umfangreicher als notwendig sind:
Für die Funktion f (x) = x − x erhalten wir beispielsweise:
f ([0, 1]) = [0, 0],
[0, 1] − [0, 1] = [−1, 1]
Bei g(x) = x · (1 − x) ergibt sich g([0, 1]) = [0, 0.25], aber je nach Art der Auswertung des Ausdrucks
über Intervalle entstehen verschiedene Intervall-Resultate:
g(x) = x · (1 − x) : [0, 1] · ([1, 1] − [0, 1]) = [0, 1] · [0, 1] = [0, 1]
g(x) = x − x · x : [0, 1] − [0, 1] · [0, 1] = [0, 1] − [0, 1] = [−1, 1]
Bei Intervallen, die 0 enthalten, ist es auch sinnvoll, Potenzen der Form xn als Elementar-Intervall-Operation
zu verwenden und sie nicht auf iterierte Intervall-Multiplikationen zurückzuführen: So ergibt sich für x2
bei a < 0 < b das ‘quadrierte’ Intervall [a, b]2 = [0, max(a2 , b2 )], also etwa [−1, 1]2 = [0, 1] im Vergleich
zu [−1, 1] · [−1, 1] = [−1, 1].
Der Grund für dieses ‘Aufblähen’ der Intervalle liegt darin, dass bei der Auswertung über die Ausdrücke
nicht berücksichtigt werden kann, dass die Parameter voneinander abhängig sind.
Vorteile bringt oft die Kombination von Intervall-Arithmetik zusammen mit dem Mittelwertsatz der Analysis: Betrachten wir wieder die Funktion g(x) = x − x2 , so ergibt sich hier g(x) = g(0.5) + g 0 (ξ) · (x − 0.5),
beim Intervall [0, 1] also mit ξ ∈ [0, 1]:
g([0, 1]) = g(0.5) + (1 − 2 · [0, 1]) · [−0.5, 0.5] = [−0.25, 0.75]
Da für g([0, 1]) alle drei angegebenen Intervalle [−1, 1], [0, 1] und [−0.25, 0.75] gültig sein müssen, dürften
wir sogar jetzt den Durchschnitt [0, 0.75] der Intervalle verwenden.
Bei praktischen Anwendungen werden meist Fließkommazahlen statt exakter reeller Arithmetik benutzt.
Achtet man dabei darauf, immer die entsprechende gerichtete Rundungen nach +∞ oder −∞ zu verwenden, so entstehen auch dabei Intervalle, die das gesuchte Ergebnis korrekt einschließen. Problematisch
ist dabei, dass Hochsprachen oft nicht zulassen, den Rundungsmodus der Hardware-Arithmetik zu beeinflussen. Hardware-orientierte Intervall-Arithmetik-Pakete müssen daher i.A. an kritischen Punkten auf
Assembler-Sprachen zurückgreifen.
5.7 Definition. Der Betrag eines Intervalles I ∈ IR ist |I| := max{|x| | x ∈ I}.
Der Abstand zweier Intervalle I1 = [a1 , b1 ] und I2 = [a2 , b2 ] ist q(I1 , I2 ) := max(|a1 − a2 |, |b1 − b2 |). Für
Vektoren I = (I1 , . . . , In ) und J = (J1 , . . . , Jn ) definieren wir q(I, J) := max{q(Ii , Ji ) | 1 ≤ i ≤ n}.
Der Durchmesser eines Intervalles I = [a, b] ∈ IR ist d(I) := b − a.
2
5.8 Lemma. Der Abstand q : Int(R)n × IRn → R ist eine Metrik, d.h. es gelten Positivität, Symmetrie und
Dreiecksungleichung:
Positivität:
q(I, J) ≥ 0 , q(I, J) = 0 ↔ I = J
70
5 INTERVALL-ARITHMETIK
Symmetrie:
q(I, J) = q(J, I)
Dreiecksungleichung
q(I, J) ≤ q(I, K) + q(K, J)
2
Unter Verwendung dieser Metrik kann man auf IR Begriffe wie ‘offene Mengen’, ‘Konvergenz’ und ‘Stetigkeit’ definieren.
Mit Hilfe der Intervall-Arithmetik kann unter Umständen die Existenz von Lösungen von Gleichungen
nachgewiesen werden. Basis dafür ist oft der Brouwer’sche Fixpunkt-Satz [Bro12]:
5.9 Satz. Ist D homeomorph zur abgeschlossenen Einheitskugel in Rn und ist P eine stetige Abbildung
mit P (D) ⊆ D, so hat P einen Fixpunkt x in D, d.h. P (x) = x.
2
Transformieren wir z.B. eine stetige Funktion φ : Rn → Rn in eine Intervall-Fassung Φ : IRn → IRn
und erhalten Φ(I) ⊆ I, so muß es in I einen Fixpunkt von φ geben. Als Beispiel betrachten wir eine
Intervall-Newton-Methode zu Bestimmung von Nullstellen:
5.10 Beispiel.Hat eine Funktion f : [a, b] → R eine stetige erste Ableitung f 0 auf [a, b] und ist F eine
Intervall-Funktion, die f 0 auswertet (nicht notwendigerweise mit minimaler Intervall-Größe), so nennt
man
N (f ; [a, b], x) := x − f (x)/F ([a, b])
eine univariate Intervall-Newton-Methode.
Findet man Werte [a, b] und x ∈ [a, b] mit N (f ; [a, b], x) ⊆ [a, b], so gibt es ein eindeutig bestimmtes
y ∈ [a, b] mit f (y) = 0. Über die quadratische Konvergenz ergibt sich, dass bei ausreichend kleinem Startintervall [a, b] keine Aufblähung der Intervalle stattfindet, sondern sie sogar kleiner werden können. Dann
kann man auch evtl. auf die Anwendung von Software-Fließkomma-Arithmetik wie etwa MPFR verzichten.
2
Eine automatische Umsetzung normaler arithmetischer Algorithmen auf Intervall-Form ist leider nicht
einfach, Hauptproblem bilden dabei die Vergleichsoperatoren: Ein Größen-Vergleich zweier Intervalle
I = [a1 , b1 ] und J = [a2 , b2 ] ist nur dann möglich, wenn sich die Intervalle nicht überlappen. Sollten
die Intervallen jedoch einen nicht-leeren Durchschnitt haben, so müßte man bei einem Programmstück der
Form if I < J then A else B sowohl A als auch B auswerten und die Vereinigung der entstehenden Intervalle bilden. Dies ist jedoch nicht immer erfolgreich möglich, da z.B. bei A die Bedingung I < J
nicht gelten muß.
Zum Abschluß dieses Abschnittes sei noch auf einige Erweiterungen der Intervall-Arithmetik hingewiesen,
bei denen z.B. sinnvoll unendlich große Intervalle, entstanden durch Division durch 0, verwendet werden
können. Bei der Kahan-Novoa-Ratz-Arithmetik, vgl. [Ke96], modifiziert man z.B. die Intervall-Division
und setzt hier z.B. [1, 2]/[−1, 1] := [−∞, −1] ∪ [+1, ∞]
71
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
6 Darstellungen und Orakel-Turingmaschinen
Stichworte: Darstellungen, berechenbare Zahlen, Typ-2-Berechenbarkeit, Reduzierbarkeit und Äquivalenz von Darstellungen
Empfehlenswerte Literatur zu diesem und den folgenden Kapiteln sind das Buch von Ko [Ko91], aus dem
i.W. das Berechenbarkeitsmodell stammt, und die Arbeiten von Weihrauch [We95, We97, We00], in denen
die grundlegenden Begriffe zu Darstellungen zu finden sind.
Da R überabzählbar ist, gibt es keine surjektive Funktion von B∗ auf R und damit keine Notation der reellen
Zahlen. Als Menge der Namen ist B∗ also nicht ausreichend. Wir wollen das Konzept der Notationen
jedoch soweit als möglich beibehalten, müssen jedoch auf eine überabzählbare Namensmenge ausweichen,
was wiederum Konsequenzen für das verwendete Berechnungsmodell haben muß, da dieses auch an der
abzählbaren Menge B∗ orientiert ist. Statt B∗ verwenden wir F := {Φ : B∗ ÂB∗ } als Namensmenge,
was den Vorteil hat, daß wir große Teile unseres Berechnungsmodells weiterhin verwenden können. Als
Erweiterung des Begriffs ‘Notation’ werden wir den Begriff ‘Darstellung’ benutzen:
6.1 Definition. Eine Darstellung einer Menge X ist eine surjektive Funktion δ : F ÂX. Ist δ(Φ) = x , so
wird Φ auch als Name von x bezeichnet (bzgl. δ).
2
Die Namen bei einer Darstellung sind also, im Gegensatz zu den Namen bei Notationen, keine endlichen Objekte; wir können einen Namen also normalerweise nicht in einer endlichen Form hinschreiben.
Wir werden noch zeigen müssen, daß wir dennoch ‘konstruktiv’ mit diesen unendlichen Namen umgehen
können!
Bei unseren ersten Beispielen für Darstellungen werden wir als Menge X die Menge der reellen Zahlen
verwenden, an der wir ja auch primär interessiert sind. Das Konzept der Darstellungen läßt sich aber auch
für andere Mengen mit der Mächtigkeit der reellen Zahlen benutzen, etwa für komplexe Zahlen, Folgen
reeller Zahlen, stetige Funktionen auf einem Kompaktum und insbesondere für viele metrische Räume.
Die Menge aller (totalen) Funktionen von R in R allerdings hat zu viele Elemente und ist daher nicht
darstellbar!
6.2 Beispiel. Darstellungen für die reellen Zahlen R lassen sich leicht aus verschiedenen Definitionen von
R herleiten: (Achtung: 0n und 1n sind hier die Worte 0| .{z
. . 0} und 1| .{z
. . 1} !)
n
n
a) Cauchy-Darstellung δC : F ÂR:
Wir definieren δC (Φ) := x, wenn für alle n ∈ N der Wert qn := (Φ(1n ))Q definiert ist und die Folge
(qn )n∈N eine Cauchy-Folge mit lim qn = x ist. Ansonsten sei δC (Φ) undefiniert.
n→∞
Φ legt also eine Folge rationaler Zahlen fest, deren Grenzwert δC (Φ) ist.
b) Intervall-Darstellung δI : F ÂR:
Wir definieren δI (Φ) := x, wenn für alle n ∈ N, n > 0, die Werte `n := (Φ(0n ))Q und rn := (Φ(1n ))Q
definiert sind , wobei stets `n < `n+1 < rn+1 < rn und zudem lim `n = lim rn = x gilt. Ansonsten sei
n→∞
δI (Φ) undefiniert.
n→∞
Φ legt also hier zwei streng monotone Folgen rationaler Zahlen fest, die eine Intervallschachtelung bilden,
deren Grenzwert δI (Φ) ist.
c) Dezimal-Darstellung δDez : F ÂR:
72
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
Wir definieren δDez (Φ) := x, wenn für alle n ∈ N die Werte zn := (Φ(1n ))N existieren, für genau ein
m > 0 der Wert zm = 10 (interpretiert als Dezimalpunkt) ist, ansonsten stets zn ∈ {0, . . . , 9} gilt und
schließlich die folgende Gleichung gilt
Ãm−1
!
∞
X
X
x = (−1)z0
zi 10m−1−i +
zi 10m−i
i=1
i=m+1
Wiederum sei ansonsten δDez (Φ) undefiniert.
Φ legt also hier eine Folge von Dezimalziffern mit einem Dezimalpunkt fest, die δDez (Φ) in üblicher Form
beschreiben.
d) Normierte Cauchy-Darstellung δN C : F ÂR:
Wir definieren δN C (Φ) := x, wenn für alle w ∈ B∗ der Wert dw := (Φ(w))D definiert ist und |dw − x| ≤
2(w)Z gilt. Auch hier sei ansonsten δN C (Φ) undefiniert.
Ähnlich wie bei der normalen Cauchy-Darstellung legt Φ hier eine unendliche Menge (nun allerdings
dyadischer) Zahlen fest, deren Grenzwert für (w)Z → −∞ die Zahl x ist. Die Konvergenz der CauchyFolge (dw ) ist jedoch ‘normiert’ durch 2(w)Z .
2
Diese vier hier definierten Darstellungen δC , δI , δDez und δN C der reellen Zahlen werden wir im folgenden
noch häufig verwenden.
Unsere Basismenge F besteht aus den Funktionen über B∗ , für die wir ja bereits die Bedeutung des Begriff
‘berechenbar’ kennen. Damit können wir insbesondere reelle Zahlen auszeichnen, die einen ‘Namen’ besitzen, der berechenbar ist. (Da es nur abzählbar viele berechenbare Funktionen gibt, können nur wenige
Zahlen einen solchen berechenbaren Namen haben. Bei Notationen existiert ein entsprechender Begriff
nicht.)
6.3 Definition. Sei δ : F ÂX eine Darstellung. x ∈ X heißt δ-berechenbar, wenn eine berechenbare
Funktion Φ mit δ(Φ) = x existiert, d.h. wenn (mindestens) ein Name von x (unter δ) existiert, der berechenbar ist.
2
Im folgenden geben wir ein paar Beispiele für darstellungsberechenbare reelle Zahlen an, jeweils passend
zu den eingeführten Darstellungen:
6.4 Beispiel. a) Für die Euler’sche Zahl e = 2, 71 . . . gilt e =
das folgende „Programm“:
FUNCTION E (W:BINARY):RATIONAL;
VAR
N, I, FAK: NATURAL;
SUMME: RATIONAL;
BEGIN
FAK :=1;
SUMME := 1;
N:= LENGTH (W);
FOR I := 1 TO N DO
73
1
0!
+
1
1!
+
1
2!
+ ... =
∞
P
i=0
1
.
i!
Betrachte daher
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
FAK := FAK * I;
SUMME := SUMME + 1 / FAK
END;
RETURN SUMME
END;
Der Datentyp BINARY wird dabei für Variablen über B∗ , d.h. für beliebige Bit-Folgen verwendet. Da
zudem die Darstellung δC als Werte auf rationale Zahlen festgelegt ist, können wir hier eine Funktion
verwenden, bei der der Ergebnistyp RATIONAL$ ist.
Sicherlich ist dieses „Programm“ als Turingmaschine Me realisierbar. Dann gilt aber für alle w:
lg(w)
(fMe (w))Q =
X 1
i!
i=1
Also ist δC (fMe ) = e = 2, 71 . . ., d.h. e ist δC -berechenbar.
b) Die Kreiszahl π = 3.1415 . . . ist δI -berechenbar: Nach Leibniz ist
µ
¶ X
∞
1 1 1
4
π = 4 · 1 − + − ... =
(−1)i i+1
3 5 7
2
i=0
Da dies eine alternierende Reihe ist, ist δI (Φπ ) = π für die (berechenbare!) Funktion Φπ mit
 2lg(w)+1
P

4

(−1)i 2i+1
, w beginnt mit 0


 i=0
2lg(w)+2
(Φπ (w))Q =
P
i 4


 i=0 (−1) 2i+1 , w beginnt mit 1


beliebig
, w=λ
c) Jede rationale Zahl q ist δDez -berechenbar:
Jede Zahl q = qq12 , q1 ∈ Z, q2 ∈ N, q2 6= 0 läßt sich als periodischen Dezimalbruch schreiben:
q = ±d1 . . . dm−1 • dm+1 . . . dn p1 . . . pk
mit geeigneten m, n, k ∈ N und di , pi ∈ {0, . . . , 9}.
Damit gilt δDez (Φq ) = q für die folgende berechenbare Funktion Φq mit

−1

 (0)N−1 , lg(w) = 0, q ≥ 0


 (1)N , lg(w) = 0, q < 0
(10)−1
Φq (w) =
N , lg(w) = m

−1

(d
)
1 ≤ lg(w) ≤ n, lg(w) 6= m mit i = lg(w)

N ,

 i −1
(pi )N , lg(w) > n mit i = (lg(w) − n) mod k
√
d) Für jede dyadische Zahl a > 0 ist a δN C -berechenbar:
Im vorletzten √
Kapitel haben wir gezeigt, dass es eine berechenbare Funktion sqrt : D × Z ÂD gibt mit
|sqrt(a, p) − a| ≤ 2p für alle x ∈ D, x ≥ 0 und alle p ∈ Z.
Bei festgewähltem a gibt es dann sicher auch eine berechenbare Funktion Φ mit (Φ(w))D := sqrt(a, (w)Z ).
2
74
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
Häufig werden wir aus gegebenen Darstellungen und Notationen neue Darstellungen konstruieren, insbesondere wenn wir an mehrstelligen Funktionen interessiert sind:
6.5 Definition.
(a) Sei ν : B∗ ÂM eine Notation. Die Darstellung δν : F ÂM ist definiert durch
δν (Φ) = x :⇔ (∀w ∈ B∗ )ν(Φ(w)) = x
Die Darstellung δν,∞ : F Â{f : N → M } aller Folgen über M sei definiert durch
δν,∞ (Φ) = (xi )i∈N ⇔ (∀w ∈ Σ∗ )ν(Φ(w)) = xlg(w)
(b) Sind δi : F ÂXi (für i ∈ N) Darstellungen, so wird die Darstellung
(δ1 , . . . , δk ) : F ÂX1 × . . . × Xk
definiert durch (δ1 , . . . , δk )(Φ) := (x1 , . . . , xk ) ⇔ δi (Φi ) = xi , wobei Φi (w) := Φ(< 1i , w >) sei.
S
⊗ Xi = {f : N → Xi | f (i) ∈ Xi } = {(xi )i∈N | xi ∈ Xi } sei analog definiert
⊗ δ : F Â i∈N
i∈N i
durch
⊗ δ (Φ) := (xi )(i∈N ⇔ δi (Φi ) = xi ,
i∈N i
wobei wiederum Φi (w) := Φ(< 1i , w >) sei.
(c) Für eine Darstellung δ : F ÂX seien die Darstellungen δ k : F ÂX k und δ ∞ : F Â{f : N → X}
der Tupel bzw. Folgen über X definiert durch
⊗ δ.
δ k := (δ, . . . , δ ) und δ ∞ := i∈N
| {z }
k
2
Als Beispiel können wir ausgehend von der normierten Cauchy-Darstellung δN C mit der daraus abgeleite∞
∞
ten Darstellung δN
C Folgen reeller Zahlen darstellen. Hier ist dann δN C (Φ) = (xi )i∈N genau dann, wenn
für alle i ∈ N und w ∈ B∗ gilt
|xi − (Φ(<1i , w>)D | ≤ 2(w)Z
Um nun mit reellen Zahlen rechnen zu können, brauchen wir eine Möglichkeit, Elemente aus F, d.h.
Funktionen als Eingabe zu verwenden. Dazu erweitern wir das Modell der Turingmaschine geeignet.
6.6 Definition. Eine Orakel-Turingmaschine M besteht aus einer normalen Turingmaschine (Z, ∆, δ, z0 , ze ),
z i:Orakel −→z 0
bei der aber ein zusätzlicher Typ von Befehlen erlaubt ist, die ‘Befragung des Orakels’ −→
(wobei wir annehmen, daß das Arbeitsalphabet ∆ von M mindestens die Zeichen {B, 0, 1} enthält).
Der Ablauf einer Berechnung der Orakel-Turingmaschine M ist jedoch nicht nur abhängig von der Eingabe w ∈ Σ∗ , sondern auch von einer als ‘Orakel’ bezeichneten Funktion Φ : B∗ ÂB∗ .
M arbeitet bei den normalen Befehlen wie eine normale Turingmaschine auf der Eingabe w. Wird jedoch
der neue Befehlstyp ‘Orakelfrage’ ausgeführt, so arbeitet M wie folgt: Sei v das Wort, das aus den links
75
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
vom Kopf des Arbeitsbandes i stehenden Zeichen (vor Ausführung des Befehles) bis zum ersten Zeichen
aus ∆ \ B besteht (d.h. v ∈ B∗ ). v wird als ‘Anfrage an das Orakel’ bezeichnet. Dann gibt es zwei
Möglichkeiten:
(a) Ist v ∈ Def(Φ), so steht nach der Ausführung des Befehles ‘plötzlich’ das Wort Φ(v)B rechts vom Kopf
dieses Arbeitsbandes (wobei entsprechend viele Zeichen auf dem Band überschrieben wurden). Zudem ist
v plötzlich durch Leerzeichen überschrieben worden.
(b) Ist v 6∈ Def(Φ), so endet die Berechnung von M mit einem Fehler.
Φ
Φ
Die von M mit Orakel Φ berechnete Funktion fM
: B∗ ÂB∗ ist dann definiert als: fM
(w) = v genau
dann, wenn M bei Eingabe w und mit Orakel Φ ohne Fehler einen Endzustand mit v als Ausgabe erreicht.
Φ
Φ
TM
(w) ist die Anzahl der Rechenschritte, die M bei der Bestimmung von fM
benötigt. AΦ
M (w) sei die
Menge aller Anfragen v an das Orakel Φ, die M bei der Eingabe w an das Orakel stellt.
2
Anmerkung: (1) Die Auswertung des Orakels kostet nur einen Schritt! In diesem einen Schritt wird auf
Band i aus der Bandinschrift ‘?v↑??? . . .’ die neue Inschrift ‘? B
. . B} ↑Φ(v)B? . . .’, wobei ↑ die (un| .{z
lg(v)
veränderte) Position des Kopfes auf dem Band angibt und die ‘?’ beliebige, nicht spezifizierte Zeichen
darstellen.
Obwohl diese Orakel-Anfrage in einem Schritt beantwortet wird, muß die Orakel-Turingmaschine in gewohnter Weise das Argument v der Orakel-Anfrage schreiben und das Ergebnis Φ(v) lesen.
Φ
(2) Bei der gleicher Eingabe w, aber verschiedenen Orakeln Φ und Ψ können verschiedene Werte fM
(w) 6=
Ψ
Φ
Ψ
Φ
fM (w) und tM (w) 6= tM (w) entstehen. Selbst für die Anfragemengen kann gelten AM (w) 6= AΨ
M (w).
Φ
Sicherlich ist jedoch für jedes w die Anfragemenge AM (w) endlich, es gilt sogar
X
lg(v) ≤ tΦ
M (w)
v∈AΦ
M (w)
(3) Das Orakel kann zum Beispiel als eine Art ‘Unterprogramm’ der Turingmaschine angesehen werden,
bei dem unbekannt ist, wie es intern aussieht (black box). Eine weitere Interpretationsmöglichkeit ist, das
Orakel als Rückfrage an den ‘Anwender’ der Turingmaschine zu betrachten, d.h. als Mittel für interaktive
Programmausführung.
(4) Eine Orakel-Turingmaschine hat quasi zwei Eingaben: w ∈ Σ∗ als ‘normales’ Argument und das Orakel, das man zum Beispiel auch als ‘Prozedurparameter’ betrachten kann (wie sie auch in realen Programmiersprachen existieren). In unserer Pseudo-Programmiersprache werden wir daher einen Prozedurkopf
folgender Art verwenden:
TYP ORAKEL = FUNCTION (BINARY):BINARY;
...
FUNCTION ... (..., PHI:ORAKEL ): ...
Für eine Anfrage an das Orakel können wir dann die Notation U := PHI (V) verwenden. Als kleines
Beispiel betrachten wir folgendes Programm:
FUNCTION TEST (W:BINARY, PHI:ORAKEL): BINARY;
VAR
U, V: BINARY;
BEGIN
76
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
V:=W:
U:= PHI (V);
RETURN U;
END.
Φ
Hier ist für jede Eingabe w und jedes Orakel Φ sicherlich fM
(w) = Φ(w), d.h. M berechnet mit Orakel Φ
genau die Funktion Φ selbst.
(5) Ist das Orakel nicht eine beliebige Funktion, sondern soll als Name entsprechend einer gegebenen
Darstellung (etwa δNC ) benutzt werden, so wäre PHI:DELTA_NC statt PHI:ORAKEL eine naheliegende
Typangabe.
Φ
(w) bei einer Darstellung δ eine eindeutige Interpretation,
Haben der Parameter w oder das Resultat fM
wie etwa bei δNC als ganze Zahl unter der Notation (·)Z bz.w als dyadische Zahl„ so werden wir häufig
auch bei der Angabe von Programmen diesem Typ wählen.
Mit Hilfe der Orakel-Turingmaschinen können wir nun ‘berechenbare’ Abbildungen von F in F definieren:
Φ
Für jedes Orakel Φ : B∗ ÂB∗ ist fM
ebenfalls eine partielle Funktion von B∗ nach B∗ .
6.7 Definition. (1) Sei M eine Orakel-Turingmaschine. Die von M berechnete (totale) Abbildung ΓM :
F → F ist definiert durch
Φ
(∀Φ∈F)(∀w∈B∗ ) ( ΓM (Φ))(w) := fM
(w) )
(2) Eine Abbildung Γ : F → F heißt berechenbar, wenn es eine Orakel-Turingmaschine M mit Γ = ΓM
gibt.
2
Mengen mit der Mächtigkeit von R (des Kontinuums), z.B. F oder die Potenzmenge von N, werden oft
auch als Typ-2-Mengen bezeichnet. Entsprechend heißt die hier definierte ‘Berechenbarkeit’ oft auch
Typ-2-Berechenbarkeit. Sie ist prinzipiell verschieden von der ‘normalen’ Berechenbarkeit, der Typ-1Berechenbarkeit, aus den vorigen Kapiteln!
6.8 Definition. (a) δ1 : F ÂX1 und δ2 : F ÂX2 seien Darstellungen. Eine Funktion f : X1 ÂX2 heißt
(δ1 , δ2 )-berechenbar, wenn eine berechenbare Abbildung Γ : F → F existiert, so daß
(∀Φ ∈ F) (f ◦ δ1 (Φ) definiert ⇒ f ◦ δ1 (Φ) = δ2 ◦ Γ(Φ))
(b) δ1 , δ2 : F ÂX seien Darstellungen der gleichen Menge X. δ1 ist reduzierbar auf δ2 (δ1 ≤ δ2 ), wenn
idX : X → X mit idX (x) = x eine (δ1 , δ2 )-berechenbare Funktion ist. δ1 und δ2 sind äquivalent (δ1 ≡ δ2 ),
wenn δ1 ≤ δ2 und δ2 ≤ δ1 gilt.
2
6.9 Beispiel.
√
a) Als erstes Beispiel zeigen wir, daß
nitionsbereich R+
0 ):
: R ÂR eine (δN C , δN C )-berechenbare Funktion ist (mit Defi-
Im vorletzten Kapitel hatte wir gezeigt,
dass es eine (((·)D , (·)Z ), (·)D )-berechenbare Funktion SQRT :
√
D × Z ÂD mit der Eigenschaft | a − SQRT(a, p)| ≤ 2p für alle a ≥ 0, a ∈ D und p ∈ Z gibt.
Jetzt müssen wir ein x ∈ R ‘einlesen’, d.h. es ist uns als Orakel gegeben. Dabei kennen wir x zu keinem
Zeitpunkt exakt, sondern können nur mit Näherungen an x arbeiten, d.h. zum Rechenfehler bei der Wurzelbestimmung kommt der ‘Eingangsfehler’ durch ungenaue Daten hinzu. Betrachte die folgende Maschine
Φ
M , die zu w ∈ B∗ (interpretiert als p ∈ Z) und einem Orakel Φ ∈ F ein Wort fM
(w) ∈ B∗ bestimmt:
77
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
FUNCTION WURZEL (P:WHOLE,PHI:DELTA_NC):DYADIC:
VAR
A,Y: DYADIC;
BEGIN
A:= PHI (2·P-2);
IF A < 22P −1 THEN
Y:=0
ELSE
Y:=SQRT(A,P-1)
END;
RETURN Y;
END.
Im folgenden zeigen wir, daß von diesem Programm die Wurzelfunktion berechnet wird, und zwar bei
der Darstellung δN C : Zum Beweis seien w ∈ B∗ und ein Orakel Φ ∈ Def(δN C ) gegeben. Wir setzen
x := δN C (Φ). Zu zeigen ist
p
¡ Φ¢
√
δN C fM
= δN C (ΓM (Φ)) = δN C (Φ) = x
Φ
Sicherlich ist nach Konstruktion des Programmes √
für jedes w ∈ B∗ das Ergebnis fM
(w) in Def(νD ).
(w)Z
∗
Φ
für beliebiges w ∈ B beweisen. Seien
Daher ist es ausreichend, wenn wir |νD fM (w) − x| ≤ 2
p ∈ Z und a, y ∈ D die Werte, die den Variablen P, A und Y bei Eingabe von w und bei dem Orakel Φ
Φ
zugewiesen werden; dabei ist insbesondere p = (w)Z und y = νD fM
(w). Aus δN C (Φ) = x erhalten wir
2·p−2
zudem | a − x |≤ 2
.
√
√
√
Falls a < 22p−1 , so ergibt sich y = 0 und x < a+|a−x| < 22p . Daraus folgt | x−y| = x < 22p = 2p .
√
Falls a ≥ 22p−1 gilt, so ergibt sich |y − a| ≤ 2p−1 und x > a − |a − x| > 22p−2 . Hieraus folgt für ein ξ
zwischen a und x:
√
√
√
√
|y − x| ≤ |y − a| + | a − x|
1
≤ 2p−1 + √ |a − x|
2 ξ
1
√
≤ 2p−1 +
· 22p−2
2p−2
2· 2
p−1
= 2
+ 2p−2 < 2p
√
Damit ist, wie verlangt, stets |y − x| ≤ 2p .
b) Die Addition add : R2 → R mit add(x, y) := x + y ist (δC2 , δC )-berechenbar:
Betrachte das folgende Programm:
FUNCTION ADDITION (W:BINARY,PHI:ORAKEL):RATIONAL:
VAR
X,Y,Z : RATIONALE_ZAHL;
BEGIN
X:= PHI (< 1, W >);
Y:= PHI (< 11, W >);
Z:=X+Y
RETURN Z;
END.
78
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
Sei Φ mit δC2 (Φ) = (x, y) gegeben. Dann bilden bei diesem Programm die Werte xi und yi , die bei Eingabe
von w = 1i in X und Y entstehen, Cauchy-Folgen, die gegen x bzw. y konvergieren. Damit ist jedoch auch
(zi ) mit zi := xi + yi eine Cauchyfolge mit lim zi = x + y.
c) Die Addition add : R2 → R ist auch (δI2 , δI )-berechenbar: Bei zwei Intervallschachtelungen (`n , rn ), (`0n , rn0 )
bildet (`n + `0n , rn + rn0 ) eine Intervallschachtelung für die Summe der Werte. Damit ist die Addition offensichtlich auch (δI2 , δI )-berechenbar.
d) Die Abbildung GE : R2 → N mit
½
GE(x, y) =
1, x ≥ y
0, x < y
ist nicht (δI2 , δN )-berechenbar (wobei δN := δ(·)N die aus (·)N abgeleitete Darstellung von N sei).
Betrachte z.B. ein Φ ∈ F mit νQ Φ(< 1, 0i >) = νQ Φ(< 11, 0i >) = −1/i und νQ Φ(< 1, 1i >) = νQ Φ(<
11, 1i >) = 1/i. Dann gilt δI2 (Φ) = (0, 0). Wir nehmen an, GE sei (δI2 , δN )-berechenbar, M sei eine
Φ
entsprechende Orakel-Turingmaschine. Insbesondere muß dann (fM
(λ))N = 1 für das hier festgelegte Φ
Φ
gelten. Sei n > 0 eine beliebige Zahl derart, daß M bei der Berechnung von fM
(λ) keine Orakel-Anfrage
i
i
der Form < 11, 0 > oder < 11, 1 > mit i > n macht. Da M nur endlich viele Anfragen ausführen kann,
existiert ein solches n.
Wähle nun Ψ ∈ F mit
(
νQ Ψ(w) =
1
2n
1
2n
−
+
1
,
2i
1
,
2i
falls w =< 11, 0i > für ein i > n
falls w =< 11, 1i > für ein i > n
und Ψ(w) = Φ(w) für alle anderen w.
1
1
Sicher gilt dann δI2 (ψ) = (0, 2n
), d.h. δN (ΓM (Ψ)) = GE(δC2 (ψ)) = GE(0, 2n
) = 0.
Ψ
Bei der Berechnung von fM
(λ) ergibt sich jedoch, daß M genau die gleichen Konfigurationen durchläuft
Φ
wie bei der Berechnung von fM
(λ): Bis zur ersten Orakelanfrage stimmen die Konfigurationen überein, da
die gleiche Eingabe vorliegt. Damit ist auch die erste Anfrage v an die Orakel gleich. Nach Wahl von n gilt
jedoch Ψ(v) = Φ(v), d.h. die Antworten der Orakel sind gleich. Damit stimmen alle Konfigurationen bis
Ψ
Φ
zur zweiten Anfrage und damit auch die Anfragen selbst überein. Induktiv ergibt sich also fM
(λ) = fM
(λ),
Ψ
d.h. (fM (λ))N = 0, was nach Annahme nicht sein dürfte.
2
, δDez )-berechenbar:
e) Die Addition add : R2 → R ist nicht (δDez
Wir gehen indirekt vor und nehmen an, M sei eine Orakel-Turingmaschine, die die Addition berechnet.
Insbesondere beim Orakel Φ mit
2
δDez
(Φ) = (0.333 . . . , 0.666 . . .)
muß dann auch als Ergebnis die Zahl 1, also dezimal 1.000 . . . oder 0.999 . . . entstehen (o.B.d.A. liefere M
Φ
keine weiteren führenden Nullen). Nach Definition der Dezimaldarstellung bedeutet dies, daß fM
(1) die
Zahl 1 oder die Zahl 0 sein muß.
Φ
Φ
Annahme: (fM
(1))N = 1: Bei der Berechnung von fM
(1) kann M nur endlich viele Anfragen an Φ stellen,
d.h. es gibt ein n ∈ N so, daß M keine Anfrage mit einer Länge ≥ n stellen kann. Damit ‘kennt’ M
2
höchstens je n Dezimalen von 0.333 . . . und 0.666 . . .. (Wenn man genau die Definition von δDez
bis zur
Definition von <w1 , w2 > zurückverfolgt, sieht man, daß M sogar nur n/4-viele Dezimalen kennen kann)
79
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
Betrachten wir das Orakel Ψ mit
2
δDez
(Ψ) = (0. 33
. . . 3} 000 . . . , 0.666 . . .)
| {z
n
Ψ
so kann M durch Anfragen der Länge < n die Orakel Φ und Ψ nicht unterscheiden. Also (fM
(1))N =
Φ
(fM (1))N = 1, obwohl die Summe der von Ψ dargestellten Zahlen echt kleiner als 1 ist!!
Φ
Annahme: (fM
(1))N = 0: Analog zu oben können wir eine Zahl n finden, so daß M Φ und Ψ mit
2
(Ψ) = (0. 33
. . . 3} 999 . . . , 0.666 . . .)
δDez
| {z
n
Φ
Ψ
(1) bzw. fM
(1) nicht unterscheiden kann. Also ergibt sich hier als Widerspruch
bei der Bestimmung von fM
Ψ
(fM (1))N = 0, obwohl die Summe der Zahlen größer als 1 ist!
2
6.10 Lemma. Sind Φ : B∗ ÂB∗ und Γ, Ψ : F → F berechenbar, so sind auch Γ(Φ) : B∗ ÂB∗ und
Ψ ◦ Γ : F → F berechenbar.
2
Beweis: (a) Φ : B∗ ÂB∗ und Γ : F → F seien berechenbar, d.h. es gebe eine Turingmaschine M1 mit
fM1 = Φ und eine Orakel-Turingmaschine M2 mit ΓM2 = Γ. Wir müssen zeigen, daß Γ(Φ) (∈ F) beref
Φ
chenbar ist, d.h. daß es eine (normale) Turingmaschine M mit fM = Γ(Φ) = fM
= fMM2 1 gibt.
2
Definiere daher M wie folgt: M entstehe aus M2 dadurch, daß jeder Befehl −→ i:Orakel durch eine
entsprechende Simulation der Turingmaschine M1 auf der jeweiligen Orakelanfrage ersetzt wird. Damit
f
ist M eine normale Turingmaschine (ohne Orakel), bei der aber sicher fM = fMM2 1 gilt.
f
Anmerkungen: (1) Für w ∈ Def(fM ) gilt die Gleichheit fM (w) = fMM2 1 (w) offensichtlich. Ist w 6∈
Def(fM ), so kann dies daran liegen, daß die Simulation von M2 kein Ende findet (so daß auch M2 mit
Orakel Φ endlos rechnet) oder aber daran, daß bei einer der entstehenden Orakelanfragen v die Simulation
von M1 auf v nicht endet. Dann ist jedoch auch Φ(v) undefiniert und M2 endet bei der Orakelanfrage v
mit einem Fehler.
(2) In unserer Pseudosprache kann man die entstehende Maschine M wie folgt definieren:
TYPE ORAKEL= FUNCTION(BINARY):BINARY;
FUNCTION PHI(W:BINARY):BINARY;
...
END;
FUNCTION GAMMA(W:BINARY;THETA:ORAKEL):BINARY;
... (* Anfragen an das Orakel in der Form THETA(V) *)
END;
FUNCTION GAMMA_PHI(W:BINARY):BINARY;
BEGIN
RETURN GAMMA(W,PHI);
END;
80
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
(b) Die Abbildungen Ψ, Γ : F → F seien berechenbar, d.h. es gebe Orakel-Turingmaschinen M1 , M2 mit
ΓM1 = Ψ und ΓM2 = Γ. Dann gilt für alle Φ ∈ F:
fΦ
Φ
ΨΓ(Φ) = ΓM1 ΓM2 (Φ) = ΓM1 (fM
) = fMM1 2
2
Entsprechend sei M die Orakel-Turingmaschine, die entsteht, wenn in M1 alle Orakelaufrufe durch SimufΦ
Φ
lationen der Maschine M2 ersetzt werden. Dann ergibt sich sofort fM
= fMM1 2 .
In unserer Pseudosprache könnte man M wie folgt definieren:
VAR PHIVAR:ORAKEL;
...
FUNCTION GAMMA_PHIVAR(W:BINARY):BINARY;
RETURN GAMMA(W,PHIVAR);
END;
FUNCTION PSI_GAMMA(W:BINARY;PHI:ORAKEL):BINARY;
BEGIN
PHIVAR:=PHI;
RETURN PSI(W,GAMMA_PHIVAR);
END;
2
Wie bei den Notationen folgt aus dem obigen Lemma, daß die Darstellungsberechenbarkeit transitiv ist
und daß äquivalente Darstellungen bzgl. Berechenbarkeit gleichwertig sind.
6.11 Satz. (a) Seien δi Darstellungen der Mengen Xi für i = 1, 2. Ist g : X1 ÂX2 (δ1 , δ2 )-berechenbar
und ist x ∈ X1 ein δ1 -berechenbares Element von X1 , so ist g(x) ∈ X2 δ2 -berechenbar.
(b) Seien δi Darstellungen der Mengen Xi für i = 1, 2, 3. Sind g : X1 ÂX2 (δ1 , δ2 )-berechenbar und
h : X2 ÂX3 (δ2 , δ3 )-berechenbar, so ist auch h ◦ g : X1 ÂX3 (δ1 , δ3 )-berechenbar.
(c) Seien δi Darstellungen der Mengen Xi für i = 1, 2. Eine Funktion f : X1 ÂX2 ist (δ1 , δ2 )-berechenbar
genau dann, wenn f (δ10 , δ20 )-berechenbar ist für zwei beliebige Darstellungen δ10 , δ20 mit δ10 ≡ δ1 und
δ20 ≡ δ2 .
(d) Seien δi (i ∈ {1, 2, 3}) Darstellungen von X. Gilt δ1 ≤ δ2 und δ2 ≤ δ3 , so gilt auch δ1 ≤ δ3 .
2
6.12 Lemma. Es gilt δDez ≤ δI ≡ δNC ≤ δC und δC 6≤ δI 6≤ δDez .
2
Beweis: (Grundideen)
Zu δI ≤ δC : Die Beziehung δI ≤ δC folgt sofort aus der Definition der Darstellungen, da für alle Φ ∈ Def
gilt: δI (Φ) = δC (φ); als berechenbare Abbildung Γ können wir also die Identität auf F verwenden, die
berechenbar ist, wie wir als erstes Beispiel zu Orakel-Turingmaschinen gezeigt hatten.
Zu δI ≤ δNC : Betrachte das folgende Programm:
FUNCTION REDUKTION (P:WHOLE,PHI:DELTA_I):DYADIC:
VAR
81
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
L,R:RATIONAL;
D:DYADIC;
I:NATURAL;
BEGIN
I:=1
REPEAT
L:=PHI (0I );
R:=PHI (1I );
I:=I+1;
UNTIL R-L ≤ 2P−1 ;
D:=APPROX(L,P-1);
RETURN D;
END
APPROX(L,P) bestimme dabei zu einer rationalen Zahl L eine dyadische Zahl als Näherung mit einem
Fehler von höchstens 2P .
Bei einem Orakel Φ ∈ Def(δI ) und w ∈ B∗ als Eingabe erhalten wir als Ausgabe eine dyadische Zahl d
mit
| d − δI (Φ) | ≤ | d − ` | + | ` − δI (Φ) |
≤ |d−`|+|`−r |
≤ 2p−1 + 2p−1 = 2p
(mit `, r Inhalt von L und R am Ende der REPEAT-Schleife). Das Programm berechnet also eine Abbildung
Γ mit δN C Γ(Φ) = δI (Φ).
Zu δDez ≤ δI : Bei der Dezimaldarstellung galt:
Ãm−1
!
∞
X
X
z0
m−1+i
m−i
δDez (Φ) = (−1)
zi · 10
+
zi · 10
i=1
i=m+1
mit zn = (Φ(1n ))N , zm = 10 (entsprechend dem Dezimalpunkt ‘•’). Definieren wir zu k ∈ N einen Wert
xk ∈ Q als die Teilsumme bis i = m + k, d.h.
Ãm−1
!
m+k
X
X
z0
m−1+i
m−i
xk := (−1)
zi · 10
+
zi · 10
i=1
i=m+1
so gilt sicher |xk − xk+1 | = zm+k+1 · 10−k−1 < 10−k , also für `k := xk − 2 · 10−k und rk := xk + 2 · 10−k :
`k < `k+1 < rk+1 < rk
Die Paare (`k , rk ) bilden für k ∈ N damit eine Intervallschachtelung, wie sie bei δI benötigt wird.
−n
Zu δNC ≤ δI : Zu Φ ∈ Def (δNC ) sei x := δNC (Φ) und dn := (Φ((−n)−1
. Es folgt
Z ))D , also | x − dn |≤ 2
|dn − dn+1 | ≤ |dn − x| + |x − dn+1 | ≤ 2−n + 2−n−1 < 21−n
also dn − 22−n < dn+1 − 21−n < dn+1 + 21−n < dn + 22−n . Die Paare (dn − 22−n , dn + 22−n ) (n ∈ N)
bilden also eine für δI passende Intervallschachtelung.
82
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
Zu δC 6≤ δI : Annahme: M sei eine Maschine mit δI (ΓM (Φ)) = δC (Φ) für alle Φ ∈ Def (δC ). Für ein
Φ
Φ
beliebiges, fest gewähltes Φ ∈ Def (δC ) gilt also insbesondere νQ (fM
(0)) ≤ δC (Φ) ≤ νQ (fM
(1)).
Φ
Sei A := AΦ
M (0) ∪ AM (1) die Menge aller Anfragen, die M bei Eingabe von 0 oder 1 an Φ stellt. Dann gilt
Ψ
Φ
Ψ
Φ
fM
(0) = fM
(0) und fM
(1) = fM
(1) für alle Ψ mit Ψ|A = Φ|A . Da A endlich ist, gibt es jedoch für jedes
x ∈ R ein Ψx mit δC (Ψx ) = x und ψx |A = Φ|A , also auch für Zahlen, die nicht im von M festgelegten
Φ
Φ
Intervall (νQ (fM
(0)), νQ (fM
(1))) liegen.
Zu δI 6≤ δDez : Wir haben δDez ≤ δI bereits gezeigt. Aus δI ≤ δDez würde also δDez ≡ δI folgen. Dies kann
2
, δDez )-berechenbar ist.
2
nicht sein, da z.B. die Addition (δI2 , δI )-berechenbar, aber nicht (δDez
Zum Abschluß des Kapitel betrachten wir wieder die dyadischen Zahlen, hier insbesondere natürlich den
Berechenbarkeitsbegriff, der sich aus der Darstellung δN C ergibt.
6.13 Lemma. Die arithmetischen Grundoperationen Addition, Subtraktion, Multiplikation und Division
2
sind (δN
2
C , δN C )-berechenbar.
2
Beweis: Da δI und δN C äquivalent sind, ist die Addition reeller Zahlen sicher auch (δN
C , δN C )-berechenbar.
2
2
Die (δI , δI )-Berechenbarkeit und damit auch die (δN C , δN C )-Berechenbarkeit der Subtraktion zeigt man
analog zur Addition.
Im folgenden betrachten wir zunächst die Bestimmung des Kehrwertes zu x ∈ R:
FUNCTION KEHRWERT (P:WHOLE,PHI:DELTA_NC):DYADIC:
VAR
X0,X1,Z:DYADIC;
I:WHOLE;
BEGIN
I:=-1
REPEAT
I:=2*I;
X0:=PHI (I);
UNTIL |X0| ≥ 2I+1 ;
X1:=PHI(P+3+2I);
Z:=INV(X1,P-1);
RETURN
END
Für jedes Φ ∈ F mit x := δN C (Φ) 6= 0 gibt es ein j ∈ N, so daß |x| > 22−j ist; damit ist dann auch
|νD (Φ(1j ))| ≥ |x| − 2−j ≥ 22−j − 2−j ≥ 21−j . Die REPEAT-Schleife endet also auf jeden Fall. Seien i
und x0 die Werte der Variablen I und X0 bei Ende der Schleife. n, x1 und z seien die Werte der anderen
Variablen nach der jeweils einzigen Zuweisung.
Es gilt dann sicher
|x| ≥ |x0 | − 2−i ≥ 21−i − 2−i = 2−i
sowie
|x1 | ≥ |x| − 2−n−3−2i ≥ 2−i − 2−n−3−2i ≥ 2−i − 2−i−3 > 2−i
83
6 DARSTELLUNGEN UND ORAKEL-TURINGMASCHINEN
Damit erhalten wir
|1/x − z| ≤ |1/x − 1/x1 | + |1/x1 − z|
≤ 1/ξ 2 · |x − x1 | + 2−n−1
(∗)
≤ 22i−2 · 2−n−3−2i + 2−n−1 = 2−n
wobei sich ξ zwischen x und xi aus dem Mittelwertsatz ergibt; inbesondere muß daher |ξ| ≥ 2−i−1 gelten,
was wir für (∗) benötigen.
Zu beachten ist: Ist δN C (Φ) = 0, so ist stets |νD (Φ(1j ))| = |νD (Φ(1j )) − 0| ≤ 2−j , d.h. die REPEATSchleife endet nie! (Im Vergleich dazu: Bei der Notation νD kann man entscheiden, ob ein Name den Wert
0 ergibt oder nicht, so daß dort keine Endlosschleife entsteht!)
Auf den Beweis der Berechenbarkeit der Multiplikation verzichten wir hier, die Berechenbarkeit der Division ergibt sich wieder über Multiplikation des Zählers mit dem Kehrwert des Nenners.
2
84
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
7 Berechenbarkeit und topologische Räume
Bei den Beweisen für die Nichtberechenbarkeit gewisser Funktionen auf den reellen Zahlen wurde im WeΦ
sentlichen ausgenutzt, daß bei einer Orakel-Turingmaschine M zur Berechnung von fM
(w) die Maschine
bei jeder Eingabe w nur endlich viele Anfragen an das Orakel stellen kann. Diese Eigenschaft läßt sich
topologisch deuten. Dazu führen wir zunächst einige Begriffe aus der Topologie ein.
7.1 Definition. Ein topologischer Raum ist definiert als ein Paar (X, τ ), bestehend aus einer Menge X
und einer Menge τ von Teilmengen von X, wobei folgende Eigenschaften vorliegen müssen:
(1) Die leere Menge und X selbst liegen in τ .
(2) Mit O, O0 ∈ τ ist auch O ∩ O0 ∈ τ .
S
(3) Für jede Teilmenge α ⊆ τ ist {O|O ∈ α} ∈ τ .
Dabei wird τ als Topologie bezeichnet, die Elemente von τ heißen offene Mengen. Eine Basis β von τ ist
eine Teilmenge von τ , bei der jedes O ∈ τ Vereinigung von Elementen von β ist, d.h. O = ∪{B|B ∈ β 0 }
für ein geeignetes β 0 ⊆ β. Eine Menge A ⊆ X heißt Umgebung von x ∈ X, wenn ein O ∈ τ mit
x ∈ O ⊆ A existiert.
2
Statt der direkten Angabe einer Topologie τ ist es oft einfacher, eine Basis β anzugeben, durch die τ stets
eindeutig bestimmt ist.
7.2 Lemma.SSei X gegeben. Ein System β von Teilmengen von X ist Basis einer Topologie τ genau dann,
wenn X = {B | B ∈ β} ist und zudem gilt:
[
(∀B1 B2 ∈ β)(∃α ⊆ β) B1 ∩ B2 = {B | B ∈ α}
2
Beweis: Sei zunächst τ eine Topologie mit Basis β. Da X ∈ τ liegt, gilt dann notwendigerweise auch
[
[
(∃β 0 ⊆ β) X = {B | B ∈ β 0 } ⊆ {B | B ∈ β} ⊆ X.
S
Ferner ist zu B1 , B2 ∈ β ⊆ τ auch B1 ∩ B2 ∈ τ , damit B1 ∩ B2 = {B|B ∈ α} für ein geeignetes α ⊆ β.
Andererseits sei nun β mit den o.a. Eigenschaften gegeben. Wir definieren
n[
o
τ :=
{B | B ∈ β 0 } | β 0 ⊆ β .
S
Im folgenden zeigen wir, daßS
τ eine Topologie ist. Mit β 0 = ∅ erhalten wir sofort {B | B ∈ ∅} = ∅ ∈ τ ,
und mit β 0 = β ergibt sich {B|B ∈ β} = X ∈ τ . Die Bedingung (1) für eine Topologie ist damit
0
nachgewiesen. Zum Nachweis von
∈Sτ beliebig gegeben. Zu O und O0 existieren
S (2) seien nun O, O
0
0
dann Mengen α, α ∈ β mit O = {B|B ∈ α} und O = {B|B ∈ α0 }. Damit erhalten wir
[
[
O ∩ O0 =
{B | B ∈ α} ∩
{B | B ∈ α0 }
[
=
{B ∩ B 0 | B ∈ α, B 0 ∈ α0 }
85
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
Zu je zwei B, B 0 ∈ β existiert nach Voraussetzung an β eine Menge αB,B 0 ⊂ β mit B ∩ B 0 =
αB,B 0 }. Also folgt weiter:
o
[ n[ ©
ª
O ∩ O0 =
B̄ | B̄ ∈ αB,B 0 | B ∈ α, B 0 ∈ α0
[©
ª
=
B̄ | B̄ ∈ αB,B 0 , B ∈ α, B 0 ∈ α
o
[n
[
=
B̄ | B̄ ∈
{αB,B 0 | B ∈ α, B 0 ∈ α0 }
S
{B̄ | B̄ ∈
Damit ist S
(2) erfüllt. Zum Nachweis von (3) sei schließlich zu jedem O ∈ τ eine Menge βO so gewählt,
daß O = {B | B ∈ βO } gilt. Dann ist für beliebiges α ⊆ τ
o [n
o
[
[ n[
[
{O | O ∈ α} =
{B | B ∈ βO } | O ∈ α =
B | B ∈ {βO | O ∈ α}
2
S
7.3 Definition. Sei β Basis. Die Topologie τ = { {B | B ∈ β 0 } | β 0 ⊆ β} heißt die von β induzierte
Topologie.
2
7.4 Beispiel. a) Betrachte X = R und
β = {{x | q < x < q 0 } | q, q 0 ∈ Q, q < q 0 }
β besteht
mit rationalen Endpunkten. β ist eine Basis, da sicherlich
S also aus allen ‘offenen’ Intervallen
0
R = {B|B ∈ β} gilt und zudem für q, q , q̄, q̄ 0 ∈ Q die Menge {x | q < x < q 0 } ∩ {x | q̄ < x < q̄ 0 }
entweder leer ist oder in β liegt.
Im folgenden sei τR die von dieser Basis β induzierte Topologie. τR wird als die „natürliche“ Topologie
auf R bezeichnet.
b) Zu jedem X ist die Menge τ = {Y | Y ⊆ X} trivialerweise eine Topologie, die ‘diskrete’ Topologie.
So ist z. B.
τBOOL := {∅, {T}, {F}, {T, F}}
die diskrete Topologie für die Menge der Wahrheitswerte. Eine Basis von τBOOL ist {{T}, {F}}.
c) τ = (∅, R) ist ebenfalls eine Topologie mit Basen {R} und {∅, R}. τ ist die ‘indiskrete’ Topologie auf
R. Analoge indiskrete Topologien sind für jede Menge definiert.
d) Es sei X = F. Wir suchen nach einer zu den Orakel-Maschinen ‘passenden’ Topologie für F. Betrachtet
man die ‘Information’, die eine Orakel-Maschine bei einer Berechnung auf einer Eingabe w aus einem
Orakel Φ erhält, als ‘Approximation’ an Φ, so müssen alle Ψ , die die gleiche Information liefern, in einem
gewissen Sinn ‘nahe’ bei Φ liegen, also in einer kleinen Umgebung von Φ liegen. Diese aus Φ erhaltene
Information besteht aus endlich vielen Paaren (v, Φ(v) (für v ∈ AΦ
M (w)), d.h. aus der endlichen Funktion
φ = Φ|AΦM (w) . Jede Fortsetzung Ψ von φ ist also ‘nahe’ bei Φ. Daher definieren wir:
Für Funktionen f, g ∈ F sei
f v g ⇔ g ist Fortsetzung von f,
d.h. g|Def(f ) = f , und
Fe := {f ∈ F | f hat endlichen Definitionsbereich }
86
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
Weiter sei zu f ∈ F die Menge Cont(f ) := {g | f v g} definiert als die Menge aller Fortsetzungen
von f . Dann ist βF := {Cont(f ) | f ∈ Fe } Basis einer Topologie, die wir mit τF bezeichnen: Sicherlich
ist F = Cont(⊥) für die Funktion ⊥ ∈ F mit leerem Definitionsbereich. Ferner gilt für alle Funktionen
f1 , f2 ∈ F mit endlichem Definitionsbereich:
Cont(f1 ) ∩ Cont(f2 ) = {g | g|Def(f1 ) = f1 ∧ g|Def(f2 ) = f2 }
½
∅,
(∃w ∈ Def(f1 ) ∩ Def(f2 ))f1 (w) 6= f2 (w),
=
Cont(h), sonst.
mit

w ∈ Def(f1 )
 f1 (w),
f2 (w),
w ∈ Def(f2 ) \ Def(f1 )
h(w) :=

undefiniert, sonst.
Die offenen Menge O aus der Basis βF sind trivialerweise unter der Relation v nach oben abgeschlossen,
d.h. g ∈ Cont(fS), g v h ⇒ h ∈ Cont(f ). Diese Abschlußeigenschaft gilt aber auch für beliebige O ∈ τF ,
d.h. für O = {Cont(f )|f ∈ α} für eine Teilmenge α vonFe : g ∈ O, g @ h ⇒ (∃f ∈ α) (g ∈
Cont(f ), f @ g @ h) → h ∈ Cont(f ) ⊆ O.
2
7.5 Lemma. Sei (X, τ ) ein topologischer Raum und Y ⊆ X. Dann ist τ |Y := {O ∩ Y | O ∈ τ } eine
Topologie auf Y , die „Spurtopologie“. Ist β Basis von τ , so ist {B ∩ Y |B ∈ β} Basis von τ |Y .
2
Beweis: trivial
7.6 Lemma. Sei (X, τ ) ein topologischer Raum und sei β eine Basis von τ . Für O ⊆ X gilt dann:
O ∈ τ ⇐⇒ (∀x ∈ O)(∃Bx,O ∈ β) x ∈ Bx,O ⊆ O
2
S
S
Beweis: ‘⇐’: Hier giltSO ⊆ {Bx,O | x ∈ O} (da x ∈ Bx,O ) und auch {Bx,O | x ∈ O} ⊆ O (da stets
Bx,O ⊆ O), also O = {Bx,O | x ∈ O} und damit O ∈ τ .
S
‘⇒’: Da O ∈ τ , gibt es α ⊆ β mit O = {B|B ∈ α}, d.h. zu x ∈ O gibt es ein Bx,O ∈ α mit x ∈ Bx,O ,
wegen Bx,O ∈ α gilt dabei insbesondere Bx,O ⊆ O.
2
7.7 Definition. (X, τ ) und (X 0 , τ 0 ) seien topologische Räume. Eine Funktion f : X ÂX 0 heißt (τ, τ 0 )stetig, wenn für alle O0 ∈ τ 0 das Urbild f −1 (O0 ) = {x ∈ X | f (x) ∈ O} offen in der Spurtopologie
τ |Def(f ) ist.
2
7.8 Lemma. β 0 sei eine Basis von τ 0 . Dann ist f genau dann (τ, τ 0 )-stetig, wenn f −1 (O0 ) für jede Basismenge O0 ∈ β 0 in τ |Def(f ) offen ist.
2
Beweis: ‘⇒’: trivial, da β 0 ⊆ τ 0
S
S
‘⇐’:
Sei O0 ∈ τ 0 und α0 ⊆ β 0 mit O0 = {B 0 | B 0 ∈ α0 } gegeben. Dann f −1 (O0 ) = f −1 ( {B 0 | B 0 ∈ α0 }) =
S −1
{f (B 0 ) | B 0 ∈ α0 }. Da f −1 (B 0 ) offen ist für jedes B 0 ∈ α0 , ist damit auch f −1 (O0 ) offen (in τ |Def(f )
).
2
87
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
Beispiel: sign : R ÂBOOL = {T, F} mit

 T,
F,
sign(x) =

undefiniert,
x>0
x<0
x=0
ist (τR , τBOOL )-stetig:
sign−1 ({T}) = {x | x > 0} =
[
{(q, q + 1) | q ∈ Q, q > 0} ∈ τR
sign−1 ({F}) = {x | x < 0} ∈ τR
7.9 Lemma. f : R ÂR ist (τR , τR )-stetig genau dann, wenn
(∀x ∈ Def(f ))(∀ε > 0)(∃δ > 0)(∀y ∈ Def(f )) |x − y| < δ ⇒ |f (x) − f (y)| < ε;
d.h. (τR , τR )-Stetigkeit ist die „normale“ ε-δ-Stetigkeit.
2
Beweis: ‘⇒‘: Seien x ∈ Def(f ), und ε > 0 gegeben. Da das „offene“ Intervall (f (x) − ε, f (x) + ε) =: Ix,ε
in τR liegt, ist f −1 (Ix,ε ) offen, d.h. zu x ∈ f −1 (Ix,ε ) gibt es ein „Basisintervall“ J = {y | q < y < q 0 } mit
x ∈ J∩ Def(f ) ⊆ f −1 (Ix,ε ).
Also gilt für ein δ > 0: (x − δ, x + δ) ⊆ J und damit
(∀y ∈ Def(f ) ∩ (x − δ, x + δ)) y ∈ f −1 (Ix,ε ),
d.h. f (y) ∈ Ix,ε .
‘⇐’: Betrachte O ∈ τR . Für jedes x ∈ f −1 (O) gibt es dann ein εx > 0, so daß (f (x) − εx , f (x) + εx ) ⊆ O
gilt.
Also gibt es auch ein δx > 0, so daß
(∀y ∈ Def(f ) ∩ (x − δx , x + δx )) f (y) ∈ O,
also
x ∈ (x − δx , x + δx ) ∩ Def(f ) ⊆ f −1 (O).
Damit ist f −1 (O) offen in τR |Def(f ) .
2
7.10 Lemma. Jede (τF , τF )-stetige Abbildung Γ ist monoton bezüglich v, d.h. aus f v g folgt stets Γ(f ) v
Γ(g).
2
Beweis: Sei Γ stetig, f und g seien gegeben mit f v g. Wir müssen zeigen, daß Γ(f ) v Γ(g), also daß für
jedes w ∈ Def (Γ(f )) auch w ∈ Def (Γ(g)) und Γ(f )(w) = Γ(g)(w) gilt.
Sei also w ∈ Def (Γ(f )) beliebig gewählt. Wir definieren hw ∈ Fe durch hw := Γ(f )|{w} . Dann gilt
hw v Γ(f ), also Γ(f ) ∈ Cont(hw ) ∈ τF . Da Γ stetig ist, gibt es also h̄w ∈ Fe mit f ∈ Cont (h̄w ) ⊆
Γ−1 (Cont(hw )). Wegen f v g gilt dann auch g ∈ Cont (h̄w ) ⊆ Γ−1 (Cont (hw )), d.h. Γ(g) ∈ Cont (hw ).
Dies bedeutet jedoch hw v Γ(g), also w ∈ Def (Γ(g)) und Γ(g)(w) = hw (w) = Γ(f )(w) wie zu zeigen
88
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
2
war.
Anmerkung: Die Umkehrung des obigen Lemma gilt nicht, es gibt monotone Abbildungen, die nicht stetig
sind, z.B. Γ mit Γ(f ) := ⊥, falls Def(f ) endlich und Γ(f ) := Λ, falls Def(f ) nicht endlich. Dabei sei ⊥ die
Funktion mit leerem Definitionsbereich und Λ sei festgelegt durch Def (Λ) = B∗ und (∀w ∈ B∗ )Λ(w) = λ.
Γ ist sicherlich monoton. Wäre Γ stetig, so müßte für jedes g ∈ Fe die Menge Γ−1 (Cont (g)) offen
sein, z.B. für g mit Def(g) := {λ}, g(λ) := λ ist jedoch Λ ∈ Cont(g), ⊥ 6∈ Cont(g) und damit ist
Γ−1 (Cont(g)) = {f | Def(f ) nicht endlich }. Da hier keine Funktionen aus Fe enthalten sind, kann diese
Menge nicht offen sein.
7.11 Satz. Jede berechenbare Abbildung Γ : F → F ist (τF , τF )-stetig.
2
Beweis: Sei M eine Orakel-Turingmaschine mit ΓM = Γ. Nach Lemma 7.8 reicht es zu zeigen, daß für
jedes f ∈ Fe die Menge Γ−1 (Cont(f )) offen in τF ist. Nach Lemma 7.6 ist es also ausreichend, wenn wir
zu jedem g ∈ Γ−1 (Cont(f )) ein h ∈ Fe mit h v g finden, so daß
Cont(h) ⊆ Γ−1 (Cont(f ))
gilt. Sei also g ∈ Γ−1 (Cont(f )) gegeben, d.h. die von der Maschine M bei Orakel g berechnete Funktion
g
fM
sei eine Fortsetzung von f . Sei A die Menge aller Orakel-Anfragen, die M bei Orakel g und Eingaben
aus Def(f ) stellt, d.h.
[
AgM (w).
A=
w∈Def(f )
Da f nur einen endlichen Definitionsbereich hat, ist A ebenfalls endlich. Wir setzen h := g|A und betrachten im folgenden ein beliebiges g 0 ∈ Cont(h). Zu zeigen ist nur, daß g 0 ∈ Γ−1 (Cont(f )) ist, daß also
g0
Γ(g 0 ) = fM
eine Fortsetzung von f ist. Sei dazu w ∈ Def(f ). Dann sind die Konfigurationen, die M bei
g
g0
(w) durchläuft, identisch mit den Konfigurationen bei der Berechnung von fM
(w):
der Berechnung von fM
0
Bis zur ersten Anfrage an das Orakel g bzw. g ist das Verhalten gleich, da die gleiche Eingabe vorliegt.
Damit ist auch die erste Anfrage v an g 0 gleich der ersten Anfrage an g, d.h. v ∈ A, und damit g 0 (v) = g(v).
Also liegen auch nach der ersten Anfrage an das Orakel immer noch gleiche
Konfigurationen vor. Analog
g
g0
ergibt sich, daß auch alle weiteren Anfragen gleich sind und schließlich fM (w) = fM
(w) = f (w) gilt. 2
Anmerkung: Da die Menge der Orakel-Turingmaschinen abzählbar ist, gibt es auch nur abzählbar viele
berechenbare Abbildungen von F in F. Die Menge der (τF , τF )-stetigen Abbildungen ist jedoch überabzählbar!
Als Verallgemeinerungen von Berechenbarkeit und Reduzierbarkeit bei Darstellungen definieren wir nun:
7.12 Definition. (a) Seien δ1 , δ2 Darstellungen von X1 bzw. X2 . Eine Funktion f : X1 ÂX2 heißt (δ1 , δ2 )stetig, wenn eine (τF , τF )-stetige Abbildung Γ : F → F existiert mit:
(∀h ∈ Def(f ◦ δ1 )) f δ1 (h) = δ2 Γ(h)
(b) Seien δ1 , δ2 Darstellungen einer Menge X. δ1 ist topologisch reduzierbar auf δ2 (in Zeichen: δ1 ≤t δ2 ),
wenn die Identität idX : X → X, id(x) = x, (δ1 , δ2 )-stetig ist. δ1 und δ2 sind topologisch äquivalent (in
Zeichen: δ1 ≡t δ2 ), wenn δ1 ≤t δ2 und δ2 ≤t δ1 gilt.
2
89
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
7.13 Korollar. Jede (δ1 , δ2 )-berechenbare Funktion ist (δ1 , δ2 )-stetig.
2
Anmerkung: Beim Vergleich der Darstellungen im vorigen Kapitel haben wir stets entweder (δ1 , δ2 )Berechenbarkeit oder aber (δ1 , δ2 )-Nicht-Stetigkeit gezeigt. Insbesondere hatten wir nie auf ‘Tricks’ zurückgreifen müssen wie etwa beim Selbstanwendbarkeitsproblem, wo wir auf der Menge aller Turingmaschinen einen Diagonalisierungsbeweis geführt hatten.
Im folgenden wollen wir versuchen, einen Zusammenhang zwischen der (topologischen) (τ1 , τ2 )-Stetigkeit
und der (δ1 , δ2 )-(Darstellungs-)Stetigkeit zu finden. Dazu brauchen wir passende Topologien auf den Mengen Xi .
7.14 Lemma. Sei δ : F ÂX eine Darstellung. Dann ist τδ := {O ⊆ X | δ −1 (O) offen in τF |Def(δ) } eine
Topologie (die Quotienten- oder auch Final-Topologie bezüglich δ). Die Darstellung δ ist (τF , τδ )-stetig. 2
Beweis: trivial
7.15 Lemma. Seien δ1 : F ÂX1 und δ2 : F ÂX2 Darstellungen mit Quotienten-Topologien τ1 bzw. τ2 .
Jede totale (δ1 , δ2 )-stetige Funktion f : X1 → X2 ist dann auch (τ1 , τ2 )-stetig.
2
Beweis: Ist f (δ1 , δ2 )-stetig und total, so gibt es ein stetiges Γ : F → F mit
(∀Φ ∈ Def(δ1 ) = Def(f ◦ δ1 )) f δ1 (Φ) = δ2 Γ(Φ)
Zu zeigen ist, daß für O ∈ τ2 die Menge f −1 (O) offen inτ1 ist. Da f total ist, brauchen wir hier keine
Spurtopologien!
Da δ2 (τF , τ2 )-stetig ist, ist für O ∈ τ2 also δ2−1 (O) offen in τF |Def(δ2 ) , d.h. δ2−1 (O) = Ô ∩ Def(δ2 ) für ein
Ô ∈ τF . Da Γ stetig ist, gibt es wiederum Ō ∈ τF mit Γ−1 (Ô) = Ō, damit Γ−1 δ2−1 (O) = Ō ∩ Def(δ2 ◦ Γ).
Da δ2 Γ(Φ) = f δ1 (Φ) auf ganz Def (δ1 ) gilt, folgt
δ1−1 f −1 (O) =
=
=
=
=
=
{Φ|f δ1 (Φ) ∈ O}
{Φ|f δ1 (Φ) ∈ O} ∩ Def(δ1 )
{Φ|δ2 Γ(Φ) ∈ O} ∩ Def(δ1 )
Γ−1 δ2−1 (O) ∩ Def(δ1 )
Ō ∩ Def(δ2 ◦ Γ) ∩ Def(δ1 )
Ō ∩ Def(δ1 )
da Def(δ1 ) ⊆ Def(δ2 ◦ Γ). Damit ist δ1−1 f −1 (O) offen in der Spurtopologie τF |Def(δ1 ) . Die Menge f −1 (O)
ist daher in τ1 offen.
2
Anmerkung: (a) Das obige Resultat gilt bei geeigneten Darstellungen auch für partielle Funktionen f , wie
wir später sehen werden.
(b) Der Bereich der darstellungsstetigen und damit auch der darstellungsberechenbaren Funktionen wird
also unter anderem durch die Quotienten-Topologien der verwendeten Darstellungen beeinflußt. Daher ist
es von Vorteil, wenn τ2 so grob (d.h. nur wenige offene Mengen) und τ1 so fein (d.h. viele offene Mengen)
wie möglich ist.
90
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
7.16 Beispiel. Im folgenden bestimmen wir die Quotienten-Topologien der von uns für R eingeführten
Darstellungen.
zu δC :
Sei O ∈ τδC , O 6= ∅. Sei Φ beliebig mit δC (Φ) ∈ O gewählt. Da δC−1 (O) nach Definition offen ist, gibt es
ein f ∈ Fe mit Φ ∈ Cont(f )∩Def(δC ) ⊆ δC−1 (O). Daraus folgt δC (Cont(f )) ⊆ O. Andererseits ist jedoch
δC (Cont(f )) = R: f hat nur einen endlichen Definitionsbereich hat und für jedes n mit 1n ∈ Def(f ) ⊆
Def(Φ) ist der Wert νQ f (1n ) definiert; also ist jedes x ∈ R als lim νQ (Ψx (1n )) einer Fortsetzung Ψx von f
darstellbar. Es folgt R ⊆ O und damit R = O. Als Konsequenz gilt τδC = {∅, R}, d.h. τδC ist die indiskrete
Topologie auf R.
Zu δI :
Sei zunächst O ∈ τδI , O 6= ∅. Sei x ∈ O beliebig. Zu jedem Φ mit δI (Φ) = x existiert dann f v Φ, f ∈ Fe ,
mit δI (Cont(f )) ⊆ O. Dann existiert auch g ∈ Fe mit f v g v Φ so, daß für ein n ∈ N, n > 0, und alle
i ∈ N gilt:
0 < i ≤ n ⇒ 0i , 1i ∈ Def(g)
n < i ⇒ 0i , 1i 6∈ Def(g)
Für ` := νQ g(0n ) und r := νQ g(1n ) ergibt sich dann, daß das gesamte offene Intervall (`, r) in δI (Cont(g)) ⊆
δI (Cont(f )) ⊆ O liegt, also x ∈ (`, r) ⊆ O. Damit ist O offen in der natürlichen Topologie τR , d.h.
τδI ⊆ τR .
Sei nun O ∈ τR , O 6= ∅. Wir müssen zeigen, daß δI−1 (O) offen in τF |Def(δI ) ist. Sei dazu Φ ∈ δI−1 (O) beliebig gewählt, wir setzen x := δI (Φ) ∈ O. Es sei `i := νQ Φ(0i ) und ri := νQ Φ(1i ), also lim `i = lim ri = x.
Da O offen ist, gibt es ein n ∈ N so, daß x ∈ (`n , rn ) ⊆ O. Setzen wir D := {w ∈ B∗ | lg(w) ≤ n}
und g := Φ|D , so gilt δI (Cont(g)) = (`n , rn ) ⊆ O. Es folgt Φ ∈ Cont(g) ∩ Def(δI ) ⊆ δI−1 (O). Also ist
δI−1 (O) offen in τF |Def(δI ) und damit O offen in τδI .
Insgesamt ergibt sich also τδI = τR .
Zu δDez :
Ähnlich wie bei δI zeigt man τR ⊆ τδDez . Es gilt jedoch auch die Umkehrung, d.h. τR = τδDez . Sei dazu
O ∈ τδDez , O 6= ∅, gegeben. Betrachte ein beliebiges x ∈ O. Wir wollen zeigen, daß zu x ein ε>0 existiert,
so daß für alle x0 ∈ R mit |x − x0 | < ε gilt x0 ∈ O.
−1
Für jedes Φ mit δDez (Φ) = x gibt es (da δDez
(O) offen ist) ein f ∈ Fe mit Φ ∈ Cont(f ) ∩ Def(δDez ) ⊆
−1
δDez
(O). Wir definieren zi := νASCII Φ(1i ), es sei zm =‘•’ und (o.B.d.A.) sei z0 = 0, d.h. wir betrachten
damit den Fall x≥0. Dann gibt es auch ein g ∈ Fe mit f v g v Φ und ein ein n ≥ m, so daß für alle
i ∈ N gilt 1i ∈ Def(g) ⇔ i ≤ n, also zi = νASCII g(1i ) für i ≤ n. Setzen wir
y :=
m−1
X
m−i−1
zi 10
i=1
+
n
X
zi 10m−i ,
i=m+1
so ergibt sich [y, y + 10m−n ] = δDez Cont(g) ⊆ O. Wir müssen drei Fälle unterscheiden:
Fall (a), x 6= y und x 6= y + 10m−n : Dann gilt sogar x ∈ (y, y + 10m−n ) ⊆ O.
Fall (b), x = y : Dann ist [x, y + 10m−n ) ⊆ O. Ferner ist zi = 0 für i > n, d.h. Φ stellt x mit der Periode
0 dar.
Fall (c), x = y + 10m−n : Dann ist (y, x] ⊆ O. Ferner muß zi = 9 für i > n gelten, d.h. Φ stellt x mit der
Periode 9 dar.
91
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
Im Fall (c) gibt es zu x aber auch ein Φ0 , das x mit Periode 0 darstellt, d.h. es gibt Φ0 , y 0 , m0 und n0 , so daß
0
0
Fall (b) für Φ0 eintritt. Es ist also auch [x, y 0 + 10m −n ) ⊆ O, d.h.
0
0
x ∈ (y, y 0 + 10m −n ) ⊆ O.
Ebenso gibt es im Fall (b) ein zusätzliches halboffenes Intervall (y 0 , x] mit (y 0 , x] ⊆ O und damit (y 0 , y +
10m−n ) ⊆ O.
In jedem Fall liegt also eine offene Umgebung (bzgl. τR ) von x in O. Damit ist O auch in τR offen.
Zu δNC :
Hier gilt τδNC = τR wie bei der äquivalenten Darstellung δI , wie das folgende Lemma zeigt.
2
7.17 Lemma. δ und δ 0 seien Darstellungen der gleichen Menge X. Dann gilt:
δ ≤t δ 0 ⇒ τδ0 ⊆ τδ
und damit auch sofort
δ ≡t δ 0 ⇒ τδ0 = τδ
2
Beweis: Ist δ ≤t δ 0 , so ist die Identität id : X → X (δ, δ 0 )-stetig und damit auch (τδ , τδ0 )-stetig. Also:
O ∈ τδ0 ⇒ id−1 (O) = O ∈ τδ , d.h. τδ0 ⊆ τδ
2
Insbesondere haben also auch (berechenbar) äquivalente Darstellungen wie δI und δNC die gleiche Finaltopologie.
Im folgenden betrachten wir eine Klasse von Darstellungen, bei denen Darstellungs- und topologische
Stetigkeit gleich sind. Solche Darstellungen existieren für spezielle topologische Räume, die T0 -Räume.
(T0 ist das allgemeinste der ‘Trennungsaxiome’ aus der Topologie.)
7.18 Definition. Sei (X, τ ) ein topologischer Raum.
(a) U (x) := {U ⊆ X | (∃O ∈ τ )x ∈ O ⊆ U} sei die Menge aller Umgebungen von x.
(b) Eine Basis von U (x) ist eine Teilmenge α von U (x) mit:
(∀U ∈ U (x))(∃U 0 ∈ α) U 0 ⊆ U
(c) (X, τ ) heißt T0 -Raum, wenn für x, y ∈ X, x 6= y, stets U (x) 6= U (y) gilt.
2
Bei jedem topologischen Raum ist U (x) durch x eindeutig festgelegt. In einem T0 -Raum gilt sogar die
Umkehrung: x ist durch die Menge seiner Umgebungen U (x) eindeutig bestimmt. Für die Festlegung von
U (x) wiederum ist eine Basis von U (x) ausreichend: Ist β Basis von τ , so gibt es zu jedem x Basen αx
von U(x) mit αx ⊆ β, d.h. x kann durch eine ausreichend umfangreiche Menge αx ⊆ β ∩ U (x) eindeutig
beschrieben werden.
Von Interesse sind also besonders diejenigen T0 -Räume (X, τ ), die eine abzählbare (=
b notierbare!) Basis
β ⊆ τ besitzen.
92
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
7.19 Beispiel. (1) (R, {∅, R}) ist kein T0 -Raum, da z.B. für x = 1 und y = 0 gilt:
U (1) = {R} = U (0)
(2) (R, τR ) ist ein T0 -Raum mit abzählbarer Basis: Für x, y ∈ R, x 6= y ist das offene Inervall (x − ε, x +
ε) ∈ U (x) \ U (y), wenn 0 < ε < |x − y| gilt. τR besitzt als abzählbare Basis zum Beispiel die Menge
{{x ∈ R | q < x < q 0 } | q, q 0 ∈ Q, q < q 0 }.
(3) Ein metrischer Raum (X, d) ist eine Menge X mit einer Funktion d : X × X → R ( ‘Distanz’ ), die
den folgenden Axiomen genügen muß (für beliebige x, y, z ∈ X):
d(x, y) = d(y, x) ≥ 0
d(x, y) = 0 ⇔ x = y
d(x, y) ≤ d(x, z) + d(z, y)
Die Distanz d induziert eine Topologie τd auf X: Zu x ∈ X, ε ∈ R, ε > 0, sei B(x, ε) := {y ∈ X |
d(x, y) < ε} (offene Kugel mit Zentrum x und Radius ε). Die Menge β := {B(x, ε) | x ∈ X, ε > 0} ist
Basis einer Topologie τd . (X, τd ) ist ein T0 -Raum: Zu x 6= y ist B(x, ε) ∈ U (x) \ U (y), wenn ε < d(x, y)
gewählt wird.
Eine Teilmenge A ⊆ X heißt dicht, wenn
(∀x ∈ X)(∀ε > 0)(∃a ∈ A)d(x, a) < ε.
Dann enthält jede Umgebung eines x ∈ X mindestens ein a ∈ A. (X, d) heißt separabel, wenn eine
abzählbare dichte Teilmenge A ⊆ X existiert. Dann ist {B(a, q) | a ∈ A, q ∈ Q, q > 0} ebenfalls eine
(sogar abzählbare) Basis von τd .
(4) Sei C[0, 1] := Menge aller stetigen Funktionen f : {x | 0 ≤ x ≤ 1} → R. Dann ist d(f, g) :=
max{|f (x) − g(x)| | 0 ≤ x ≤ 1} eine Distanz auf C[0, 1]. Der Raum (C[0, 1], d) ist zudem separabel:
Abzählbare dichte Teilmengen sind zum Beispiel A1 := Menge aller Polynome mit rationalen Koeffizienten
und A2 := Menge aller Polygonzüge mit rationalen Ecken.
(5) Zu x ∈ R sei G(x) := {y | y > x}. Dann ist {G(x) | x ∈ R} ∪ {R, ∅} eine Topologie τ> auf R,
mit abzählbarer Basis {G(q) | q ∈ Q}. Hier ist für x < y U (x) ⊂
U (y), d.h. (R, τ> ) ist T0 -Raum mit
6=
abzählbarer Basis.
(6) (F, τF ) ist ein T0 -Raum mit der abzählbaren Basis {Cont(f ) | f ∈ Fe }: Ist Φ 6= Ψ, so ist sicher
Φ 6v Ψ oder aber Ψ 6v Φ. Sei daher o.B.d.A. Φ 6v Ψ und w ∈ B∗ so gewählt, daß Φ(w) definiert ist, aber
entweder w 6∈ Def(Ψ) oder aber Ψ(w) 6= Φ(w) gilt. Setze g := Φ|{w} . Sicher g v Φ und g 6v Ψ, d.h.
Cont(g) ∈ U (Φ) \ U (Ψ).
2
7.20 Definition. (X, τ ) sei ein T0 -Raum mit abzählbarer Basis. Zu jeder abzählbaren Basis β und jeder
Notation U : B∗ Âβ von β sei eine Darstellung %U : F ÂX definiert durch
%U (Φ) := x ⇔ Φ ∈ Def(δU ,∞ ) und {U (Φ(w)) | w ∈ B∗ } ist eine Basis der Umgebungen
U (x) von x.
%U wird als eine Standarddarstellung von X bzgl. τ bezeichnet.
93
2
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
Anmerkungen: (a) Da (X, τ ) T0 -Raum ist, ist x durch jede Basis von U (x) eindeutig bestimmt. Damit
ist %U als Funktion wohldefiniert. Ferner bildet bei jedem x ∈ X die Menge βx = {B ∈ β | x ∈ B}
eine abzählbare, nichtleere Basis von U (x); also existiert insbesondere auch ein Φ ∈ Def(δU ,∞ ) mit βx =
{U (Φ(w)) | w ∈ B∗ }, d.h. %U ist surjektiv.
(b) Eine Name Φ eines x unter der Standarddarstellung %U ist eine Aufzählung einer (beliebigen) Basis
von U (x). Die Reihenfolge, in der die Basis aufgezählt wird, ist dabei ohne Belang. Insbesondere ist nach
der Definition von δU ,∞ in 4.5(a) notwendigerweise Def(Φ) = B∗ für jeden Namen Φ.
7.21 Lemma. %U sei eine Standarddarstellung von X bzgl. τ entsprechend obiger Definition. Dann gilt:
1. %U ist (τF , τ )-stetig.
2. %U ist eine offene Abbildung, d.h. für alle O ∈ τF ist %U (O) ∈ τ .
3. τ ist die Finaltopologie von %U , d.h. τ = τ%U .
4. Sei ξ : F ÂX eine (τF , τ )-stetige Funktion mit (∀Φ ∈ Def(ξ)) Def(Φ) = B∗ . Dann gibt es eine
(τF , τF )-stetige Abbildung Γ : F → F mit (∀Φ ∈ Def(ξ)) ξ(Φ) = %U ◦ Γ(Φ).
5. Sei (X 0 , τ 0 ) ein topologischer Raum, sei H : X ÂX 0 so gegeben, daß H ◦%U : F ÂX 0 (τF , τ 0 )-stetig
ist. Dann ist H(τ, τ 0 )-stetig.
2
Beweis: Zu 1: Wir betrachten %−1
U (B) für ein beliebiges B ∈ β. Für jedes Φ ∈ Def(%U ) gilt dann
Φ ∈ %−1
U (B) ⇔ %U (Φ) ∈ B
⇔ B ∈ U (%U (Φ))
⇔ (∃w ∈ B∗ )U(Φ(w)) ⊆ B
Daraus ergibt sich
%−1
U (B) = Def(%U ) ∩
³[
´
{Cont(f ) | f ∈ Fe ∧ (∃w ∈ Def(f )) U(f (w)) ⊆ B} ,
d.h. %−1
U (B) ist offen in τF |Def(%U ) . Nach Lemma 7.8 ist %U stetig.
Zu 2: Es reicht zu zeigen, daß für jedes f ∈ Fe die Menge %U (Cont(f )) offen ist (die Cont(f ) bilden eine
Basis von τF ). Sei also f ∈ Fe gegeben. Falls %U (Cont(f )) leer ist, so ist nichts zu zeigen; im folgenden
seid aher %U (Cont(f )) 6= ∅.
T
Wir definieren Of := {U (f (w)) | w ∈ Def(f )}. Da der Definitionsbereich von f endlich ist, ist Of als
Durchschnitt endlich vieler offener Mengen ebenfalls offen.
Ist Φ ∈ Def(%U ) ∩ Cont(f ), so gilt %U (Φ) ∈ U(f (w)) für jedes w ∈ Def(f ), also %U (Φ) ∈ Of . Damit gilt
%U (Cont(f )) ⊆ Of .
Andererseits gibt es zu jedem x ∈ Of sicherlich einen Namen Φ von x mit f v Φ, damit Of ⊆
%U (Cont(f )).
Insgesamt erhalten wir %U (Cont(f )) = Of ∈ τ .
Zu 3: Nach dem schon bewiesenen Teil 1 gilt mit der Definition der Finaltopologie sofort τ ⊆ τ%U . Sei nun
94
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
O ∈ τ%U , d.h. %U−1 (O) = Ō ∩ Def(%U ) für ein Ō ∈ τF . Da %U surjektiv ist, gilt dann auch O = %U (Ō).
Nach Teil 2 gilt damit O = %U (Ō) ∈ τ .
Zu 4: Sei ξ : F ÂX stetig mit (∀Φ ∈ Def(ξ)) Def(Φ) = B∗ gegeben. Zu zeigen ist die Existenz eines
stetigen Γ mit ξ(Φ) = % ◦ Γ(Φ), d.h. δU ,∞ (Γ(Φ)) muß eine Basis der Umgebungen U (ξ(Φ)) von ξ(Φ)
aufzählen. Damit Γ stetig ist, darf jeder endliche Teil dieser Aufzählung nur von endlicher Information
über Φ abhängig sein.
Wir definieren Γ durch einen Algorithmus in unserer Pseudosprache. Dieser Algorithmus enthält allerdings
einen Test, der (je nach gegebenen ξ und U) nicht berechenbar sein muß: es wird für gewisse f ∈ Fe und
v ∈ B∗ getestet, ob ξ(Cont(f )) ⊆ U (v) gilt, d.h. ob U(v) Umgebung jedes x ∈ ξ(Cont(f )) ist. Die
entstehende Abbildung Γ wird daher stetig werden, aber nicht in jedem Fall berechenbar! Als weiteres
Hilfsmittel benötigen wir eine eine Bijektion ι : N → Fe × Def(U). Da Fe abzählbar ist, gibt es ein solches
ι!
FUNCTION GAMMA (W:BINARY, Φ:ORAKEL): BINARY;
VAR
n, i: NATURAL;
v: BINARY;
f : Fe ;
BEGIN
n :=LENGTH(W);
IF n = 0 THEN
i := 0;
REPEAT
(f, v) := ι(i);
IF Def(f ) 6⊆ Def(Φ) THEN Fehler, kein Ergebnis;
i := i + 1;
UNTIL f v Φ AND ξ(Cont(f )) ⊆ U(v);
RETURN v;
ELSE
(f, v) := ι(n)
IF Def(f ) 6⊆ Def(Φ) THEN Fehler, kein Ergebnis;
IF f v Φ AND ξ(Cont(f )) ⊆ U(v) THEN
RETURN v;
ELSE
RETURN GAMMA(λ,Φ);
END.
Analog zu den Orakel-Turingmaschinen definiert dieser Algorithmus eine Abbildung Γ : F → F. Zu zeigen
ist nun, daß (a) für alle Φ ∈ Def(ξ) gilt ξ(Φ) = %U Γ(Φ) und daß (b) Γ stetig ist.
Zum Beweis von (a) sei Φ ∈ Def(ξ) gegeben. Da Def(Φ) = B∗ ist, ist beim Ablauf des Algorithmus stets
Def(f ) ⊆ Def(Φ).
Sei nun B ∈ β beliebig mit ξ(Φ) ∈ B. Da ξ stetig ist, ist ξ −1 (B) offen, es gibt also ein f ∈ Fe mit
Φ ∈ Cont(f ) ∩ Def(ξ) ⊆ ξ −1 (B), d.h. f v Φ und ξ(Cont(f )) ⊆ B. Da ι bijektiv und U eine Notation
von β ist, gibt es also n ∈ N und v ∈ B∗ mit ι(n) = (f, v) und U(v) = B. Für jedes w mit lg(w) = n gilt
daher U(Γ(Φ)(w)) = B. Die Menge {U(Γ(Φ)(w)) | w ∈ B∗ } ist also zumindest Obermenge einer Basis
der Umgebungen von ξ(Φ).
95
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
Da zu Φ ∈ Def(ξ) auch mindestens ein B ∈ β mit ξ(Φ) ∈ B existieren muß, ist mit der gleichen Festlegung von f , n und v zudem sichergestellt, daß die Repeat-Schleife im Algorithmus zum Halten kommt,
so daß U(Γ(Φ)(λ)) und damit auch U(Γ(Φ)(w)) für jedes w definiert ist. Der Algorithmus gewährleistet
zudem, daß für jedes w stets ξ(Φ) ∈ U(Γ(Φ)(w)) gelten muß. Damit besteht {U(Γ(Φ)(w)) | w ∈ B∗ } nur
aus Umgebungen von ξ(Φ), ist also sogar eine Basis dieser Umgebungen.
Da beim Algorithmus für w, w0 mit lg(w) = lg(w0 ) sicher Γ(Φ)(w) = Γ(Φ)(w0 ) gilt, ist Γ(Φ) ∈ Def(δU ,∞ ).
Daraus ergibt sich insgesamt, daß %U Γ(Φ) definiert ist und ξ(Φ) = %U Γ(Φ) wie verlangt gilt.
Wir wollen nun die Stetigkeit von Γ zeigen; dazu zeigen wir, daß für jedes g ∈ Fe die Menge Γ−1 (Cont(g))
offen ist. Sei Φ ∈ Γ−1 (Cont(g)) beliebig gewählt, d.h. g v Γ(Φ). Für jedes w ∈ Def(g) ist also Γ(Φ)(w)
definiert, es muß also bei jedem (der endlich vielen!) (f, v) = ι(i), die bei der Bestimmung von Γ(Φ)(w)
benutzt werden, Def(f ) ⊆ Def(Φ) gelten. Es sei D die Vereinigung aller dieser Def(f ) für alle w ∈
Def(g), damit D ⊆ Def(Φ). Zudem ist D endlich, also ist h := Φ|D ∈ Fe . Für jedes Ψ ∈ Cont(h)
und jedes w ∈ Def(g) gilt jedoch nach Wahl von D, daß Γ(Ψ)(w) = Γ(Φ)(w) = g(w) sein muß, d.h.
g v Γ(Ψ). Es ist damit Φ ∈ Cont(h) ⊆ Γ−1 Cont(g)). Da Φ beliebig aus Γ−1 (Cont(g)) gewählt war, ist
Γ−1 Cont(g)) damit offen.
Zu 5: Sei H ◦%U : F ÂX 0 (τF , τ 0 )-stetig. Betrachte ein beliebiges O0 ∈ τ 0 . Dann ist (H ◦%U )−1 (O0 ) offen in
der entsprechenden Spurtopologie, d.h. (H ◦%U )−1 (O0 ) = O ∩Def(H ◦%U ) für ein O ∈ τF . Da %U surjektiv
−1
−1
ist, ist für jede Teilmenge A von X %U (%−1
(O0 ) = %U (%−1
(O0 ))) =
U (A)) = A und damit H
U (H
%U ((H ◦ %U )−1 (O0 )) = %U (O ∩ Def(H ◦ %U )) = %U (O) ∩ Def(H). Nach Teil 2 ist H damit (τ, τ 0 )-stetig.
2
Bei einem gegebenen T0 -Raum (X, τ ) mit abzählbarer Basis β gibt es viele Notationen U dieser Basis.
Ferner kann es viele weitere abzählbare Basen geben, die sogar zu β disjunkt sein können. Damit gibt es
zu X und τ viele Standarddarstellungen. Diese sind jedoch alle topologisch äquivalent:
7.22 Lemma. (X, τ ) sei ein T0 -Raum, der eine abzählbare Basis besitzt. %1 und %1 seien Standarddarstellungen von X bezüglich τ . Dann sind %1 und %2 topologisch äquivalent.
2
Beweis: Mit 7.21.4 gilt sofort %1 ≤t %2 und %2 ≤t %1 .
2
7.23 Definition.
1. Sei (X, τ ) ein T0 -Raum mit abzählbarer Basis. Eine Darstellung δ : F ÂX heißt zulässig bzgl. τ ,
wenn δ topologisch äquivalent zu einer Standarddarstellung von X bzgl. τ ist.
2. Eine Darstellung δ : F ÂX heißt zulässig, wenn (X, τδ ) ein T0 -Raum mit abzählbarer Basis ist und
δ bzgl. τδ zulässig ist. Dabei sei τδ die Quotiententopologie von δ.
2
7.24 Satz. (Hauptsatz über zulässige Darstellungen)
δ und δ 0 seien zulässige Darstellungen der T0 -Räume mit abzählbaren Basen (X, τ ) bzw. (X 0 , τ 0 ). Sei
f : X ÂX 0 eine beliebige Funktion. Dann gilt:
96
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
f ist (τ, τ 0 )-stetig ⇔ f ist (δ, δ 0 )-stetig.
2
Beweis: Seien % bzw. %0 Standard-Darstellungen von (X, τ ) bzw. (X 0 , τ 0 ), d.h. δ ≡t % und δ 0 ≡t %0 . Ferner
gilt: f ist (δ, δ 0 )-stetig ⇔ f ist (%, %0 )-stetig (ein Analogon zu Satz 4.11(c) gilt für Darstellungsstetigkeit).
(a) Sei f (τ, τ 0 )-stetig. Dann ist ξ := f ◦ % ebenfalls stetig und es gilt (∀Φ ∈ Def(ξ) ⊆ Def(%)) Def(Φ) =
B∗ . Nach 7.21.5 gibt es also ein stetiges Γ mit f ◦ %(Φ) = ξ(Φ) = %0 Γ(Φ) für alle Φ ∈ Def(f ◦ %), d.h. f
ist (%, %0 )-stetig.
(b) Sei f (%, %0 )-stetig, d.h. f ◦ %(Φ) = %0 ◦ Γ(Φ) für Φ ∈ Def(f ◦ %) und ein stetiges Γ. Die Abbildung
%0 ◦ Γ ist dann jedoch stetig und damit auch f ◦ %U . Nach 7.21.5 ist f damit (τ, τ 0 )-stetig.
2
Aus diesem Ergebnis erhalten wir sofort:
7.25 Korollar. δ und δ 0 seien zulässige Darstellungen der T0 -Räume mit abzählbaren Basen (X, τ ) bzw.
(X 0 , τ 0 ). Ist f (δ, δ 0 )-berechenbar, so ist f auch (τ, τ 0 )-stetig. Ist f nicht (τ, τ 0 )-stetig, so ist f nicht (δ, δ 0 )berechenbar.
2
Damit können wir den Begriff ‘konstruktiv’ jetzt genauer fassen:
Konstruktivität ist (in verschiedenen Abstufungen):
- ‘Stetigkeit’ (bezüglich ‘natürlicher’ Topologien),
- ‘Berechenbarkeit’ (bei zulässigen Darstellungen) bzw.
- ‘leichte Berechenbarkeit’ (d.h. in polynomialer Zeit)!
Im folgenden werden wir die bereits bekannten Beispiele von Darstellungen auf Zulässigkeit untersuchen.
Außerdem erhalten wir durch die Standdarddarstellungen auf einen Schlag ‘gute’ Darstellungen für die
verschiedensten Räume.
7.26 Beispiel. (1) δNC , δI : F ÂR sind beide zulässig (bezüglich der natürlichen Topologie auf R): Wähle
als Basis von τR die offenen Intervalle mit rationalen Endpunkten, es sei eine Notation U dieser Intervalle
definiert durch U(w) = {x | l < x < y} :⇔ νQ2 (w) = (l, r). % sei die sich ergebende Standarddarstellung.
Dann sind δNC , δI und % sogar berechenbar äquivalent: δI ≤ % gilt, da eine Intervallschachtelung mit
Limes x auch eine Basis der Umgebungen von x ist. % ≤ δI erhalten wir, indem wir bei der Folge (Ii )i∈N ,
die sich bei einem %-Namen Φ eines x ∈ R durch δU ,∞ (Φ) = (Ii )i∈N ergibt, eine Intervallschachtelung
(Jj )j>0 mit dem Limes x durch Jj := ∩{Ii | i ≤ j} bilden.
(2) δC ist nicht zulässig, da hier die Quotiententopologie die indiskrete Topologie ist (und damit keinen
T0 -Raum bildet).
(3) δDez ist ebenfalls nicht zulässig, da hier die Finaltopologie die natürliche Topologie τR ist. Damit
müßten δDez und δI topologisch äquivalent sein, also insbesondere auch δI ≤t δDez . Daß dies nicht gilt,
kann man ähnlich zeigen, wie bei der Nichtberechenbarkeit der Addition (bzgl. δDez ).
(4) δBOOL ist zulässig (bezüglich der diskreten Topologie auf {T, F}).
(5) Aus Beispiel 7.19(5) ergeben sich weitere zulässige Darstellungen von R, aber bezüglich einer anderen
Topologie!
2
97
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
7.27 Beispiel. Bei metrischen Räumen kann man allgemein wie folgt vorgehen: Gegeben sei ein ein separabler metrischer Raum (X, d), α sei eine Notation einer dichten Teilmenge A von M . Dann ist {B(x, q) |
x ∈ A, q ∈ Q, q > 0} eine abzählbare Basis der von der Distanz auf X induzierten Topologie τd . Daraus
erhalten wir sofort die Existenz von Standarddarstellungen (bzgl. τd ).
In Analogie zur normierten Cauchy-Darstellung von R können wir auch für X eine normierte CauchyDarstellung δN C(α) : F ÂX definieren:

 Φ ∈ Def(δα,∞ ) sowie
(∀i ∈ N) d(xi , x) ≤ 2−i ,
δN C(α) (Φ) = x : ⇔

wobei (xi )i∈N := δα,∞ (Φ) sei.
Man kann leicht zeigen, daß auch δN C(α) eine (bzgl. τd ) zulässige Darstellung ist.
Anmerkung: Die Normierung d(xi , x) ≤ 2−i ist willkürlich gewählt, prinzipiell könnte man statt dessen
d(xi , x) ≤ error(i) für eine beliebige Funktion error : N → Q+ mit lim error(i) = 0 verwenden.
i→∞
Damit erhalten wir auch zulässige Darstellungen für C[0, 1] aus Notationen von Polygonzügen: Wähle z.B.
eine Notation α von Polygonzügen wie folgt: Der Polygonzug p mit den rationalen Ecken (x0 , y0 ), (x1 , y1 ),
(x2 , y2 ), . . ., (xn , yn ) (mit 0 = x0 < x1 < . . . < xn = 1) wird notiert durch Angabe der rationalen Zahlen
x0 , y0 , x1 , y1 , x2 , y2 , . . . , xn , yn d.h.

∗

 νQ (w) = (x0 , y0 , x1 , y1 , x2 , y2 , . . . , xn , yn ) und
½
α(w) = p : ⇔
yi falls x = xi ,

 p(x) := lineare Interpolation sonst .
Wir definieren damit δpz : F ÂC[0, 1] durch
(
δα,∞ (Φ) = (pi )i∈N und
δpz (Φ) = f : ⇔
(∀i ∈ N) max{|pj (x) − pi (x)| | 0 ≤ x ≤ 1} ≤ 2−i
Mit der Zulässigkeit dieser Darstellung können wir nun leicht viele Fragen folgender Art beantworten:
Ist es möglich, bei einer reellen Funktion f eine Nullstelle zu finden (wenn vorhanden)?
Anders formuliert:
Gibt es eine (δpz , δN C )-berechenbare Funktion Λ : C[0, 1] ÂR mit Def(Λ) = {f ∈ C[0, 1] |
(∃x ∈ [0, 1]) f (x) = 0} und der Eigenschaft f (Λ(f )) = 0 für alle f ∈ Def(Λ) ?
Diese Frage ist wegen der Zulässigkeit der Darstellungen leicht mit Nein beantwortbar; wir zeigen im
folgenden durch indirekten Beweis, daß es noch nicht einmal ein stetiges Λ mit der obigen Eigenschaft
gibt.
Betrachte die Folge (pi )i>0 von Polygonzügen aus C[0, 1], die durch folgende vier Eckpunkte festgelegt
sind: (0, −1) (1/3, −1/i), (2/3, −1/i), (1, 1). Jeder dieser Polygonzüge hat eine eindeutige Nullstelle xi
(zwischen 2/3 und 1), also ist Λ für jedes dieser pi definiert und es gilt insbesondere limi→∞ Λ(pi ) = 2/3.
Die Folge (pi )i>0 selbst konvergiert gegen den Polygonzug p̄, der durch die vier Punkte (0, −1) (1/3, 0),
(2/3, 0), (1, 1) festgelegt ist. Aus der Stetigkeit von Λ folgt dann notwendigerweise Λ(p̄) = lim Λ(pi ) =
2/3. Andererseits ist aber auch p̄ = lim p0i , wenn p0i durch die Punkte (0, −1) (1/3, +1/i), (2/3, +1/i),
98
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
(1, 1) festgelegt ist. Hier ist jedoch limi→∞ Λ(p0i ) = 1/3. Λ kann also im p̄ nicht stetig sein, damit auch
nicht berechenbar.
Eine Modifikation der obigen Frage können wir jedoch mit Ja beantworten:
Ist es möglich, bei einer reellen Funktion f mit nur einer einzigen Nullstelle, diese Nullstelle
zu finden?
Anders formuliert:
Gibt es eine (δpz , δN C )-berechenbare Funktion Λ : C[0, 1] ÂR mit Def(Λ) = {f ∈ C[0, 1] |
f hat genau eine Nullstelle im Intervall [0, 1]} und der Eigenschaft f (Λ(f )) = 0 für alle
f ∈ Def(Λ) ?
Im folgenden sei f eine solche stetige Funktion mit eindeutig besimmter Nullstelle x. Dann können wir
x mit einer Orakel-Turingmaschine aus einem Namen von f wie folgt berechnen: Wir bestimmen uns
sukzessive Polygonzüge pi als Näherungen an f . Die Nullstelle x kann dann nur an einer der Stellen
liegen, an denen |pi (y)| ≤ 2−i ist, da sich nach Definition von δpz der Polygonzug pi von f an keiner Stelle
um mehr als 2−i unterscheiden kann. Durch (exakt ausführbare) rationale Arithmetik lassen sich aus pi
aber die rationalen Zahlen li := min{y ∈ [0, 1] | |pi (y)| ≤ 2−i } und ri := max{y ∈ [0, 1] | |pi (y)| ≤ 2−i }
berechnen. Wir erhalten also ein abgeschlossenes Intervall [li , ri ], in dem x liegen muß und in dem |f (y)|
durch 21−i beschränkt ist.
Insbesondere gilt damit x ∈ ∩i∈N [li , ri ]. Andererseits folgt aus y ∈ ∩i∈N [li , ri ] sofort f (y) ≤ 21−i für jedes
i, also f (y) = 0. Da x aber die einzige Nullstelle von f sein sollte, ergibt sich {x} = ∩i∈N [li , ri ]. Die
Intervalle Ij := ∩i≤j [li , ri ] bilden also eine Intervallschachtelung für x. Aus dieser Intervallschachtelung
kann nun leicht ein δN C -Name von x gewonnen werden.
2
7.28 Satz. Die Räume (X1 , τ1 ), . . . , (Xn , τn ) seien T0 -Räume mit den abzählbaren Basen β1 , . . . , βn . Dann
ist die Menge β̄ = {B1 × . . . × Bn | Bi ∈ βi } (abzählbare) Basis einer Topologie τ1 ⊗ τ2 . . . ⊗ τn auf
X1 × . . . × Xn , der ‘Produkttopologie’. Der Produktraum (X1 × . . . × Xn , τ1 ⊗ . . . ⊗ τn ) ist ebenfalls ein
T0 -Raum.
Sind δi : F ÂXi bezüglich τi zulässige Darstellungen, so ist die Produktdarstellung (δ1 , . . . , δn ) von
X1 × . . . × Xn zulässig bezüglich τ1 ⊗ . . . ⊗ τn .
2
n
Insbesondere ist damit δNC
eine zulässige Darstellung des Rn bezüglich der natürlichen Topologie auf Rn .
Beweis: Wir zeigen zunächst, daß β̄ alle notwendigen Eigenschaften für eine Basis erfüllt:
Sei x̄ = (x1 . . . , xn ) ∈ X̄ := X1 × . . . × Xn . Da alle βi Basen sind, gibt es zu jedem xi ein Bi ∈ βi mit
xi ∈ Bi , d.h. x̄ ∈ B1 × . . . × Bn ∈ β̄. Damit X̄ = ∪{B̄ | B̄ ∈ β̄}.
Seien B̄ = B1 × . . . × Bn und B̄ 0 = B10 × . . . × Bn0 ∈ β gegeben, es sei x̄ = (x1 , . . . , xn ) ∈ B̄ ∩ B̄ 0
beliebig. Dann gilt xi ∈ Bi ∩ Bi0 für jeden Index i, es gibt also Bi00 ∈ βi mit xi ∈ Bi00 ⊆ Bi ∩ Bi0 . Damit ist
jedoch auch x̄ ∈ B̄ 00 ⊆ B̄ ∩ B̄ 0 mit B̄ 00 := B100 × . . . × Bn00 ∈ β̄.
Damit ist β̄ Basis einer Topologie τ1 ⊗ . . . ⊗ τn , die wir im folgenden kurz mit τ̄ bezeichnen. Als nächstes
zeigen wir, daß (X̄, τ̄ ) ein T0 -Raum ist:
Seien dazu x̄ := (x1 , . . . , xn ) und ȳ := (y1 , . . . , yn ) mit x̄ 6= ȳ gegeben. Es gibt also einen Index i mit
xi 6= yi . Da (Xi , τi ) T0 -Raum ist, gilt U (xi ) 6= U (yi ). O.B.d.A. gibt es also ein Bi ∈ βi mit xi ∈ Bi und
99
7 BERECHENBARKEIT UND TOPOLOGISCHE RÄUME
yi 6∈ Bi . Setze O := X1 × . . . × Xi−1 × Bi × Xi+1 × . . . × Xn . Dann gilt x̄ ∈ O und ȳ 6∈ O. Da O sicher
offen ist, ist damit U (x̄) 6= U (ȳ).
Es seien Ui Notationen der Basen βi , eine Notation Ū von β̄ erhalten wir dann durch Ū(w) = B1 × . . . ×
Bn ⇔ (U1 , . . . Un )(w) = (B1 , . . . , Bn ) (vgl. Beispiel 3.7). Es seien %i := %Ui die Standarddarstellungen
zu den Ui und es sei % := %Ū die Standarddarstellung zu Ū. Wir definieren %̄ := (%1 , . . . , %n ) als weitere
Darstellung von X̄.
Die Darstellungen δi seien zulässig bezüglich τi , es sei δ̄ := (δ1 , . . . , δn ). Damit gilt sofort δi ≡t %i . Da
sowohl δ̄ als auch %̄ komponentenweise definiert sind, erhält man leicht δ̄ ≡t %̄. Zu zeigen ist also noch
%̄ ≡t %, wir zeigen sogar %̄ ≡ %, d.h. berechenbare Äquivalenz!
Betrachte dazu ein beliebiges Φ ∈ Def(%̄) und setze %̄(Φ) = x̄ = (x1 , . . . , xn ). Dann ist bei jedem xi
die Menge {Ui Φ(<1i , w>) | w ∈ B∗ } Umgebungsbasis von xi . Setzen wir Bi,w := Ui Φ(<1i , w>), so ist
{B1,w1 × . . . × Bn,wn | wi ∈ B∗ } sicher eine Umgebungsbasis von x̄. Darauf aufbauend kann man %̄ ≤ %
leicht zeigen: Wähle eine berechenbare Bijektion ι : N → (B∗ )n und setze für w und (w1 , . . . , wn ) :=
ι(lg(w)):
Γ(Φ)(w) :=< Φ(<11 , w1 >), Φ(<12 , w2 >), . . . , Φ(<1n , wn >) >
Dann ist Γ sicherlich berechenbar und es gilt %̄(Φ) = %Γ(Φ) für Φ ∈ Def(%̄).
Andererseits ist bei %(Φ) = x̄ = (x1 , . . . , xn ) die Menge {ŪΦ(w) | w ∈ B∗ } Umgebungsbasis von x̄; für
jedes i ist damit {Ui prin Φ(w) | w ∈ B∗ } Basis der Umgebungen von xi . Damit ist %(Φ) = %̄Γ(Φ), falls Γ
die Eigenschaft Γ(Φ)(<1i , w>) = prin Φ(w) für w ∈ B∗ und 1 ≤ i ≤ n hat. Damit gilt auch % ≤ %̄.
2
Produkttopologien sind nicht nur für endliche, sondern auch für unendliche Produkte definiert, also z.B.
⊗ Xi . Sind die entsprechenden Räume (Xi , τi ) jeweils T0 -Räume, so ist der Proauch für Folgenräume i∈N
duktraum ebenfalls T0 -Raum, allerdings besitzt er keine abzählbare Basis (, wenn die Xi mindestens zwei
⊗ Xi bezüglich dieser ProdukttopoloElemente haben). Damit kann es keine zulässige Darstellung von i∈N
gie geben.
⊗ δi : F Â i∈N
⊗ Xi
In Definition 4.5 hatten wir ausgehend von Darstellungen δi : F ÂXi eine Darstellung i∈N
definiert. Für diese Darstellung gilt wohl:
⊗ δi zulässig bezüglich der durch die
Vermutung: δi : F Âxi seien bezüglich τi zulässig. Dann ist i∈N
folgende Basis erzeugten Topologie τ :
× Oi | Oi ∈ βi ; nur für endlich viele i ist Oi 6= Xi }
β = { i∈N
Dabei sei βi jeweils eine Basis von τi .
100
Herunterladen