Interval exchange families#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 1)

Linear families of interval exchange transformations

class surface_dynamics.interval_exchanges.iet_family.IETFamily#

Bases: object

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 141)

A linear family of interval exchange transformations

This class consists of two attributes:

  • a permutation (must be labeled)

  • a cone of lengths (a subcone of the positive cone)

EXAMPLES:

sage: from surface_dynamics import *

sage: p = iet.Permutation('a b c d', 'd c b a')
sage: F = iet.IETFamily(p, (ZZ**4).basis())    # optional: pplpy
sage: F  # optional: pplpy
top 0 1 2 3
bot 3 2 1 0
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0

sage: iet.IETFamily(p, [(2,3,0,0), (0,1,1,1)])  # optional: pplpy
top 0 1 2 3
bot 3 2 1 0
0 1 1 1
2 3 0 0

sage: iet.IETFamily(p, [(1,0,0,0), (1,-1,1,1)])  # optional: pplpy
Traceback (most recent call last):
...
ValueError: C must be a subcone of the non-negative cone
sage: iet.IETFamily(p, Polyhedron(vertices=[(0,0,0,0), (1,0,0,0),(0,1,0,0),(1,1,1,1)]))  # optional: pplpy
Traceback (most recent call last):
...
ValueError: should have only zero as vertices
children()#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 503)

Compute the children of the pair (p, C) composed of a permutation and a slice of a Rauzy simplex.

EXAMPLES:

sage: from surface_dynamics import *

sage: p = iet.Permutation('a b c d', 'd c b a')
sage: F = iet.IETFamily(p, Polyhedron(rays=(ZZ**4).basis()))  # optional: pplpy
sage: top, bot = F.children()  # optional: pplpy
sage: top[0]  # optional: pplpy
't'
sage: top[1]  # optional: pplpy
top 0 1 2 3
bot 3 0 2 1
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
sage: bot[0]  # optional: pplpy
'b'
sage: bot[1]  # optional: pplpy
top 0 3 1 2
bot 3 2 1 0
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0

sage: p = iet.Permutation('a b c d e f', 'e b f c a d')
sage: F = iet.IETFamily(p, Polyhedron(rays=[(1,1,1,1,1,2),(0,1,0,1,0,1)]))  # optional: pplpy
sage: c = F.children()  # optional: pplpy
sage: len(c)  # optional: pplpy
1
sage: c[0][0]  # optional: pplpy
't'
sage: c[0][1]  # optional: pplpy
top 0 1 2 3 4 5
bot 4 1 5 3 2 0
0 1 0 1 0 0
1 1 1 1 1 1

sage: F = iet.IETFamily(p, Polyhedron(rays=[(0,0,0,1,0,0),(1,0,0,0,0,0),(1,1,1,1,1,1)]))  # optional: pplpy
sage: c = F.children()  # optional: pplpy
sage: len(c)  # optional: pplpy
1
sage: c[0][0]  # optional: pplpy
'b'
sage: c[0][1]  # optional: pplpy
top 0 1 2 3 5 4
bot 4 1 5 2 0 3
0 0 0 1 0 0
1 0 0 0 0 0
1 1 1 0 1 1
has_connection()#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 444)

Check whether this family has a connection.

EXAMPLES:

sage: from surface_dynamics import *
sage: p = iet.Permutation('A B C D E', 'E D C B A')
sage: C0 = Polyhedron(rays=(ZZ**5).basis())
sage: iet.IETFamily(p, C0).has_connection()  # optional: pplpy
False

sage: C = Polyhedron(rays=[(1,2,3,2,3),(1,1,0,0,2)])
sage: iet.IETFamily(p, C).has_connection()  # optional: pplpy
True

sage: C = Polyhedron(rays=[(1,1,1,1,4),(2,0,1,2,5)])
sage: iet.IETFamily(p, C).has_connection()  # optional: pplpy
True

sage: C = Polyhedron(rays=[(1,0,0,1,0),(1,0,0,0,1),(0,1,0,1,0),(0,1,0,0,1)])
sage: iet.IETFamily(p, C).has_connection()  # optional: pplpy
True

sage: C = Polyhedron(rays=[(1,2,2,2,2)])
sage: iet.IETFamily(p, C).has_connection()  # optional: pplpy
False
permutation()#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 353)

Return the permutation as a list of integers

random_element()#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 667)

Return a random point in the cone

EXAMPLES:

sage: from surface_dynamics import *
sage: from surface_dynamics.misc.linalg import deformation_space
sage: q = iet.Permutation([0,1,2,3,4,5],[5,3,2,1,0,4])
sage: rays = [[0, 0, 0, 1, 1, 0], [3, 1, 0, 1, 0, 2], [5, 0, 1, 2, 0, 3]]
sage: F = iet.IETFamily(q, rays)  # optional: pplpy
sage: F  # optional: pplpy
top 0 1 2 3 4 5
bot 5 3 2 1 0 4
0 0 0 1 1 0
3 1 0 1 0 2
5 0 1 2 0 3
sage: x = polygen(ZZ)
sage: K.<a> = NumberField(x^10 - 3, embedding=AA(3)**(1/10))
sage: T = F.random_element(K)  # optional: pplpy
sage: V = deformation_space(T.lengths())  # optional: pplpy
sage: (QQ**6).subspace(F.rays()) == V  # optional: pplpy
True
random_element_statistics()#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 708)

