30 dic 2016

Cómo resolver el enigma de lógica más difícil del mundo

Hay enigmas complicados que se enuncian de forma muy sencilla. Los de lógica son un buen ejemplo: manejan términos que todos entendemos (como mentir o decir la verdad), pero tenemos que ser muy ocurrentes para resolverlos. El conocido como "problema de lógica más difícil del mundo" está al alcance de todos si lo abordamos sistemáticamente, y durante su resolución descubriremos técnicas muy útiles para lidiar con problemas de otro tipo. Su autor, Smullyan, un pianista, mago, humorista y matemático es más interesante aún que el propio enigma.

El problema fue publicado por George Boolos en la Harvard Review of Philosophy en 1996, pero su creador es Raymond Smullyan, un hombre fascinante cuyo retrato esbozamos al final de la entrada.

Aquí os dejo una versión equivalente que ha sufrido algunas modificaciones narrativas por mi parte, pero cuya esencia lógica sigue siendo exactamente la misma:

Enunciado "literario":

Estás frente a tres ordenadores A, B y C (aparentemente iguales) que responden "0" y "1" a preguntas del tipo "sí" o "no", y no se sabe si 0 significa no y 1 significa sí o viceversa ("0"="sí", "1"="no"). 

Uno de ellos tiene un sistema operativo Linux y siempre dice la verdad, otro es la computadora Skynet y siempre miente y otro lleva Windows y responde aleatoriamente, como si tirara una moneda y contestara "0" si sale cara y "1" si sale cruz. 

Haciéndoles tres preguntas del tipo "sí" o "no" (tienes que elegir a qué ordenador le haces cada pregunta [no vale preguntar algo y que contesten los tres] y puedes hacerles preguntas a ordenadores distintos) a las que contestarán con "1" o "0", ¿podrías determinar qué sistema operativo (Linux, Windows, Skynet) lleva cada ordenador (A,B,C)? ¿Cuáles serían esas tres preguntas?


Enunciado más sencillo:

Con tres preguntas de o no (a las que responderán con 1 ó 0), tienes que adivinar qué sujeto miente siempre, cuál dice la verdad y cuál responde aleatoriamente. Todo esto sin saber el significado real de 1 y 0 (sólo sabes que uno de ellos significa y el otro no).


Si has resuelto antes problemas de lógica, probablemente detectes intuitivamente dos factores que hacen que el enigma se complique bastante. El primero es evidente: al no saber traducir 0/1 a sí/no, tendremos que idear preguntas que permitan sacar información a los ordenadores incluso aunque no conozcamos el significado real de la respuesta. El segundo es que el factor aleatorio es lo más tocapelotas que te puedes encontrar: una pregunta al aleatorio (Windows) será una pregunta perdida.

Este último factor nos permite hacer la primera deducción acerca de la solución del problema: tendremos que preguntar necesariamente a más de un ordenador, ya que si le hacemos las tres preguntas a uno sólo y resulta ser Windows, no habremos obtenido ninguna información del mismo. Es práctico dibujar diagramas de árbol, escribiendo en cada rama las identidades posibles de cada ordenador según la respuesta obtenida (podemos caracterizar cada estado posible con tres letras: escribiendo en orden la identidad de A, B y C. Por ejemplo, MVA indica que A es Mentiroso, B es Verdadero y C es Aleatorio).

Una buena estrategia para solucionar un problema complejo es reducirlo antes a un problema más simple. Así pues, vamos a intentar resolver primero el enigma suponiendo que los ordenadores responden o NO. Una vez entendamos la estructura de la solución de este problema derivado, nos será mucho más fácil abordar el enigma que nos ocupa.

Otra deducción más filosófica: cada pregunta que hagamos creará dos ramas en nuestro diagrama, y asociados a esa rama tendremos un número de estados posibles. Por ejemplo, aquí tenemos, con la notación descrita arriba, la disyunción de estados que provoca preguntarle a A si es el aleatorio (en el problema, se llama Windows... A partir de ahora, por simplicidad, usaremos la terminología "aleatorio, mentiroso, verdadero"):




Es fundamental observar dos cosas:

  1. Hagamos la pregunta que hagamos, las dos posibilidades que contemplen que el preguntado sea aleatorio (en este caso, los estados AMV y AVM), estarán siempre presentes en ambas respuestas (ya que el aleatorio no nos aporta ninguna información).
  2. Es bueno hacer preguntas que, como esta, asocien un número igual de estados posibles a cada respuesta. ¿Por qué? Pues porque tras la segunda pregunta, hemos de quedarnos con (un mínimo de) dos estados asociados a cada respuesta, ya que la tercera pregunta dividirá éstos en dos y así determinaremos de forma única cuál es la identidad de cada ordenador con 3 preguntas. Si hiciéramos una primera pregunta que asociara, por ejemplo, cinco estados al SÍ, nos sería imposible llegar al estado mencionado con dos preguntas más (ya que cinco divido a la mitad dos veces es 1,25 > 1), y por tanto no podríamos solucionar el problema.
