Die te Fibonacci-Zahl kann in linearer Zeit unter Verwendung der folgenden Wiederholung berechnet werden:
def fib(n):
i, j = 1, 1
for k in {1...n-1}:
i, j = j, i+j
return i
Die - te Fibonacci - Zahl kann auch wie folgt berechnet werden [ φ n / √. Dies hat jedoch Probleme mit Rundungsproblemen für selbst relativ kleinen. Es gibt wahrscheinlichMöglichkeiten, dies zuumgehen, aber ich würde das lieber nicht tun.
Gibt es einen effizienten (logarithmischen im Wert oder besser) Algorithmus, um die n- te Fibonacci-Zahl zu berechnen , die nicht auf Gleitkomma-Arithmetik beruht? Nehmen Sie an, dass Ganzzahloperationen ( + , - , × , / ) in konstanter Zeit ausgeführt werden können.
Antworten:
Sie können Matrix-Powering und die Identität In Ihrem Berechnungsmodell ist dies ein O ( log n ) -Algorithmus, wenn Sie das Powering durch wiederholtes Quadrieren implementieren.
quelle
Sie können diesen mathematischen Artikel lesen: Ein schneller Algorithmus zur Berechnung großer Fibonacci-Zahlen (Daisuke Takahashi): PDF .
Einfacher ausgedrückt, habe ich mehrere Fibonacci-Algorithmen in C ++ (ohne und mit GMP) und Python implementiert. Komplette Quellen auf Bitbucket. Auf der Hauptseite können Sie auch Links folgen zu:
Die nützlichsten Formeln sind:
Seien Sie vorsichtig beim Algorithmus. Sie dürfen nicht mehrmals denselben Wert berechnen. Ein einfacher rekursiver Algorithmus (in Python):
Seine Komplexität ist logarithmisch (wenn die Grundoperationen in konstanter Zeit ablaufen): .O(logn)
quelle
Grundlegende Theorie und Code zur Berechnung linearer Wiederholungen mit konstanten Koeffizienten inO ( log2n ) ist abrufbar unter http://www.jjj.de/ .
Überprüfen Sie das kostenlose Buch Matters Computational und den Pari- / GP-Code.
quelle