Crystal Of Mirković-Vilonen (MV) Polytopes#
AUTHORS:
Dinakar Muthiah, Travis Scrimshaw (2015-05-11): initial version
- class sage.combinat.crystals.mv_polytopes.MVPolytope(parent, lusztig_datum, long_word=None)[source]#
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: 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
>>> 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)[source]#
Plot
self
.INPUT:
P
– (optional) a space to realize the polytope; default is the weight lattice realization of the crystal
See also
EXAMPLES:
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
>>> 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)[source]#
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: 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))
>>> 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)[source]#
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: 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)
>>> 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: 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])
>>> 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: MV([1,1,1,3,1,0,0,1,1]) MV polytope with Lusztig datum (1, 1, 1, 3, 1, 0, 0, 1, 1)
>>> 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: 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]
>>> 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: 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))
>>> 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:
- Element[source]#
alias of
MVPolytope
- latex_options()[source]#
Return the latex options of
self
.EXAMPLES:
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}
>>> 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)[source]#
Set the latex options for the elements of
self
.INPUT:
projection
– the projection; set toTrue
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 ofself
)mark_endpoints
– whether to mark the endpoints (initial:True
)circle_size
– the size of the endpoint circles (initial: 0.1)
EXAMPLES:
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)
>>> 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)