Crystal of Mirković-Vilonen polytopes - Combinatorics

Skip to content
Back to top
View this page
Edit this page

# Crystal of Mirković-Vilonen polytopes

AUTHORS:

- Dinakar Muthiah, Travis Scrimshaw (2015-05-11): initial version

class sage.combinat.crystals.mv_polytopes.MVPolytope(parent, lusztig_datum, long_word=None)

  Bases: `PBWCrystalElement`

  A Mirković-Vilonen (MV) polytope.

  EXAMPLES:

  We can create an animation showing how the MV polytope changes under a string of crystal operators:

  Sage

      sage: MV = crystals.infinity.MVPolytopes(['C', 2])
      sage: u = MV.highest_weight_vector()
      sage: L = RootSystem(['C',2,1]).ambient_space()
      sage: s = [1,2,1,2,2,2,1,1,1,1,2,1,2,2,1,2]
      sage: BB = [[-9, 2], [-10, 2]]
      sage: p = L.plot(reflection_hyperplanes=False, bounding_box=BB)  # long time
      sage: frames = [p + L.plot_mv_polytope(u.f_string(s[:i]),  # long time
      ....:                                  circle_size=0.1,
      ....:                                  wireframe='green',
      ....:                                  fill='purple',
      ....:                                  bounding_box=BB)
      ....:           for i in range(len(s))]
      sage: for f in frames:  # long time
      ....:     f.axes(False)
      sage: animate(frames).show(delay=60) # optional -- ImageMagick # long time

  Python

      >>> from sage.all import *
      >>> MV = crystals.infinity.MVPolytopes(['C', Integer(2)])
      >>> u = MV.highest_weight_vector()
      >>> L = RootSystem(['C',Integer(2),Integer(1)]).ambient_space()
      >>> s = [Integer(1),Integer(2),Integer(1),Integer(2),Integer(2),Integer(2),Integer(1),Integer(1),Integer(1),Integer(1),Integer(2),Integer(1),Integer(2),Integer(2),Integer(1),Integer(2)]
      >>> BB = [[-Integer(9), Integer(2)], [-Integer(10), Integer(2)]]
      >>> p = L.plot(reflection_hyperplanes=False, bounding_box=BB)  # long time
      >>> frames = [p + L.plot_mv_polytope(u.f_string(s[:i]),  # long time
      ...                                  circle_size=RealNumber('0.1'),
      ...                                  wireframe='green',
      ...                                  fill='purple',
      ...                                  bounding_box=BB)
      ...           for i in range(len(s))]
      >>> for f in frames:  # long time
      ...     f.axes(False)
      >>> animate(frames).show(delay=Integer(60)) # optional -- ImageMagick # long time

  plot(P=None, **options)

    Plot `self`.

    INPUT:

    - `P` – (optional) a space to realize the polytope; default is the weight lattice realization of the crystal

    See also

    `plot_mv_polytope()`

    EXAMPLES:

    Sage

        sage: MV = crystals.infinity.MVPolytopes(['C', 2])
        sage: b = MV.highest_weight_vector().f_string([1,2,1,2,2,2,1,1,1,1,2,1])
        sage: b.plot()                                                              # needs sage.plot
        Graphics object consisting of 12 graphics primitives

    Python

        >>> from sage.all import *
        >>> MV = crystals.infinity.MVPolytopes(['C', Integer(2)])
        >>> b = MV.highest_weight_vector().f_string([Integer(1),Integer(2),Integer(1),Integer(2),Integer(2),Integer(2),Integer(1),Integer(1),Integer(1),Integer(1),Integer(2),Integer(1)])
        >>> b.plot()                                                              # needs sage.plot
        Graphics object consisting of 12 graphics primitives

    Here is the above example placed inside the ambient space of type \(C_2\):

  polytope(P=None)

    Return a polytope of `self`.

    INPUT:

    - `P` – (optional) a space to realize the polytope; default is the weight lattice realization of the crystal

    EXAMPLES:

    Sage

        sage: MV = crystals.infinity.MVPolytopes(['C', 3])
        sage: b = MV.module_generators[0].f_string([3,2,3,2,1])
        sage: P = b.polytope(); P
        A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 6 vertices
        sage: P.vertices()
        (A vertex at (0, 0, 0),
         A vertex at (0, 1, -1),
         A vertex at (0, 1, 1),
         A vertex at (1, -1, 0),
         A vertex at (1, 1, -2),
         A vertex at (1, 1, 2))

    Python

        >>> from sage.all import *
        >>> MV = crystals.infinity.MVPolytopes(['C', Integer(3)])
        >>> b = MV.module_generators[Integer(0)].f_string([Integer(3),Integer(2),Integer(3),Integer(2),Integer(1)])
        >>> P = b.polytope(); P
        A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 6 vertices
        >>> P.vertices()
        (A vertex at (0, 0, 0),
         A vertex at (0, 1, -1),
         A vertex at (0, 1, 1),
         A vertex at (1, -1, 0),
         A vertex at (1, 1, -2),
         A vertex at (1, 1, 2))

