2 puntos por GN⁺ 2025-05-23 | 1 comentarios | Compartir por WhatsApp
  • Después de dejar pegado en la pared durante 12 años un patrón de cuadrados replicados dibujado en papel cuadriculado en la secundaria, lo analiza como un fractal llamado wallflower y lo conecta con L-Systems, álgebra lineal, sistemas numéricos y generalizaciones a dimensiones superiores
  • Partiendo de un solo cuadrado, el procedimiento de copiar la figura actual arriba, abajo, izquierda y derecha, y en el siguiente paso copiarla en una dirección rotada unos 27 grados, crea un fractal que llena el plano
  • Las reglas simples de L-System R → RLR, L → RLL producen un contorno parecido, pero no la misma figura; las formas más comunes están documentadas como Quadratic von Koch island, Quadratic Flake, Minkowski Sausage, entre otras
  • wallflower puede interpretarse como un sistema numérico basado en matrices, con la matriz (M=\begin{bmatrix}-2&1\1&2\end{bmatrix}) como base y vectores de dirección escritos como números; (\det(M)=-5) invierte la orientación en cada iteración
  • La generalización a 3D resultó incómoda por problemas de simetría y solapamiento, y en 4D pudo construirse orthotopeflower con una matriz que cumple las condiciones, pero bajo las mismas restricciones parece que solo son posibles 1D, 2D y 4D

El inicio del fractal que estaba pegado en la pared

  • En la secundaria hizo un garabato en papel cuadriculado uniendo y copiando cuadrados repetidamente, y luego lo dejó pegado en la pared para analizarlo más adelante
  • Llama a este fractal wallflower tanto por su estructura que se abre como pétalos como por la historia de haber estado mucho tiempo en la pared
  • El procedimiento original era el siguiente
    • Comenzar con un solo cuadrado
    • Colocar 4 copias del estado actual a la izquierda, derecha, arriba y abajo
    • Luego colocar 4 copias del estado actual en esas mismas cuatro direcciones, pero inclinadas unos 27 grados en sentido horario
    • Repetir alternadamente ambos métodos de colocación hasta llenar la hoja cuadriculada
  • Este procedimiento, como la Gosper Curve, puede cubrir cualquier región del plano si se itera, y cada estado intermedio también puede teselar el plano

Un contorno casi igual al de un L-System, pero distinto

  • Hace alrededor de un año, pensó que este contorno podía generarse con un L-System
  • Las reglas usadas consisten solo en giros de 90 grados a la derecha (R) y a la izquierda (L)
    • La cadena inicial es (RRRR)
    • En cada iteración se sustituye según (R \rightarrow RLR), (L \rightarrow RLL)
  • Las primeras etapas parecían tener el mismo contorno que wallflower, pero al hacer una animación confirmó que desde la cuarta iteración ambos métodos dejan de coincidir
  • La diferencia surge del modo en que se colocan las copias
    • El método de “drag and drop” coloca directamente copias de la tercera iteración arriba, abajo, izquierda y derecha del centro
    • El método del L-System coloca las copias en direcciones diagonales
  • La forma que produce el L-System ya está documentada en varios lugares
  • No pudo encontrar la misma forma que la variante de drag and drop que estaba en la pared ni con búsqueda de imágenes de Google ni explorando Wikipedia
  • Encontró reglas adecuadas para wallflower, (L \rightarrow RLR) y (R \rightarrow LLR), pero estas reglas producen el efecto de que la dirección en que se dibuja el contorno se invierte en cada etapa

Cómo contar el fractal

  • Como wallflower crece hacia afuera desde el origen, puede verse como una correspondencia entre números naturales y coordenadas de una retícula
  • Toma el cuadrado central como 0 y numera los 4 cuadrados añadidos en la primera iteración como 1, 2, 3 y 4 en sentido horario
  • En la siguiente iteración podría numerarlos recorriendo de arriba abajo y de izquierda a derecha, pero ese método no encaja bien con la estructura recursiva
  • Aprovechando que cada pétalo es una copia de la iteración anterior, se puede reutilizar la numeración desde el centro hacia afuera tanto dentro de cada pétalo como entre pétalos
  • Con esta numeración, los múltiplos de 5, los (5n+1), los múltiplos de 25, etc., forman patrones de retícula inclinados
  • La razón es que la cantidad de cuadrados en cada iteración crece como (1, 5, 25, 125, ...)
    • En cada iteración, al estado anterior se le suman 4 copias, para un total de 5 veces
    • Por eso las potencias de 5 y la representación en base 5 encajan bien con la estructura

