杨格与RSK算法

本节提供了一些关于杨格和斯坦利书第8章中解释的RSK(Robinson-Schensted-Knuth)算法的例子 [Stanley2013].

杨格

我们从创建杨格的前几个层次开始 Y . 为此,我们需要定义偏序集的元素和顺序关系,即分区的包含:

sage: level = 6
sage: elements = [b for n in range(level) for b in Partitions(n)]
sage: ord = lambda x,y: y.contains(x)
sage: Y = Poset((elements,ord), facade=True)
sage: H = Y.hasse_diagram()
sage: view(H)  # optional - dot2tex graphviz
thematic_tutorials/algebraic_combinatorics/../media/young_lattice.png

我们现在可以定义向上和向下运算符 UDQQ Y . 首先,我们在分区上这样做,它构成了 QQ Y ::

sage: QQY = CombinatorialFreeModule(QQ,elements)

sage: def U_on_basis(la):
....:     covers = Y.upper_covers(la)
....:     return QQY.sum_of_monomials(covers)

sage: def D_on_basis(la):
....:     covers = Y.lower_covers(la)
....:     return QQY.sum_of_monomials(covers)

作为速记,你也可以把上面写为:

sage: U_on_basis = QQY.sum_of_monomials * Y.upper_covers
sage: D_on_basis = QQY.sum_of_monomials * Y.lower_covers

下面是我们对分区应用运算符时的结果 (2,1) ::

sage: la = Partition([2,1])
sage: U_on_basis(la)
B[[2, 1, 1]] + B[[2, 2]] + B[[3, 1]]
sage: D_on_basis(la)
B[[1, 1]] + B[[2]]

现在我们在 QQ Y ::

sage: U = QQY.module_morphism(U_on_basis)
sage: D = QQY.module_morphism(D_on_basis)

我们可以查一下身份 D_{{i+1}} U_i - U_{{i-1}} D_i = I_i 在的所有分区上显式 i=3 ::

sage: for p in Partitions(3):
....:     b = QQY(p)
....:     assert D(U(b)) - U(D(b)) == b

我们也可以检查 lambda vdash n 在里面 U^n(emptyset) 等于形状的标准青年表的个数 lambda ::

sage: u = QQY(Partition([]))
sage: for i in range(4):
....:     u = U(u)
sage: u
B[[1, 1, 1, 1]] + 3*B[[2, 1, 1]] + 2*B[[2, 2]] + 3*B[[3, 1]] + B[[4]]

例如,标准青年表的数量 (2,1,1)3 ::

sage: StandardTableaux([2,1,1]).cardinality()
3

我们可以大致测试一下:

sage: for la in u.support():
....:     assert u[la] == StandardTableaux(la).cardinality()

我们也可以对照钩子长度公式(定理8.1)来验证:

sage: def hook_length_formula(p):
....:     n = p.size()
....:     return factorial(n) // prod(p.hook_length(*c) for c in p.cells())

sage: for la in u.support():
....:     assert u[la] == hook_length_formula(la)

RSK算法

现在让我们来看看RSK算法。我们可以如下验证例8.12:

sage: p = Permutation([4,2,7,3,6,1,5])
sage: RSK(p)
[[[1, 3, 5], [2, 6], [4, 7]], [[1, 3, 5], [2, 4], [6, 7]]]

tableaux也可以显示为tableaux::

sage: P,Q = RSK(p)
sage: P.pp()
1  3  5
2  6
4  7
sage: Q.pp()
1  3  5
2  4
6  7

逆RSK算法实现如下:

sage: RSK_inverse(P,Q, output='permutation')
[4, 2, 7, 3, 6, 1, 5]

我们可以验证RSK算法是一个双射:

sage: def check_RSK(n):
....:     for p in Permutations(n):
....:          assert RSK_inverse(*RSK(p), output='permutation') == p
sage: for n in range(5):
....:     check_RSK(n)