Durante los últimos días, he estado investigando la siguiente pregunta en StackExchange sobre una espiral de números enteros. Estamos buscando una fórmula cerrada para las coordenadas del \(n\) -ésimo elemento en la siguiente espiral entera, que se expande desde el origen hacia afuera y más y más hasta el infinito.:
.. 9 10 11 12
23 8 1 2 13
22 7 0 3 14
21 6 5 4 15
20 19 18 17 16Primero dividimos los números naturales en los siguientes grupos:
$$G_1 = \{ 1,...,8 \}\\G_2 = \{ 9, ..., 24 \}\\G_3 = \{ 25, ... 48 \}\\...\\G_k = \left\{ (2k-1)^2, (2k+1)^2 - 1 \right\}$$
Llamamos
$$a^2 = \left(\left \lfloor \left( \frac{\left \lfloor \sqrt{n} \right \rfloor + 1}{2} \right) \right \rfloor \cdot 2 - 1 \right)^2$$
el número inicial en un grupo.
Dentro de un grupo hay cuatro subgrupos de igual tamaño \(G_1\) para \(G_1\) es \(g_1 = \{ 1,2 \}, g_2 = \{ 3,4 \}, g_3 = \{ 5,6 \}, g_4 = \{7,8\}\) ). Si \(n\) de un subgrupo al siguiente, la dirección de la trayectoria de la espiral (en el sentido de las agujas del reloj en nuestro ejemplo) también cambia al mismo tiempo. Obtenemos la dirección actual \( b \in \{0,1,2,3\} \) dividiendo la posición \(na^2\) dentro de un grupo por el número de elementos en un subgrupo:
$$b = \left \lfloor \frac{ n - a^2 }{ \text{abs}\left( a \right) + 1 } \right \rfloor$$
Ahora podemos determinar el primer elemento dentro de un subgrupo \(g_n\) agregando un múltiplo \(b\) del número \(a+1\) de elementos dentro de un grupo al número inicial \(a^2\):
$$c = a^2 + b \cdot (a+1)$$
Ahora podemos determinar por simple observación:
$$x_{right} = \left(n - c - \frac{ a + 1 }{2}+1\right),\, y_{right} = \left(\frac{ a + 1 }{2}\right) \\ x_{bottom} = \left(\frac{ a + 1 }{2}\right),\, y_{bottom} = (-1) \cdot \left( n - c - \frac{ a + 1 }{2}+1\right) \\ x_{left} = (-1) \cdot \left(n - c - \frac{ a + 1 }{2}+1\right),\, y_{left} = (-1) \cdot \left(\frac{ a + 1 }{2}\right) \\ x_{top} = (-1) \cdot \left(\frac{ a + 1 }{2}\right),\, y_{top} = \left( n - c - \frac{ a + 1 }{2}+1\right)$$
Ahora queremos representar \(f(n)\) en forma cerrada y sin distinciones de casos. Para ello, utilizamos la función signo; he descrito el procedimiento aquí . Para obtener una fórmula pura que dependa de \(n\) , obtenemos:

Con la ayuda de SVG.js , podemos ver en esta pequeña visualización que todo realmente funciona:
See the Pen ulam spiral by David Vielhuber (@vielhuber) on CodePen.
La espiral también se conoce como espiral de Ulam y tiene una relación interesante con los números primos.