Crystals of modified Nakajima monomials - Combinatorics

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

# Crystals of modified Nakajima monomials

Let \(Y_{i,k}\), for \(i \in I\) and \(k \in \ZZ\), be a commuting set of variables, and let \(\boldsymbol{1}\) be a new variable which commutes with each \(Y_{i,k}\). (Here, \(I\) represents the index set of a Cartan datum.) One may endow the structure of a crystal on the set \(\widehat{\mathcal{M}}\) of monomials of the form

\[M = \prod_{(i,k) \in I\times \ZZ_{\ge0}} Y_{i,k}^{y_i(k)}\boldsymbol{1}.\]

Elements of \(\widehat{\mathcal{M}}\) are called modified Nakajima monomials. We will omit the \(\boldsymbol{1}\) from the end of a monomial if there exists at least one \(y_i(k) \neq 0\). The crystal structure on this set is defined by

\[\begin{split}\begin{aligned} \mathrm{wt}(M) &= \sum_{i\in I} \Bigl( \sum_{k\ge 0} y_i(k) \Bigr) \Lambda_i, \\ \varphi_i(M) &= \max\Bigl\{ \sum_{0\le j \le k} y_i(j) : k\ge 0 \Bigr\}, \\ \varepsilon_i(M) &= \varphi_i(M) - \langle h_i, \mathrm{wt}(M) \rangle, \\ k_f = k_f(M) &= \min\Bigl\{ k\ge 0 : \varphi_i(M) = \sum_{0\le j\le k} y_i(j) \Bigr\}, \\ k_e = k_e(M) &= \max\Bigl\{ k\ge 0 : \varphi_i(M) = \sum_{0\le j\le k} y_i(j) \Bigr\}, \end{aligned}\end{split}\]

where \(\{h_i : i \in I\}\) and \(\{\Lambda_i : i \in I \}\) are the simple coroots and fundamental weights, respectively. With a chosen set of integers \(C = (c_{ij})_{i\neq j}\) such that \(c_{ij}+c_{ji} =1\), one defines

\[A_{i,k} = Y_{i,k} Y_{i,k+1} \prod_{j\neq i} Y_{j,k+c_{ji}}^{a_{ji}},\]

where \((a_{ij})\) is a Cartan matrix. Then

\[\begin{split}\begin{aligned} e_iM &= \begin{cases} 0 & \text{if } \varepsilon_i(M) = 0, \\ A_{i,k_e}M & \text{if } \varepsilon_i(M) > 0, \end{cases} \\ f_iM &= A_{i,k_f}^{-1} M. \end{aligned}\end{split}\]

It is shown in [KKS2007] that the connected component of \(\widehat{\mathcal{M}}\) containing the element \(\boldsymbol{1}\), which we denote by \(\mathcal{M}(\infty)\), is crystal isomorphic to the crystal \(B(\infty)\).

Let \(\widetilde{\mathcal{M}}\) be \(\widehat{\mathcal{M}}\) as a set, and with crystal structure defined as on \(\widehat{\mathcal{M}}\) with the exception that

\[\begin{split}f_iM = \begin{cases} 0 & \text{if } \varphi_i(M) = 0, \\ A_{i,k_f}^{-1}M & \text{if } \varphi_i(M) > 0. \end{cases}\end{split}\]

Then Kashiwara [Ka2003] showed that the connected component in \(\widetilde{\mathcal{M}}\) containing a monomial \(M\) such that \(e_iM = 0\), for all \(i \in I\), is crystal isomorphic to the irreducible highest weight crystal \(B(\mathrm{wt}(M))\).

WARNING:

> Monomial crystals depend on the choice of positive integers \(C = (c_{ij})_{i\neq j}\) satisfying the condition \(c_{ij}+c_{ji}=1\). We have chosen such integers uniformly such that \(c_{ij} = 1\) if \(i < j\) and \(c_{ij} = 0\) if \(i>j\).

AUTHORS:

- Arthur Lubovsky: initial version

- Ben Salisbury: initial version

