Ich wechsle von n nach m für den ersten Teil der Antwort.
F (m + 1)/F (m) ist ein Verhältnis, das verwendet wird, um einen ungefähren Wert für F (m) zu erhalten, nicht die Zeit. Beginnend bei m> = 1, wenn m zunimmt, konvergiert das Verhältnis F (m + 1)/F (m) schnell zu φ = (1 + sqrt (5))/2 ~ = 1,61803. Dies kann als F (m + 1) ~ = φ F (m) wiedergegeben werden.Dann ist F (m + 2) ~ = φ F (m + 1) ~ = φ (φ F (m)) ~ = φ^2 F (m) und allgemein F (m + k) ~ = φ^k F (m), eine vernünftige Näherung für m> = 10, wie in der Tabelle am Ende dieser Antwort gezeigt. Der Absatz macht dann einen plötzlichen Sprung zu der Aussage, dass F (n)> 1,6^n, was nur für n> = 72 gilt. Der Absatz adressiert dann den Rekursionsbaum, der nur Addition beinhaltet, und stellt fest, dass Die Blattknoten des Rekursionsbaums geben nur 0 (F (0)) oder 1 (F (1)) zurück, sodass Sie mindestens 1,6^n (nicht 1,6n) Blattknoten benötigen (1,6^n Blattknoten, die 1 zurückgeben) um eine Summe> = 1,6^n zu erzeugen. (Man beachte, dass F (n)> 1,6^n nur für n> = 72 gilt).
Wie bei einem schnelleren Algorithmus ähnelt eine Lucas-Sequenzmethode einer optimierten Matrixexponentiation durch die Quadrierungsmethode. Der Maximalwert für eine 64-Bit-Ganzzahl ohne Vorzeichen ist fib (93) == 12200160415121876738 (was im folgenden Code 7 Schleifen erfordern würde).
/* lucas sequence method */
uint64_t fib(uint64_t n) {
uint64_t a, b, p, q, aq, qq;
a = q = 1;
b = p = 0;
while(1){
if (n & 1) {
aq = a*q;
a = b*q + aq + a*p;
b = b*p + aq;
}
n >>= 1;
if (n == 0)
break;
qq = q*q;
q = p*q*2 + qq;
p = p*p + qq;
}
return b;
}
Um eine Vorstellung davon, wie genau die Näherung F (m + k) geben ~ = φ^k F (m) wird unter Verwendung von F (100) als Testfall im Vergleich zu Werte von m (10, 20 , 30, 40).
F(100)/(φ^90 F(10)) ~= 1.0000661
F(100)/(φ^80 F(20)) ~= 1.00000000437
F(100)/(φ^70 F(30)) ~= 1.000000000000289
F(100)/(φ^60 F(40)) ~= 1.0000000000000000191
Ich wähle diese Frage als Wegthema zu schließen, weil sie sich auf [Informatik] (http://cs.stackexchange.com) –
Komplexität des naiven Fibonacci Rekursion ist ... Fibonacci! –
Werfen Sie einen Blick [hier] (http://marcodiiga.github.io/linear-recurrence-relations) für einen interessanten Weg, mit Fibonacci-Berechnungen umzugehen. –