### Navigation

- index
- modules |
- next |
- previous |
- Category Theory »

# Highest Weight Crystals

class `sage.categories.highest_weight_crystals.``HighestWeightCrystals`(s=None)

  Bases: `sage.categories.category_singleton.Category_singleton`

  The category of highest weight crystals.

  A crystal is highest weight if it is acyclic; in particular, every connected component has a unique highest weight element, and that element generate the component.

  EXAMPLES:

      sage: C = HighestWeightCrystals()
      sage: C
      Category of highest weight crystals
      sage: C.super_categories()
      [Category of crystals]
      sage: C.example()
      Highest weight crystal of type A_3 of highest weight omega_1

  TESTS:

      sage: TestSuite(C).run()
      sage: B = HighestWeightCrystals().example()
      sage: TestSuite(B).run(verbose = True)
      running ._test_an_element() . . . pass
      running ._test_category() . . . pass
      running ._test_elements() . . .
        Running the test suite of self.an_element()
        running ._test_category() . . . pass
        running ._test_eq() . . . pass
        running ._test_not_implemented_methods() . . . pass
        running ._test_pickling() . . . pass
        running ._test_stembridge_local_axioms() . . . pass
        pass
      running ._test_elements_eq_reflexive() . . . pass
      running ._test_elements_eq_symmetric() . . . pass
      running ._test_elements_eq_transitive() . . . pass
      running ._test_elements_neq() . . . pass
      running ._test_enumerated_set_contains() . . . pass
      running ._test_enumerated_set_iter_cardinality() . . . pass
      running ._test_enumerated_set_iter_list() . . . pass
      running ._test_eq() . . . pass
      running ._test_fast_iter() . . . pass
      running ._test_not_implemented_methods() . . . pass
      running ._test_pickling() . . . pass
      running ._test_some_elements() . . . pass
      running ._test_stembridge_local_axioms() . . . pass

  class `ElementMethods`
  class `HighestWeightCrystals.``ParentMethods`
    `highest_weight_vector`()

      Returns the highest weight vector if there is a single one; otherwise, raises an error.

      Caveat: this assumes that `highest_weight_vectors()` returns a list or tuple.

      EXAMPLES:

          sage: C = crystals.Letters(['A',5])
          sage: C.highest_weight_vector()
          1

    `highest_weight_vectors`()

      Returns the highest weight vectors of `self`

      This default implementation selects among the module generators those that are highest weight, and caches the result. A crystal element \(b\) is highest weight if \(e_i(b)=0\) for all \(i\) in the index set.

      EXAMPLES:

          sage: C = crystals.Letters(['A',5])
          sage: C.highest_weight_vectors()
          (1,)

          sage: C = crystals.Letters(['A',2])
          sage: T = crystals.TensorProduct(C,C,C,generators=[[C(2),C(1),C(1)],[C(1),C(2),C(1)]])
          sage: T.highest_weight_vectors()
          ([2, 1, 1], [1, 2, 1])

    `lowest_weight_vectors`()

      Returns the lowest weight vectors of `self`

      This default implementation selects among all elements of the crystal those that are lowest weight, and cache the result. A crystal element \(b\) is lowest weight if \(f_i(b)=0\) for all \(i\) in the index set.

      EXAMPLES:

          sage: C = crystals.Letters(['A',5])
          sage: C.lowest_weight_vectors()
          [6]

          sage: C = crystals.Letters(['A',2])
          sage: T = crystals.TensorProduct(C,C,C,generators=[[C(2),C(1),C(1)],[C(1),C(2),C(1)]])
          sage: T.lowest_weight_vectors()
          [[3, 2, 3], [3, 3, 2]]

    `q_dimension`(q=None, prec=None, use_product=False)

      Return the \(q\)-dimension of `self`.

      Let \(B(\lambda)\) denote a highest weight crystal. Recall that the degree of the \(\mu\)-weight space of \(B(\lambda)\) (under the principal gradation) is equal to \(\langle \rho^{\vee}, \lambda - \mu \rangle\) where \(\langle \rho^{\vee}, \alpha_i \rangle = 1\) for all \(i \in I\) (in particular, take \(\rho^{\vee} = \sum_{i \in I} h_i\)).

      The \(q\)-dimension of a highest weight crystal \(B(\lambda)\) is defined as

      \[\dim_q B(\lambda) := \sum_{j \geq 0} \dim(B_j) q^j,\]

      where \(B_j\) denotes the degree \(j\) portion of \(B(\lambda)\). This can be expressed as the product

      \[\dim_q B(\lambda) = \prod_{\alpha^{\vee} \in \Delta_+^{\vee}} \left( \frac{1 - q^{\langle \lambda + \rho, \alpha^{\vee} \rangle}}{1 - q^{\langle \rho, \alpha^{\vee} \rangle}} \right)^{\mathrm{mult}\, \alpha},\]

      where \(\Delta_+^{\vee}\) denotes the set of positive coroots. Taking the limit as \(q \to 1\) gives the dimension of \(B(\lambda)\). For more information, see [Kac] Section 10.10.

      INPUT:

      - `q` – the (generic) parameter \(q\)
      - `prec` – (default: `None`) The precision of the power series ring to use if the crystal is not known to be finite (i.e. the number of terms returned). If `None`, then the result is returned as a lazy power series.
      - `use_product` – (default: `False`) if we have a finite crystal and `True`, use the product formula

      EXAMPLES:

          sage: C = crystals.Tableaux(['A',2], shape=[2,1])
          sage: qdim = C.q_dimension(); qdim
          q^4 + 2*q^3 + 2*q^2 + 2*q + 1
          sage: qdim(1)
          8
          sage: len(C) == qdim(1)
          True
          sage: C.q_dimension(use_product=True) == qdim
          True
          sage: C.q_dimension(prec=20)
          q^4 + 2*q^3 + 2*q^2 + 2*q + 1
          sage: C.q_dimension(prec=2)
          2*q + 1

          sage: R.<t> = QQ[]
          sage: C.q_dimension(q=t^2)
          t^8 + 2*t^6 + 2*t^4 + 2*t^2 + 1

          sage: C = crystals.Tableaux(['A',2], shape=[5,2])
          sage: C.q_dimension()
          q^10 + 2*q^9 + 4*q^8 + 5*q^7 + 6*q^6 + 6*q^5
           + 6*q^4 + 5*q^3 + 4*q^2 + 2*q + 1

          sage: C = crystals.Tableaux(['B',2], shape=[2,1])
          sage: qdim = C.q_dimension(); qdim
          q^10 + 2*q^9 + 3*q^8 + 4*q^7 + 5*q^6 + 5*q^5
           + 5*q^4 + 4*q^3 + 3*q^2 + 2*q + 1
          sage: qdim == C.q_dimension(use_product=True)
          True

          sage: C = crystals.Tableaux(['D',4], shape=[2,1])
          sage: C.q_dimension()
          q^16 + 2*q^15 + 4*q^14 + 7*q^13 + 10*q^12 + 13*q^11
           + 16*q^10 + 18*q^9 + 18*q^8 + 18*q^7 + 16*q^6 + 13*q^5
           + 10*q^4 + 7*q^3 + 4*q^2 + 2*q + 1

      We check with a finite tensor product:

          sage: TP = crystals.TensorProduct(C, C)
          sage: TP.cardinality()
          25600
          sage: qdim = TP.q_dimension(use_product=True); qdim # long time
          q^32 + 2*q^31 + 8*q^30 + 15*q^29 + 34*q^28 + 63*q^27 + 110*q^26
           + 175*q^25 + 276*q^24 + 389*q^23 + 550*q^22 + 725*q^21
           + 930*q^20 + 1131*q^19 + 1362*q^18 + 1548*q^17 + 1736*q^16
           + 1858*q^15 + 1947*q^14 + 1944*q^13 + 1918*q^12 + 1777*q^11
           + 1628*q^10 + 1407*q^9 + 1186*q^8 + 928*q^7 + 720*q^6
           + 498*q^5 + 342*q^4 + 201*q^3 + 117*q^2 + 48*q + 26
          sage: qdim(1) # long time
          25600
          sage: TP.q_dimension() == qdim # long time
          True

      The \(q\)-dimensions of infinite crystals are returned as formal power series:

          sage: C = crystals.LSPaths(['A',2,1], [1,0,0])
          sage: C.q_dimension(prec=5)
          1 + q + 2*q^2 + 2*q^3 + 4*q^4 + O(q^5)
          sage: C.q_dimension(prec=10)
          1 + q + 2*q^2 + 2*q^3 + 4*q^4 + 5*q^5 + 7*q^6
           + 9*q^7 + 13*q^8 + 16*q^9 + O(q^10)
          sage: qdim = C.q_dimension(); qdim
          1 + q + 2*q^2 + 2*q^3 + 4*q^4 + 5*q^5 + 7*q^6
           + 9*q^7 + 13*q^8 + 16*q^9 + 22*q^10 + O(x^11)
          sage: qdim.compute_coefficients(15)
          sage: qdim
          1 + q + 2*q^2 + 2*q^3 + 4*q^4 + 5*q^5 + 7*q^6
           + 9*q^7 + 13*q^8 + 16*q^9 + 22*q^10 + 27*q^11
           + 36*q^12 + 44*q^13 + 57*q^14 + 70*q^15 + O(x^16)

      REFERENCES:

      [Kac] | Victor G. Kac. Infinite-dimensional Lie Algebras. Third edition. Cambridge University Press, Cambridge, 1990.

  class `HighestWeightCrystals.``TensorProducts`(category, *args)

    Bases: `sage.categories.tensor.TensorProductsCategory`

    The category of highest weight crystals constructed by tensor product of highest weight crystals.

    class `ParentMethods`

      Implements operations on tensor products of crystals.

      `highest_weight_vectors`()

        Return the highest weight vectors of `self`.

        This works by using a backtracing algorithm since if \(b_2 \otimes b_1\) is highest weight then \(b_1\) is highest weight.

        EXAMPLES:

            sage: C = crystals.Tableaux(['D',4], shape=[2,2])
            sage: D = crystals.Tableaux(['D',4], shape=[1])
            sage: T = crystals.TensorProduct(D, C)
            sage: T.highest_weight_vectors()
            ([[[1]], [[1, 1], [2, 2]]],
             [[[3]], [[1, 1], [2, 2]]],
             [[[-2]], [[1, 1], [2, 2]]])
            sage: L = filter(lambda x: x.is_highest_weight(), T)
            sage: tuple(L) == T.highest_weight_vectors()
            True

        TESTS:

        We check this works with Kashiwara’s convention for tensor products:

            sage: C = crystals.Tableaux(['B',3], shape=[2,2])
            sage: D = crystals.Tableaux(['B',3], shape=[1])
            sage: T = crystals.TensorProduct(D, C)
            sage: T.global_options(convention='Kashiwara')
            sage: T.highest_weight_vectors()
            ([[[1, 1], [2, 2]], [[1]]],
             [[[1, 1], [2, 2]], [[3]]],
             [[[1, 1], [2, 2]], [[-2]]])
            sage: T.global_options.reset()
            sage: T.highest_weight_vectors()
            ([[[1]], [[1, 1], [2, 2]]],
             [[[3]], [[1, 1], [2, 2]]],
             [[[-2]], [[1, 1], [2, 2]]])

    `HighestWeightCrystals.TensorProducts.``extra_super_categories`()

      EXAMPLES:

          sage: HighestWeightCrystals().TensorProducts().extra_super_categories()
          [Category of highest weight crystals]

  `HighestWeightCrystals.``additional_structure`()

    Return `None`.

    Indeed, the category of highest weight crystals defines no additional structure: it only guarantees the existence of a unique highest weight element in each component.

    See also

    `Category.additional_structure()`

    Todo

    Should this category be a `CategoryWithAxiom`?

    EXAMPLES:

        sage: HighestWeightCrystals().additional_structure()

  `HighestWeightCrystals.``example`()

    Returns an example of highest weight crystals, as per `Category.example()`.

    EXAMPLES:

        sage: B = HighestWeightCrystals().example(); B
        Highest weight crystal of type A_3 of highest weight omega_1

  `HighestWeightCrystals.``super_categories`()

    EXAMPLES:

        sage: HighestWeightCrystals().super_categories()
        [Category of crystals]

### Navigation

- index
- modules |
- next |
- previous |
- Category Theory »