def has_rauzy_move(self, winner, side='right'): r""" Tests if the permutation is rauzy_movable on the left. EXAMPLES: :: sage: p = iet.Permutation('a b c','a c b',reduced=True) sage: p.has_rauzy_move(0,'right') True sage: p.has_rauzy_move(0,'left') False sage: p.has_rauzy_move(1,'right') True sage: p.has_rauzy_move(1,'left') False :: sage: p = iet.Permutation('a b c d','c a b d',reduced=True) sage: p.has_rauzy_move(0,'right') False sage: p.has_rauzy_move(0,'left') True sage: p.has_rauzy_move(1,'right') False sage: p.has_rauzy_move(1,'left') True """ side = side_conversion(side) winner = interval_conversion(winner) return self._twin[winner][side] % len(self) != side % len(self)
def rauzy_move(self, side='right', iterations=1): r""" Performs a Rauzy move. INPUT: - ``side`` - 'left' (or 'l' or 0) or 'right' (or 'r' or 1) - ``iterations`` - integer (default :1) the number of iteration of Rauzy moves to perform OUTPUT: iet -- the Rauzy move of self EXAMPLES:: sage: phi = QQbar((sqrt(5)-1)/2) sage: t1 = iet.IntervalExchangeTransformation(('a b','b a'),[1,phi]) sage: t2 = t1.rauzy_move().normalize(t1.length()) sage: l2 = t2.lengths() sage: l1 = t1.lengths() sage: l2[0] == l1[1] and l2[1] == l1[0] True """ side = side_conversion(side) res = copy(self) for i in range(iterations): res = res._rauzy_move(side) return res
def rauzy_move_relabel(self, winner, side='right'): r""" Returns the relabelization obtained from this move. EXAMPLE:: sage: from surface_dynamics.all import * sage: p = iet.Permutation('a b c d','d c b a') sage: q = p.reduced() sage: p_t = p.rauzy_move('t') sage: q_t = q.rauzy_move('t') sage: s_t = q.rauzy_move_relabel('t') sage: print s_t a->a, b->b, c->c, d->d sage: map(s_t, p_t[0]) == map(Word, q_t[0]) True sage: map(s_t, p_t[1]) == map(Word, q_t[1]) True sage: p_b = p.rauzy_move('b') sage: q_b = q.rauzy_move('b') sage: s_b = q.rauzy_move_relabel('b') sage: print s_b a->a, b->d, c->b, d->c sage: map(s_b, q_b[0]) == map(Word, p_b[0]) True sage: map(s_b, q_b[1]) == map(Word, p_b[1]) True """ from surface_dynamics.interval_exchanges.labelled import LabelledPermutationIET from sage.combinat.words.morphism import WordMorphism winner = interval_conversion(winner) side = side_conversion(side) p = LabelledPermutationIET(self.list()) l0_q = p.rauzy_move(winner, side).list()[0] d = dict([(self._alphabet[i],l0_q[i]) for i in range(len(self))]) return WordMorphism(d)
def rauzy_move(self, side='right', iterations=1, data=False): r""" Performs a Rauzy move. INPUT: - ``side`` - 'left' (or 'l' or 0) or 'right' (or 'r' or 1) - ``iterations`` - integer (default :1) the number of iteration of Rauzy moves to perform - ``data`` - whether to return also the paths and composition of towers OUTPUT: - ``iet`` -- the Rauzy move of self - ``path`` -- (if ``data=True``) a list of 't' and 'b' - ``towers`` -- (if ``data=True``) the towers of the Rauzy induction as a word morphism EXAMPLES:: sage: from surface_dynamics.all import * sage: phi = QQbar((sqrt(5)-1)/2) sage: t1 = iet.IntervalExchangeTransformation(('a b','b a'),[1,phi]) sage: t2 = t1.rauzy_move().normalize(t1.length()) sage: l2 = t2.lengths() sage: l1 = t1.lengths() sage: l2[0] == l1[1] and l2[1] == l1[0] True sage: tt,path,sub = t1.rauzy_move(iterations=3, data=True) sage: tt Interval exchange transformation of [0, 0.3819660112501051?[ with permutation a b b a sage: path ['b', 't', 'b'] sage: sub WordMorphism: a->aab, b->aabab The substitution can also be recovered from the Rauzy diagram:: sage: p = t1.permutation() sage: p.rauzy_diagram().path(p, *path).substitution() == sub True """ if data: towers = {a:[a] for a in self._permutation.letters()} path = [] side = side_conversion(side) res = copy(self) for i in range(iterations): res,winner,(a,b,c) = res._rauzy_move(side) if data: towers[a] = towers[b] + towers[c] path.append(winner) if data: from sage.combinat.words.morphism import WordMorphism return res, path, WordMorphism(towers) else: return res
def rauzy_move(self, side='right', iterations=1, data=False, error_on_saddles=True): r""" Performs a Rauzy move. INPUT: - ``side`` - 'left' (or 'l' or 0) or 'right' (or 'r' or 1) - ``iterations`` - integer (default :1) the number of iteration of Rauzy moves to perform - ``data`` - whether to return also the paths and composition of towers - ``error_on_saddles`` - (default: ``True``) whether to stop when a saddle is encountered OUTPUT: - ``iet`` -- the Rauzy move of self - ``path`` -- (if ``data=True``) a list of 't' and 'b' - ``towers`` -- (if ``data=True``) the towers of the Rauzy induction as a word morphism EXAMPLES:: sage: from surface_dynamics import * sage: phi = QQbar((sqrt(5)-1)/2) sage: t1 = iet.IntervalExchangeTransformation(('a b','b a'),[1,phi]) sage: t2 = t1.rauzy_move().normalize(t1.length()) sage: l2 = t2.lengths() sage: l1 = t1.lengths() sage: l2[0] == l1[1] and l2[1] == l1[0] True sage: tt,path,sub = t1.rauzy_move(iterations=3, data=True) sage: tt Interval exchange transformation of [0, 0.3819660112501051?[ with permutation a b b a sage: path ['b', 't', 'b'] sage: sub WordMorphism: a->aab, b->aabab The substitution can also be recovered from the Rauzy diagram:: sage: p = t1.permutation() sage: p.rauzy_diagram().path(p, *path).substitution() == sub True An other examples involving 3 intervals:: sage: t = iet.IntervalExchangeTransformation(('a b c','c b a'),[1,1,3]) sage: t Interval exchange transformation of [0, 5[ with permutation a b c c b a sage: t1 = t.rauzy_move() sage: t1 Interval exchange transformation of [0, 4[ with permutation a b c c a b sage: t2 = t1.rauzy_move() sage: t2 Interval exchange transformation of [0, 3[ with permutation a b c c b a sage: t2.rauzy_move() Traceback (most recent call last): ... ValueError: saddle connection found sage: t2.rauzy_move(error_on_saddles=False) Interval exchange transformation of [0, 2[ with permutation a b a b Degenerate cases:: sage: p = iet.Permutation('a b', 'b a') sage: T = iet.IntervalExchangeTransformation(p, [1,1]) sage: T.rauzy_move(error_on_saddles=False) Interval exchange transformation of [0, 1[ with permutation a a """ if data: towers = {a:[a] for a in self._permutation.letters()} path = [] side = side_conversion(side) res = copy(self) for i in range(iterations): winner,(a,b,c) = res._rauzy_move(side, error_on_saddles=error_on_saddles) if data: if winner is None: raise ValueError("does not handle degenerate situations") towers[a] = towers[b] + towers[c] path.append(winner) if data: from sage.combinat.words.morphism import WordMorphism return res, path, WordMorphism(towers) else: return res
def zorich_move(self, side='right', iterations=1, data=False): r""" Performs a Rauzy move. INPUT: - ``side`` - 'left' (or 'l' or 0) or 'right' (or 'r' or 1) - ``iterations`` - integer (default :1) the number of iteration of Rauzy moves to perform - ``data`` - whether to return also the path OUTPUT: - ``iet`` -- the Rauzy move of self - ``path`` -- (if ``data=True``) a list of 't' and 'b' EXAMPLES:: sage: from surface_dynamics import * sage: p = iet.Permutation('a b c', 'c b a') sage: T = iet.IntervalExchangeTransformation(p, [12, 35, 67]) sage: T.zorich_move() Interval exchange transformation of [0, 55[ with permutation a b c c a b sage: assert T.permutation() == p and T.lengths() == vector((12,35,67)) A self similar example in genus 2:: sage: p = iet.Permutation('a b c d', 'd a c b') sage: R = p.rauzy_diagram() sage: code = 'b'*4 + 't'*1 + 'b'*3 + 't'*1 + 'b'*3 + 't'*1 + 'b'*1 + 't'*1 + 'b'*4 + 't'*1 + 'b'*2 + 't'*7 sage: g = R.path(p, *code) sage: m = g.matrix() sage: poly = m.charpoly() sage: l = max(poly.roots(AA, False)) sage: K.<a> = NumberField(poly, embedding=l) sage: lengths = (m - a).right_kernel().basis()[0] sage: T = iet.IntervalExchangeTransformation(p, lengths) sage: T.normalize(a, inplace=True) sage: T Interval exchange transformation of [0, a[ with permutation a b c d d a c b sage: T2, path = T.zorich_move(iterations=12, data=True) sage: a*T2.lengths() == T.lengths() True sage: path == code True Saddle connection detection:: sage: p = iet.Permutation('a b c', 'c b a') sage: T = iet.IntervalExchangeTransformation(p, [41, 22, 135]) sage: T.zorich_move(iterations=100) Traceback (most recent call last): ... ValueError: saddle connection found sage: p = iet.Permutation('a b c d e f', 'f c b e d a') sage: T = iet.IntervalExchangeTransformation(p, [41, 132, 22, 135, 55, 333]) sage: T.zorich_move(iterations=100) Traceback (most recent call last): ... ValueError: saddle connection found """ if data: path = '' side = side_conversion(side) res = copy(self) for i in range(iterations): winner, m = res._zorich_move(side) if data: path += winner * m if data: return res, path else: return res
def rauzy_move(self, side='right', iterations=1, data=False, error_on_saddles=True): r""" Performs a Rauzy move. INPUT: - ``side`` - 'left' (or 'l' or 0) or 'right' (or 'r' or 1) - ``iterations`` - integer (default :1) the number of iteration of Rauzy moves to perform - ``data`` - whether to return also the paths and composition of towers - ``error_on_saddles`` - (default: ``True``) whether to stop when a saddle is encountered OUTPUT: - ``iet`` -- the Rauzy move of self - ``path`` -- (if ``data=True``) a list of 't' and 'b' - ``towers`` -- (if ``data=True``) the towers of the Rauzy induction as a word morphism EXAMPLES:: sage: from surface_dynamics.all import * sage: phi = QQbar((sqrt(5)-1)/2) sage: t1 = iet.IntervalExchangeTransformation(('a b','b a'),[1,phi]) sage: t2 = t1.rauzy_move().normalize(t1.length()) sage: l2 = t2.lengths() sage: l1 = t1.lengths() sage: l2[0] == l1[1] and l2[1] == l1[0] True sage: tt,path,sub = t1.rauzy_move(iterations=3, data=True) sage: tt Interval exchange transformation of [0, 0.3819660112501051?[ with permutation a b b a sage: path ['b', 't', 'b'] sage: sub WordMorphism: a->aab, b->aabab The substitution can also be recovered from the Rauzy diagram:: sage: p = t1.permutation() sage: p.rauzy_diagram().path(p, *path).substitution() == sub True An other examples involving 3 intervals:: sage: t = iet.IntervalExchangeTransformation(('a b c','c b a'),[1,1,3]) sage: t Interval exchange transformation of [0, 5[ with permutation a b c c b a sage: t1 = t.rauzy_move() sage: t1 Interval exchange transformation of [0, 4[ with permutation a b c c a b sage: t2 = t1.rauzy_move() sage: t2 Interval exchange transformation of [0, 3[ with permutation a b c c b a sage: t2.rauzy_move() Traceback (most recent call last): ... ValueError: saddle connection found sage: t2.rauzy_move(error_on_saddles=False) Interval exchange transformation of [0, 2[ with permutation a b a b Degenerate cases:: sage: p = iet.Permutation('a b', 'b a') sage: T = iet.IntervalExchangeTransformation(p, [1,1]) sage: T.rauzy_move(error_on_saddles=False) Interval exchange transformation of [0, 1[ with permutation a a """ if data: towers = {a: [a] for a in self._permutation.letters()} path = [] side = side_conversion(side) res = copy(self) for i in range(iterations): winner, (a, b, c) = res._rauzy_move(side, error_on_saddles=error_on_saddles) if data: if winner is None: raise ValueError("does not handle degenerate situations") towers[a] = towers[b] + towers[c] path.append(winner) if data: from sage.combinat.words.morphism import WordMorphism return res, path, WordMorphism(towers) else: return res
def zorich_move(self, side='right', iterations=1, data=False): r""" Performs a Rauzy move. INPUT: - ``side`` - 'left' (or 'l' or 0) or 'right' (or 'r' or 1) - ``iterations`` - integer (default :1) the number of iteration of Rauzy moves to perform - ``data`` - whether to return also the path OUTPUT: - ``iet`` -- the Rauzy move of self - ``path`` -- (if ``data=True``) a list of 't' and 'b' EXAMPLES:: sage: from surface_dynamics.all import * sage: p = iet.Permutation('a b c', 'c b a') sage: T = iet.IntervalExchangeTransformation(p, [12, 35, 67]) sage: T.zorich_move() Interval exchange transformation of [0, 55[ with permutation a b c c a b sage: assert T.permutation() == p and T.lengths() == vector((12,35,67)) A self similar example in genus 2:: sage: p = iet.Permutation('a b c d', 'd a c b') sage: R = p.rauzy_diagram() sage: code = 'b'*4 + 't'*1 + 'b'*3 + 't'*1 + 'b'*3 + 't'*1 + 'b'*1 + 't'*1 + 'b'*4 + 't'*1 + 'b'*2 + 't'*7 sage: g = R.path(p, *code) sage: m = g.matrix() sage: poly = m.charpoly() sage: l = max(poly.roots(AA, False)) sage: K.<a> = NumberField(poly, embedding=l) sage: lengths = (m - a).right_kernel().basis()[0] sage: T = iet.IntervalExchangeTransformation(p, lengths) sage: T.normalize(a, inplace=True) sage: T Interval exchange transformation of [0, a[ with permutation a b c d d a c b sage: T2, path = T.zorich_move(iterations=12, data=True) sage: a*T2.lengths() == T.lengths() True sage: path == code True Saddle connection detection:: sage: p = iet.Permutation('a b c', 'c b a') sage: T = iet.IntervalExchangeTransformation(p, [41, 22, 135]) sage: T.zorich_move(iterations=100) Traceback (most recent call last): ... ValueError: saddle connection found sage: p = iet.Permutation('a b c d e f', 'f c b e d a') sage: T = iet.IntervalExchangeTransformation(p, [41, 132, 22, 135, 55, 333]) sage: T.zorich_move(iterations=100) Traceback (most recent call last): ... ValueError: saddle connection found """ if data: path = '' side = side_conversion(side) res = copy(self) for i in range(iterations): winner, m = res._zorich_move(side) if data: path += winner * m if data: return res, path else: return res