class sage.combinat.crystals.mv_polytopes.MVPolytopes(cartan_type)

  Bases: `PBWCrystal`

  The crystal of Mirković-Vilonen (MV) polytopes.

  Let \(W\) denote the corresponding Weyl group and \(P_{\RR} = \RR \otimes P\). Let \(\Gamma = \{ w \Lambda_i \mid w \in W, i \in I \}\). Consider \(M = (M_{\gamma} \in \ZZ)_{\gamma \in \Gamma}\) that satisfy the tropical Plücker relations (see Proposition 7.1 of [BZ01]). The MV polytope is defined as

  \[P(M) = \{ \alpha \in P_{\RR} \mid \langle \alpha, \gamma \rangle \geq M_{\gamma} \text{ for all } \gamma \in \Gamma \}.\]

  The vertices \(\{\mu_w\}_{w \in W}\) are given by

  \[\langle \mu_w, \gamma \rangle = M_{\gamma}\]

  and are known as the GGMS datum of the MV polytope.

  Each path from \(\mu_e\) to \(\mu_{w_0}\) corresponds to a reduced expression \(\mathbf{i} = (i_1, \ldots, i_m)\) for \(w_0\) and the corresponding edge lengths \((n_k)_{k=1}^m\) from the Lusztig datum with respect to \(\mathbf{i}\). Explicitly, we have

  \[\begin{split}\begin{aligned} n_k & = -M_{w_{k-1} \Lambda_{i_k}} - M_{w_k \Lambda_{i_k}} - \sum_{j \neq i} a_{ji} M_{w_k \Lambda_j}, \\ \mu_{w_k} - \mu_{w_{k-1}} & = n_k w_{k-1} \alpha_{i_k}, \end{aligned}\end{split}\]

  where \(w_k = s_{i_1} \cdots s_{i_k}\) and \((a_{ji})\) is the Cartan matrix.

  MV polytopes have a crystal structure that corresponds to the crystal structure, which is isomorphic to \(\mathcal{B}(\infty)\) with \(\mu_{w_0} = 0\), on `PBW data`. Specifically, we have \(f_j P(M)\) as being the unique MV polytope given by shifting \(\mu_e\) by \(-\alpha_j\) and fixing the vertices \(\mu_w\) when \(s_j w < w\) (in Bruhat order) and the weight is given by \(\mu_e\). Furthermore, the \(*\)-involution is given by negating \(P(M)\).

  INPUT:

  - `cartan_type` – a Cartan type

  EXAMPLES:

  Sage

      sage: MV = crystals.infinity.MVPolytopes(['B', 3])
      sage: hw = MV.highest_weight_vector()
      sage: x = hw.f_string([1,2,2,3,3,1,3,3,2,3,2,1,3,1,2,3,1,2,1,3,2]); x
      MV polytope with Lusztig datum (1, 1, 1, 3, 1, 0, 0, 1, 1)

  Python

      >>> from sage.all import *
      >>> MV = crystals.infinity.MVPolytopes(['B', Integer(3)])
      >>> hw = MV.highest_weight_vector()
      >>> x = hw.f_string([Integer(1),Integer(2),Integer(2),Integer(3),Integer(3),Integer(1),Integer(3),Integer(3),Integer(2),Integer(3),Integer(2),Integer(1),Integer(3),Integer(1),Integer(2),Integer(3),Integer(1),Integer(2),Integer(1),Integer(3),Integer(2)]); x
      MV polytope with Lusztig datum (1, 1, 1, 3, 1, 0, 0, 1, 1)

  Elements are expressed in terms of Lusztig datum for a fixed reduced expression of \(w_0\):

  Sage

      sage: MV.default_long_word()
      [1, 3, 2, 3, 1, 2, 3, 1, 2]
      sage: MV.set_default_long_word([2,1,3,2,1,3,2,3,1])
      sage: x
      MV polytope with Lusztig datum (3, 1, 1, 0, 1, 0, 1, 3, 4)
      sage: MV.set_default_long_word([1, 3, 2, 3, 1, 2, 3, 1, 2])

  [Python]

      >>> from sage.all import *
      >>> MV.default_long_word()
      [1, 3, 2, 3, 1, 2, 3, 1, 2]
      >>> MV.set_default_long_word([Integer(2),Integer(1),Integer(3),Integer(2),Integer(1),Integer(3),Integer(2),Integer(3),Integer(1)])
      >>> x
      MV polytope with Lusztig datum (3, 1, 1, 0, 1, 0, 1, 3, 4)
      >>> MV.set_default_long_word([Integer(1), Integer(3), Integer(2), Integer(3), Integer(1), Integer(2), Integer(3), Integer(1), Integer(2)])

  We can construct elements by giving it Lusztig data (with respect to the default long word reduced expression):

  Sage

      sage: MV([1,1,1,3,1,0,0,1,1])
      MV polytope with Lusztig datum (1, 1, 1, 3, 1, 0, 0, 1, 1)

  Python

      >>> from sage.all import *
      >>> MV([Integer(1),Integer(1),Integer(1),Integer(3),Integer(1),Integer(0),Integer(0),Integer(1),Integer(1)])
      MV polytope with Lusztig datum (1, 1, 1, 3, 1, 0, 0, 1, 1)

  We can also construct elements by passing in a reduced expression for a long word:

  Sage

      sage: x = MV([1,1,1,3,1,0,0,1,1], [3,2,1,3,2,3,2,1,2]); x
      MV polytope with Lusztig datum (1, 1, 1, 0, 1, 0, 5, 1, 1)
      sage: x.to_highest_weight()[1]
      [1, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 2, 1, 3]

  [Python]

      >>> from sage.all import *
      >>> x = MV([Integer(1),Integer(1),Integer(1),Integer(3),Integer(1),Integer(0),Integer(0),Integer(1),Integer(1)], [Integer(3),Integer(2),Integer(1),Integer(3),Integer(2),Integer(3),Integer(2),Integer(1),Integer(2)]); x
      MV polytope with Lusztig datum (1, 1, 1, 0, 1, 0, 5, 1, 1)
      >>> x.to_highest_weight()[Integer(1)]
      [1, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 2, 1, 3]

  The highest weight crystal \(B(\lambda) \subseteq B(\infty)\) is characterized by the MV polytopes that sit inside of \(W \lambda\) (translating \(\mu_{w_0} \mapsto \lambda\)):

  Sage

      sage: MV = crystals.infinity.MVPolytopes(['A',2])
      sage: La = MV.weight_lattice_realization().fundamental_weights()
      sage: R = crystals.elementary.R(La[1]+La[2])
      sage: T = tensor([R, MV])
      sage: x = T(R.module_generators[0], MV.highest_weight_vector())
      sage: lw = x.to_lowest_weight()[0]; lw
      [(2, 1, 0), MV polytope with Lusztig datum (1, 1, 1)]
      sage: lw[1].polytope().vertices()
      (A vertex at (0, 0, 0),
       A vertex at (0, 1, -1),
       A vertex at (1, -1, 0),
       A vertex at (1, 1, -2),
       A vertex at (2, -1, -1),
       A vertex at (2, 0, -2))

  Python

      >>> from sage.all import *
      >>> MV = crystals.infinity.MVPolytopes(['A',Integer(2)])
      >>> La = MV.weight_lattice_realization().fundamental_weights()
      >>> R = crystals.elementary.R(La[Integer(1)]+La[Integer(2)])
      >>> T = tensor([R, MV])
      >>> x = T(R.module_generators[Integer(0)], MV.highest_weight_vector())
      >>> lw = x.to_lowest_weight()[Integer(0)]; lw
      [(2, 1, 0), MV polytope with Lusztig datum (1, 1, 1)]
      >>> lw[Integer(1)].polytope().vertices()
      (A vertex at (0, 0, 0),
       A vertex at (0, 1, -1),
       A vertex at (1, -1, 0),
       A vertex at (1, 1, -2),
       A vertex at (2, -1, -1),
       A vertex at (2, 0, -2))

  REFERENCES:

  - [Kam2007]

  - [Kam2010]

  Element

    alias of `MVPolytope`

  latex_options()

    Return the latex options of `self`.

    EXAMPLES:

    Sage

        sage: MV = crystals.infinity.MVPolytopes(['F', 4])
        sage: MV.latex_options()
        {'P': Ambient space of the Root system of type ['F', 4],
         'circle_size': 0.1,
         'mark_endpoints': True,
         'projection': True}

    Python

        >>> from sage.all import *
        >>> MV = crystals.infinity.MVPolytopes(['F', Integer(4)])
        >>> MV.latex_options()
        {'P': Ambient space of the Root system of type ['F', 4],
         'circle_size': 0.1,
         'mark_endpoints': True,
         'projection': True}

  set_latex_options(**kwds)

    Set the latex options for the elements of `self`.

    INPUT:

    - `projection` – the projection; set to `True` to use the default projection of the specified weight lattice realization (initial: `True`)

    - `P` – the weight lattice realization to use (initial: the weight lattice realization of `self`)

    - `mark_endpoints` – whether to mark the endpoints (initial: `True`)

    - `circle_size` – the size of the endpoint circles (initial: 0.1)

    EXAMPLES:

    Sage

        sage: MV = crystals.infinity.MVPolytopes(['C', 2])
        sage: P = RootSystem(['C', 2]).weight_lattice()
        sage: b = MV.highest_weight_vector().f_string([1,2,1,2])
        sage: latex(b)
        \begin{tikzpicture}
        \draw (0, 0) -- (0, -2) -- (-1, -3) -- (-1, -3) -- (-2, -2);
        \draw (0, 0) -- (-1, 1) -- (-1, 1) -- (-2, 0) -- (-2, -2);
        \draw[fill=black] (0, 0) circle (0.1);
        \draw[fill=black] (-2, -2) circle (0.1);
        \end{tikzpicture}
        sage: MV.set_latex_options(P=P, circle_size=float(0.2))
        sage: latex(b)
        \begin{tikzpicture}
        \draw (0, 0) -- (2, -2) -- (2, -3) -- (2, -3) -- (0, -2);
        \draw (0, 0) -- (-2, 1) -- (-2, 1) -- (-2, 0) -- (0, -2);
        \draw[fill=black] (0, 0) circle (0.2);
        \draw[fill=black] (0, -2) circle (0.2);
        \end{tikzpicture}
        sage: MV.set_latex_options(mark_endpoints=False)
        sage: latex(b)
        \begin{tikzpicture}
        \draw (0, 0) -- (2, -2) -- (2, -3) -- (2, -3) -- (0, -2);
        \draw (0, 0) -- (-2, 1) -- (-2, 1) -- (-2, 0) -- (0, -2);
        \end{tikzpicture}
        sage: MV.set_latex_options(P=MV.weight_lattice_realization(),
        ....:                      circle_size=0.2,
        ....:                      mark_endpoints=True)

    Python

        >>> from sage.all import *
        >>> MV = crystals.infinity.MVPolytopes(['C', Integer(2)])
        >>> P = RootSystem(['C', Integer(2)]).weight_lattice()
        >>> b = MV.highest_weight_vector().f_string([Integer(1),Integer(2),Integer(1),Integer(2)])
        >>> latex(b)
        \begin{tikzpicture}
        \draw (0, 0) -- (0, -2) -- (-1, -3) -- (-1, -3) -- (-2, -2);
        \draw (0, 0) -- (-1, 1) -- (-1, 1) -- (-2, 0) -- (-2, -2);
        \draw[fill=black] (0, 0) circle (0.1);
        \draw[fill=black] (-2, -2) circle (0.1);
        \end{tikzpicture}
        >>> MV.set_latex_options(P=P, circle_size=float(RealNumber('0.2')))
        >>> latex(b)
        \begin{tikzpicture}
        \draw (0, 0) -- (2, -2) -- (2, -3) -- (2, -3) -- (0, -2);
        \draw (0, 0) -- (-2, 1) -- (-2, 1) -- (-2, 0) -- (0, -2);
        \draw[fill=black] (0, 0) circle (0.2);
        \draw[fill=black] (0, -2) circle (0.2);
        \end{tikzpicture}
        >>> MV.set_latex_options(mark_endpoints=False)
        >>> latex(b)
        \begin{tikzpicture}
        \draw (0, 0) -- (2, -2) -- (2, -3) -- (2, -3) -- (0, -2);
        \draw (0, 0) -- (-2, 1) -- (-2, 1) -- (-2, 0) -- (0, -2);
        \end{tikzpicture}
        >>> MV.set_latex_options(P=MV.weight_lattice_realization(),
        ...                      circle_size=RealNumber('0.2'),
        ...                      mark_endpoints=True)