martes, 26 de junio de 2018

VBA: Conjetura de Collatz y Excel

Un fantástico 'loco' matemático alemán, Lothar Collatz, enunció en 1937 la que se llamó 'Conjetura de Collatz'... que viene a decir lo siguiente:
Definida una función f(x) para números enteros positivos, siendo:
f(n) = 3n+1 si n es impar
f(n) = n/2 si n es par

Dado un entero m define una secuencia tal que
a(1) = m
y
para i ≥ 1, a(i+1) = f(a(i)).
El problema o conjetura de Collatz nos dice que para cualquier valor inicial m, la secuencia a(i) siempre nos conducirá a 1 !!??

Lo interesante del tema es que la conjetura aún permanece sin demostración!.... aún hoy se sigue buscando un número de partida que rompa con la premisa.

Puedes leer algo más al respecto en la Wikipedia.


Hoy haremos una proyección para los primeros 1.000 números enteros, viendo como se cumple en cada caso... desarrollando un algoritmo con VB para replicar el 'problema de Collatz'

Insertaremos el siguiente procedimiento en un módulo estándar:

Sub Collatz_Serie()
Application.ScreenUpdating = False
'recorremos enteros entre 2 y 1000
For i = 2 To 1000
    'iniciamos el contador de iteraciones para cada entero
    contador = 1
    'damos valor a n
    n = i
    Cells(i - 1, contador + 1).Value = n
    'conjetura de Collatz
    'inicio del algoritmo
    Do
        'si es par dividimos por 2
        If n Mod 2 = 0 Then
            n = n / 2
        Else
        'si es impar multiplicamos por 3 y sumamos 1
            n = 3 * n + 1
        End If
        'incrementamos el contador
        contador = contador + 1
        'y devolvemos el resultado a la hoja de cálculo..
        Cells(i - 1, contador + 1).Value = n
    Loop Until n = 1    'salimos del bucle cuando alcancemos el entero esperado n=1
    
    'llevamos el dato del contador a la columna A
    With Cells(i - 1, "A")
        .Value = contador
        .Font.Bold = True
        .Font.Color = vbRed
    End With
Next i
Application.ScreenUpdating = True
End Sub



Nuestra macro comienza la secuencia desde la columna B hacia la derecha, por cada fila, i.e., por cada entero, hasta llegar a 1.
Y finalmente coloca en la columna A el número de iteraciones que ha necesitado para alcanzar la unidad.

VBA: Conjetura de Collatz y Excel



Como curiosidad si construimos un gráfico de dispersión con los rangos B1:B999 como valores de X y A1:A999 como valores de Y tendríamos este curioso gráfico que nos deja entrever una cierta distribución lógica del número de repeticiones necesarias para alcanzar el 1

VBA: Conjetura de Collatz y Excel



No intentes el proceso para números muy grandes por que Excel sobrepasa rápidamente sus especificaciones y entra en un problema de 'sobrepasamiento'.

No hay comentarios:

Publicar un comentario