En cuanto a las formas de comprobar si un número es un número de Fibonacci, hablaré de las pruebas eficientes ya que los otros aspectos parecen cubiertos. En primer lugar, debe comprobar si el residuo mod algún número fijo es posible para un número de Fibonacci. Sloane's A189761 da la secuencia de módulos "buenos" a utilizar: por ejemplo, sólo hay 54 residuos distintos mod 39088169 que contienen números de Fibonacci. Una búsqueda binaria en ellos permite eliminar rápidamente el 99,9998% de los números posibles. (Dependiendo de lo grande que quieras ir, puede ser aconsejable un número más pequeño o más grande).
Por supuesto, para números muy pequeños puede optar por hacer una búsqueda binaria directamente antes de comprobar los residuos hasta el módulo elegido.
Para los números que pasan la prueba, el 5n 2 La prueba de ± 4 es la mejor, y probablemente sea sensato hacerla directamente: la prueba de residuos anterior garantiza que el número no es de una clase de congruencia prohibida para su módulo. Es decir, calcular la raíz cuadrada del número y ver si se acerca a un número entero. Si es así, eleve al cuadrado y compruebe si el resultado es el número original. Los métodos del artículo de Bernstein "Detección de potencias perfectas en tiempo esencialmente lineal" (sección 8) pueden utilizarse aquí si se desea.
Tenga en cuenta que si n < 0 sólo tiene que probar 5n 2 + 4.
0 votos
El Fórmula de Binet debería ser útil.
0 votos
@J.M :Conocía la fórmula de Binnet pero no sirve de mucho cuando se trata de generar hasta $10^{12}$ o más, ya que perderá precisión debido a la operación en coma flotante, también hay un algoritmo de tiempo O(lg n) que utiliza el truco de la exponenciación matricial para calcular
fib(n)
pero no quiero generar y comprobar.0 votos
@J.M:¿O quieres decir que puedo reducir la fórmula de Binnet a algo que se pueda utilizar para comprobar?
0 votos
Un hilo relacionado en stackoverflow: stackoverflow.com/questions/2432669/