class sage.combinat.crystals.monomial_crystals.CrystalOfNakajimaMonomials(ct, La, c)

  Bases: `InfinityCrystalOfNakajimaMonomials`

  Let \(\widetilde{\mathcal{M}}\) be \(\widehat{\mathcal{M}}\) as a set, and with crystal structure defined as on \(\widehat{\mathcal{M}}\) with the exception that

  \[\begin{split}f_iM = \begin{cases} 0 & \text{if } \varphi_i(M) = 0, \\ A_{i,k_f}^{-1}M & \text{if } \varphi_i(M) > 0. \end{cases}\end{split}\]

  Then Kashiwara [Ka2003] showed that the connected component in \(\widetilde{\mathcal{M}}\) containing a monomial \(M\) such that \(e_iM = 0\), for all \(i \in I\), is crystal isomorphic to the irreducible highest weight crystal \(B(\mathrm{wt}(M))\).

  INPUT:

  - `ct` – a Cartan type

  - `La` – an element of the weight lattice

  EXAMPLES:

  Sage

      sage: La = RootSystem("A2").weight_lattice().fundamental_weights()
      sage: M = crystals.NakajimaMonomials("A2",La[1]+La[2])
      sage: B = crystals.Tableaux("A2",shape=[2,1])
      sage: GM = M.digraph()
      sage: GB = B.digraph()
      sage: GM.is_isomorphic(GB,edge_labels=True)
      True

      sage: La = RootSystem("G2").weight_lattice().fundamental_weights()
      sage: M = crystals.NakajimaMonomials("G2",La[1]+La[2])
      sage: B = crystals.Tableaux("G2",shape=[2,1])
      sage: GM = M.digraph()
      sage: GB = B.digraph()
      sage: GM.is_isomorphic(GB,edge_labels=True)
      True

      sage: La = RootSystem("B2").weight_lattice().fundamental_weights()
      sage: M = crystals.NakajimaMonomials(['B',2],La[1]+La[2])
      sage: B = crystals.Tableaux("B2",shape=[3/2,1/2])
      sage: GM = M.digraph()
      sage: GB = B.digraph()
      sage: GM.is_isomorphic(GB,edge_labels=True)
      True

      sage: La = RootSystem(['A',3,1]).weight_lattice(extended=True).fundamental_weights()
      sage: M = crystals.NakajimaMonomials(['A',3,1],La[0]+La[2])
      sage: B = crystals.GeneralizedYoungWalls(3,La[0]+La[2])
      sage: SM = M.subcrystal(max_depth=4)
      sage: SB = B.subcrystal(max_depth=4)
      sage: GM = M.digraph(subset=SM) # long time
      sage: GB = B.digraph(subset=SB) # long time
      sage: GM.is_isomorphic(GB,edge_labels=True) # long time
      True

      sage: La = RootSystem(['A',5,2]).weight_lattice(extended=True).fundamental_weights()
      sage: LA = RootSystem(['A',5,2]).weight_space().fundamental_weights()
      sage: M = crystals.NakajimaMonomials(['A',5,2],3*La[0])
      sage: B = crystals.LSPaths(3*LA[0])
      sage: SM = M.subcrystal(max_depth=4)
      sage: SB = B.subcrystal(max_depth=4)
      sage: GM = M.digraph(subset=SM)
      sage: GB = B.digraph(subset=SB)
      sage: GM.is_isomorphic(GB,edge_labels=True)
      True

      sage: c = matrix([[0,1,0],[0,0,1],[1,0,0]])
      sage: La = RootSystem(['A',2,1]).weight_lattice(extended=True).fundamental_weights()
      sage: M = crystals.NakajimaMonomials(2*La[1], c=c)
      sage: sorted(M.subcrystal(max_depth=3), key=str)
      [Y(0,0) Y(0,1) Y(1,0) Y(2,1)^-1,
       Y(0,0) Y(0,1)^2 Y(1,1)^-1 Y(2,0) Y(2,1)^-1,
       Y(0,0) Y(0,2)^-1 Y(1,0) Y(1,1) Y(2,1)^-1 Y(2,2),
       Y(0,1) Y(0,2)^-1 Y(1,1)^-1 Y(2,0)^2 Y(2,2),
       Y(0,1) Y(1,0) Y(1,1)^-1 Y(2,0),
       Y(0,1)^2 Y(1,1)^-2 Y(2,0)^2,
       Y(0,2)^-1 Y(1,0) Y(2,0) Y(2,2),
       Y(1,0) Y(1,3) Y(2,0) Y(2,3)^-1,
       Y(1,0)^2]

  Python

      >>> from sage.all import *
      >>> La = RootSystem("A2").weight_lattice().fundamental_weights()
      >>> M = crystals.NakajimaMonomials("A2",La[Integer(1)]+La[Integer(2)])
      >>> B = crystals.Tableaux("A2",shape=[Integer(2),Integer(1)])
      >>> GM = M.digraph()
      >>> GB = B.digraph()
      >>> GM.is_isomorphic(GB,edge_labels=True)
      True

      >>> La = RootSystem("G2").weight_lattice().fundamental_weights()
      >>> M = crystals.NakajimaMonomials("G2",La[Integer(1)]+La[Integer(2)])
      >>> B = crystals.Tableaux("G2",shape=[Integer(2),Integer(1)])
      >>> GM = M.digraph()
      >>> GB = B.digraph()
      >>> GM.is_isomorphic(GB,edge_labels=True)
      True

      >>> La = RootSystem("B2").weight_lattice().fundamental_weights()
      >>> M = crystals.NakajimaMonomials(['B',Integer(2)],La[Integer(1)]+La[Integer(2)])
      >>> B = crystals.Tableaux("B2",shape=[Integer(3)/Integer(2),Integer(1)/Integer(2)])
      >>> GM = M.digraph()
      >>> GB = B.digraph()
      >>> GM.is_isomorphic(GB,edge_labels=True)
      True

      >>> La = RootSystem(['A',Integer(3),Integer(1)]).weight_lattice(extended=True).fundamental_weights()
      >>> M = crystals.NakajimaMonomials(['A',Integer(3),Integer(1)],La[Integer(0)]+La[Integer(2)])
      >>> B = crystals.GeneralizedYoungWalls(Integer(3),La[Integer(0)]+La[Integer(2)])
      >>> SM = M.subcrystal(max_depth=Integer(4))
      >>> SB = B.subcrystal(max_depth=Integer(4))
      >>> GM = M.digraph(subset=SM) # long time
      >>> GB = B.digraph(subset=SB) # long time
      >>> GM.is_isomorphic(GB,edge_labels=True) # long time
      True

      >>> La = RootSystem(['A',Integer(5),Integer(2)]).weight_lattice(extended=True).fundamental_weights()
      >>> LA = RootSystem(['A',Integer(5),Integer(2)]).weight_space().fundamental_weights()
      >>> M = crystals.NakajimaMonomials(['A',Integer(5),Integer(2)],Integer(3)*La[Integer(0)])
      >>> B = crystals.LSPaths(Integer(3)*LA[Integer(0)])
      >>> SM = M.subcrystal(max_depth=Integer(4))
      >>> SB = B.subcrystal(max_depth=Integer(4))
      >>> GM = M.digraph(subset=SM)
      >>> GB = B.digraph(subset=SB)
      >>> GM.is_isomorphic(GB,edge_labels=True)
      True

      >>> c = matrix([[Integer(0),Integer(1),Integer(0)],[Integer(0),Integer(0),Integer(1)],[Integer(1),Integer(0),Integer(0)]])
      >>> La = RootSystem(['A',Integer(2),Integer(1)]).weight_lattice(extended=True).fundamental_weights()
      >>> M = crystals.NakajimaMonomials(Integer(2)*La[Integer(1)], c=c)
      >>> sorted(M.subcrystal(max_depth=Integer(3)), key=str)
      [Y(0,0) Y(0,1) Y(1,0) Y(2,1)^-1,
       Y(0,0) Y(0,1)^2 Y(1,1)^-1 Y(2,0) Y(2,1)^-1,
       Y(0,0) Y(0,2)^-1 Y(1,0) Y(1,1) Y(2,1)^-1 Y(2,2),
       Y(0,1) Y(0,2)^-1 Y(1,1)^-1 Y(2,0)^2 Y(2,2),
       Y(0,1) Y(1,0) Y(1,1)^-1 Y(2,0),
       Y(0,1)^2 Y(1,1)^-2 Y(2,0)^2,
       Y(0,2)^-1 Y(1,0) Y(2,0) Y(2,2),
       Y(1,0) Y(1,3) Y(2,0) Y(2,3)^-1,
       Y(1,0)^2]

  Element

    alias of `CrystalOfNakajimaMonomialsElement`

  cardinality()

    Return the cardinality of `self`.

    EXAMPLES:

    Sage

        sage: La = RootSystem(['A',2]).weight_lattice().fundamental_weights()
        sage: M = crystals.NakajimaMonomials(['A',2], La[1])
        sage: M.cardinality()
        3

        sage: La = RootSystem(['D',4,2]).weight_lattice(extended=True).fundamental_weights()
        sage: M = crystals.NakajimaMonomials(['D',4,2], La[1])
        sage: M.cardinality()
        +Infinity

    Python

        >>> from sage.all import *
        >>> La = RootSystem(['A',Integer(2)]).weight_lattice().fundamental_weights()
        >>> M = crystals.NakajimaMonomials(['A',Integer(2)], La[Integer(1)])
        >>> M.cardinality()
        3

        >>> La = RootSystem(['D',Integer(4),Integer(2)]).weight_lattice(extended=True).fundamental_weights()
        >>> M = crystals.NakajimaMonomials(['D',Integer(4),Integer(2)], La[Integer(1)])
        >>> M.cardinality()
        +Infinity

