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.
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.
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):
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.
La impresión de un PDF en cualquier impresora se puede automatizar con un bot de…
Hoy te enseñaré cómo enviar un mensaje a un usuario desde un bot de Telegram…
El día de hoy te enseñaré algo muy sencillo pero útil al programar con PHP:…
El plugin para imprimir en impresoras térmicas alcanza hoy su versión 3.4.0 agregando soporte para…
En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…
Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…
Esta web usa cookies.