Return a triple (num_minimals, num_saddles, num_unknowns) of number of interval exchange transformations found to be respectively minimal, with a saddle connection or “unknown” by mean of at most num_iterations steps of Zorich induction over a sample of num_exp random interval exchange transformations in this family.

INPUT:

  • ring – the ring in which is taken the lengths (usually a number field)

  • num_exp – number of experiments

  • num_iterations – the number of Zorich move to be performed on the interval exchange transformations to find a saddle connection

  • intervalxt – whether to use pyintervalxt for iteration (much faster for large number of induction steps)

EXAMPLES:

sage: from surface_dynamics import *
sage: q = iet.Permutation([0,1,2,3,4,5],[5,3,2,1,0,4])
sage: rays = [[0, 0, 0, 1, 1, 0], [3, 1, 0, 1, 0, 2], [5, 0, 1, 2, 0, 3]]
sage: F = iet.IETFamily(q, rays)  # optional: pplpy
sage: x = polygen(QQ)
sage: K.<cbrt3> = NumberField(x^3 - 3, embedding=AA(3)**(1/3))
sage: F.random_element_statistics(K, intervalxt=False)  # optional: pplpy
(0, 100, 0)
sage: F.random_element_statistics(K, intervalxt=True)  # optional: pplpy  # optional: gmpxxyy  # optional: pyeantic  # optional: pyintervalxt
...(0, 100, 0)

A conjectural counterexample to Dynnikov-Skripshenko conjecture:

sage: path = 'bbbbbtbttbttbbttbtttbbbbttbttbtbbtbbtbbtt'
sage: p = iet.Permutation('a b c d e f g h i', 'i h g f e d c b a')
sage: R = p.rauzy_diagram()
sage: T = R.path(p, *path).self_similar_iet()
sage: T.sah_arnoux_fathi_invariant()
(0, 0, 0, 0, 0, 0)
sage: F = iet.IETFamily(T)  # optional: pplpy
sage: F  # optional: pplpy
top 0 1 2 3 4 5 6 7 8
bot 8 7 6 5 4 3 2 1 0
71 67 70 107 0 0 19 2 0
95 63 21 44 35 0 0 0 43
105 94 88 147 0 0 0 15 19
253 310 0 243 34 101 68 0 0
425 395 404 611 14 0 129 0 0
524 703 0 628 0 245 51 68 0
619 462 0 229 238 63 0 0 272
701 910 0 823 0 308 0 119 51
sage: minimals, saddles, unknowns = F.random_element_statistics(K, num_exp=20, num_iterations=200, intervalxt=False)  # optional: pplpy
sage: assert minimals == 0 and saddles < 3 and unknowns > 17, (minimals, saddles, unknowns)  # optional: pplpy
sage: minimals, saddles, unknowns = F.random_element_statistics(K, num_exp=20, num_iterations=200, intervalxt=True)  # optional: pplpy  # optional: gmpxxyy  # optional: pyeantic  # optional: pyintervalxt
sage: assert minimals == 0 and saddles < 3 and unknowns > 17, (minimals, saddles, unknowns)  # optional: pplpy  # optional: gmpxxyy  # optional: pyeantic  # optional: pyintervalxt
random_integer_point_statistics()#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 812)

OUTPUT: a dictionary whose keys are integers i and values are the number of integer points found so that the number of cylinders is i.

ray_coefficient()#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 228)

Return the i-th coefficient of the nray-th ray

EXAMPLES:

sage: from surface_dynamics import *
sage: p = iet.Permutation('a b c d', 'd c b a')
sage: F = iet.IETFamily(p, [(2,3,0,0), (0,1,1,1)])  # optional: pplpy
sage: F.ray_coefficient(0, 2)  # optional: pplpy
1
sage: F.ray_coefficient(1, 0)  # optional: pplpy
2
sage: F.ray_coefficient(3, 0)  # optional: pplpy
Traceback (most recent call last):
...
IndexError: row index out of range
sage: F.ray_coefficient(1, 5)  # optional: pplpy
Traceback (most recent call last):
...
IndexError: column index out of range
rays()#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 258)

Return the rays as vectors

EXAMPLES:

sage: from surface_dynamics import *
sage: p = iet.Permutation('a b c d', 'd c b a')
sage: F = iet.IETFamily(p, [(2,3,0,0), (0,1,1,1)])  # optional: pplpy
sage: F.rays()  # optional: pplpy
[(0, 1, 1, 1), (2, 3, 0, 0)]
tree()#

File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 598)

The tree should be smarter in several ways:

  • once a saddle connection is found it should check whether it is stable and whether it corresponds to a splitting, a cylinder decomposition, etc

  • implement a C version!

  • understand what the parabolic are doing!

EXAMPLES:

sage: from surface_dynamics import *
sage: p = iet.Permutation([0,1,2,3,4,5],[5,4,3,2,1,0])
sage: rays = [[5, 1, 0, 0, 3, 8], [2, 1, 0, 3, 0, 5], [1, 0, 1, 2, 0, 3], [3, 0, 1, 0, 2, 5]]
sage: F = iet.IETFamily(p, rays)  # optional: pplpy