Exemplo n.º 1
0
    def rauzy_move_relabel(self, winner, side='right'):
        r"""
        Returns the relabelization obtained from this move.

        EXAMPLE::

            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: s_t
            WordMorphism: 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: s_b
            WordMorphism: 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 sage.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)
Exemplo n.º 2
0
    def representative(self, reduced=True, alphabet=None):
        """
        Returns the Zorich representative of this connected component.

        Zorich constructs explicitely interval exchange
        transformations for each stratum in [Zor08]_.

        EXAMPLES:

        ::

            sage: a = AbelianStratum(6).connected_components()[1]
            sage: print a.representative(alphabet=range(8))
            0 1 2 3 4 5 6 7
            3 2 5 4 7 6 1 0

        ::

            sage: a = AbelianStratum(4,4).connected_components()[1]
            sage: print a.representative(alphabet=range(11))
            0 1 2 3 4 5 6 7 8 9 10
            3 2 5 4 6 8 7 10 9 1 0
        """
        zeroes = [x//2 for x in self._parent._zeroes if x > 0]

        n = self._parent._zeroes.count(0)
        g = self._parent._genus

        l0 = range(3*g-2)
        l1 = [3, 2]
        for k in range(4, 3*g-4, 3):
            l1 += [k, k+2, k+1]
        l1 += [1, 0]

        k = 4
        for d in zeroes:
            for i in range(d-1):
                del l0[l0.index(k)]
                del l1[l1.index(k)]
                k += 3
            k += 3

        # marked points
        if n != 0:
            interval = range(3*g-2, 3*g-2+n)

            if self._parent._zeroes[0] == 0:
                k = l0.index(3)
                l0[k:k] = interval
                l1[-1:-1] = interval
            else:
                l0[1:1] = interval
                l1.extend(interval)

        if self._parent._marked_separatrix == 'in':
            l0.reverse()
            l1.reverse()

        if reduced:
            from sage.dynamics.interval_exchanges.reduced import ReducedPermutationIET
            return ReducedPermutationIET([l0, l1], alphabet=alphabet)

        else:
            from sage.dynamics.interval_exchanges.labelled import LabelledPermutationIET
            return LabelledPermutationIET([l0, l1], alphabet=alphabet)
Exemplo n.º 3
0
    def representative(self, reduced=True, alphabet=None):
        r"""
        Returns the Zorich representative of this connected component.

        Zorich constructs explicitely interval exchange
        transformations for each stratum in [Zor08]_.

        EXAMPLES:

        ::

            sage: c = AbelianStratum(6).connected_components()[2]
            sage: c
            H_even(6)
            sage: p = c.representative(alphabet=range(8))
            sage: p
            0 1 2 3 4 5 6 7
            5 4 3 2 7 6 1 0
            sage: p.connected_component()
            H_even(6)

        ::

            sage: c = AbelianStratum(4,4).connected_components()[2]
            sage: c
            H_even(4, 4)
            sage: p = c.representative(alphabet=range(11))
            sage: p
            0 1 2 3 4 5 6 7 8 9 10
            5 4 3 2 6 8 7 10 9 1 0
            sage: p.connected_component()
            H_even(4, 4)
        """
        zeroes = [x for x in self._parent._zeroes if x > 0]
        n = self._parent._zeroes.count(0)
        g = self._parent._genus

        l0 = range(3*g-2)
        l1 = [6, 5, 4, 3, 2, 7, 9, 8]
        for k in range(10, 3*g-4, 3):
            l1 += [k, k+2, k+1]
        l1 += [1, 0]

        k = 4
        for d in zeroes:
            for i in range(d/2-1):
                del l0[l0.index(k)]
                del l1[l1.index(k)]
                k += 3
            k += 3

        # if there are marked points we transform 0 in [3g-2, 3g-3, ...]
        if n != 0:
            interval = range(3*g-2, 3*g - 2 + n)

            if self._parent._zeroes[0] == 0:
                k = l0.index(6)
                l0[k:k] = interval
                l1[-1:-1] = interval
            else:
                l0[1:1] = interval
                l1.extend(interval)

        if self._parent._marked_separatrix == 'in':
            l0.reverse()
            l1.reverse()

        if reduced:
            from sage.dynamics.interval_exchanges.reduced import ReducedPermutationIET
            return ReducedPermutationIET([l0, l1], alphabet=alphabet)

        else:
            from sage.dynamics.interval_exchanges.labelled import LabelledPermutationIET
            return LabelledPermutationIET([l0, l1], alphabet=alphabet)
Exemplo n.º 4
0
    def representative(self, reduced=True, alphabet=None):
        r"""
        Returns the Zorich representative of this connected component.

        Zorich constructs explicitely interval exchange
        transformations for each stratum in [Zor08]_.

        INPUT:

        - ``reduced`` - boolean (defaut: ``True``): whether you obtain
          a reduced or labelled permutation

        - ``alphabet`` - alphabet or ``None`` (defaut: ``None``):
          whether you want to specify an alphabet for your
          representative

        EXAMPLES:

        ::

            sage: c = AbelianStratum(0).connected_components()[0]
            sage: c
            H_hyp(0)
            sage: p = c.representative(alphabet="01")
            sage: p
            0 1
            1 0
            sage: p.connected_component()
            H_hyp(0)

        ::

            sage: c = AbelianStratum(0,0).connected_components()[0]
            sage: c
            H_hyp(0, 0)
            sage: p = c.representative(alphabet="abc")
            sage: p
            a b c
            c b a
            sage: p.connected_component()
            H_hyp(0, 0)

        ::

            sage: c = AbelianStratum(2).connected_components()[0]
            sage: c
            H_hyp(2)
            sage: p = c.representative(alphabet="ABCD")
            sage: p
            A B C D
            D C B A
            sage: p.connected_component()
            H_hyp(2)

        ::

            sage: c = AbelianStratum(1,1).connected_components()[0]
            sage: c
            H_hyp(1, 1)
            sage: p = c.representative(alphabet="01234")
            sage: p
            0 1 2 3 4
            4 3 2 1 0
            sage: p.connected_component()
            H_hyp(1, 1)
        """
        g = self._parent._genus
        n = self._parent._zeroes.count(0)
        m = len(self._parent._zeroes) - n

        if m == 0:  # on the torus
            if n == 1:
                l0 = [0, 1]
                l1 = [1, 0]
            elif n == 2:
                l0 = [0, 1, 2]
                l1 = [2, 1, 0]
            else:
                l0 = range(1, n+2)
                l1 = [n+1] + range(1, n+1)

        elif m == 1:  # H(2g-2,0^n) or H(0,2g-2,0^(n-1))
            l0 = range(1, 2*g+1)
            l1 = range(2*g, 0, -1)
            interval = range(2*g+1, 2*g+n+1)

            if self._parent._zeroes[0] == 0:
                l0[-1:-1] = interval
                l1[-1:-1] = interval
            else:
                l0[1:1] = interval
                l1[1:1] = interval

        else:  # H(g-1,g-1,0^n) or H(0,g-1,g-1,0^(n-1))
            l0 = range(1, 2*g+2)
            l1 = range(2*g+1, 0, -1)
            interval = range(2*g+2, 2*g+n+2)

            if self._parent._zeroes[0] == 0:
                l0[-1:-1] = interval
                l1[-1:-1] = interval
            else:
                l0[1:1] = interval
                l1[1:1] = interval

        if self._parent._marked_separatrix == 'in':
            l0.reverse()
            l1.reverse()

        if reduced:
            from sage.dynamics.interval_exchanges.reduced import ReducedPermutationIET
            return ReducedPermutationIET([l0, l1], alphabet=alphabet)

        else:
            from sage.dynamics.interval_exchanges.labelled import LabelledPermutationIET
            return LabelledPermutationIET([l0, l1], alphabet=alphabet)
Exemplo n.º 5
0
    def representative(self, reduced=True, alphabet=None):
        r"""
        Returns the Zorich representative of this connected component.

        Zorich constructs explicitely interval exchange
        transformations for each stratum in [Zor08]_.

        INPUT:

        - ``reduced`` - boolean (default: ``True``): whether you
          obtain a reduced or labelled permutation

        - ``alphabet`` - an alphabet or ``None``: whether you want to
          specify an alphabet for your permutation

        OUTPUT:

        permutation -- a permutation which lives in this component

        EXAMPLES:

        ::

            sage: c = AbelianStratum(1,1,1,1).connected_components()[0]
            sage: print c
            H_c(1, 1, 1, 1)
            sage: p = c.representative(alphabet=range(9))
            sage: print p
            0 1 2 3 4 5 6 7 8
            4 3 2 5 8 7 6 1 0
            sage: p.connected_component()
            H_c(1, 1, 1, 1)
        """
        g = self._parent._genus
        zeroes = [x for x in self._parent._zeroes if x > 0]
        n = self._parent._zeroes.count(0)

        l0 = range(0, 4*g-3)
        l1 = [4, 3, 2]
        for k in range(5, 4*g-6, 4):
            l1 += [k, k+3, k+2, k+1]
        l1 += [1, 0]
        k = 3
        for d in zeroes:
            for i in range(d-1):
                del l0[l0.index(k)]
                del l1[l1.index(k)]
                k += 2
            k += 2

        if n != 0:
            interval = range(4*g-3, 4*g-3+n)

            if self._parent._zeroes[0] == 0:
                k = l0.index(4)
                l0[k:k] = interval
                l1[-1:-1] = interval
            else:
                l0[1:1] = interval
                l1.extend(interval)

        if self._parent._marked_separatrix == 'in':
            l0.reverse()
            l1.reverse()

        if reduced:
            from sage.dynamics.interval_exchanges.reduced import ReducedPermutationIET
            return ReducedPermutationIET([l0, l1], alphabet=alphabet)

        else:
            from sage.dynamics.interval_exchanges.labelled import LabelledPermutationIET
            return LabelledPermutationIET([l0, l1], alphabet=alphabet)