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
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
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 is highest weight if
for all
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])
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 is lowest weight if
for all
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]]
Return the -dimension of self.
Let denote a highest weight crystal. Recall that
the degree of the
-weight space of
(under
the principal gradation) is equal to
where
for all
(in particular, take
).
The -dimension of a highest weight crystal
is
defined as
where denotes the degree
portion of
. This
can be expressed as the product
where denotes the set of positive coroots.
Taking the limit as
gives the dimension of
.
For more information, see [Kac] Section 10.10.
INPUT:
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 -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. |
Bases: sage.categories.tensor.TensorProductsCategory
The category of highest weight crystals constructed by tensor product of highest weight crystals.
Implements operations on tensor products of crystals.
Return the highest weight vectors of self.
This works by using a backtracing algorithm since if
is highest weight then
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]]])
EXAMPLES:
sage: HighestWeightCrystals().TensorProducts().extra_super_categories()
[Category of highest weight crystals]
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
Todo
Should this category be a CategoryWithAxiom?
EXAMPLES:
sage: HighestWeightCrystals().additional_structure()
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
EXAMPLES:
sage: HighestWeightCrystals().super_categories()
[Category of crystals]