Nuestra mejor perspectiva, por tanto, es quedarnos con cuatro estados posibles tras la primera pregunta (es decir, descartar dos de los 6 estados posibles originales).

Combinando los dos puntos anteriores, llegamos a una paradoja aparente:


Si, tras hacer la primera pregunta, tenemos cuatro estados posibles, nuestra única opción para llegar a la solución es preguntar algo que divida por dos el número de estados, dejando 2 asociados al SÍ y 2 al NO. Pero, si la posibilidad de que el preguntado sea aleatorio aparece en ambas respuestas, tendríamos 3 estados tras la segunda pregunta, lo que nos llevaría a la conclusión de que es imposible resolver el problema.



Pues bien, las premisas son ciertas pero la conclusión es errónea, porque... ¿Y si estuviéramos seguros de que no estamos preguntando al aleatorio?

Esta es la última deducción que tenemos que hacer para resolver la versión reducida del enigma. Una vez nos demos cuenta de esto, sólo tenemos que probar inteligentemente varias combinaciones de preguntas que nos devulevan un conjunto de estados en los que no quepa la opción de que un determinado ordenador (A,B o C) sea aleatorio tras la primera pregunta, utilizando operadores lógicos sencillos: lo que los programadores conocen como ==, and, or,... y que los profanos conocen como "¿Es la respuesta que me das al preguntarte X igual a la que me das al preguntarte Y?", "¿Son las dos respuestas SÍ?", "¿Es alguna de las respuestas SÍ?",...

Esta es mi solución, una de las muchas posibles (puedes ver una solución alternativa que usa un operador lógico distinto en el apartado de fuentes al final de la entrada) [antes de la pregunta indico a quién va dirigida]:



Et voilà!  Observa las letras recuadradas bajo la primera respuesta: en el SÍ, no cabe la opción de que B sea aleatorio, y lo mismo pasa con C en el NO. Por eso, a partir de ese momento, sólo les preguntamos a ellos.

La segunda pregunta es simplemente para determinar si el interrogado es mentiroso o verdadero. Podríamos decir cualquier cosa cuya respuesta sea evidente, como ¿Existes?, ¿Es el término "monarquía parlamentaria" un oxímoron? ¿No es no? (esto sólo es válido para ordenadores que no sean del PSOE). Una vez lo hemos determinado, es coser y cantar, le hacemos una simple pregunta sobre la identidad de otro personaje y ya hemos averiguado quién es quién.


Volvemos al problema original


La adaptación de la solución del problema simplificado al de partida pasa por dos etapas: encontrar preguntas fructíferas aun desconociendo si 0/1 es SÍ/NO o NO/SÍ y adaptar (complicar) la estructura lógica de la solución anterior a este tipo de preguntas.

Con un poco de intuición (que podemos adquirir resolviendo muchos problemas de lógica más sencillos), hallamos esa pregunta mágica: ¿1 es SÍ?

Su magia está en que, independientemente del significado de 1, siempre que se lo preguntemos al verdadero responderá 1 y siempre que se lo preguntemos al mentiroso responderá 0 (haz la prueba). Por tanto, es una herramienta magnífica para determinar identidades.

Para rematar el problema, sólo nos queda la última etapa: añadir esta pregunta a la estructura de la solución anterior. Veréis que ese es el único cambio entre una y otra:



Vale, sí, la primera pregunta es bastante farragosa, pero es que es un enigma muy complejo☺.

Merece la pena reflexionar sobre otra enseñanza del problema: en lógica, no importa tanto el significado que le asociemos a cada símbolo; lo verdaderamente relevante es el contraste entre dichos símbolos, que podemos exprimir mediante operadores lógicos (como el que hemos usado aquí), siendo posible sacar conclusiones de palabras cuyo significado real no conocemos, pero entre las que hay una relación (son antónimos). Esto choca con nuestra experiencia cotidiana, donde lo fundamental es el valor absoluto de nuestros "signos lógicos" (como SÍ o NO) y no el valor relativo de los mismos.

Smullyan y Epiménides 


Puede que pensando el problema hayas imaginado ciertas preguntas que los ordenadores serían incapaces de contestar. Seguramente, todas ellas sean autorreferenciales (algún día hablaremos de los muchos quebraderos de cabeza que dio la autorreferencialidad a grandes lógicos como Bertrand Russell). Este tipo de paradoja se conoce desde hace milenios y la primera mención de la que tenemos constancia la hizo Epiménides, un poeta cretense del siglo VI AEC que (supuestamente) durmió una siesta de 57 años de la que se despertó con el don de la clarividencia. Este misterioso individuo afirmó que todos los cretenses eran mentirosos, y siendo él cretense, esto equivale a decir Yo miento o Esta frase es falsa. 

