Square-tiled Surfaces#

Square-tiled surfaces or orgamis are translation surfaces obtained by gluing unit squares by translation.

Building square-tiled surfaces#

Square-tiled surfaces are encoded by a pair of permutations and this is how you build them in surface-dynamics

from surface_dynamics import Origami
o = Origami("(1,2)", "(1,3)")

The shortcut to get back the two permutations are r (for right) and u (for up)

print(o.r())
print(o.u())
(1,2)
(1,3)

Some well-know square-tiled surfaces are ready-made

from surface_dynamics import origamis
ew = origamis.EierlegendeWollmilchsau()
print(ew)
print(ew.r())
print(ew.u())
(1,2,3,4)(5,6,7,8)
(1,5,3,7)(2,8,4,6)
(1,2,3,4)(5,6,7,8)
(1,5,3,7)(2,8,4,6)

and it is also possible to get representative or exhaustive list in a given stratum or stratum component

from surface_dynamics import Stratum
H2_hyp = Stratum([2]).hyperelliptic_component()
print(H2_hyp.origamis(4))
{(1)(2)(3,4)
(1,2,3)(4), (1,2,3,4)
(1,3,4,2), (1,2,3,4)
(1)(2,4,3), (1)(2)(3,4)
(1,2,3,4), (1)(2,3,4)
(1,2,3,4), (1)(2,3,4)
(1,2)(3)(4), (1,2,3,4)
(1)(2,3,4), (1,2,3,4)
(1)(2)(3,4), (1)(2,3,4)
(1,2,4,3)}

Topological invariants#

Many topological invariants of square-tiled surfaces and their Teichmüller curves are available. The stratum and stratum component

print(o.stratum())
print(o.stratum_component())
print(ew.stratum())
print(ew.stratum_component())
H_2(2)
H_2(2)^hyp
H_3(1^4)
H_3(1^4)^c

Veech group and Teichmüller curve#

Veech group

print(o.veech_group())
print(o.veech_group().is_congruence())
print(ew.veech_group())
Arithmetic subgroup with permutations of right cosets
 S2=(2,3)
 S3=(1,2,3)
 L=(1,2)
 R=(1,3)
True
Arithmetic subgroup with permutations of right cosets
 S2=()
 S3=()
 L=()
 R=()

Approximation of Lyapunov exponents and (exact rational) sum

print(o.lyapunov_exponents_approx())
print(o.sum_of_lyapunov_exponents())
print(ew.lyapunov_exponents_approx())
print(ew.sum_of_lyapunov_exponents())
[0.332674913548040]
4/3
[0.0000449733993775928, 0.0000397390928755535]
1

If you are interested in some statistics of a Teichmüller curve you can iterate through the origamis it contains. For example we study the distribution of the number of cylinders in all Teichmüller curves of the component (genus 3) with 11 squares

cc = Stratum([4]).odd_component()
for T in cc.arithmetic_teichmueller_curves(11):
    cyls = [0]*3
    for o in T:
        n = len(o.cylinder_decomposition())
        cyls[n-1] += 1
    print(cyls)
[1474, 4310, 2016]
[110, 0, 90]
[1650, 636, 1114]

The origami database#

The origami database is a database that contains the list of all arithmetic Teichmüller curves (up to some number of squares). It is a standard sqlite database and can also be read from other programs.

from surface_dynamics import OrigamiDatabase
D = OrigamiDatabase()
q = D.query(stratum=Stratum([2]), nb_squares=9)
print(q.number_of())
o1,o2 = q.list()
print(o1)
print(o2)
2
(1)(2)(3)(4)(5)(6)(7,8,9)
(1,2,3,4,5,6,7)(8)(9)
(1)(2)(3)(4)(5)(6)(7)(8,9)
(1,2,3,4,5,6,7,8)(9)

To get the list of columns available in the database you can do

D.cols()
['representative',
 'stratum',
 'component',
 'primitive',
 'quasi_primitive',
 'orientation_cover',
 'hyperelliptic',
 'regular',
 'quasi_regular',
 'genus',
 'nb_squares',
 'optimal_degree',
 'veech_group_index',
 'veech_group_congruence',
 'veech_group_level',
 'teich_curve_ncusps',
 'teich_curve_nu2',
 'teich_curve_nu3',
 'teich_curve_genus',
 'sum_of_L_exp',
 'L_exp_approx',
 'min_nb_of_cyls',
 'max_nb_of_cyls',
 'min_hom_dim',
 'max_hom_dim',
 'minus_identity_invariant',
 'monodromy_name',
 'monodromy_signature',
 'monodromy_index',
 'monodromy_order',
 'monodromy_solvable',
 'monodromy_nilpotent',
 'monodromy_gap_primitive_id',
 'relative_monodromy_name',
 'relative_monodromy_signature',
 'relative_monodromy_index',
 'relative_monodromy_order',
 'relative_monodromy_solvable',
 'relative_monodromy_nilpotent',
 'relative_monodromy_gap_primitive_id',
 'orientation_stratum',
 'orientation_genus',
 'pole_partition',
 'automorphism_group_order',
 'automorphism_group_name']

Each of these columns is available for display

q = D.query(stratum=Stratum([2]))
D = OrigamiDatabase()
q = D.query(('stratum', '=', Stratum([2])), ('nb_squares', '<', 15))
q.cols('nb_squares', 'veech_group_level', 'teich_curve_nu2', 'teich_curve_nu3', 'teich_curve_genus', 'monodromy_name')
q.show()
Nb squares  vg level  Teich curve nu2  Teich curve nu3  Teich curve genus  Monodromy
------------------------------------------------------------------------------------
3           2         1                0                0                  S3       
4           12        1                0                0                  S4       
5           60        0                0                0                  S5       
5           15        1                0                0                  A5       
6           60        0                0                0                  S6       
7           420       2                0                0                  S7       
7           105       0                0                0                  A7       
8           840       2                0                1                  S8       
9           630       3                0                0                  A9       
9           2520      0                0                2                  S9       
10          2520      0                0                4                  S10      
11          6930      0                0                3                  A11      
11          27720     3                0                6                  S11      
12          27720     4                0                11                 S12      
13          90090     3                0                7                  A13      
13          360360    0                0                14                 S13      
14          360360    0                0                25                 S14      

You can also get some information about the filling of the database with

D.info(genus=3)
genus 3
=======
 H_3(4)^hyp   : 163 T. curves (up to 51 squares)
 H_3(4)^odd   : 118 T. curves (up to 41 squares)
 H_3(3, 1)^c  :  72 T. curves (up to 25 squares)
 H_3(2^2)^hyp : 280 T. curves (up to 33 squares)
 H_3(2^2)^odd : 390 T. curves (up to 30 squares)
 H_3(2, 1^2)^c: 253 T. curves (up to 20 squares)
 H_3(1^4)^c   : 468 T. curves (up to 20 squares)


Total: 1744 Teichmueller curves