Een spiraal van cijfers

De afgelopen dagen heb ik de volgende vraag op StackExchange over een spiraal van gehele getallen bestudeerd . We zoeken een gesloten formule voor de coördinaten van het \(n\) -de element in de volgende integer-spiraal, die zich uitbreidt van de oorsprong naar buiten en steeds verder in het oneindige:

..  9 10 11 12
23  8  1  2 13
22  7  0  3 14
21  6  5  4 15
20 19 18 17 16

Eerst verdelen we de natuurlijke getallen in de volgende groepen:

$$G_1 = \{ 1,...,8 \}\\G_2 = \{ 9, ..., 24 \}\\G_3 = \{ 25, ... 48 \}\\...\\G_k = \left\{ (2k-1)^2, (2k+1)^2 - 1 \right\}$$

Wij bellen

$$a^2 = \left(\left \lfloor \left( \frac{\left \lfloor \sqrt{n} \right \rfloor + 1}{2} \right) \right \rfloor \cdot 2 - 1 \right)^2$$

het startnummer in een groep.

Binnen een groep zijn er vier subgroepen van dezelfde grootte \(G_1\) Voor \(G_1\) \(g_1 = \{ 1,2 \}, g_2 = \{ 3,4 \}, g_3 = \{ 5,6 \}, g_4 = \{7,8\}\) ). Als \(n\) van de ene subgroep naar de andere verandert, wordt de richting op het pad van de spiraal (in ons voorbeeld met de klok mee) tegelijkertijd ook gewijzigd. We krijgen de huidige richting \( b \in \{0,1,2,3\} \) door de positie \(na^2\) binnen een groep te delen door het aantal elementen in een subgroep:

$$b = \left \lfloor \frac{ n - a^2 }{ \text{abs}\left( a \right) + 1 } \right \rfloor$$

Nu kunnen we het eerste element binnen een subgroep \(g_n\) door een veelvoud \(b\) van het aantal \(a+1\) elementen binnen een groep toe te voegen aan het initiële getal \(a^2\):

$$c = a^2 + b \cdot (a+1)$$

Nu kunnen we bepalen door eenvoudige observatie:

$$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)$$

We willen nu \(f(n)\) in een gesloten vorm en zonder onderscheid tussen gevallen weergeven. Hiervoor gebruiken we de signumfunctie; ik heb de procedure hier beschreven. Om een zuivere formule te verkrijgen die afhankelijk is van \(n\) , krijgen we:

Met behulp van SVG.js kunnen we in deze kleine visualisatie zien dat het hele ding echt werkt:

See the Pen ulam spiral by David Vielhuber (@vielhuber) on CodePen.

De spiraal staat ook bekend als de spiraal van Ulam en heeft een spannende relatie met priemgetallen.

Terug