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