class sage.combinat.crystals.monomial_crystals.CrystalOfNakajimaMonomialsElement(parent, Y, A)

  Bases: `NakajimaMonomial`

  Element class for `CrystalOfNakajimaMonomials`.

  The \(f_i\) operators need to be modified from the version in `monomial_crystalsNakajimaMonomial` in order to create irreducible highest weight realizations. This modified \(f_i\) is defined as

  \[\begin{split}f_iM = \begin{cases} 0 & \text{if } \varphi_i(M) = 0, \\ A_{i,k_f}^{-1}M & \text{if } \varphi_i(M) > 0. \end{cases}\end{split}\]

  EXAMPLES:

  Sage

      sage: La = RootSystem(['A',5,2]).weight_lattice(extended=True).fundamental_weights()
      sage: M = crystals.NakajimaMonomials(['A',5,2],3*La[0])
      sage: m = M.module_generators[0].f(0); m
      Y(0,0)^2 Y(0,1)^-1 Y(2,0)
      sage: TestSuite(m).run()

  Python

      >>> from sage.all import *
      >>> La = RootSystem(['A',Integer(5),Integer(2)]).weight_lattice(extended=True).fundamental_weights()
      >>> M = crystals.NakajimaMonomials(['A',Integer(5),Integer(2)],Integer(3)*La[Integer(0)])
      >>> m = M.module_generators[Integer(0)].f(Integer(0)); m
      Y(0,0)^2 Y(0,1)^-1 Y(2,0)
      >>> TestSuite(m).run()

  f(i)

    Return the action of \(f_i\) on `self`.

    INPUT:

    - `i` – an element of the index set

    EXAMPLES:

    Sage

        sage: La = RootSystem(['A',5,2]).weight_lattice(extended=True).fundamental_weights()
        sage: M = crystals.NakajimaMonomials(['A',5,2],3*La[0])
        sage: m = M.module_generators[0]
        sage: [m.f(i) for i in M.index_set()]
        [Y(0,0)^2 Y(0,1)^-1 Y(2,0), None, None, None]

    Python

        >>> from sage.all import *
        >>> La = RootSystem(['A',Integer(5),Integer(2)]).weight_lattice(extended=True).fundamental_weights()
        >>> M = crystals.NakajimaMonomials(['A',Integer(5),Integer(2)],Integer(3)*La[Integer(0)])
        >>> m = M.module_generators[Integer(0)]
        >>> [m.f(i) for i in M.index_set()]
        [Y(0,0)^2 Y(0,1)^-1 Y(2,0), None, None, None]

    Sage

        sage: M = crystals.infinity.NakajimaMonomials("E8")
        sage: M.set_variables('A')
        sage: m = M.module_generators[0].f_string([4,2,3,8])
        sage: m
        A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1
        sage: [m.f(i) for i in M.index_set()]
        [A(1,2)^-1 A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1,
         A(2,0)^-1 A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,0)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(4,1)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(5,0)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(6,0)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(7,1)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-2]
        sage: M.set_variables('Y')

    [Python]

        >>> from sage.all import *
        >>> M = crystals.infinity.NakajimaMonomials("E8")
        >>> M.set_variables('A')
        >>> m = M.module_generators[Integer(0)].f_string([Integer(4),Integer(2),Integer(3),Integer(8)])
        >>> m
        A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1
        >>> [m.f(i) for i in M.index_set()]
        [A(1,2)^-1 A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1,
         A(2,0)^-1 A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,0)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(4,1)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(5,0)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(6,0)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(7,1)^-1 A(8,0)^-1,
         A(2,1)^-1 A(3,1)^-1 A(4,0)^-1 A(8,0)^-2]
        >>> M.set_variables('Y')

  weight()

    Return the weight of `self` as an element of the weight lattice.

    EXAMPLES:

    Sage

        sage: La = RootSystem("A2").weight_lattice().fundamental_weights()
        sage: M = crystals.NakajimaMonomials("A2",La[1]+La[2])
        sage: M.module_generators[0].weight()
        (2, 1, 0)

    Python

        >>> from sage.all import *
        >>> La = RootSystem("A2").weight_lattice().fundamental_weights()
        >>> M = crystals.NakajimaMonomials("A2",La[Integer(1)]+La[Integer(2)])
        >>> M.module_generators[Integer(0)].weight()
        (2, 1, 0)

