2010-12-05 28 views
5

¿Cuál sería la forma más eficiente para calcular la suma de los números de Fibonacci de F(n) a F(m) donde F(n) y F(m) son enésima y mth números de Fibonacci, respectivamente, y 0 = < n < = m (con F (0) = 0, F (1) = 1).Encontrar la suma de los números de Fibonacci

Por ejemplo, si n=0, m=3, necesitamos encontrar F(0)+F(1)+F(2)+F(3).

Solo por fuerza bruta tardará mucho tiempo para el rango de n y m mencionado. Si se puede hacer a través de la exponenciación de la matriz, entonces, ¿cómo?

+0

I estaría muy feliz de saber la aplicación de esta respuesta! – rjobidon

+2

Creo que te hemos molestado lo suficiente, en particular con la pista sobre Binet (en su lugar, debes usar el álgebra lineal como se insinuó en tu pregunta). También ten en cuenta que '' F (m + 2) - F (n + 2) - 2' no es del todo correcto, pero puedes averiguarlo dado que la suma de fibo # a n es efectivamente F (n + 2) - 1 (sugerencia: quiere la suma _inclusive_ de F (n) y, por lo tanto, necesita restar la suma de fibo # hasta 'n-1' y _substract_ this de F (m + 2) -2). De todos modos ... parece y huele a 'HOMEWORK', la comunidad SO no debería ayudar demasiado ;-) – mjv

+1

@mjv - huele como un problema de competencia de codificación – Attila

Respuesta

6

F(m+2) - F(n+2) - 2 (discussion)

Literalmente, la suma de su m cota superior, menos la suma de su límite inferior n.

+2

Esto no es del todo correcto. La respuesta es simplemente F (m + 2) - F (n + 2), ya que los términos (-1) se cancelan. –

+0

@ JørgenFogh No es * no completamente correcto *, en realidad es completamente incorrecto. Sin ofender al OP de la respuesta. –

+0

@ Sнаđошƒаӽ La idea es correcta, sin embargo. La respuesta es consistentemente desactivada por 2, no completamente sin relación con la respuesta correcta. –

12

Dado que "la suma de los primeros n números de Fibonacci es el (n + 2) nd número de Fibonacci menos 1". (gracias, Wikipedia), puede calcular F(m + 2) - F(n + 2) - 2. Use Binet's Fibonacci number formula para calcular rápidamente F(m + 2) y F(n + 2). Me parece bastante eficiente.

Actualización: encontrado un viejo SO Post, "nth fibonacci number in sublinear time", y (debido a la precisión como mjv y Jim Lewis han señalado en los comentarios), you can't really escape an O(n) solution to calculate F(n).

+0

+1, para los enlaces adicionales y una respuesta más completa. – MrGomez

+0

@MrGomez tuvo que hacer +1 también por darme la fórmula básica :) – jball

+1

Todo bien en la fórmula. Cuando se trata de computación, necesitará un cálculo poderoso de Phi y/o sqrt (5) para usar Binet en números grandes ... – mjv

1

algoritmo a través de la matriz explicación propiedad encontró here y here

class Program 
{ 
    static int FibMatrix(int n, int i, int h, int j, int k) 
    { 
     int t = 0; 

     while (n > 0) 
     { 
      if (n % 2 == 1) 
      { 
       t = j * h; 
       j = i * h + j * k + t; 
       i = i * k + t; 
      } 
      t = h * h; 
      h = 2 * k * h + t; 
      k = k * k + t; 
      n = n/2; 
     } 

     return j;    
    } 

    static int FibSum(int n, int m) 
    { 
     int sum = Program.FibMatrix(n, 1, 1, 0, 0); 

     while (n + 1 <= m) 
     { 
      sum += Program.FibMatrix(n + 1, 1, 1, 0, 0); 
      n++; 
     } 

     return sum; 
    } 

    static void Main(string[] args) 
    { 
     // Output : 4 
     Console.WriteLine(Program.FibSum(0, 4).ToString()); 

     Console.ReadLine(); 
    } 
} 
8

Las primeras dos respuestas (las más antiguas) son aparentemente incorrecta a mí. De acuerdo con este discussion que ya se cita en una de las respuestas, la suma de los primeros n números de Fibonacci viene dada por:

SumFib(n) = F[n+2] - 1       (1) 

Ahora, vamos a definir SumFib(m, n) como la suma de los números de Fibonacci m-nincluido (como se requerido por OP). Entonces:

SumFib(m, n) = SumFib(n) - SumFib(m-1) 

Tenga en cuenta el segundo término. Es así porque SumFib(m) incluye F[m], pero queremos suma de F[m] a F[n]inclusive. Así que restamos suma hasta F[m-1] de suma hasta F[n]. Las matemáticas simples de kínder, ¿no?:-)

SumFib(m, n) = SumFib(n) - SumFib(m-1) 
      = (F[n+2] - 1) - (F[m-1 + 2] - 1) [using eq(1)] 
      = F[n+2] - 1 - F[m+1] + 1 
      = F[n+2] - F[m+1] 

Therefore, SumFib(m, n) = F[n+2] - F[m+1]     (2) 

Ejemplo:

m = 3, n = 7 
Sum = F[3] + F[4] + F[5] + F[6] + F[7] 
    = 2 + 3 + 5 + 8 + 13 
    = 31 

Y mediante el uso (2) derivado anteriormente:

SumFib(3, 7) = F[7+2] - F[3+1] 
      = F[9] - F[4] 
      = 34 - 3 
      = 31 

Bono:
Cuando m y n son grandes, es necesario eficiente algoritmos para generar números de Fibonacci. Aquí hay una muy buena article que explica una forma de hacerlo.

+0

+1. Estoy muy sorprendido por las votaciones en las dos respuestas anteriores. ¿Deberíamos realmente esperar que SumFib (n, n) <= 0 como afirman si la suma es inclusiva? –

+0

Gracias @Daenerys. No lo creo. 'SumFib (n, n)' debería ser muy sensiblemente igual a 'Fib (n)'. –

Cuestiones relacionadas