nte Fibonacci-Zahl in der sublinearen Zeit
Gibt es eine Algorithmus zum berechnen der N-TEN fibonacci-Zahl im sub-lineare Zeit?
InformationsquelleAutor der Frage Biswajyoti Das | 2009-10-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Algorithmus zum berechnen der N-TEN fibonacci-Zahl im sub-lineare Zeit?
InformationsquelleAutor der Frage Biswajyoti Das | 2009-10-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
n
TEN Fibonacci-Zahl ist gegeben durchwo
Unter der Annahme, dass der primitive mathematische Operationen (
+
-
*
und/
)O(1)
können Sie dieses Ergebnis, um zu berechnenn
TEN Fibonacci-Zahl inO(log n)
Zeit (O(log n)
wegen der Potenzierung in der Formel).In C#:
InformationsquelleAutor der Antwort jason
Folgenden von Pillsy die Referenz zu matrix-Potenzierung, so dass für die matrix
dann
Erhöhung Matrizen zu Kräfte, durch wiederholte Multiplikation ist nicht sehr effizient.
Zwei Ansätze zur matrix-Potenzierung sind Teile und herrsche-das bringt Mn in O( - ln n) Schritte, oder Eigenwert-ZERLEGUNG, die Konstante Zeit, aber können zu Fehlern aufgrund der begrenzten floating-point-Präzision.
Wenn Sie wollen, einen genauen Wert, der größer ist als die Präzision der Gleitkomma-Implementierung haben, müssen Sie auf die O ( ln n ) - Ansatz basiert auf dieser relation:
Die Eigenwert-ZERLEGUNG auf M findet zwei Matrizen U und Λso dass Λ ist diagonal und
Eine Erhöhung der diagonalen matrix Λ n - te Potenz ist einfach eine Frage der Anhebung jedes element in Λ nth, so ist dies eine O(1) Methode der Erhöhung M n - te Potenz. Jedoch die Werte in Λ werden wohl keine ganzen zahlen, so dass einige Fehler auftreten.
Definieren Λ für unsere 2x2-matrix als
Finden λwir lösen
gibt
mithilfe der quadratischen Formel
Wenn Sie gelesen haben Jason ' s Antwort, Sie können sehen, wohin das gehen wird.
Lösung für die Eigenvektoren X1 und X2:
Diese Vektoren geben U:
Invertierenden U mit
so U-1 ist gegeben durch
Sanity-check:
Also die Plausibilitätsprüfung hält.
Nun haben wir alles, was wir brauchen, um zu berechnen, Mn1,2:
so
Das stimmt mit der angegebenen Formel anderswo.
Können Sie ableiten aus einer recurrance Verhältnis, aber in engineering computing und simulation die Berechnung der Eigenwerte und Eigenvektoren von großen Matrizen ist eine wichtige Aktivität, da es Stabilität gibt und Obertöne der Systeme von Gleichungen, sowie die Anhebung der Matrizen zu hohe Kräfte effizient.
InformationsquelleAutor der Antwort Pete Kirkham
Wenn Sie möchten, dass die genaue Anzahl (was ist ein "bignum", sondern als ein int/float), dann fürchte ich, dass
Es ist unmöglich!
Wie gesagt die Formel für die Fibonacci-zahlen lautet:
Wie viele Ziffern ist
fib n
?Da die angeforderten Ergebnis ist der O(n), es kann nicht berechnet werden, in weniger als O(n) Zeit.
Wenn Sie nur wollen, die niedrigere Ziffern für die Antwort, dann ist es möglich zu berechnen, in sub-linearen Zeit mit der matrix-Potenzierung-Methode.
InformationsquelleAutor der Antwort yairchu
Einer der übungen in SICP ist über diese, was hat die Antwort beschrieben hier.
In der Imperativ-Stil, das Programm würde so Aussehen
InformationsquelleAutor der Antwort Nietzche-jou
Können Sie es exponentiating eine matrix von Integer-zahlen, wie gut. Wenn Sie die matrix
dann
(M^n)[1, 2]
wird gleich dern
TEN Fibonacci-Zahl, wenn[]
ist eine matrix hoch-und^
ist matrix-Potenzierung. Für eine Feste Größe-matrix, Potenzierung, um eine positive ganzzahlige Potenz kann durchgeführt werden in O(log n) Zeit in der gleichen Weise wie mit reellen zahlen.EDIT: natürlich abhängig von der Art der Antwort, die Sie wollen, können Sie in der Lage sein, um Weg mit einem konstant-Zeit-Algorithmus. Wie die anderen Formeln zeigen, die
n
TEN Fibonacci-Zahl wächst exponentiell mitn
. Auch mit 64-bit vorzeichenlosen Ganzzahlen, Sie müssen nur eine 94-Eintrag lookup-Tabelle, um zu decken das ganze Spektrum.ZWEITER EDIT: Tun das matrix-exponential, mit einer eigendecomposition erste entspricht genau JDunkerly die Lösung unten. Die Eigenwerte dieser matrix sind die
(1 + sqrt(5))/2
und(1 - sqrt(5))/2
.InformationsquelleAutor der Antwort Pillsy
Wikipedia hat eine geschlossene form der Lösung
http://en.wikipedia.org/wiki/Fibonacci_number
Oder in c#:
InformationsquelleAutor der Antwort JDunkerley
Für die wirklich großen dieser rekursiven Funktion arbeiten. Dabei verwendet er die folgenden Gleichungen:
Müssen Sie eine Bibliothek, ermöglicht Ihnen die Arbeit mit großen ganzen zahlen. Ich benutze die BigInteger Bibliothek von https://mattmccutchen.net/bigint/.
Beginnen mit einem array von fibonacci-zahlen. Verwenden fibs[0]=0, fibs[1]=1 fibs[2]=1 fibs[3]=2, fibs[4]=3, usw. In diesem Beispiel verwende ich ein array von der ersten 501 (gezählt von 0). Finden Sie die ersten 500 nicht-null Fibonacci-zahlen hier: http://home.hiwaay.net/~jalison/Fib500.html. Es dauert ein wenig Bearbeiten, um es in das richtige format, aber das ist nicht allzu schwer.
Dann finden Sie jede Fibonacci-Zahl die Verwendung dieser Funktion (in C):
Ich habe getestet dieses für die 25.000 TEN Fibonacci-Zahl und dergleichen.
InformationsquelleAutor der Antwort user3137939
Hier ist meine rekursive version, die eine Rekursion log(n) Zeit. Ich denke, es ist am einfachsten zu Lesen in der rekursiven form:
Funktioniert es, weil Sie berechnen können
fib(n),fib(n-1)
mitfib(n-1),fib(n-2)
wenn n ungerade ist, und wenn n gerade ist, können Sie berechnenfib(n),fib(n-1)
mitfib(n/2),fib(n/2-1)
.Base case und der seltsame Fall sind einfach. Zur Ableitung der auch Fall, beginnen Sie mit a,b,c als aufeinander folgende fibonacci-Werte (z.B., 8,5,3) und schreiben Sie in eine matrix mit a = b+c. Hinweis:
Aus, dass wir sehen, dass eine matrix aus den ersten drei fibonacci-zahlen, Zeiten einer matrix mit drei beliebige aufeinander folgende fibonacci-zahlen, ist gleich der nächste. So wissen wir, dass:
Also:
Vereinfachen der rechten Seite führt zu den selbst Fall.
InformationsquelleAutor der Antwort Eyal
mithilfe R
InformationsquelleAutor der Antwort George Dontas
sehen und herrsche " - Algorithmus hier
Den link hat pseudocode für die matrix-Potenzierung erwähnt in einigen der anderen Antworten zu dieser Frage.
InformationsquelleAutor der Antwort Chinmay Lokesh
Fixed point Arithmetik ist ungenau. Jason ist C# - code gibt falsche Antwort für n = 71 (308061521170130 statt 308061521170129) und darüber hinaus.
Für die richtige Antwort, verwenden Sie ein Computer-algebra-system. Sympy ist wie eine Bibliothek für Python. Es gibt eine interaktive Konsole in http://live.sympy.org/ . Kopieren und einfügen mit dieser Funktion
Dann berechnen
Vielleicht möchten Sie versuchen, die Inspektion
phi
.InformationsquelleAutor der Antwort Colonel Panic
Können Sie die seltsam eckige rooty Gleichung um eine genaue Antwort. Der Grund dafür ist, dass die $\sqrt(5)$ fällt aus am Ende, Sie müssen nur behalten die Koeffizienten mit Ihren eigenen Vermehrung format.
InformationsquelleAutor der Antwort Scott
Hier ist ein one-liner berechnet, dass F(n), mit ganzen zahlen der Größe O(n) O(log n) arithmetische Operationen:
Verwendung von ganzen zahlen der Größe O(n) zumutbar ist, weil das ist vergleichbar um die Größe der Antwort.
Um dies zu verstehen, lassen Sie phi-der goldene Schnitt (die größte Lösung für x^2=x+1) und F(n) die n ' te Fibonacci-Zahl, wobei F(0)=0, F(1)=F(2)=1
Nun, phi^n = F(n-1) + F(n)phi.
Auch zahlen der form (a+b*phi), wobei a, b sind Ganzzahlen geschlossen unter Multiplikation.
Mithilfe dieser Darstellung kann man berechnen phi^n in O(log n) integer-Operationen mit Potenzierung durch Quadratur. Das Ergebnis wird sein, F(n-1)+F(n) - phi, aus denen man ablesen kann der n ' te Fibonacci-Zahl.
Beachten Sie, dass die Mehrheit dieser code ist ein standard-Potenzierung-von-Quadratur-Funktion.
Man die one-liner, beginnt diese zu beantworten, kann man festhalten, dass die Repräsentation von phi durch eine ausreichend große ganzzahlige
X
kann man durchführen(a+b*phi)(c+d*phi)
als integer-operation(a+bX)(c+dX) modulo (X^2-X-1)
. Dann diepow
Funktion ersetzt werden kann durch die standard-Python -pow
- Funktion (die beinhaltet praktischerweise ein drittes argumentz
berechnet das Ergebnis moduloz
. DieX
gewählt ist2<<i
.InformationsquelleAutor der Antwort Paul Hankin