class sage.combinat.crystals.monomial_crystals.InfinityCrystalOfNakajimaMonomials(ct, c, category=None)

  Bases: `UniqueRepresentation`, `Parent`

  Crystal \(B(\infty)\) in terms of (modified) Nakajima monomials.

  Let \(Y_{i,k}\), for \(i \in I\) and \(k \in \ZZ\), be a commuting set of variables, and let \(\boldsymbol{1}\) be a new variable which commutes with each \(Y_{i,k}\). (Here, \(I\) represents the index set of a Cartan datum.) One may endow the structure of a crystal on the set \(\widehat{\mathcal{M}}\) of monomials of the form

  \[M = \prod_{(i,k) \in I\times \ZZ_{\ge0}} Y_{i,k}^{y_i(k)}\boldsymbol{1}.\]

  Elements of \(\widehat{\mathcal{M}}\) are called modified Nakajima monomials. We will omit the \(\boldsymbol{1}\) from the end of a monomial if there exists at least one \(y_i(k) \neq 0\). The crystal structure on this set is defined by

  \[\begin{split}\begin{aligned} \mathrm{wt}(M) & = \sum_{i\in I} \Bigl( \sum_{k \ge 0} y_i(k) \Bigr) \Lambda_i, \\ \varphi_i(M) & = \max\Bigl\{ \sum_{0 \le j \le k} y_i(j) : k \ge 0 \Bigr\}, \\ \varepsilon_i(M) & = \varphi_i(M) - \langle h_i, \mathrm{wt}(M) \rangle, \\ k_f = k_f(M) & = \min\Bigl\{ k \ge 0 : \varphi_i(M) = \sum_{0 \le j \le k} y_i(j) \Bigr\}, \\ k_e = k_e(M) & = \max\Bigl\{ k \ge 0 : \varphi_i(M) = \sum_{0 \le j \le k} y_i(j) \Bigr\}, \end{aligned}\end{split}\]

  where \(\{h_i : i \in I\}\) and \(\{\Lambda_i : i \in I \}\) are the simple coroots and fundamental weights, respectively. With a chosen set of nonnegative integers \(C = (c_{ij})_{i\neq j}\) such that \(c_{ij} + c_{ji} = 1\), one defines

  \[A_{i,k} = Y_{i,k} Y_{i,k+1} \prod_{j\neq i} Y_{j,k+c_{ji}}^{a_{ji}},\]

  where \((a_{ij})_{i,j \in I}\) is a Cartan matrix. Then

  \[\begin{split}\begin{aligned} e_iM &= \begin{cases} 0 & \text{if } \varepsilon_i(M) = 0, \\ A_{i,k_e}M & \text{if } \varepsilon_i(M) > 0, \end{cases} \\ f_iM &= A_{i,k_f}^{-1} M. \end{aligned}\end{split}\]

  It is shown in [KKS2007] that the connected component of \(\widehat{\mathcal{M}}\) containing the element \(\boldsymbol{1}\), which we denote by \(\mathcal{M}(\infty)\), is crystal isomorphic to the crystal \(B(\infty)\).

  INPUT:

  - `cartan_type` – a Cartan type

  - `c` – (optional) the matrix \((c_{ij})_{i,j \in I}\) such that \(c_{ii} = 0\) for all \(i \in I\), \(c_{ij} \in \ZZ_{>0}\) for all \(i,j \in I\), and \(c_{ij} + c_{ji} = 1\) for all \(i \neq j\); the default is \(c_{ij} = 0\) if \(i < j\) and \(0\) otherwise

  EXAMPLES:

  Sage

      sage: B = crystals.infinity.Tableaux("C3")
      sage: S = B.subcrystal(max_depth=4)
      sage: G = B.digraph(subset=S) # long time
      sage: M = crystals.infinity.NakajimaMonomials("C3") # long time
      sage: T = M.subcrystal(max_depth=4) # long time
      sage: H = M.digraph(subset=T) # long time
      sage: G.is_isomorphic(H,edge_labels=True) # long time
      True

      sage: M = crystals.infinity.NakajimaMonomials(['A',2,1])
      sage: T = M.subcrystal(max_depth=3)
      sage: H = M.digraph(subset=T) # long time
      sage: Y = crystals.infinity.GeneralizedYoungWalls(2)
      sage: YS = Y.subcrystal(max_depth=3)
      sage: YG = Y.digraph(subset=YS) # long time
      sage: YG.is_isomorphic(H,edge_labels=True) # long time
      True

      sage: M = crystals.infinity.NakajimaMonomials("D4")
      sage: B = crystals.infinity.Tableaux("D4")
      sage: MS = M.subcrystal(max_depth=3)
      sage: BS = B.subcrystal(max_depth=3)
      sage: MG = M.digraph(subset=MS) # long time
      sage: BG = B.digraph(subset=BS) # long time
      sage: BG.is_isomorphic(MG,edge_labels=True) # long time
      True

  Python

      >>> from sage.all import *
      >>> B = crystals.infinity.Tableaux("C3")
      >>> S = B.subcrystal(max_depth=Integer(4))
      >>> G = B.digraph(subset=S) # long time
      >>> M = crystals.infinity.NakajimaMonomials("C3") # long time
      >>> T = M.subcrystal(max_depth=Integer(4)) # long time
      >>> H = M.digraph(subset=T) # long time
      >>> G.is_isomorphic(H,edge_labels=True) # long time
      True

      >>> M = crystals.infinity.NakajimaMonomials(['A',Integer(2),Integer(1)])
      >>> T = M.subcrystal(max_depth=Integer(3))
      >>> H = M.digraph(subset=T) # long time
      >>> Y = crystals.infinity.GeneralizedYoungWalls(Integer(2))
      >>> YS = Y.subcrystal(max_depth=Integer(3))
      >>> YG = Y.digraph(subset=YS) # long time
      >>> YG.is_isomorphic(H,edge_labels=True) # long time
      True

      >>> M = crystals.infinity.NakajimaMonomials("D4")
      >>> B = crystals.infinity.Tableaux("D4")
      >>> MS = M.subcrystal(max_depth=Integer(3))
      >>> BS = B.subcrystal(max_depth=Integer(3))
      >>> MG = M.digraph(subset=MS) # long time
      >>> BG = B.digraph(subset=BS) # long time
      >>> BG.is_isomorphic(MG,edge_labels=True) # long time
      True

  Element

    alias of `NakajimaMonomial`

  c()

    Return the matrix \(c_{ij}\) of `self`.

    EXAMPLES:

    Sage

        sage: La = RootSystem(['B',3]).weight_lattice().fundamental_weights()
        sage: M = crystals.NakajimaMonomials(La[1]+La[2])
        sage: M.c()
        [0 1 1]
        [0 0 1]
        [0 0 0]

        sage: c = Matrix([[0,0,1],[1,0,0],[0,1,0]])
        sage: La = RootSystem(['A',2,1]).weight_lattice(extended=True).fundamental_weights()
        sage: M = crystals.NakajimaMonomials(2*La[1], c=c)
        sage: M.c() == c
        True

    Python

        >>> from sage.all import *
        >>> La = RootSystem(['B',Integer(3)]).weight_lattice().fundamental_weights()
        >>> M = crystals.NakajimaMonomials(La[Integer(1)]+La[Integer(2)])
        >>> M.c()
        [0 1 1]
        [0 0 1]
        [0 0 0]

        >>> c = Matrix([[Integer(0),Integer(0),Integer(1)],[Integer(1),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0)]])
        >>> La = RootSystem(['A',Integer(2),Integer(1)]).weight_lattice(extended=True).fundamental_weights()
        >>> M = crystals.NakajimaMonomials(Integer(2)*La[Integer(1)], c=c)
        >>> M.c() == c
        True

  cardinality()

    Return the cardinality of `self`, which is always \(\infty\).

    EXAMPLES:

    Sage

        sage: M = crystals.infinity.NakajimaMonomials(['A',5,2])
        sage: M.cardinality()
        +Infinity

    Python

        >>> from sage.all import *
        >>> M = crystals.infinity.NakajimaMonomials(['A',Integer(5),Integer(2)])
        >>> M.cardinality()
        +Infinity

  get_variables()

    Return the type of monomials to use for the element output.

    EXAMPLES:

    Sage

        sage: M = crystals.infinity.NakajimaMonomials(['A', 4])
        sage: M.get_variables()
        'Y'

    Python

        >>> from sage.all import *
        >>> M = crystals.infinity.NakajimaMonomials(['A', Integer(4)])
        >>> M.get_variables()
        'Y'

  set_variables(letter)

    Set the type of monomials to use for the element output.

    If the \(A\) variables are used, the output is written as \(\prod_{i\in I} Y_{i,0}^{\lambda_i} \prod_{i,k} A_{i,k}^{c_{i,k}}\), where \(\sum_{i \in I} \lambda_i \Lambda_i\) is the corresponding dominant weight.

    INPUT:

    - `letter` – can be one of the following:

      - `'Y'` – use \(Y_{i,k}\), corresponds to fundamental weights

      - `'A'` – use \(A_{i,k}\), corresponds to simple roots

    EXAMPLES:

    Sage

        sage: M = crystals.infinity.NakajimaMonomials(['A', 4])
        sage: elt = M.highest_weight_vector().f_string([2,1,3,2,3,2,4,3])
        sage: elt
        Y(1,2) Y(2,0)^-1 Y(2,2)^-1 Y(3,0)^-1 Y(3,2)^-1 Y(4,0)
        sage: M.set_variables('A')
        sage: elt
        A(1,1)^-1 A(2,0)^-1 A(2,1)^-2 A(3,0)^-2 A(3,1)^-1 A(4,0)^-1
        sage: M.set_variables('Y')

    Python

        >>> from sage.all import *
        >>> M = crystals.infinity.NakajimaMonomials(['A', Integer(4)])
        >>> elt = M.highest_weight_vector().f_string([Integer(2),Integer(1),Integer(3),Integer(2),Integer(3),Integer(2),Integer(4),Integer(3)])
        >>> elt
        Y(1,2) Y(2,0)^-1 Y(2,2)^-1 Y(3,0)^-1 Y(3,2)^-1 Y(4,0)
        >>> M.set_variables('A')
        >>> elt
        A(1,1)^-1 A(2,0)^-1 A(2,1)^-2 A(3,0)^-2 A(3,1)^-1 A(4,0)^-1
        >>> M.set_variables('Y')

    Sage

        sage: La = RootSystem(['A',2]).weight_lattice().fundamental_weights()
        sage: M = crystals.NakajimaMonomials(La[1]+La[2])
        sage: lw = M.lowest_weight_vectors()[0]
        sage: lw
        Y(1,2)^-1 Y(2,1)^-1
        sage: M.set_variables('A')
        sage: lw
        Y(1,0) Y(2,0) A(1,0)^-1 A(1,1)^-1 A(2,0)^-2
        sage: M.set_variables('Y')

    [Python]

        >>> from sage.all import *
        >>> La = RootSystem(['A',Integer(2)]).weight_lattice().fundamental_weights()
        >>> M = crystals.NakajimaMonomials(La[Integer(1)]+La[Integer(2)])
        >>> lw = M.lowest_weight_vectors()[Integer(0)]
        >>> lw
        Y(1,2)^-1 Y(2,1)^-1
        >>> M.set_variables('A')
        >>> lw
        Y(1,0) Y(2,0) A(1,0)^-1 A(1,1)^-1 A(2,0)^-2
        >>> M.set_variables('Y')