Si le preguntamos a algún ser racional (sea mentiroso o sincero) ¿Es esta frase falsa? (o alguna variante) será incapaz de contestar algo coherente, por lo que este tipo de preguntas están prohibidas en el problema. Aunque sería interesantísimo incluirlas (y hacer que a los ordenadores les pueda explotar la CPU cuando se las hacemos): en las fuentes os dejo una variante del problema en la que se permiten preguntas irrespondibles, siendo posible resolverlo ¡con sólo dos de ellas!




El del vídeo no es nada más y nada menos que Raymond Smullyan: un genial pianista, mago, humorista, lógico, filósofo, taoísta, escritor, matemático y, sobre todo... inventor por excelencia de problemas de lógica. Él es el creador de este acertijo (aunque técnicamente, en el suyo los ordenadores respondían sí y no), en el que encontramos elementos característicos de su vasta obra, repleta de caballeros que siempre dicen la verdad acompañados de escuderos que siempre mienten y de humanos que dicen lo que les da la gana.

Una de sus mejores recopilaciones de enigmas, cuentos y anécdotas lógicas es ¿Cómo se llama este libro? donde trata temas tan variados como el teorema de incompletitud de Gödel o la caracterización de la lógica, y te ayuda a casarte con la deseable Porcia (personaje de la entretenida y antisemita obra de Shakespeare El mercader de Venecia) y a determinar si aún vive Drácula. Además, es fácilmente legible porque está dividido en pequeñas secciones de menos de una página. Por ponerle una pega, la traducción al español es mala (y tengo pruebas contundentes de ello), así que try to read it in English.

Otro librazo suyo es Alice in Puzzle-Land, cuyo prólogo está escrito por Martin Gardner (también un excelente y longevo divulgador, que nos dejó hace unos años) y que tengo el honor de poseer, firmado por Raymond Smullyan. 



Os dejo una reseña de su interesantísima vida al final de la entrada (era profesor de piano pero se retiró por una lesión, también fue mago profesional y dio clase de asignaturas que nunca había cursado pero que dominaba; la universidad en la que trabajaba, por tanto, se las "convalidó").

Hoy, Smullyan tiene 97 años y vive (esperemos que durante mucho tiempo más) en el barrio de Queens de Nueva York. Si os fijáis, él ya no puede leer su propio cuento carroliano, según el subtítulo del mismo.

La mejor forma posible de acabar la entrada es con una anécdota de Smullyan sobre la esencia de la lógica, acompañada de un buen bis:

Un amigo —ex-oficial de policía—, cuando se enteró de* que yo era lógico de profesión, me dijo: "Deja que te explique cómo veo yo la lógica. El otro día, estaba con mi mujer en casa de una señora que nos ofreció tarta. En la bandeja había sólo dos trozos, uno mayor que otro. Tras un momento de reflexión, cogí el mayor. Mi razonamiento fue el siguiente: Sé que a mi mujer le gusta la tarta y que ella sabe que a mí también me gusta. También sé que ella me quiere y desea lo mejor para mí, de manera que ella habría querido que yo cogiera el trozo más grande. Por eso lo cogí."
Raymond Smullyan en ¿Cómo se llama este libro?



*: Los nefastos traductores del libro prescindieron de ese de. Esta es sólo una de las muchas erratas y errores de concepto de la versión castellana: en la página anterior, encontramos clock traducido como chimenea. Que conste que no he elegido esa sección porque esté especialmente plagada de erratas, éstas se distribuyen homogéneamente a lo largo y ancho de la obra. He hecho bastantes cambios en el párrafo citado para evitar el estilo anticuado e ineficiente de esos expertos en deslucir a Raymond traductores.




27 nov 2016

¿Es un programa informático autor de su obra? Wolfram|Alpha sienta un peligroso precedente en el copyright

Un dilema filosófico profundo es el de determinar si puede surgir originalidad de un algoritmo. Esta reflexión no es un devaneo metafísico, ya que podría tener importantes implicaciones en terrenos como el copyright: un famoso programa (el "buscador científico" Wolfram|Alpha) tiene derechos de autor sobre cualquier contenido que aparezca en él, gozando su output del mismo estatus legal que un paper o una novela. Analizamos este hito y reflexionamos sobre cuál es la fuente de originalidad y consciencia en el campo de la inteligencia artificial.


©onocimiento™

Cuando entras a Wolfram|Alpha (en adelante, Wolfram) a pedirle que te resuelva una integral te encuentras dos sutilezas inusuales, que (afortunadamente) cada vez se ven menos: en su logo, aparece el símbolo de marca comercial y de marca registrada.


Una imagen vale más que mil palabras. ® indica que la marca está registrada, y ™ se adjunta a lo que el propietario considera una marca comercial. Manda huevos que Wolfram Alpha LLC considere que "computacional" sea una marca comercial propia.

