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