Conjetura de Collatz o Ulam
La conjetura de Collatz o Ulam es un famoso problema matemático aún sin resolver que afirma lo siguiente: tomando cualquier número entero positivo, si es par se lo divide entre 2, si es impar se lo multiplica por 3 y se le suma 1; repitiendo este proceso con el resultado, la secuencia siempre llegará eventualmente al número 1, sin importar el número inicial.
El enunciado formal es el siguiente: Definido para \(n\in\mathbb{N}\),
\[
f(n) =
\begin{cases}
\frac{n}{2} & \text{si } n \text{ es par} \\
3n + 1 & \text{si } n \text{ es impar}
\end{cases}
\]
\[
a_{i} =
\begin{cases}
n & \text{para } i = 0 \\
f(a_{i-1}) & \text{para } i > 0
\end{cases}
\]
Realizando iteraciones sucesivas, el proceso termina en 1 para cualquier entero positivo inicial (según la conjetura).
Se solicita que realice un programa para implementar esta conjetura, con lo siguiente:
- Una función que retorne verdadero si un número es par y falso si no lo es.
- Una función que aplique la operación \(n/2\) para \(n\) par.
- Una función que aplique la operación \(3n+1\) si \(n\) es impar.
- Mostrar todos los valores de la secuencia hasta terminar en \(1\).
Además, el programa debe determinar:
- La cantidad de números pares que se generaron.
- La cantidad de números impartes que se generaron.
- El máximo valor obtenido.
Ejemplos
Ingrese n: 10
10
5
16
8
4
2
1
Máximo: 16
Cantidad de pares: 5
Cantidad de impares: 2
Ingrese n: 100
100
50
25
76
38
19
58
29
88
44
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1
Máximo: 88
Cantidad de pares: 18
Cantidad de impares: 8
Solución
def par(n):
return n % 2 == 0
def f_par(n):
return n // 2
def f_impar(n):
return 3 * n + 1
n = int(input("Ingrese n: "))
maximo = 1
pares = 0
impares = 1 # Considerando el 1
while n > 1:
print(n)
if par(n):
n = f_par(n)
pares += 1
else:
n = f_impar(n)
impares += 1
if n > maximo:
maximo = n
print(n) # Imprime el 1 final
print("Máximo:", maximo)
print("Cantidad de pares:", pares)
print("Cantidad de impares:", impares)