OFFSET
1,1
COMMENTS
The curve can be drawn by turtle graphics rules. Each term of the sequence encodes an angle of rotation in units of (1/6)*Pi. For example, a(k) = 3 would mean a turn of 90 degrees to the left, a(k) = -2 a turn of 60 degrees to the right. To draw the tiling we draw a line of length l and then take a term of the sequence to determine the direction of further drawing by rotation relative to the current drawing orientation. The length of the line segments between each term of the sequence is either sqrt(3) or 1 units. We start by drawing with sqrt(3) units of length; every time we reach a term with 3 or -3 in the sequence we toggle the selected line length from sqrt(3) in 1, or back again from 1 in sqrt(3).
The curve is defined by recursion; this means a(1..14) draws a single "hat" monotile. Then the interval a(15..56) draws the perimeter around the H8 metatile and a(57..202) will be the perimeter around the next higher composition of these tiles. (For details regarding H8 see page 18 in arXiv:2303.10798.) The number of "hat" tiles enclosed by this curve after k recursions is Fibonacci(4*k + 2) (A033890).
The number of new terms added after each iteration can be calculated as m(k) = 5*m(k-1) - 5*m(k-2) + m(k-3) with m(1..3) = {14, 42, 146, ...}. After each such iteration the curve will be closed with an enclosed area equivalent to A033890(k+1) "hat" tiles.
LINKS
Thomas Scheuerle, Table of n, a(n) for n = 1..2718
David Smith, Joseph Samuel Myers, Craig S. Kaplan, and Chaim Goodman-Strauss, An aperiodic monotile, arXiv:2303.10798 [math.CO], 2023.
Thomas Scheuerle, MATLAB program
FORMULA
a(1..14) = {3,-2, 3,-2, 3, 2, 0, 2, -3, 2, 3, 2,-3, 2} = a(1..L(1)) and for k > 0:
a(1..L(k+1)) = {a(1..L(k-1)), a(L(k)+1..c1(k)-1), -a(c1(k)), a(c1(k)+1..c2(k)-1), -a(c1(k)), a(c1(k)+1..c2(k)-1), -a(c1(k)), a(c1(k)+1..c3(k)-1), -a(c4(k)), a(c4(k)+1..c2(k)-1), -a(c1(k)), a(c1(k)+1..c2(k)-1), -a(c1(k)), a(c1(k)+1..c3(k)-1), -a(c3(k)), a(c3(k)+1..L(k))}. With:
L(k) = 6*L(k-1) - 10*L(k-2) + 6*L(k-3) - L(k-4), for k > 3 and L(0..3) = {0, 14, 56, 202}.
L(k) = L(k-1) + r1(k-1) + 3*r3(k-1) + 2*r4(k-1) + r6(k-1).
r1(k) = r5(k-1) + r1(k-1) + r7(k-1), with r1(1) = 6.
r2(k) = r2(k-1) + r7(k-1), with r2(1) = 6.
r3(k) = 2*r6(k-1) + r3(k-1) + r4(k-1) + r7(k-1), with r3(1) = 6 (A003699).
r4(k) = r6(k+1) = 2*r5(k-1) + 3*r3(k-1) + r4(k-1), with r4(1) = 8 (A052530).
r5(k) = r5(k-1) + r3(k-1), with r5(1) = 2. r4, r5, r6 are in the case of this tiling accidentally essentially the same recurrence.
r6(k) = r5(k) = r5(k-1) + r6(k-1) + r7(k-1), with r6(1) = 2 (A052530).
r7(k) = r6(k-1) + 2*r3(k-1), with r7(1) = 4 (A003500).
c1(k) = r2(k) + L(k) = {6, 24, 80, ...}.
c2(k) = r2(k) + r3(k) + L(k) = {12, 46, 162, ...}.
c3(k) = r2(k) + r4(k) + L(k) = {14, 54, 192, ...}.
c4(k) = r2(k) + r7(k) + L(k) = {10, 38, 132, ...}.
Description of curve position:
OrientationAngle(n) = Sum_{k = 1..n-1} a(k)*Pi*(1/6).
Xcoordinate(n) = Sum_{k = 1..n} cos(OrientationAngle(n))*sqrt(1 + 2*((1 + Sum_{k = 1..n-1} [abs(a(k)) = 3]) mod 2)).
Ycoordinate(n) = Sum_{k = 1..n} sin(OrientationAngle(n))*sqrt(1 + 2*((1 + Sum_{k = 1..n-1} [abs(a(k)) = 3]) mod 2)). [] is the Iverson bracket here.
For some nonnegative integers b and c:
OrientationAngle(L(b)) = OrientationAngle(L(c)).
Xcoordinate(L(b)) = Xcoordinate(L(c)).
Ycoordinate(L(b)) = Ycoordinate(L(c)).
EXAMPLE
We start by drawing a line of length sqrt(3):
___
We then take the first term of the sequence, a(1) = 3: this means
we turn our drawing turtle 90 degrees to the left and also switch to a length unit of 1.
___|
We take the second term from the sequence, a(2) = -2: this means
we turn our drawing turtle 60 degrees to the right, and we keep the selected line length of 1 unit.
/
___|
(In this ASCII representation, angles and length units are only symbolically represented and do not match the exact values in the description.)
PROG
(MATLAB) See link.
(PARI)
L(k) = { my(v = [0, 14, 56, 202]); if(k > 3, return(6*L(k-1) - 10*L(k-2) + 6*L(k-3) - L(k-4)), return(v[k+1])) }
r1(k) = if(k > 1, return(r5(k-1) + r1(k-1) + r7(k-1)), return(6))
r2(k) = if(k > 1, return(r2(k-1) + r7(k-1)), return(6))
r3(k) = if(k > 1, return(2*r5(k-1) + r3(k-1) + r5(k) + r7(k-1)), return(6))
r5(k) = if(k > 1, return(r5(k-1) + r3(k-1)), return(2))
r7(k) = if(k > 1, return(r5(k-1) + 2*r3(k-1)), return(4))
c1(k) = r2(k) + L(k-1)
c2(k) = r2(k) + r3(k) + L(k-1)
c3(k) = r2(k) + r5(k+1) + L(k-1)
c4(k) = r2(k) + r7(k) + L(k-1)
a(NumIter) = { my(a = [3, -2, 3, -2, 3, 2, 0, 2, -3, 2, 3, 2, -3, 2]); for(k = 1, NumIter, a = concat([a, a[(L(k-1)+1)..(c1(k)-1)], -a[c1(k)], a[(c1(k)+1)..(c2(k)-1)], -a[c1(k)], a[(c1(k)+1)..(c2(k)-1)], -a[c1(k)], a[(c1(k)+1)..(c3(k)-1)], -a[c4(k)], a[(c4(k)+1)..(c2(k)-1)], -a[c1(k)], a[(c1(k)+1)..(c2(k)-1)], -a[c1(k)], a[(c1(k)+1)..(c3(k)-1)], -a[c3(k)], a[(c3(k)+1)..length(a)] ]) ); return(a) }
draw(NumIter) = {my(p = [0, sqrt(3)]); my(dl = [1]); my(s = a(NumIter)); for(j=2, length(s), dl = concat(dl, ((dl[j-1]+(abs(s[j-1])==3))%2)); p = concat(p, p[j]+sqrt(1+2*dl[j])*exp(I*Pi*vecsum(s[1..j-1])*(1/6)) )); plothraw(apply(real, p), apply(imag, p), 1); }
CROSSREFS
KEYWORD
sign
AUTHOR
Thomas Scheuerle, Jul 09 2023
STATUS
approved