Let
be a CartanType with index set
, and
be a realization of the type
weight
lattice.
A type
crystal
is a colored oriented graph
equipped with a weight function from the nodes to some realization
of the type
weight lattice such that:
Each edge is colored with a label in
.
For each
, each node
has:
-successor
;
-predecessor
.Furthermore, when they exist,
.weight() = x.weight() -
;
.weight() = x.weight() +
.This crystal actually models a representation of a Lie algebra if it satisfies some further local conditions due to Stembridge [St2003].
REFERENCES:
[St2003] J. Stembridge, A local characterization of simply-laced crystals, Trans. Amer. Math. Soc. 355 (2003), no. 12, 4807-4823.
EXAMPLES:
We construct the type
crystal on letters (or in representation
theoretic terms, the highest weight crystal of type
corresponding to the highest weight
):
sage: C = CrystalOfLetters(['A',5]); C
The crystal of letters for type ['A', 5]
It has a single highest weight element:
sage: C.highest_weight_vectors()
[1]
A crystal is an enumerated set (see EnumeratedSets); and we can count and list its elements in the usual way:
sage: C.cardinality()
6
sage: C.list()
[1, 2, 3, 4, 5, 6]
as well as use it in for loops:
sage: [x for x in C]
[1, 2, 3, 4, 5, 6]
Here are some more elaborate crystals (see their respective documentations):
sage: Tens = TensorProductOfCrystals(C, C)
sage: Spin = CrystalOfSpins(['B', 3])
sage: Tab = CrystalOfTableaux(['A', 3], shape = [2,1,1])
sage: Fast = FastCrystal(['B', 2], shape = [3/2, 1/2])
sage: KR = KirillovReshetikhinCrystal(['A',2,1],1,1)
One can get (currently) crude plotting via:
sage: Tab.plot()
If dot2tex is installed, one can obtain nice latex pictures via:
sage: K = KirillovReshetikhinCrystal(['A',3,1], 1,1)
sage: view(K, pdflatex=True, tightpage=True) #optional - dot2tex graphviz
or with colored edges:
sage: K = KirillovReshetikhinCrystal(['A',3,1], 1,1)
sage: G = K.digraph()
sage: G.set_latex_options(color_by_label = {0:"black", 1:"red", 2:"blue", 3:"green"}) #optional - dot2tex graphviz
sage: view(G, pdflatex=True, tightpage=True) #optional - dot2tex graphviz
For rank two crystals, there is an alternative method of getting metapost pictures. For more information see C.metapost?
See also the categories Crystals, ClassicalCrystals, FiniteCrystals, HighestWeightCrystals.
Caveat: this crystal library, although relatively featureful for classical crystals, is still in an early development stage, and the syntax details may be subject to changes.
TODO:
Most of the above features (except Littelmann/alcove paths) are in MuPAD-Combinat (see lib/COMBINAT/crystals.mu), which could provide inspiration.
Bases: sage.combinat.backtrack.GenericBacktracker
Time complexity:
amortized for each produced
element, where
is the size of the index set, and f is
the cost of computing
and
operators.
Memory complexity: O(depth of the crystal)
Principle of the algorithm:
Let C be a classical crystal. It’s an acyclic graph where all connected component has a unique element without predecessors (the highest weight element for this component). Let’s assume for simplicity that C is irreducible (i.e. connected) with highest weight element u.
One can define a natural spanning tree of
by taking
as rot of the tree, and for any other element
taking as ancestor the element
such that
there is an
-arrow from
to
with
minimal. Then, a path from
to
describes the lexicographically smallest sequence
such that
.
Morally, the iterator implemented below just does a depth first
search walk through this spanning tree. In practice, this can be
achieved recursively as follow: take an element
, and
consider in turn each successor
, ignoring
those such that
for some
and
(this can be tested by computing
for
).
EXAMPLES:
sage: from sage.combinat.crystals.crystals import CrystalBacktracker
sage: C = CrystalOfTableaux(['B',3],shape=[3,2,1])
sage: CB = CrystalBacktracker(C)
sage: len(list(CB))
1617