martes, 30 de junio de 2015

#11 Pequeño Proyecto de un grupo cuyo nombre no puedo decir

Nótese que el título está hecho para crear expectativa...pero a nadie le importa xD


Se acuerdan de la conjetura de Collatz? La he mencionado 04 veces en el blog:



En qué consiste? Voy a tomar la explicación que escribí alguna vez:

"La conjetura de Collatz es una proposición aún no demostrada ( no se sabe si es verdad o mentira) proveniente del área de La Teoría de Números (algunos prefieren llamarla "Aritmética Superior"). La conjetura dice más o menos lo siguiente: Si a cualquier número natural (1,2,3.......) le aplicas sucesivamente la regla de Collatz, que consiste en, "si el número es par (2,4,6, etc), lo divides entre 2; y si es impar (1,3,5, etc) lo multiplicas por 3 y le agregas 1"......entonces, siempre, y SIEMPRE, vas a llegar a 1.

Me explico mejor: Vamos a tomar para el ejemplo el número 5. 

El 5 es impar. La regla de Collatz dice "multiplícalo por 3 y súmale 1": 3x5+1=16. 
Ahora aplicas de nuevo la regla: El 16 es par, la regla de Collatz dice "divide entre 2": 16/2=8. 
Ooootra vez, aplicamos Collaz. 8 es par, por lo tanto, volver a dividirlo: 8/2=4. 
Nuevamente: 4 es par, entonces 4/2=2. 
2 es par, por lo tanto: 2/2=1. 
El 1 es impar, Collatz dice "multiplícalo por 3 y agrégale 1: 3x1+1=4. 
Pero el 4 ya salió antes.

Y precisamente, la Conjetura de Collatz nos dice que a cualquier número que tú le apliques sucesivamente esta regla, siempre vas a terminar en el ciclo: 4,2,1....Es una conjetura solamente, para saber si es verdad, tienes que demostrarla, y si es mentira, pues dar un contraejemplo (o sea, un número que no cumpla con esa regla)."

El asunto es que la Conjetura de Collatz no se resuelve desde que en 1969, un tal Collatz (sorpresa!) la mencionó. Yo la conocí cuando habré tenido mis 14 ó 15 años, y fue la única conjetura en la que (en ese tiempo) me sentí capaz de resolver y dedicarle realmente tiempo. Hay muchas conjeturas abiertas en matemáticas y archiconocidas, como la de Goldbach o la de Riemann, pero todo el mundo está detrás de ellas, Collatz en cambio, si bien tiene sus seguidores, la población que lo intenta resolver aún sigue siendo muy inferior que cualquiera de las anteriores.

Volviendo, estoy en un grupo en la que nos dedicamos a hacer proyectos para aprender y con ánimos de hacer por que nos gusta hacerlo (muchas veces sin ver las utilidades prácticas) y hay proyectos de todas las complejidades, desde hacer un Sistema Operativo desde cero y crear un nuevo lenguaje de programación que corra sobre él, pasando por hacer un resolutor de sudokus y terminando como los míos, que en este caso creo que ha sido el más cortito y el menos complejo. 

Como estoy aprendiendo recién javascript (el lenguaje de programación que se utiliza para hacer dinámica una web) decidí que mi primer proyecto sería escribir en js (la extensión de javascript) la función de Collatz y correrla en una web (en realidad quería hacer una página en la que introduzcas un número cualquiera en un cuadro de texto y te "bote" automáticamente toda la cadena de números) pero me conformé con el código. Fue escrito por mi amigo (él asesora y hace seguimientos a los proyectos, el pata es un capo) y yo prácticamente sólo miraba lo que hacía xD

Código escrito en javascript 

function collatz (n) {
    while (n> 1) {
        if (n % 2 === 0) {
            n = n/2;
        } else {
            n = 3*n + 1;
        }
        console.log(n);
    }
}

Código escrito en clojure