Un sistema numérico que usa matrices como base

  • Si se descompone un número como si fueran posiciones en base 5, puede encontrarse su ubicación en la retícula fractal sumando los vectores correspondientes a cada dígito
  • Por ejemplo, 231 puede verse como (200 + 30 + 1), y al sumar los vectores de posición de cada parte se obtiene la posición de 231
  • Los valores de un solo dígito se definen como vectores de dirección
    • (\vec{0}=(0,0))
    • (\vec{1}=(1,0))
    • (\vec{2}=(0,1))
    • (\vec{3}=(-1,0))
    • (\vec{4}=(0,-1))
  • Al principio, los valores posicionales de la forma (10^n) se expresaban con fórmulas condicionales según si (n) era par o impar, pero aplicando repetidamente una sola matriz pueden calcularse sin condiciones
  • La matriz usada es la siguiente

[ M=\begin{bmatrix} -2 & 1 \ 1 & 2 \end{bmatrix} ]

  • Esta matriz cumple (M^2=5I), así que cada dos etapas la escala se alinea con un factor 5
  • Por lo tanto, puede expresarse así

[ \overrightarrow{(10^n)}=M^n\vec{1} ]

  • En lugar de un sistema posicional usual con base escalar y dígitos escalares, esta estructura puede verse como un sistema numérico con base matricial y dígitos vectoriales

El determinant separa los dos fractales

  • El determinante de (M) es (\det(M)=-5), y por ser negativo, la orientación del espacio se invierte en cada iteración
  • Por esa inversión, comparado con la numeración original, la posición de valores como 20 y 40 parece intercambiarse
  • Para evitar la inversión, puede elegirse una matriz con determinante positivo

