The GL(2,R) Action, the Veech Group, Delaunay Decomposition#

Acting on surfaces by matrices.#

from flatsurf import translation_surfaces

s = translation_surfaces.veech_double_n_gon(5)
s.plot()
../_images/b30c3e3e6a50b59bc3137a7fa61e333d908d0cdb57b03b119767c66ca53ee1eb.png
m = matrix([[2, 1], [1, 1]])

You can act on surfaces with the \(GL(2,R)\) action

ss = m * s
ss
Translation Surface in H_2(2) built from 2 pentagons
ss.plot()
../_images/869c95ef99e1f5c9ddf2f50f0777c3bacfe53e027b2954fe17ffea15d5e2a371.png

To “renormalize” you can improve the presentation using the Delaunay decomposition.

sss = ss.delaunay_decomposition()
sss
Delaunay cell decomposition of Translation Surface in H_2(2) built from 2 pentagons
sss.plot()
../_images/f2db52553f3e6e60c9194a854c90ef45cc7f57dba5f94f58172548a228e55a8d.png

The Veech group#

Set \(s\) to be the double pentagon again.

s = translation_surfaces.veech_double_n_gon(5)

The surface has a horizontal cylinder decomposition all of whose moduli are given as below

p = s.polygon(0)
modulus = (p.vertex(3)[1] - p.vertex(2)[1]) / (p.vertex(2)[0] - p.vertex(4)[0])
AA(modulus)
0.3632712640026804?
m = matrix(s.base_ring(), [[1, 1 / modulus], [0, 1]])
show(m)
\(\displaystyle \left(\begin{array}{rr} 1 & \frac{2}{5} a^{3} \\ 0 & 1 \end{array}\right)\)
show(matrix(AA, m))
\(\displaystyle \left(\begin{array}{rr} 1 & 2.752763840942347? \\ 0 & 1 \end{array}\right)\)

The following can be used to check that \(m\) is in the Veech group of \(s\).

s.canonicalize() == (m * s).canonicalize()
True

Infinite surfaces#

Infinite surfaces support multiplication by matrices and computing the Delaunay decomposition. (Computation is done “lazily”)

s = translation_surfaces.chamanara(1 / 2)
s.plot(edge_labels=False, polygon_labels=False)
../_images/5c2d62d411e1d375ff0b81ba9cc0837d1c60437ab81925f55f0626cc94f85364.png
ss = s.delaunay_decomposition()
gs = ss.graphical_surface(edge_labels=False, polygon_labels=False)
gs.make_all_visible(limit=20)
gs.plot()
../_images/4c799bb2bca7e619eef9f78ecfa11274bb64594674d587a63334b97d3a73b3fd.png
m = matrix([[2, 0], [0, 1 / 2]])
ms = m * s
gs = ms.graphical_surface(edge_labels=False, polygon_labels=False)
gs.make_all_visible(limit=20)
gs.plot()
../_images/57857d5331cdcb75f755a3f1bad652e849d98e7918affd24655dad9fc24cd7c2.png
mss = ms.delaunay_decomposition()
gs = mss.graphical_surface(edge_labels=False, polygon_labels=False)
gs.make_all_visible(limit=20)
gs.plot()
../_images/679950af5d19932229c66e67b5a06ae669a50caaa73ab9d35b0068396c08e9d5.png

You can tell from the above picture that \(m\) is in the Veech group.