p liczbę Fibonacciego można obliczyć w czasie liniowej stosując następujący nawrotu:
def fib(n):
i, j = 1, 1
for k in {1...n-1}:
i, j = j, i+j
return i
p liczbę Fibonacciego może być obliczana jako . Ma to jednak problemy z zaokrąglaniem nawet dla stosunkowo niewielkiej . Prawdopodobnie są na to sposoby, ale wolałbym tego nie robić.
Czy istnieje wydajny (logarytmiczny w wartości lub lepszej) algorytm do obliczania tej liczby Fibonacciego, który nie opiera się na arytmetyki zmiennoprzecinkowej? Załóżmy, że operacje na liczbach całkowitych ( , , , ) mogą być wykonywane w stałym czasie.n + - × /
Odpowiedzi:
Możesz użyć zasilania macierzy i tożsamości W twoim modelu obliczeniowym jest to algorytm O ( log n ) , jeśli używasz powtarzającego się kwadratu, aby zaimplementować zasilanie.
źródło
Możesz przeczytać ten artykuł matematyczny: Szybki algorytm obliczania dużych liczb Fibonacciego (Daisuke Takahashi): PDF .
Mówiąc prościej, zaimplementowałem kilka algorytmów Fibonacciego w C ++ (bez GMP iz GMP) oraz w Pythonie. Kompletne źródła na Bitbucket. Na stronie głównej możesz również przejść do linków do:
Najbardziej przydatne formuły to:
Uważaj na algorytm. Nie wolno obliczać tej samej wartości kilka razy. Prosty algorytm rekurencyjny (w języku Python):
Jego złożoność jest logarytmiczna (jeśli podstawowe operacje odbywają się w stałym czasie): .O ( logn )
źródło
Sprawdź bezpłatną książkę Matters Computational i kod pari / gp.
źródło