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 \(f(n)\) in een gesloten weergave en ook zonder onderscheid tussen hoofdletters en kleine letters. We gebruiken de Signum-functie, ik heb de procedure hier beschreven . Zodat we een zuivere formule krijgen als functie 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.