Sébastien Labbé, CNRS, LaBRI, Université de Bordeaux
Rencontre SDA2 2020, 4 décembre 2020, https://sda2-2020.sciencesconf.org/
SPACE BAR = next slide, SHIFT + SPACE = previous slide, ESC = overview
First we define the set $\Ucal$ of Wang tiles in SageMath and the Wang shift $\Omega_\Ucal\subseteq[0,18]^{\mathbb{Z}^2}$.
from slabbe import WangTileSet
tiles = ["FOJO", "FOHL", "JMFP", "DMFK", "HPJP", "HPHN", "HKFP", "HKDP",
"BOIO", "GLEO", "GLCL", "ALIO", "EPGP", "EPIP", "IPGK", "IPIK",
"IKBM", "IKAK", "CNIP"]
U = WangTileSet([tuple(tile) for tile in tiles])
U.tikz()
tiling = U.solver(10,8).solve(solver='glucose')
tiling.tikz()
None
tiling = U.solver(10,10).solve(solver='glucose')
lines = []
for x,y in tiling.tile_positions(M=[0, 1, 2, 3, 4, 5, 6, 7]):
lines.append(f'\\draw[fill=yellow] ({x},{y}) rectangle ({x+1},{y+1});')
tiling.tikz(extra_before='\n'.join(lines))
None
to obtain the Wang shift $\Omega_\Vcal\subseteq[0,20]^{\mathbb{Z}^2}$.
U.find_markers(i=2,radius=2,solver="dancing_links")
[[0, 1, 2, 3, 4, 5, 6, 7]]
M = [0, 1, 2, 3, 4, 5, 6, 7]
V,alpha0 = U.find_substitution(M, i=2, radius=2, solver="dancing_links")
show(alpha0)
We obtain $\Omega_\Ucal=\overline{\alpha_0(\Omega_\Vcal)}^\sigma$ with 2-dimensional morphism $\alpha_0:[0,20]\to[0,18]^{*^2}$
alpha0.wang_tikz(domain_tiles=V, codomain_tiles=U, ncolumns=7)
V.tikz()
tiling = V.solver(10,10).solve(solver='glucose')
lines = []
for x,y in tiling.tile_positions(M=[0, 1, 2, 8, 9, 10, 11]):
lines.append(f'\\draw[fill=yellow] ({x},{y}) rectangle ({x+1},{y+1});')
for x,y in tiling.tile_positions(M=[3, 5, 13, 14, 17, 20]):
lines.append(f'\\draw[fill=green] ({x},{y}) rectangle ({x+1},{y+1});')
tiling.tikz(extra_before='\n'.join(lines))
None
to obtain the Wang shift $\Omega_\Wcal\subseteq[0,18]^{\mathbb{Z}^2}$.
V.find_markers(i=1,radius=1,solver="dancing_links")
[[0, 1, 2, 8, 9, 10, 11], [3, 5, 13, 14, 17, 20], [4, 6, 7, 12, 15, 16, 18, 19]]
M = [0, 1, 2, 8, 9, 10, 11]
W,alpha1 = V.find_substitution(M, i=1, radius=1, solver="dancing_links")
show(alpha1)
We obtain $\Omega_\Vcal=\overline{\alpha_1(\Omega_\Wcal)}^\sigma$ with 2-dimensional morphism $\alpha_1:[0,18]\to[0,20]^{*^2}$
alpha1.wang_tikz(domain_tiles=W, codomain_tiles=V, ncolumns=5)
W.tikz()
It turns out that $\Ucal$ and $\Wcal$ are equivalent
W.is_equivalent(U)
True
U.tikz()
W.tikz()
The bijection between the vertical colors, between the horizontal colors and from $\Ucal$ to $\Wcal$ is computed as follows:
_,vert,horiz,alpha2 = U.is_equivalent(W, certificate=True)
vert
{'J': 'A', 'F': 'I', 'H': 'B', 'D': 'G', 'I': 'GF', 'B': 'IH', 'A': 'IJ', 'E': 'AF', 'C': 'BF', 'G': 'ID'}
horiz
{'O': 'K', 'L': 'M', 'P': 'KO', 'M': 'PL', 'K': 'PO', 'N': 'MO'}
We obtain $\Omega_\Wcal=\overline{\alpha_2(\Omega_\Ucal)}^\sigma$ word 2-dimensional morphism $\alpha_2:[0,18]\to[0,18]^{*^2}$
show(alpha2)
Let $\phi = \alpha_0\circ\alpha_1\circ\alpha_2$
Phi = alpha0 * alpha1 * alpha2
show(Phi)
This proves that $\Omega_\Ucal$ is self-similar:
$$\Omega_\Ucal =\overline{\alpha_0(\Omega_\Vcal)}^\sigma =\overline{\alpha_0\alpha_1(\Omega_\Wcal)}^\sigma =\overline{\alpha_0\alpha_1\alpha_2(\Omega_\Ucal)}^\sigma =\overline{\phi(\Omega_\Ucal)}^\sigma.$$Also $\phi$ is onto up to a shift and recognizable. Thus $\Omega_\Ucal$ is aperiodic.
Moreover, one can prove (from the study of $2\times 2$ factors) that there is a unique subshift $X$ such that $X=\overline{\phi(X)}^\sigma$. Thus we now have 2 equivalent characterization for the subshift $\Omega_\Ucal\subseteq[0,18]^{\mathbb{Z}^2}$:
from slabbe import TikzPicture
with open('figure4.tex','r') as f:
s = f.read()
TikzPicture(s)
There is also a third equivalent characterization of the same subshift $\Omega_\Ucal$:
whose substitutive structure is described using 2-dimensional Rauzy induction of $\mathbb{Z}^2$-action on the torus.
Details will be part of a chapter Three characterizations of a self-similar aperiodic 2-dimensional subshift part of a (french + english) book on the thematics of SDA2 edited by Nathalie Aubrun and Michael Rao. I will put my chapter on arxiv soon.
Let $R_\Ucal$ be the continuous $\Z^2$-action defined on $\T^2$ by $R_\Ucal^\bn(\bx)=\bx + \varphi^{-2}\bn$ for every $\bn\in\Z^2$ where $\varphi=\frac{1+\sqrt{5}}{2}$. It defines a dynamical system that we denote $(\T^2, \Z^2, R_\Ucal)$. The coding by the partition defines a symbolic dynamical system $(\Xcal_{\Pcal_\Ucal,R_\Ucal},\Z^2,\sigma)$ where $\Xcal_{\Pcal_\Ucal,R_\Ucal}\subseteq[0,18]^{\Z^2}$.
Theorem The Wang shift $\Omega_\Ucal$ has the following properties:
Theorem There exists a 4-to-2 cut and project scheme such that for every configuration $w\in\Omega_\Ucal$, the set $Q\subseteq\Z^2$ of occurrences of a pattern in $w$ is a regular model set. If $w$ is a generic (resp. singular) configuration, then $Q$ is a generic (resp. singular) model set.
References:
In the proof, we used Knuth's dancing links algorithm to find markers because it is faster at this particular task than the MILP solver Gurobi or the SAT solver Glucose as we can see below:
U.find_markers(i=2,radius=2,solver="dancing_links") # long time (3s)
[[0, 1, 2, 3, 4, 5, 6, 7]]
#U.find_markers(i=2,radius=2,solver="gurobi") # long time (13s) # optional gurobi
#U.find_markers(i=2,radius=2,solver="glucose") # long time (2min 10s) # optional glucose
Note that for other tasks like finding a valid tiling an $n\times n$ square with Wang tiles, the Glucose SAT solver (developped at LaBRI) based on MiniSAT is faster than Knuth's dancing links algorithm or MILP solvers.
See: http://www.slabbe.org/blogue/2018/12/comparison-of-wang-tiling-solvers
Installation:
sage -pip install slabbe