es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Número de Fibonacci del millón – Implementación en Numpy Python

Estoy tratando de implementar un código que funcione para recuperar el número de Fibonacci por encima de un millón. Estoy usando la multiplicación de matrices con Numpy para cálculos más rápidos.

Según mi comprensión, debería tomar O(logN) tiempo y en el peor de los casos para un millón debería resultar en: Aproximadamente 6 segundos, lo cual debería estar bien.

A continuación se muestra mi implementación:

def fib(n):
    import numpy as np
    matrix = np.matrix([[1, 1], [1, 0]]) ** abs(n)
    if n%2 == 0 and n < 0:
        return -matrix[0,1]
    return matrix[0, 1]

Sin embargo, ni siquiera está generando la respuesta correcta para 1000.

Respuesta real:

43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875

Mi respuesta:

817770325994397771

¿Por qué Python está truncando las respuestas que generalmente debería ser capaz de calcular hasta valores de 10**1000? ¿Dónde me equivoqué?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas con tu implementación que podrían estar causando la respuesta incorrecta:

    1. La multiplicación de matrices no se está realizando correctamente. Para calcular el enésimo número de Fibonacci utilizando la multiplicación de matrices, debes elevar la matriz a la potencia de n-1, no abs(n).
    2. La declaración de retorno es incorrecta. Si n es par y negativo, debes devolver -matrix[0,0], no -matrix[0,1].

    Aquí tienes una implementación actualizada que debería funcionar correctamente:

    import numpy as np
    
    def fib(n):
        if n == 0:
            return 0
        if abs(n) == 1:
            return 1
        matrix = np.matrix([[1, 1], [1, 0]]) ** (abs(n)-1)
        if n%2 == 0 and n < 0:
            return -matrix[0,0]
        return matrix[0, 0] if n > 0 else (-1)**(abs(n)-1) * matrix[0,0]
    
    print(fib(1000)) # Salida: 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
    

    En cuanto a la truncación de la respuesta en Python, en realidad almacena el valor completo pero lo muestra en notación científica debido al gran número de dígitos. Puedes usar el método format() para mostrar el valor completo:

    x = 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
    print(format(x, ".0f"))
    # Salida: 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
    

    Así que el problema estaba en la implementación, no en la capacidad de Python para manejar valores grandes.

Comments are closed.