[ M'=\begin{bmatrix} 2 & 1 \ -1 & 2 \end{bmatrix} ]

[ \det(M')=5 ]

  • (M') no invierte la orientación y sigue rotando los vectores numéricos en sentido horario; si se usa esta matriz como base, se reproduce la versión L-System mencionada antes
  • La diferencia entre ambos fractales es la siguiente
    • wallflower surge de (M), con (\det(M)=-5)
    • la familia más común de quadratic flake surge de (M'), con (\det(M')=5)
  • El valor absoluto del determinante, 5, coincide con la estructura en la que el fractal crece 5 veces por iteración
    • Si el determinante fuera mayor, las copias crecerían demasiado rápido y quedarían huecos
    • Si fuera menor, las copias crecerían demasiado lento y las iteraciones se superpondrían
  • El ángulo de unos 27 grados está relacionado con el vector (\langle1,2\rangle), que aparece al imponer coordenadas enteras, determinante (\pm5) y norma del vector (\sqrt5)
    • El ángulo de ese vector es (\arctan(2/1)\approx63.43^\circ)
    • Medido desde el eje y, queda a unos 27 grados

Reglas de suma y acarreo

  • La suma de vectores funciona bien para los valores posicionales desarrollados, pero no se comporta como la suma numérica ordinaria, por ejemplo (\vec{2}+\vec{2}\neq\vec{4})
  • Del 1 al 4, es más natural verlos no como números propiamente dichos, sino como direcciones: arriba, derecha, abajo e izquierda
  • Las direcciones opuestas se cancelan entre sí
    • (\vec{1}+\vec{3}=\vec{0})
    • (\vec{2}+\vec{4}=\vec{0})
  • Si se hace una tabla con combinaciones de vectores unitarios, algunos resultados de suma se convierten en valores de dos dígitos
  • Por eso, al sumar números grandes hay que manejar acarreo como en una suma larga convencional
  • Como ejemplo, al calcular (\vec{22}+\vec{1}), por la regla (\vec{2}+\vec{1}=\vec{13}), el resultado termina siendo 133
  • No se demuestra si este sistema de suma funciona en general; se deja para que el lector lo compruebe

Sistemas numéricos relacionados e investigación

  • El sistema numérico del fractal wallflower se conecta con otras bases que no usan solo números naturales como dígitos
  • Balanced Ternary usa (-1,0,1) como dígitos y 3 como base, y wallflower puede verse como un análogo bidimensional al que se le añaden los dígitos de dirección positiva y negativa en el eje y
  • generalized balanced ternary se generaliza a cualquier dimensión sobre retículas de permutoedros, y en 2D se vuelve una retícula hexagonal
  • Quater-imaginary Base es un sistema cuya base es (2i) y cuyos dígitos son 0, 1, 2 y 3
  • (M') puede verse como una base correspondiente al número complejo (2+i), y Balanced base 2+i (and some gratuitous fractals) de Timothy James McKenzie Makarios trata esta idea
  • También encontró estos materiales relacionados
    • Project BinSys: un proyecto para encontrar bases matriciales con determinante 2
    • Replicating Tesselations de Andrew Vince: trata con más rigor fractales, teselaciones, álgebra lineal y sistemas numéricos, y amplía el análisis más allá de (\mathbb{Z}^2) hacia retículas más generales

Extenderlo a 3D y 4D

  • En 3D imagina una estructura de “3D plus” que empieza con un cubo y se copia en seis direcciones
  • Las condiciones deseadas para una matriz 3x3 eran las siguientes
    • Todas las entradas deben ser enteras
    • Cada vector columna debe tener distancia de Hamming 3 desde el origen
    • Como en cada iteración se añaden 6 copias, la escala debe crecer 7 veces y el determinante debe ser (\pm7)
  • Encontró matrices 3x3 que satisfacen estas condiciones, pero el resultado visual hacía que las iteraciones se vieran aplastadas, dejando expuesta la iteración anterior
  • Al añadir dos estructuras 3D plus más, pudo llenar los huecos, y los 8 puntos centrales quedaron dispuestos como los vértices de un cubo torcido
  • Para una disposición más simétrica, podría bastar con exigir que cada columna sea ortogonal a las demás y tenga la misma magnitud, pero en 3D eso parece imposible bajo la restricción de coordenadas enteras
  • En 4D, en cambio, las condiciones sí encajan
    • Basta con que la suma de cuadrados de los componentes de cada vector columna sea 3
    • Puede lograrse usando 3 componentes (\pm1) y uno 0 entre los 4 componentes
  • Con la siguiente matriz 4x4 construye un fractal 4D

[ \begin{bmatrix} 0 & -1 & -1 & -1 \ 1 & 0 & -1 & 1 \ 1 & 1 & 0 & -1 \ 1 & -1 & 1 & 0 \end{bmatrix} ]

  • A este fractal 4D lo llama orthotopeflower
  • La visualización en 4D se trata fijando el valor de (w) para ver cortes 3D, o representando una ventana 4D como una retícula 7x7 que contiene otras retículas 7x7
  • En una ventana de visualización de 31x31x31x31, parece expandirse hacia afuera sin el aplastamiento excesivo que aparecía en 3D

Dimensiones más altas y el giro final

  • Si se extienden las mismas restricciones a dimensiones más altas, parece que las únicas dimensiones que cumplen las condiciones son 1D, 2D y 4D
    • 1D es balanced ternary
    • 2D es wallflower o quadratic flake
    • 4D es orthotopeflower
  • La matriz elegida en 4D codifica el cuaternión (i+j+k), lo que sugiere una base cuaterniónica nonaria balanceada con base (i+j+k) y dígitos (0,\pm1,\pm i,\pm j,\pm k)
  • No está claro si este sistema cuaterniónico realmente funciona, así que lo deja para su yo futuro, cuando sepa más matemáticas
  • Un intento por recuperar el interés por las matemáticas y la programación después del burnout terminó convirtiendo un viejo garabato en una exploración de fractales, sistemas numéricos, álgebra lineal y dimensiones superiores
  • El giro final es que las visualizaciones del artículo no coinciden con el fractal real de la pared que aparece en la miniatura
    • La cuarta iteración real en la pared está copiada en la dirección opuesta por unos 27 grados
    • En ese momento pensó que si seguía inclinando siempre hacia el mismo lado se desviaría del eje y trató de corregirlo, pero la estructura de (M) ya se corrige sola en cada etapa
    • Cierra mencionando que incluso Donald Knuth tomó un wrong turn al pegar un fractal en la pared

1 comentarios

 
GN⁺ 2025-05-23
Opiniones en Hacker News
  • Fue un artículo perspicaz y muy cuidado, y la visualización 3D estuvo especialmente buena.
    Me recordó algo que hice hace tiempo jugando con decimación recursiva para generar un efecto parecido a un fractal a partir de una imagen arbitraria.
    Se puede probar directamente aquí: https://jsfiddle.net/nicobrenner/a1t869qf/
    Hay que presionar Blursort 2x2 varias veces para crear los fotogramas y luego presionar Animate. También se puede copiar/pegar una imagen, y todo corre en el navegador, sin backend. No lo recomiendo en móvil.

    • Me pregunto si esto también funcionaría en 3D.
  • Me obsesioné un poco con esto y creo que armé una forma de rellenar el “wallflower” con un L-system.
    https://onlinetools.com/math/l-system-generator?draw=AB&skip...
    Pensándolo de nuevo, probablemente esto genera otro fractal, pero no estoy seguro.

  • Pensé que sería una lectura ligera, pero como tenía que trabajar, no me quedó otra que leer algunas partes por arriba.
    Pienso volver después para probar varias cosas; es un artículo realmente muy bien hecho.

  • Es un artículo mucho más profundo y exigente de lo que esperaba; se nota la dedicación.
    Quisiera preguntarle al autor qué recomendaría colgar ahora en la pared del cuarto de un niño.

    • No soy para nada experto en crianza, pero creo que cualquier cosa relacionada con algo que al niño le despierte pasión o asombro en ese momento está bien.
      Al final del artículo incluí un pequeño párrafo sobre el burnout. En mi caso, la raíz del problema fue haber perdido el encanto y la curiosidad que sentía por las matemáticas y la programación, y al escribir este texto pude reconectar con esa sensación de asombro infantil que antes me resultaba fácil sentir.
  • Revisé la aritmética de dos números de dos dígitos y efectivamente funciona.
    Esperaba que 41+14 diera 12, porque si sumas dos casillas a la derecha y dos casillas hacia arriba, obtienes dos casillas a la derecha y dos hacia arriba.
    En la suma larga de abajo, usé = para mostrar equivalencias, es decir, reordenamiento de términos (1+2=2+1), descomposición de números (41=40+1) y suma de un dígito (1+4=22); usé -> cuando el algoritmo entrega un dígito, y < para pasar a la siguiente columna.
    41+14 = (40+1)+(10+4) = 40 + 10 + (1+4) = 40 + 10 + 22 -> 1s digit = 2 < 4 + 1 + 2 = 22 + 2 = 20 + 2 + 2 = 20 + 41 -> 10s digit = 1 < 2 + 4 = 0 -> done == 12
    En el artículo hay dos sistemas de base distintos: en uno 10, 20, 30, 40 van en sentido horario y en el otro van en sentido antihorario. En ambos, 1, 2, 3, 4 van en sentido horario. La suma anterior usa el segundo sistema, el de la tabla de suma, donde las decenas van en sentido antihorario.
    También funciona en el otro sistema. 14+21 debería dar 12.
    14+21 =10+20+42 ->2 <1+2+4 =13+4 =10+3+4 =10+31 ->1 <1+3 =0 ==12

  • Me pregunto cómo se le ocurrió el sistema de numeración “middle out”.
    Cuando resuelvo problemas de matemáticas por mi cuenta, casi nunca se me ocurren ideas tan inspiradas como esa.

    • En el artículo parece que el orden fue un poco distinto, pero al final todo empezó cuando en algún momento me di cuenta de que la forma en que el fractal crecía por un factor de 5, el sistema numérico en base 5 y la “espiral” mencionada en el texto podían encajar entre sí.
      También pensé mucho en cómo dibujar el fractal con un programa, y la forma natural era empezar desde el centro e ir expandiéndose hacia afuera.
      Hay una anécdota sobre Richard Feynman: tenía una docena de problemas aleatorios en el fondo de la mente, los iba avanzando un poco cada vez que veía una conexión y, cuando por fin resolvía uno, la gente pensaba que lo había descubierto al instante, como por arte de magia. Esto fue algo parecido, aunque estoy muy lejos de ese nivel, y apenas pude hacerlo con un solo problema, no con una docena.
  • En una pared del lugar donde trabajaba antes teníamos esto como una impresión de gran formato.
    https://raw.githubusercontent.com/cies/haskell-fractal/refs/... [17 MB, perdón que sea Github]
    También está el código Haskell usado para generarlo: https://github.com/cies/haskell-fractal
    Me resultó especialmente interesante el proceso de imaginar la función sharpen. Para el ajuste de curvas usé una herramienta que ya no existe: https://github.com/cies/haskell-fractal/blob/master/fractal....
    Fue un pequeño proyecto divertido.

  • Me identifico con la parte de “decidí delegárselo a mi yo del futuro, que sabrá más matemáticas”.
    La lista de problemas que debía resolver, pero que no pude por falta de orientación y de conexión a internet, también influyó mucho en decidir qué carrera hacer. La mayoría eran problemas de álgebra lineal.

  • Creo que hay un error tipográfico en la fórmula del patrón. La expresión justo después de “Looking closely you might pick up on the pattern” debería ser 5**(n/2) en vez de 5**n, y 5**((n-1)/2) en vez de 5**(n-1).
    \overrightarrow{10*4} es [0, 25], pero con la fórmula original sale [0, 625].
    Además, sobre el error de Knuth, en los comentarios de YouTube dicen que en realidad su fractal estaba bien y que solo confundió el punto inicial con el final. Dicho de forma aproximada, ese fractal es simétrico respecto de una rotación central, y esa misma rotación fue lo que Knuth creyó que estaba mal. En cualquier caso, sí cometió un error relacionado con fractales, así que la conclusión se mantiene.

    • Bien visto; ya corregí la fórmula.