Muchos de los logos que ves en internet están registrados (sin ir más lejos, el de Google, evidentemente) pero no te lo hacen saber cada vez que los ves porque resulta desagradable (muchos internautas le tenemos asco al enfoque actual del copyright). A Wolfram, esto parece no importarle mucho, porque se ha atrevido a ponerle copyright a cualquier output de su programa. Es aceptable que un programador quiera tener derechos de autor sobre un código de su autoría, pero no que desee tenerlos sobre lo que éste produce. Poniendo otra vez a Google como ejemplo (que conste que este gigante tampoco es un ejemplo de moralidad), es normal que la empresa se reserve los derechos del código que hace funcionar tan bien al buscador, pero sería impensable que también se atribuyera los de todos los resultados de búsqueda que, obviamente, no ha creado ella. Wolfram argumenta que ellos no son como Google, beben de una fuente de información objetiva y contrastada (no de la red en general) y procesan los datos de forma original, como cuando una persona escribe un libro inspirada por los muchos que ha leído en su vida.

Es una postura que podría ser razonable en ciertos aspectos, si bien se ve claramente que es una barbaridad generalizar así el copyright: ¿al buscar 1+1=2, debo citar a Wolfram en mi tesis si utilizo ese resultado?

Yo me opongo radicalmente a ella porque tengo pesadillas con corporaciones poniendo miles de programas básicos a registrar los postulados de Euclides, las relaciones trigonométricas o las leyes de la termodinámica. En esos sueños, una sociedad de autores cuyas siglas son una permutación de GAES (este año, la Frikipedia ha muerto definitivamente por culpa de la sociedad general que no debe ser nombrada, por eso me da miedo mencionar a quien tú ya sabes) registra mi nombre y tengo que pagar un canon cada vez que me presento.


¿Qué hace ©Wolfram|Alpha®?


Además de apropiarse de conocimiento colectivo, este motor es capaz de realizar hazañas tales como resolver integrales y ecuaciones diferenciales simbólicamente (muy útil para estudiar cálculo), decirte dónde está la Estación Espacial Internacional, dar respuesta a las preguntas científicas que se le hacen a Siri y a Bing y... ¡dibujar famosos! Si sabes cómo preguntarle, claro... Si no utilizas las palabras clave apropiadas para cada función, probablemente no entienda nada de lo que le estás diciendo y te muestre datos con poca relación a tu pregunta. Como dijo Douglas Lenat (experto en inteligencia artificial) al probar Wolfram: "hay una amplia gama de preguntas que no puede analizar y que no puede responder."





