Hoy vamos a implementar la conjetura de Collatz en C. Aunque decir “implementar” la conjetura de Collatz no tiene sentido, así que mejor dicho vamos a tratar de probar la conjetura de Collatz.
Si en algún momento entramos a un ciclo infinito podríamos decir que la conjetura de Collatz es falsa, pero eso no ha pasado hasta el día de hoy.
Como sea, vamos a hacer una función que te indica las iteraciones que le llevan a un número llegar a 1 siguiendo la operación de 3N+1 si el mismo es impar, y dividiendo al número entre 2 si es par.
Además de indicar las iteraciones vamos a imprimir la secuencia de números.
Conjetura de Collatz en C
Entonces simplemente vamos a tener un número y haremos un ciclo que se va a ejecutar mientras el mismo sea distinto de 1. Dentro del ciclo vamos a comprobar si el número es par, y en caso de que así sea, lo vamos a dividir entre 2.
En caso de que el número no sea par, vamos a multiplicarlo por 3 y sumarle 1. La conjetura dice que no importa el número ya que siempre vamos a terminar en 1.
Nota: si por alguna razón el ciclo se repitiera infinitamente, estarías comprobando que la conjetura es falsa (yo he probado hasta con 9000000
y siempre llega a 1; otros han probado con números mucho más grandes y sigue cumpliéndose).
Por cierto, he usado el tipo de dato unsigned long long
para manejar números grandes. Si tú quieres o te confunde usar este tipo de dato puedes usar simplemente un int
, aunque debes tener cuidado con los desbordamientos.
Modo de uso
El modo de uso es el siguiente. Definimos el número del cual queremos la sucesión, invocamos a la función y obtenemos el resultado, que será el número de iteraciones que llevó para llegar a 1.
Recuerda que la función va a imprimir la sucesión de números cuando la invoques.
Al ejecutarlo con el número que ves, la salida es:

Y podemos hacer más pruebas. Por ejemplo, entre el 2 y el 9000000, ¿Cuál número da la mayor cantidad de iteraciones para llegar al 1? y no es 9000000, sino 8400511
como podemos comprobar a continuación:
La salida es la siguiente (si lo vas a probar, comenta la línea que imprime la sucesión):

Poniendo todo junto
El código completo junto con su implementación en el main
queda así:
Por aquí te dejo más tutoriales de programación en C.