Implementación de algoritmos de teoría de números/Conjetura de Collatz
La conjetura de Collatz es una conjetura de teoría de números, debida a Lothar Collatz, que fue quien la propuso en 1937. La conjetura también es conocida como conjetura 3n + 1. La conjetura puede ser descrita como sigue. Tómese cualquier entero positivo n. Si n es par, divídase por 2 para obtener n / 2. Si n es impar, multiplíquese por 3 y súmese 1 para obtener 3n + 1. Repítase el proceso indefinidamente. La conjetura dice que independientemente del número por el que se empiece, siempre se alcanzará el 1, concretamente la secuencia 4,2,1 que se repetirá indefinidamente.
Descripción formal
editarSea la siguiente operación, aplicable a cualquier número entero positivo:
- Si el número es par, se divide entre 2.
- Si el número es impar, se multiplica por 3 y se suma 1.
Formalmente, esto equivale a una función , que en notación de aritmética modular queda expresada como:
Ahora, se forma una sucesión mediante la aplicación de esta operación repetidamente, comenzando por cualquier entero positivo, y tomando el resultado de cada paso como la entrada del siguiente.
En notación:
(esto es: es el valor de aplicado a recursivamente veces; ).
La conjetura de Collatz es: El proceso alcanzará eventualmente el número 1, independiente del entero positivo que haya sido elegido inicialmente.
El menor i tal que ai = 1 se denomina tiempo de parada total de n. La conjetura asegura que n tiene un tiempo de parada total bien definido. Si, para algún n, tal que i no exista, se dirá que n tiene un tiempo de parada infinito y la conjetura es falsa.
Implementación en distintos lenguajes de programación
editarC
editarvoid collatz(long int n) {
while (n > 1) {
printf("%d", n);
if ((n % 2) == 1)
n = 3 * n + 1;
else
n = n / 2;
}
printf("%d", n);
}
Python
editardef collatz(n):
result = [n]
while n > 1:
if (n % 2) == 0:
n = n/2
else:
n = n*3 + 1
result.append(n)
print(result)
Java
editar(versión recursiva)
static void collatz(int n) {
System.out.println(n);
if (n>1) {
if (n%2==0)
collatz(n/2);
else
collatz(3*n+1);
}
}
Haskell
editarcollatz :: (Integral a)=>a->[a]
collatz 1 = [1]
collatz n
| even n = n:collatz (div n 2)
| otherwise = n:collatz (3*n + 1)
MATLAB
editarfunction c = collatz(n)
c(1) = n;
r = 2;
while n ~= 1
if ~mod(n,2)
c(r) = n/2;
else
c(r) = 3*n + 1;
end
n = c(r);
r = r + 1;
end
end
JavaScript
editarfunction collatz(n) {
while(n !== 1) {
if(n % 2 == 0) // Si es par
n = n / 2
else
n = (n * 3) + 1
}
}