For the drawing command to work you will need to:
- install graphviz
- install dot2tex via: sage -f http://sage.math.washington.edu/home/nthiery/dot2tex-2.8.7-2.spkg
- enter this in the notebook or in your ./sage/init.sage file:
from sage.misc.latex import latex
latex.add_to_preamble('\\usepackage{tikz}')
latex.add_to_jsmath_avoid_list('\\begin{tikzpicture}')
}}}
{{{id=84|
b = B(rows=[[1,3],[3]])
b.weight()
///
(1, 0, 2)
}}}
{{{id=85|
b.f(1)
///
[[2, 3], [3]]
}}}
{{{id=86|
b.e(2)
///
[[1, 3], [2]]
}}}
{{{id=93|
b.epsilon(2)
///
2
}}}
{{{id=94|
b.phi(2)
///
0
}}}
{{{id=87|
b.s(2)
///
[[1, 2], [2]]
}}}
The following does not yet work and is on the wishlist (see below):
{{{id=109| show(Tableau([[1,2,2],[2,3]])) ///Wishlist: cyclage graph in Sage!!
Wishlist: LaTeX support for tableaux, compatible with jsmath/mathjax for visualization in the notebook, see trac#4355.
see Lascoux, Leclerc, Thibon Crystal graphs and q-analogues of weight multiplicities for the root system,Lett. Math. Phys. 35 (1995), no. 4, 359–374.
{{{id=12| n = len(mu)-1 B = CrystalOfTableaux(['A',n], shape=la) b = B(rows=[[1,1,2],[2,4],[3]]); b /// [[1, 1, 2], [2, 4], [3]] }}} {{{id=17| b = B(rows=[[1,1,2],[2,4],[3]]); b /// [[1, 1, 2], [2, 4], [3]] }}} {{{id=19| b.e(3) /// [[1, 1, 2], [2, 3], [3]] }}} {{{id=20| b.s(2) /// [[1, 1, 3], [2, 4], [3]] }}}We calculate the orbit of an element in the crystal under the group generated by the reflections along i-strings in the crystal
{{{id=23| C = TransitiveIdeal(lambda x: [ x.s(i) for i in x.index_set() ] , [b]) list(C) /// [[[1, 1, 2], [2, 4], [3]], [[1, 1, 3], [2, 4], [3]], [[1, 2, 3], [2, 4], [3]], [[1, 1, 3], [2, 4], [4]], [[1, 2, 3], [2, 4], [4]], [[1, 3, 3], [2, 4], [4]]] }}}We calculate the shortest distance to the end of a string
{{{id=25| def length_to_end_of_string(x,i): return min(x.phi(i), x.epsilon(i)) /// }}}Analogue of the major index in terms of the distance to end of string in crystal
{{{id=27| def element_statistic(x): return sum(i*length_to_end_of_string(x,i) for i in x.index_set()) /// }}} {{{id=28| element_statistic(b) /// 4 }}}The real statistic is given by the average over the orbit of an element of the above statistic
{{{id=29| def orbit_statistic(x): orbit = list(TransitiveIdeal(lambda y: [ y.s(i) for i in y.index_set() ] , [x])) return 1/len(orbit) * sum(element_statistic(y) for y in orbit) /// }}} {{{id=30| orbit_statistic(b) /// 2 }}}We collect all elements in the crystal of weight mu
{{{id=36| Bmu = [x for x in B if [i[1] for i in x.weight()]==mu] /// }}} {{{id=32| sum(t^orbit_statistic(x) for x in Bmu) /// t^3 + 2*t^2 + t }}}The charge and orbit statistic only agree after the application of the Schuetzenberger involution \Omega_2
{{{id=33| for x in Bmu: x.pp() print "orbit and tableaux charge ", orbit_statistic(x), x.to_tableau().charge() print " " /// 1 1 4 2 2 3 orbit and tableaux charge 3 1 1 1 2 2 4 3 orbit and tableaux charge 2 2 1 1 3 2 2 4 orbit and tableaux charge 2 2 1 1 2 2 3 4 orbit and tableaux charge 1 3 }}}Wishlist: implementation of the Schuetzenberger involution Omega_2 on tableaux and words
M. Okado. A. Schilling, M. Shimozono A tensor product theorem related to perfect crystals
J. Algebra 267 (2003) 212-245 ( math.QA/0111288 )
A. Schilling, P. Tingley, Demazure crystals and energy functions, preprint
{{{id=66| print n, la, mu /// 3 [3, 2, 1] [2, 2, 1, 1] }}} {{{id=48| def K(n,k): return KirillovReshetikhinCrystal(['A',n,1],k,1) /// }}} {{{id=95| view(K(2,1), pdflatex = True) ///
}}}
{{{id=96|
view(K(3,2), pdflatex = True)
///
}}}
{{{id=49|
KR = [ K(n,i) for i in mu ]
T = TensorProductOfCrystals(*KR)
///
}}}
{{{id=65|
def vacuum(T):
K = T.crystals
l = len(K)
vac = [ K[l-1].module_generator() ]
for i in range(l-1):
vac = [b for b in K[l-2-i] if b.Epsilon() == vac[0].Phi()] + vac
return vac
///
}}}
{{{id=67|
vacuum(T)
///
[[[1], [2]], [[3], [4]], [[2]], [[1]]]
}}}
{{{id=50|
@cached_function
def string_rep(T, u=None):
r"""
Calculates the string representation for all elements in
`T = K(n,k_1) \otimes \cdots \otimes K(n,k_l)`:
The output is a dictionary which gives for every `x\in T` the shortest
path in `f_i` from `u = u_1 \otimes \cdots \otimes u_l` to `x`.
By default, `u` is the vacuum of T.
"""
index_set = T.index_set()
import copy
if u is None:
u = vacuum(T)
string = { T(*u) : [] }
known = set( string.keys() )
todo = copy.copy(known)
# Invariants:
# - known contains all elements x for which we know string(x)
# - todo contains all elements x for which we haven't propagated to each child
while todo <> set( [] ):
x = todo.pop()
for i in index_set:
eix = x.f(i)
if (eix is not None and eix not in known):
todo.add(eix)
known.add(eix)
string[eix] = string[x] + [i]
return string.__getitem__
///
}}}
{{{id=51|
def energy(x):
r"""
Calculates the energy function of `x` which is a tensor
product of elements in `K(n,k)`. If
`x \in K(n,k_1) \otimes \cdots \otimes K(n,k_l)`, then the
energy is defined as the number of `f_0` in the shortest path
from `u_1 \otimes \cdots \otimes u_l` to `x`.
"""
g = string_rep(x.parent())
return g(x).count(0)
///
}}}
{{{id=55|
Lambda = T.weight_lattice_realization().fundamental_weights()
Lambda
///
Finite family {0: Lambda[0], 1: Lambda[1], 2: Lambda[2], 3: Lambda[3]}
}}}
{{{id=71|
def to_weight(la,La):
weight = sum(La[i] for i in la)
return weight - weight.level()*La[0]
///
}}}
{{{id=72|
to_weight(la,Lambda)
///
-3*Lambda[0] + Lambda[1] + Lambda[2] + Lambda[3]
}}}
{{{id=57|
I = T.index_set()
I.remove(0)
S = [ t for t in T if all(t.epsilon(i) == 0 for i in I) ]
S = [ t for t in S if t.weight()== to_weight(la,Lambda)]
///
}}}
{{{id=58|
len(S)
///
4
}}}
{{{id=59|
S
///
[[[[1], [2]], [[1], [3]], [[2]], [[1]]], [[[1], [2]], [[2], [3]], [[1]], [[1]]], [[[1], [3]], [[1], [2]], [[2]], [[1]]], [[[2], [3]], [[1], [2]], [[1]], [[1]]]]
}}}
{{{id=62|
g=string_rep(T)
///
}}}
{{{id=63|
[g(x) for x in S]
///
[[2, 3, 1, 0, 0], [2, 3, 0, 1, 2, 3, 1, 0, 0], [2, 3, 1, 0, 2, 3, 1, 0, 0], [2, 3, 0, 1, 1, 0, 2, 3, 2, 3, 1, 0, 0]]
}}}
This is again the Kostka-Foulkes polynomial up to an overall factor
{{{id=60| t = PolynomialRing(QQ,'t').gen() sum(t^energy(x) for x in S) /// t^4 + 2*t^3 + t^2 }}} {{{id=61| KostkaFoulkesPolynomial(la,mu) /// t^3 + 2*t^2 + t }}}Wishlist: faster implementation of the energy function (possibly in terms of the R-matrix)
These functions will be introduced in Sara Billey's talk!
{{{id=97| ks3 = kSchurFunctions(QQ, 3); ks3 /// k-Schur Functions at level 3 over Univariate Polynomial Ring in t over Rational Field }}} {{{id=99| s = SFASchur(ks3.base_ring()) /// }}} {{{id=100| s(ks3[3,2,1,1]) /// s[3, 2, 1, 1] + t*s[3, 3, 1] + t*s[4, 1, 1, 1] + (t^2+t)*s[4, 2, 1] + t^2*s[4, 3] + (t^3+t^2)*s[5, 1, 1] + t^3*s[5, 2] + t^4*s[6, 1] }}}implemented with Steve Pon and Nicolas Thiery
These functions are dual to the k-Schur functions
{{{id=101| W = WeylGroup(['A', 3, 1]) w = W.from_reduced_word([3,1,2,0,3,1,0]) w /// [-1 0 2 0] [-2 1 2 0] [-2 1 1 1] [-2 0 2 1] }}} {{{id=103| w.stanley_symmetric_function() /// 8*m[1, 1, 1, 1, 1, 1, 1] + 4*m[2, 1, 1, 1, 1, 1] + 2*m[2, 2, 1, 1, 1] + m[2, 2, 2, 1] }}} {{{id=104| W = WeylGroup(['C',3,1]) W.from_reduced_word([0,2,1,0]).stanley_symmetric_function() /// 32*m[1, 1, 1, 1] + 16*m[2, 1, 1] + 8*m[2, 2] + 4*m[3, 1] }}}Wishlist: make the k-Schur function and their duals live in the right subspace/quotient of the ring of symmetric functions.
{{{id=105| /// }}} {{{id=107| /// }}}