(defn collatz [n] ;; defn -> definir función
  (println n)     ;; imprimir a la consola
  (if (= n 1)     ;; si n es igual a 1
    n             ;; entonces retornar n
    (collatz      ;; sino, entonces llamar a la misma función con el resultado de abajo
     (if (= (mod n 2) 0) ;; si n es par
       (/ n 2)           ;; retornar el resultado de n/2
       (inc (* n 3)))))) ;; sino entonces retornar el resultado de n*3 + 1


Para aterrizar esto a una realidad más palpable (?) vamos a hacer una cosa. Si están usando Google Chrome (es válido también en Mozilla), hagan clic derecho sobre la página de este blog, y dénle a "Inspeccionar Elemento" (es la última de las opciones). Se les abrirá una ventana, con herramientas de desarrollador. Lo que ven es la pestaña "Elements" y el código que están viendo es HTML, el lenguaje de maquetado, y al costado, el CSS, el lenguaje de los estilos. Pero no nos vayamos por las ramas. 

Clic en la imagen para ver más grande

Ahora cambien la pestaña a "Console". No se asusten por la cantidad de líneas en rojo que aparecen, al final encontrarán al cursor tintineando para que escriban algo ahí. Pues ahí van a colocar el código de collatz (copiénlo y péguenlo ahí). Al dar enter les saldrá el mensaje "undefined".

Clic en la imagen para ver más grande



Ahora testearemos la función. Escriban  collatz(5) y den enter de nuevo. Lo que les sale es la cadena de números para el número 5 aplicada la función de Collatz, que es el ejercicio que hicimos manualmente al inicio. 

Clic en la imagen para ver más grande


Pueden probar con los números que ustedes quieran, sólo deben reemplazar el número 5 por cualquiera que se les apetezca, a mí particularmente me gusta rayar a la computadora con números como 45678909876543235693489850909386093406980753285984528493579129914903294902402309072408270820478472380748027034870340284803804720374082308470238748027304728404200

Eso es todo por hoy. Hace rato que me pasé de la regla de "30 minutos para escribir un post".

Pdta 01: Sugeriría, para los nuevos, no leer entradas antes de "Patydrómeda 2.0" (o sea, las entradas escritas antes de junio del 2015) porque era muy egocéntrica en ese entonces (lo sigo siendo) y personalmente percibo que hacía sobreesfuerzos por parecer divertida y entretenida. Como que me da rochecito.

Pdta 02: El próximo proyecto será hacer el juego de 2048 en javascript. Aunque antes de eso, a lo mejor resolveremos un problema de la Code Jam en este lenguaje.

Pdta 03: Desactivé la protección copyrigth, ésa que hace que en este blog no puedas seleccionar texto. Lo desactivé momentáneamente para que puedan copiar y pegar la función de Collatz. Para los que están interesados en implementarlo en sus blogs/página, el código es éste:

function disableselect(e){
return false
}
function reEnable(){
return true
}
document.onselectstart=new Function ("return false")
if (window.sidebar){
document.onmousedown=disableselect
document.onclick=reEnable
}

Y sí, está en javascript (por si acaso el código me lo robé "de por ahí").

4 comentarios:

  1. Me gusta la forma en la que escribes y relatas tus conocimientos , pocas personas llegan a hacer eso en mì , es genial conocerte .

    ResponderEliminar
    Respuestas
    1. Me has alegrado el día con tu comentario, gracias por eso :) No has dejado tu nombre, me dejas con la intriga!

      Eliminar
  2. matematicas, algoritmos, programacion, javascript, consola... este post me ha provocado una ereccion!
    sobre collatz, hace un año vi una obra de teatro llamada "incendios" donde hablan de su conjetura, incluso la utilizan, aunque de una forma metaforica, para resolver el gran misterio de la trama. muy interesante.
    saludos!

    ResponderEliminar
    Respuestas
    1. Felizmente encontré un fragmento de la obra en youtube, me la paso a ver...

      Eliminar