Auf die folgende Berechnungsmethode bin ich gestoßen, als ich die
Eigenschaften von näher untersucht habe. Dabei dürfte ich
wohl ein mir bisher unbekanntes Verfahren »wiederentdeckt« haben.7 Vielleicht ist die Herleitung aber interessant:
Betrachten wir das charakteristische Polynom x2 - x - 1. Nullsetzen
ergibt x2 = x + 1. Die Nullstellen sind und
. Für
diese gilt x2 = x + 1.
Für x3 erhalten wir daraus x3 = x2 . x = (x + 1) . x = x2 + x = (x + 1) + x = 2x + 1 = F3 . x + F2; analog ergibt sich induktiv
Mit diesem Wissen können wir die geschlossene Form auch einfach ausrechnen:
ebenso:
Kennen Sie komplexe Zahlen? Ähnlich, wie man diese konstruiert, können
wir auch hier vorgehen: Definiere
a : = (a1, a2) : = a1 . + a2;
analog sei
b : = (b1, b2) : = b1 .
+ b2.
Die Definition eines solchen Zahlenpaares ist in dem Sinne eindeutig,
dass es eine reelle Zahl darstellt, welche nicht durch ein anderes
Paar aus rationalen (und daher erst recht nicht natürlichen) Zahlen
gebildet werden kann. Denn sei z.B. a = b, also
a1 . + a2 = b1 .
+ b2,
dann folgt
(a1 - b1) .
= b2 - a2, womit die rechte
Seite der Gleichung entweder null oder ebenfalls irrational sein muß.
Mit obiger Definition gelten folgende Rechenregeln:
In dieser Struktur kann man also »addieren« und »multiplizieren«.
Wir stellen fest, daß
= 1 = (0, 1),
=
= (1, 0),
=
+ 1 = (1, 1) und allgemein gilt:
= Fn .
+ Fn-1 = (Fn, Fn-1).
Dies liefert uns ein Verfahren, um
(Fn, Fn-1) durch schnelle
Exponentiation (durch fortgesetztes Quadrieren mit anschließendem
Zusammenmultiplizieren der zu den Zweierpotenzen gehörigen Quadrate)
zu bestimmen. Die Lösung für allgemeine Fibonaccifolgen ergibt sich
dann mittels 4.1.2.
Der Algorithmus cap:ExpoAlgorithmus erwartet ein Fibonaccizahlenpaar x : = (f1, f0) mit den Startwerten der Fibonaccifolge sowie den Index n und liefert dann das Paar (fn, fn-1) als Ergebnis zurück.
Es geht noch schneller, wenn man die binäre Exponentiation ein wenig umgestaltet und vom höchstwertigen Bit abwärts verlaufen läßt; abhängig vom jeweiligen Bit ist dann entweder (F2i, F2i-1) oder (F2i+1, F2i) zu bestimmen. Dabei kommt man mit reinen Quadrierungsschritten aus und kann die Multiplikationen einsparen. Für jeden Schritt sind dann nur noch zwei skalare Quadrierungen sowie einige billige Operationen (Addition, Subtraktion, Shiften) erforderlich. Erläuterungen hierzu und eine Implementierung finden sich beispielsweise in [GNU MP]. - Solche »Exponentiationsalgorithmen« kann man auch allgemein betrachten und weiteren Optimierungen unterziehen (wobei sich wiederum ein Bezug zu den Fibonaccizahlen ergibt); siehe [PLMo92] für eine solche Untersuchung.
Thorsten Reinecke 2004-07-11