Plot de Fidel Castro [Wolfram Alpha LLC. 2009. Wolfram|Alpha. https://www.wolframalpha.com/input/?i=curve+fidel+castro (access November 27, 2016)], Zapatero [Wolfram Alpha LLC. 2009. Wolfram|Alpha. https://www.wolframalpha.com/input/?i=curve+zapatero (access November 27, 2016)], Bernie Sanders [Wolfram Alpha LLC. 2009. Wolfram|Alpha. https://www.wolframalpha.com/input/?i=curve+bernie+sanders (access November 27, 2016)] y una Angelina Jolie no demasiado jolie [Wolfram Alpha LLC. 2009. Wolfram|Alpha. https://www.wolframalpha.com/input/?i=curve+angelina+jolie (access November 27, 2016)]


¿Cuándo es creativo un programa?


Parafraseando a Arthur Samuel (pionero en AI y desarrollador de $\mathbf{T\!_{\displaystyle E} \! X}$, el programa gracias al cual podemos ver fórmulas matemáticas en el blog), un programa original es aquel que crea algo que no ha sido explícitamente incluido en el código. Como en todo dilema filosófico, la cuestión está en definir bien los términos. ¿A qué nos referimos con explícitamente? Obviamente, un programa que nos da la sucesión de Fibonacci mediante un bucle que va evaluando a,b=b,a+b no es creativo, porque le hemos dicho de forma explícita cómo crear.

Douglas Hofstadter (cuyo padre, además de darle su apellido a él, se lo dio a Leonard, de The Big Bang Theory), en su faraónico Gödel, Escher, Bach recoge la siguiente cita de Max Mathews, autor de un programa que mezclaba obras musicales dando lugar a una nueva creación:

¿Lo que está haciendo el ordenador es componer? Lo mejor sería que esta pregunta no apareciese, pero no puede ser completamente ignorada. Es difícil suministrar una respuesta. Los algoritmos son deterministas, simples y comprensibles. No hay envueltas computaciones complicadas o de ardua comprensión; no se ha utilizado ningún programa de "aprendizaje"; no ocurre ningún proceso fortuito; la máquina funciona de manera perfectamente mecánica y normal. Sin embargo, el resultado es una secuencia de sonidos que, en el orden de los detalles finos, no ha sido completa y precisamente especificada. Así, el compositor se ve a menudo sorprendido, y gratamente, por los detalles que dan concreción a sus ideas. Es solamente en esta medida que la computadora compone. Llamamos composición al proceso algorítmico, pero de inmediato volvemos a subrayar que los algoritmos son transparentemente simples.

Una de las ideas que nos da Hofstadter en Gödel, Escher, Bach (en sus más de 800 páginas hay espacio para muchas) es que el ingrediente principal para una máquina inteligente y consciente es la autorreferencialidad: cuando un algoritmo es capaz de observarse y cambiarse a sí mismo, hemos traspasado una frontera importante hacia la inteligencia artificial. Pero la autorreferencialidad trae problemas asociados... se pueden dar bucles extraños como el enunciado Esta frase es falsa.

Cuadro autorreferencial de MC Escher, tomado sin permiso


Al fin y al cabo, todo se reduce a un problema de caos. Cuando la respuesta de la máquina depende de multitud de parámetros y leyes que somos incapaces de modelizar, podemos considerar que la creación no es explícita en el código, y que la máquina es la autora de su obra.

¿Acaso no pasa lo mismo con los seres humanos? Si conociéramos la manera de pensar de una persona y todas sus circunstancias, ¿no podríamos determinar inequívocamente sus acciones?
La respuesta es compleja y controvertida, y tiene mucha relación con la cuestión de si nuestra mente es o no algorítimica (como un programa de ordenador).

Yo pienso, como Douglas Hofstadter, que nuestra inteligencia también es algorítmica y puede haber programas inteligentes, pero hay posturas como la de Roger Penrose que asocian efectos cuánticos a la mente y la consideran no-algorítmica (recomiendo encarecidamente echarles un ojo a los libros mencionados al final de la entrada).


¿Y qué pasa con el copyright?



Los defensores del copyright clásico alegan que restringir la distribución y readaptación de una obra estimula la creación artística, al dotar de relevancia y reconocimiento al creador y darle poder sobre la misma, pero se olvidan de mencionar que hay sistemas que consiguen hacerlo sin limitar su difusión y el acceso libre a la cultura. La concepción actual del copyright es un lastre enorme para el avance cultural y científico, ya que limita la libertad de expresión, niega la posibilidad de mejorar una obra ya existente, permite que el azar sea registrado como obra propia, que los derechos de autor se hereden... Es decir, propugna la propiedad privada del conocimiento,

Además, dicho sistema legal no tiene sentido en la red, donde hacer copias es rápido, cómodo y sencillo: casi todos copiamos música, películas, libros e imágenes y lo seguiremos haciendo.

Afortunadamente, existen licencias copyleft que otorgan al autor el reconocimiento que se merece sin limitar el necesario flujo cultural (que debe llegar a todos los estratos sociales). Un ejemplo son las licencias GPL y Creative Commons (como la de este blog), que permiten reservarte ciertos derechos (como el de atribución) liberando muchos otros (difusión, readaptación,...).

Creative Commons guiando a los contribuyentes

De Eugène_Delacroix_-_La_liberté_guidant_le_peuple.jpg: Eugène Delacroix derivative work: Ju gatsu mikka (^o^) appelez moi Ju (^o^) - Eugène_Delacroix_-_La_liberté_guidant_le_peuple.jpg, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=7982600

Trabajar empleando licencias libres (un esqueleto fundamental de la ética hacker) ha demostrado ser un éxito total: gran parte de los programas que utilizas son software libre, están desarrollados por programadores que creen en la libre difusión de su obra, y que se lo pasan muy bien haciéndolos. Si nos lees desde un dispositivo Android, te estás beneficiando del trabajo desinteresado de mucha gente.



Para acabar esta entrada bipolar IA-copyright, os dejo con un par de frases de Douglas Lenat sobre inteligencia artificial:
"La inteligencia son diez millones de reglas"
"Una vez que realmente tienes una gran cantidad de información integrada como conocimiento, entonces los sistemas humanos de software serán superhumanos, en el mismo sentido que la especie humana con la escritura es superhumana comparada con la especie humana antes de la escritura." 







19 nov 2016

Arte fractal: Coloreando el conjunto de Mandelbrot con Matlab

Los fractales pueden parecer entes incomprensibles, a los que sólo pueden acceder sabios matemáticos. Sin embargo, hay algunos bastante cotidianos: el romanesco, la lata de una famosa marca de levadura,... El más apasionante es el conjunto de Mandelbrot. Utilizando ciertas propiedades del mismo, podemos asociar un color a cada número que lo forma, obteniendo imágenes bellísimas que nos permiten ver el fractal desde otra perspectiva. Si no sabes Matlab, puedes saltarte los snippets de código y contemplar las imágenes que obtenemos con cada método.


No vamos a hacer hincapié en la definición rigurosa de fractales (nos basta con saber que un fractal es un objeto autosemejante a infinitas escalas) o en conceptos (¡interesantísimos!) asociados a ellos (como la dimensión fractal); hoy sólo vamos a usar los fractales pragmáticamente, para crear imágenes apasionantes.


Breve descripción del conjunto de Mandelbrot


El conjunto de Mandelbrot, pese a su infinita complejidad (nunca mejor dicho), es facilísimo de describir analíticamente. Cogemos un número complejo $z_0$, que equivale a un punto con coordenadas $(x,y)$ en el plano complejo (es decir, la coordenada $x$ es parte real de $z_0$ y la coordenada $y$ es la imaginaria) y sacamos un número que llamamos $z_1$ (en breve veréis para qué lo queremos) realizando con $z_0$ la siguiente operación:

$z_1=z_0^2+z_0$

Para sacar $z_2$ (¿para qué lo queremos? pronto lo verás), hacemos lo mismo pero cambiando $z_1$ por $z_2$ y $z_0^2$ por $z_1^2$:

$z_2=z_1^2+z_0$

Y ya os imagináis cómo sacar $z_3$...

$z_3=z_2^2+z_0$

Podemos generalizar esta fórmula para $z_n$ (siendo $n$ cualquier número natural):

$z_{n+1}=z_n^2+z_0$

Pues bien, si realizando esta operación (llamada iteración) infinitas veces no nos queda algo infinito (es decir, la serie no diverge), $z_0$ pertenece al conjunto de Mandelbrot y lo pintamos de de negro. En caso contrario, $z_0$ no pertenece al mismo y lo pintamos de blanco.


Nuestro primer plot. Los ejes indican el elemento de la matriz: un punto con coordenadas (x,y) es el elemento (y,x) de la matriz D.

Aquí tenemos el arte fractal más básico posible: la representación monocromática del conjunto, cuyo código es:




Este método no está mal, pero para colorear, nos viene mejor asociar a cada A(i,j) su número de iteraciones en vez de su pertenencia o no al conjunto (guardando c en D(i,j) en vez de un 1 o un 0). El programa que usaremos es el siguiente (y en el caso monocromático, el resultado es casi igual):

Repito que en esta entrada no voy a profundizar en filosofía fractal (que es abundante y muy interesante), pero sí que es importante aclarar un par de conceptos del programa para profanos del tema:
  1. Técnicamente, para saber si un punto está o no en el conjunto de Mandelbrot por fuerza bruta (que es como lo estamos haciendo nosotros), habría que hacer infinitas iteraciones. Como acostumbro a publicar una entrada semanal, me descuadraba un poco eso de tener que esperar infinitos segundos a que el programa dibuje cada punto, por lo que para el programa, infinito=100 (bastante razonable, aunque pintará de negro puntos que no estén realmente en el conjunto). Definimos "infinito" en la línea 3 del código de arriba.
  2. Por motivos que no explicaremos aquí, ningún número del conjunto de Mandelbrot tiene módulo mayor que 2, de ahí la condición del bucle de la línea 14.

La importancia de la escala

Como el conjunto de Mandelbrot se basa en la divergencia o no de la serie que hemos visto para cada punto, otra forma más directa de representarlo es haciendo las iteraciones un número determinado de veces para todos los puntos y representando directamente su valor. Pero tenemos que tener en cuenta que los módulos de los puntos que están fuera del conjunto se acercan más a infinito con cada iteración, por lo que su valor (y la diferencia entre ellos) será muy superior al del de los puntos internos (que diferirán mucho menos), siendo necesario escalar la matriz que en el programa de abajo llamamos Z para obtener un dibujo más equilibrado.

En física, esto se hace muy a menudo utilizando la función exponencial de -x, ($D=e^{-mod(Z)}$), ya que ésta suaviza las diferencias de manera proporcional a su valor: modera mucho los grandes contrastes y así realza los pequeños. Por eso, al pintar fractales usaremos mucho la escala exponencial.

Otra manera similar de hacer esto es tomar $D=\log(\mod(Z))$ (la escala de Richter de los terremotos es logarítmica, hace algo parecido a eso), que tiene el mismo efecto pero "suaviza" las diferencias más despacio que la exponencial de $-\mod(Z)$.

Todo se ve mucho más claro con esta gráfica:

La distancia entre las líneas continua y rayada rojas decrece más rápido que la que hay entre las azules. Obviamente, la distancia entre las rectas verdes con igual pendiente es constante,

¡Al grano! Vamos a ver cómo queda el conjunto pintándolo según una escala exponencial:


Ya hemos empezado a tunearlo, usando este código:



Esto no ha hecho más que empezar...


Como el lector intuirá, para avanzar en el arte fractal, debemos familiarizarnos con los mapas de colores, que nos permiten obtener fractales policromados. Así que voy a hacer una introducción a los colormaps de Matlab.

Un colormap es una matriz de n filas y 3 columnas, en la que cada fila indica un color que se puede usar para el plot; y la 1ª, 2ª y 3ª columna, respectivamente, la cantidad (de 0 a 1) de rojo, verde y azul que contiene ese color. Cuando usemos imagesc para pintar una matriz, la función asociará a los elementos de menor valor de la misma el primer color definido y a los de mayor valor el último (es decir, el color definido por la última fila del colormap). Es decir, cuanto mayor sea el valor relativo de un elemento de la matriz, mayor será el índice de la fila del colormap que define su color.

Un ejemplo muy sencillo que incluye todo lo fundamental para trabajar con colormaps:

Si queremos pintar tres franjas de colores fáciles como el rojo, el amarillo y el violeta, definimos un colormap y lo dibujamos así:






Un último tecnicismo: para poner el color que quieras, puedes elegir el color RGB aquí y añadir al colormap el vector [R,G,B]/255 (el valor máximo habitual en RGB es 255, mientras que en Matlab es 1).


Et voilà!

Ya tenemos todos los conocimientos necesarios para iniciarnos en el arte fractal, así que os dejo una muestra de lo que se puede obtener combinando hábilmente los métodos descritos en la entrada:







He hecho un script que genera mapas de colores aleatorios y he elegido los que me parecían más bonitos.










Como ocurre mucho en física, si nos centramos en lo microscópico en vez de en lo macroscópico (que en nuestro caso se basa en aumentar la s de nuestros scripts)  todo se vuelve más irregular. 

Propina: coloreando según el argumento

Inspirado en las imágenes de Georg-Johann Lay en el artículo de Wikipedia del conjunto de Mandelbrot en alemán, que es una pasada.


Si aún no estás con la boca abierta, prepárate.

Los números complejos se pueden caracterizar por su módulo (distancia al origen) y argumento (ángulo en radianes que forma con el eje real la recta que une el número en el plano complejo al origen). Como hay infinitas maneras de dar un ángulo (por ejemplo, $0=2\pi =4\pi =2k\pi $ [radianes]) solemos tomarlos de forma que sean mayores que $-\pi$ y menores o iguales a $\pi$, de manera que no haya multiplicidades. A esto lo llamamos la determinación principal del argumento y, si la dibujamos, vemos que tiene una discontinuidad en el semieje real negativo (ya que pasa de valer $\pi$ a valer $-\pi$):


En la imagen, $\pi$ es negro, $-\pi$ es blanco y $0$ es naranja. Se observa claramente la discontinuidad mencionada en la zona izquierda del eje x. La imagen anterior equivale a la primera iteración (itM=1) del script expo.m, que hemos modificado para la ocasión:




Si iteramos dos veces, obtenemos esta bella simetría central:



Seguimos iterando:
itM=3

itM=4

itM=5

itM=6

itM=7

itM=10

itM=100

itM=1000

Observamos que simplemente representando el argumento de cada número complejo tras las iteraciones ¡también aparece el conjunto de Mandelbrot!

No solo eso: el pseudocírculo (cardioide) principal conserva el patrón del argumento del plano complejo, el secundario también pero girado $\pi$ radianes, el terciario, girado otros $\pi$ radianes respecto del segundo (es decir, igual que el primero),...

Si os fijáis, se pueden observar muchísimas más regularidades. Es francamente sorprendente y desconcertante para mí, ya que siempre había visto el conjunto como un grupo de números cuyo módulo no divergía, pero nunca había pensado en que podría pasar algo así con el argumento. Cuando me informe y pregunte a gente que sepa de verdad de variable compleja, escribiré otra entrada en la que ate los cabos matemáticos que he ido dejando sueltos en esta.


12 nov 2016

¡Los subpíxeles de tu móvil se pueden ver con una gota de agua!

El año pasado, observé con microscopio los entresijos de una pantalla y fue muy sorprendente... ¡lo del RGB era verdad! Aumentando un poco, se distinguían unos cuadraditos (píxeles) pero, si te acercabas más, veías cómo ese cuadradito uniforme se dividía en zonas rojas, verdes y azules, cuya mezcla daba el color deseado. Pensé en probar en casa con una lupa o un microscopio USB de esos que venden en DealeXtreme, pero el otro día, llorando sobre el móvil al conocer la victoria de Trump (no habría sido muy distinto con Clinton), me di cuenta de que unas gotitas de agua bastaban para conocer al subpíxel en todo su esplendor.

Snif, snif... ¡Eureka!

Vamos al grano. Llora o echa una gotita de agua sobre la pantalla de tu móvil (con cuidado, a no ser que sea resistente al agua como el mío). Probablemente, la gota sea bastante grande y aumente levemente la imagen, tal que así:




Pero nosotros queremos mirar más allá de lo que vemos, así que, sabiendo que cuanto menor es el radio de una lente con una cara plana, mayor es su potencia, procedemos a separar esa gota grande en gotitas pequeñas ("tirando" de la gota con la punta de un lápiz, por ejemplo). Empezaremos a ver claramente los píxeles, esos grandes ignorados (vemos miles de ellos al día y no nos damos ni cuenta):




Sí señor, la cuadrícula ya se ve a simple vista:




Si lo piensas, un píxel no es tan pequeño como creemos: la lente que forma la gota de agua de la derecha sólo tiene un aumento de 1,5x. ¿Que cómo lo sé? Pues bien, primero lo intenté aplicando las fórmulas de óptica geométrica que se estudiaban en Física de 2º de bachillerato (siendo uno de los radios de curvatura $R_2=\infty$, puesto que una cara de la lente es plana) pero no salían las cuentas: la gota no es una lente delgada, sino una especie de casquete esférico; no llega a ser una semiesfera, por lo que no podemos tomar su radio como radio de curvatura de la lente,...

Así que al final saqué los aumentos por un método deductivo alternativo al científico, la cuenta de la vieja: si os fijáis, cada espacio entre líneas en la gota equivale a un espacio y medio entre líneas fuera. 

Fondo de pantalla ideal para los amantes del lo-fi

En esta última imagen, ya se empieza a apreciar que cada píxel no es homogéneo, pero no nos quedará ninguna duda cuando aún hagamos esa gota más pequeña: tenemos que intentar dejar sobre nuestra pantalla una gotita tan enana que nos deje ver dentro del píxel.

No es difícil de conseguir, en esta imagen ya lo vamos logrando (en la gotita de abajo, el amarillo empieza a descomponerse en sus componentes roja, verde y azul):



Pero, si aislamos una gota mínima, es aún mejor:



Al final del primer mensaje, al lado del ojo, vemos una gotita perfecta que contiene los tres colores. Estamos ante los subpíxeles en todo su esplendor: cualquier color visible por nuestro ojo se puede formar como combinación de luz roja, verde y azul (ya que disponemos sólo de tres tipos de bastones en nuestra retina y cada uno se excita con uno de los tres colores), por tanto, cada píxel se subdivide en tres zonas que emiten en dichos tonos.

 Subpíxeles de distintas pantallas (By Pengo - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=3430548 )

La bandera en la Luna

El que seamos capaces o no de resolver partes de una imagen depende de nuestra capacidad de enfoque y la cercanía a la misma. Uno de los argumentos más enarbolados por los negacionistas de la llegada del hombre a la Luna es la imposibilidad de ver con un telescopio la bandera que supuestamente clavaron los estadounidenses. Y tienen razón. Lo que pasa es que no es un problema de que esté o no allí, sino de resolución.

La calidad de un telescopio no se mide en aumentos, sino en resolución óptica. El mejor que tenemos (para luz visible) es el VLT, siglas de Very Large Telescope (su sucesor iba a ser el Overwhelmingly Large Telescope, pero por falta de presupuesto va a ser el Extremely Large Telescope [esto no es coña]). Está instalado en Chile y pertenece a la ESO, una organización intergubernamental europea dedicada a la astrofísica. Tiene una resolución de una milésima de segundo de arco, que es 50 veces mejor que la del Hubble. Conociendo ésta y la distancia Tierra-Luna ($D=384400$ kilómetros), podemos calcular con trigonometría básica la distancia máxima en la superficie lunar que puede resolver ($R$): (pensad en un triángulo rectángulo con un cateto sobre la superficie lunar, siendo el otro la recta que une la superficie de la Tierra con la de la Luna, en dirección radial) 

$R=D\cdot sin(\phi)$

Siendo la resolución del VLT $\phi=0,001"=5\cdot 10^{-9}$ radianes. Como (futuro) físico, me siento mal si no hago aproximaciones, así que ahí van un par:
La hipotenusa del triángulo, a esas distancias, es parecida al cateto mayor (que realmente es la distancia Tierra-Luna), así que la fórmula anterior es válida. Aún así, la podemos simplificar aún más tomando $sin(\phi)\approx \phi$, ya que se trata de un ángulo pequeño en radianes (esta aproximación es cotidiana en física, y es la culpable de que puedas considerar el movimiento de un péndulo como armónico simple).

$R=D\phi=384400000 \cdot 5\cdot 10^{-9}= 1,922$ metros

Así pues, lo más pequeño que podemos distinguir mirando la Luna con el VLT es un objeto de 2 metros, distancia superior a lo que mide una bandera... a no ser que hubieran puesto una como la que tenemos en la plaza de Colón.

Empleando esta sencilla relación, podemos calcular cosas como la distancia a la que deberíamos situarnos de nuestra tele para verla a máxima resolución (según la densidad de píxeles de la misma).

Acabo con un verso genial de Machado, que me ha venido a la mente de tanto hablar sobre visión.

"El ojo que ves no es ojo porque tú lo veas, es ojo porque te ve."
Antonio Machado