O º número de Fibonacci pode ser calculado em tempo linear usando o seguinte recorrência:
def fib(n):
i, j = 1, 1
for k in {1...n-1}:
i, j = j, i+j
return i
O º número de Fibonacci também pode ser computada como . No entanto, isso tem problemas com problemas de arredondamento para relativamente pequeno . Provavelmente existem maneiras de contornar isso, mas eu prefiro não fazer isso.
Existe uma eficiente (logarítmica no valor ou melhor) algoritmo para calcular o º número de Fibonacci que não depende de aritmética de ponto flutuante? Suponha que operações inteiras ( , , , ) possam ser executadas em tempo constante.
Respostas:
Você pode usar a alimentação de matriz e a identidade No seu modelo de computação, este é um algoritmo O ( log n ) se você usar quadrados repetidos para implementar a alimentação.
fonte
Você pode ler este artigo matemático: Um algoritmo rápido para calcular grandes números de Fibonacci (Daisuke Takahashi): PDF .
Mais simples, implementei vários algoritmos de Fibonacci em C ++ (sem e com GMP) e Python. Fontes completas no Bitbucket. Na página principal, você também pode seguir os links para:
As fórmulas mais úteis são:
Tenha cuidado com o algoritmo. Você não deve calcular o mesmo valor várias vezes. Um algoritmo recursivo simples (em Python):
Sua complexidade é logarítmica (se as operações básicas estiverem em tempo constante): .O(logn)
fonte
Verifique o livro gratuito Matters Computational e o código pari / gp.
fonte