class sage.combinat.crystals.monomial_crystals.NakajimaMonomial(parent, Y, A)

  Bases: `Element`

  An element of the monomial crystal.

  Monomials of the form \(Y_{i_1,k_1}^{y_1} \cdots Y_{i_t,k_t}^{y_t}\), where \(i_1, \dots, i_t\) are elements of the index set, \(k_1, \dots, k_t\) are nonnegative integers, and \(y_1, \dots, y_t\) are integers.

  EXAMPLES:

  Sage

      sage: M = crystals.infinity.NakajimaMonomials(['B',3,1])
      sage: mg = M.module_generators[0]
      sage: mg
      1
      sage: mg.f_string([1,3,2,0,1,2,3,0,0,1])
      Y(0,0)^-1 Y(0,1)^-1 Y(0,2)^-1 Y(0,3)^-1 Y(1,0)^-3
       Y(1,1)^-2 Y(1,2) Y(2,0)^3 Y(2,2) Y(3,0) Y(3,2)^-1

  Python

      >>> from sage.all import *
      >>> M = crystals.infinity.NakajimaMonomials(['B',Integer(3),Integer(1)])
      >>> mg = M.module_generators[Integer(0)]
      >>> mg
      1
      >>> mg.f_string([Integer(1),Integer(3),Integer(2),Integer(0),Integer(1),Integer(2),Integer(3),Integer(0),Integer(0),Integer(1)])
      Y(0,0)^-1 Y(0,1)^-1 Y(0,2)^-1 Y(0,3)^-1 Y(1,0)^-3
       Y(1,1)^-2 Y(1,2) Y(2,0)^3 Y(2,2) Y(3,0) Y(3,2)^-1

  An example using the \(A\) variables:

  Sage

      sage: M = crystals.infinity.NakajimaMonomials("A3")
      sage: M.set_variables('A')
      sage: mg = M.module_generators[0]
      sage: mg.f_string([1,2,3,2,1])
      A(1,0)^-1 A(1,1)^-1 A(2,0)^-2 A(3,0)^-1
      sage: mg.f_string([3,2,1])
      A(1,2)^-1 A(2,1)^-1 A(3,0)^-1
      sage: M.set_variables('Y')

  [Python]

      >>> from sage.all import *
      >>> M = crystals.infinity.NakajimaMonomials("A3")
      >>> M.set_variables('A')
      >>> mg = M.module_generators[Integer(0)]
      >>> mg.f_string([Integer(1),Integer(2),Integer(3),Integer(2),Integer(1)])
      A(1,0)^-1 A(1,1)^-1 A(2,0)^-2 A(3,0)^-1
      >>> mg.f_string([Integer(3),Integer(2),Integer(1)])
      A(1,2)^-1 A(2,1)^-1 A(3,0)^-1
      >>> M.set_variables('Y')

  e(i)

    Return the action of \(e_i\) on `self`.

    INPUT:

    - `i` – an element of the index set

    EXAMPLES:

    Sage

        sage: M = crystals.infinity.NakajimaMonomials(['E',7,1])
        sage: m = M.module_generators[0].f_string([0,1,4,3])
        sage: [m.e(i) for i in M.index_set()]
        [None,
         None,
         None,
         Y(0,0)^-1 Y(1,1)^-1 Y(2,1) Y(3,0) Y(3,1) Y(4,0)^-1 Y(4,1)^-1 Y(5,0),
         None,
         None,
         None,
         None]

        sage: M = crystals.infinity.NakajimaMonomials("C5")
        sage: m = M.module_generators[0].f_string([1,3])
        sage: [m.e(i) for i in M.index_set()]
        [Y(2,1) Y(3,0)^-1 Y(3,1)^-1 Y(4,0),
         None,
         Y(1,0)^-1 Y(1,1)^-1 Y(2,0),
         None,
         None]

        sage: M = crystals.infinity.NakajimaMonomials(['D',4,1])
        sage: M.set_variables('A')
        sage: m = M.module_generators[0].f_string([4,2,3,0])
        sage: [m.e(i) for i in M.index_set()]
        [A(2,1)^-1 A(3,1)^-1 A(4,0)^-1,
         None,
         None,
         A(0,2)^-1 A(2,1)^-1 A(4,0)^-1,
         None]
        sage: M.set_variables('Y')

    Python

        >>> from sage.all import *
        >>> M = crystals.infinity.NakajimaMonomials(['E',Integer(7),Integer(1)])
        >>> m = M.module_generators[Integer(0)].f_string([Integer(0),Integer(1),Integer(4),Integer(3)])
        >>> [m.e(i) for i in M.index_set()]
        [None,
         None,
         None,
         Y(0,0)^-1 Y(1,1)^-1 Y(2,1) Y(3,0) Y(3,1) Y(4,0)^-1 Y(4,1)^-1 Y(5,0),
         None,
         None,
         None,
         None]

        >>> M = crystals.infinity.NakajimaMonomials("C5")
        >>> m = M.module_generators[Integer(0)].f_string([Integer(1),Integer(3)])
        >>> [m.e(i) for i in M.index_set()]
        [Y(2,1) Y(3,0)^-1 Y(3,1)^-1 Y(4,0),
         None,
         Y(1,0)^-1 Y(1,1)^-1 Y(2,0),
         None,
         None]

        >>> M = crystals.infinity.NakajimaMonomials(['D',Integer(4),Integer(1)])
        >>> M.set_variables('A')
        >>> m = M.module_generators[Integer(0)].f_string([Integer(4),Integer(2),Integer(3),Integer(0)])
        >>> [m.e(i) for i in M.index_set()]
        [A(2,1)^-1 A(3,1)^-1 A(4,0)^-1,
         None,
         None,
         A(0,2)^-1 A(2,1)^-1 A(4,0)^-1,
         None]
        >>> M.set_variables('Y')

  epsilon(i)

    Return the value of \(\varepsilon_i\) on `self`.

    INPUT:

    - `i` – an element of the index set

    EXAMPLES:

    Sage

        sage: M = crystals.infinity.NakajimaMonomials(['G',2,1])
        sage: m = M.module_generators[0].f(2)
        sage: [m.epsilon(i) for i in M.index_set()]
        [0, 0, 1]

        sage: M = crystals.infinity.NakajimaMonomials(['C',4,1])
        sage: m = M.module_generators[0].f_string([4,2,3])
        sage: [m.epsilon(i) for i in M.index_set()]
        [0, 0, 0, 1, 0]

    Python

        >>> from sage.all import *
        >>> M = crystals.infinity.NakajimaMonomials(['G',Integer(2),Integer(1)])
        >>> m = M.module_generators[Integer(0)].f(Integer(2))
        >>> [m.epsilon(i) for i in M.index_set()]
        [0, 0, 1]

        >>> M = crystals.infinity.NakajimaMonomials(['C',Integer(4),Integer(1)])
        >>> m = M.module_generators[Integer(0)].f_string([Integer(4),Integer(2),Integer(3)])
        >>> [m.epsilon(i) for i in M.index_set()]
        [0, 0, 0, 1, 0]

  f(i)

    Return the action of \(f_i\) on `self`.

    INPUT:

    - `i` – an element of the index set

    EXAMPLES:

    Sage

        sage: M = crystals.infinity.NakajimaMonomials("B4")
        sage: m = M.module_generators[0].f_string([1,3,4])
        sage: [m.f(i) for i in M.index_set()]
        [Y(1,0)^-2 Y(1,1)^-2 Y(2,0)^2 Y(2,1) Y(3,0)^-1 Y(4,0) Y(4,1)^-1,
         Y(1,0)^-1 Y(1,1)^-1 Y(1,2) Y(2,0) Y(2,2)^-1 Y(3,0)^-1 Y(3,1) Y(4,0) Y(4,1)^-1,
         Y(1,0)^-1 Y(1,1)^-1 Y(2,0) Y(2,1)^2 Y(3,0)^-2 Y(3,1)^-1 Y(4,0)^3 Y(4,1)^-1,
         Y(1,0)^-1 Y(1,1)^-1 Y(2,0) Y(2,1) Y(3,0)^-1 Y(3,1) Y(4,1)^-2]

    Python

        >>> from sage.all import *
        >>> M = crystals.infinity.NakajimaMonomials("B4")
        >>> m = M.module_generators[Integer(0)].f_string([Integer(1),Integer(3),Integer(4)])
        >>> [m.f(i) for i in M.index_set()]
        [Y(1,0)^-2 Y(1,1)^-2 Y(2,0)^2 Y(2,1) Y(3,0)^-1 Y(4,0) Y(4,1)^-1,
         Y(1,0)^-1 Y(1,1)^-1 Y(1,2) Y(2,0) Y(2,2)^-1 Y(3,0)^-1 Y(3,1) Y(4,0) Y(4,1)^-1,
         Y(1,0)^-1 Y(1,1)^-1 Y(2,0) Y(2,1)^2 Y(3,0)^-2 Y(3,1)^-1 Y(4,0)^3 Y(4,1)^-1,
         Y(1,0)^-1 Y(1,1)^-1 Y(2,0) Y(2,1) Y(3,0)^-1 Y(3,1) Y(4,1)^-2]

  phi(i)

    Return the value of \(\varphi_i\) on `self`.

    INPUT:

    - `i` – an element of the index set

    EXAMPLES:

    Sage

        sage: M = crystals.infinity.NakajimaMonomials(['D',4,3])
        sage: m = M.module_generators[0].f(1)
        sage: [m.phi(i) for i in M.index_set()]
        [1, -1, 1]

        sage: M = crystals.infinity.NakajimaMonomials(['C',4,1])
        sage: m = M.module_generators[0].f_string([4,2,3])
        sage: [m.phi(i) for i in M.index_set()]
        [0, 1, -1, 2, -1]

    Python

        >>> from sage.all import *
        >>> M = crystals.infinity.NakajimaMonomials(['D',Integer(4),Integer(3)])
        >>> m = M.module_generators[Integer(0)].f(Integer(1))
        >>> [m.phi(i) for i in M.index_set()]
        [1, -1, 1]

        >>> M = crystals.infinity.NakajimaMonomials(['C',Integer(4),Integer(1)])
        >>> m = M.module_generators[Integer(0)].f_string([Integer(4),Integer(2),Integer(3)])
        >>> [m.phi(i) for i in M.index_set()]
        [0, 1, -1, 2, -1]

  weight()

    Return the weight of `self` as an element of the weight lattice.

    EXAMPLES:

    Sage

        sage: C = crystals.infinity.NakajimaMonomials(['A',1,1])
        sage: v = C.highest_weight_vector()
        sage: v.f(1).weight() + v.f(0).weight()
        -delta

        sage: M = crystals.infinity.NakajimaMonomials(['A',4,2])
        sage: m = M.highest_weight_vector().f_string([1,2,0,1])
        sage: m.weight()
        2*Lambda[0] - Lambda[1] - delta

    Python

        >>> from sage.all import *
        >>> C = crystals.infinity.NakajimaMonomials(['A',Integer(1),Integer(1)])
        >>> v = C.highest_weight_vector()
        >>> v.f(Integer(1)).weight() + v.f(Integer(0)).weight()
        -delta

        >>> M = crystals.infinity.NakajimaMonomials(['A',Integer(4),Integer(2)])
        >>> m = M.highest_weight_vector().f_string([Integer(1),Integer(2),Integer(0),Integer(1)])
        >>> m.weight()
        2*Lambda[0] - Lambda[1] - delta

  weight_in_root_lattice()

    Return the weight of `self` as an element of the root lattice.

    EXAMPLES:

    Sage

        sage: M = crystals.infinity.NakajimaMonomials(['F',4])
        sage: m = M.module_generators[0].f_string([3,3,1,2,4])
        sage: m.weight_in_root_lattice()
        -alpha[1] - alpha[2] - 2*alpha[3] - alpha[4]

        sage: M = crystals.infinity.NakajimaMonomials(['B',3,1])
        sage: mg = M.module_generators[0]
        sage: m = mg.f_string([1,3,2,0,1,2,3,0,0,1])
        sage: m.weight_in_root_lattice()
        -3*alpha[0] - 3*alpha[1] - 2*alpha[2] - 2*alpha[3]

        sage: M = crystals.infinity.NakajimaMonomials(['C',3,1])
        sage: m = M.module_generators[0].f_string([3,0,1,2,0])
        sage: m.weight_in_root_lattice()
        -2*alpha[0] - alpha[1] - alpha[2] - alpha[3]

    Python

        >>> from sage.all import *
        >>> M = crystals.infinity.NakajimaMonomials(['F',Integer(4)])
        >>> m = M.module_generators[Integer(0)].f_string([Integer(3),Integer(3),Integer(1),Integer(2),Integer(4)])
        >>> m.weight_in_root_lattice()
        -alpha[1] - alpha[2] - 2*alpha[3] - alpha[4]

        >>> M = crystals.infinity.NakajimaMonomials(['B',Integer(3),Integer(1)])
        >>> mg = M.module_generators[Integer(0)]
        >>> m = mg.f_string([Integer(1),Integer(3),Integer(2),Integer(0),Integer(1),Integer(2),Integer(3),Integer(0),Integer(0),Integer(1)])
        >>> m.weight_in_root_lattice()
        -3*alpha[0] - 3*alpha[1] - 2*alpha[2] - 2*alpha[3]

        >>> M = crystals.infinity.NakajimaMonomials(['C',Integer(3),Integer(1)])
        >>> m = M.module_generators[Integer(0)].f_string([Integer(3),Integer(0),Integer(1),Integer(2),Integer(0)])
        >>> m.weight_in_root_lattice()
        -2*alpha[0] - alpha[1] - alpha[2] - alpha[3]