Weyl群、Coxeter群与Bruhat序¶
经典Weyl群和仿射Weyl群¶
您可以为任何根系创建Weyl群和仿射Weyl群。对于这些,有多种方法可用。其中一些方法适用于普通Coxeter组。
默认情况下,Weyl群的元素表示为矩阵::
sage: WeylGroup("A3").simple_reflection(1)
[0 1 0 0]
[1 0 0 0]
[0 0 1 0]
[0 0 0 1]
你可能更喜欢一种符号,其中的元素被写成简单反射的产物。为了实现这一点,您需要指定一个前缀,通常 "s"
**
sage: W = WeylGroup("A3",prefix="s")
sage: [s1,s2,s3] = W.simple_reflections()
sage: (s1*s2*s1).length()
3
sage: W.long_element()
s1*s2*s3*s1*s2*s1
sage: s1*s2*s3*s1*s2*s1 == s3*s2*s1*s3*s2*s3
True
Weyl基团作用于根晶格的环境空间,该空间由该方法访问 domain
。为了说明这一点,请回忆一下,如果 w_0 那就是长元素了 alpha mapsto -w_0(alpha) 是简单根的排列。我们可以这样计算:
sage: W = WeylGroup("E6",prefix="s")
sage: w0 = W.long_element(); w0
s1*s3*s4*s5*s6*s2*s4*s5*s3*s4*s1*s3*s2*s4*s5*s6*s2*s4*s5*s3*s4*s1*s3*s2*s4*s5*s3*s4*s1*s3*s2*s4*s1*s3*s2*s1
sage: sr = W.domain().simple_roots().list(); sr
[(1/2, -1/2, -1/2, -1/2, -1/2, -1/2, -1/2, 1/2), (1, 1, 0, 0, 0, 0, 0, 0),
(-1, 1, 0, 0, 0, 0, 0, 0), (0, -1, 1, 0, 0, 0, 0, 0), (0, 0, -1, 1, 0, 0, 0, 0),
(0, 0, 0, -1, 1, 0, 0, 0)]
sage: [-w0.action(a) for a in sr]
[(0, 0, 0, -1, 1, 0, 0, 0), (1, 1, 0, 0, 0, 0, 0, 0), (0, 0, -1, 1, 0, 0, 0, 0),
(0, -1, 1, 0, 0, 0, 0, 0), (-1, 1, 0, 0, 0, 0, 0, 0),
(1/2, -1/2, -1/2, -1/2, -1/2, -1/2, -1/2, 1/2)]
我们可能会问,这种排列什么时候是微不足道的。如果它是非平凡的,则它诱导出动态图的一个自同构,所以当动态图没有自同构时,它一定是非平凡的。但如果存在非平凡的自同构,则排列可能是也可能不是平凡的::
sage: def roots_not_permuted(ct):
....: W = WeylGroup(ct)
....: w0 = W.long_element()
....: sr = W.domain().simple_roots()
....: return all(a == -w0.action(a) for a in sr)
sage: for ct in [CartanType(['D', r]) for r in [2..8]]:
....: print("{} {}".format(ct, roots_not_permuted(ct)))
['D', 2] True
['D', 3] False
['D', 4] True
['D', 5] False
['D', 6] True
['D', 7] False
['D', 8] True
If alpha is a root let r_alpha denote the reflection in the hyperplane that is orthogonal to alpha. We reserve the notation s_alpha for the simple reflections, that is, the case where alpha is a simple root. The reflections are just the conjugates of the simple reflections.
反射是有限族中的值,有限族是 Python 词典的包装器。关键字是正根,因此给定一个正根,您可以查找相应的反射。如果您想要所有反射的列表,您可以使用常用方法来构造列表(例如,使用 list
函数)或使用该方法 values
对于反射族:
sage: W = WeylGroup("B3",prefix="s")
sage: ref = W.reflections(); ref
Finite family {(1, -1, 0): s1, (0, 1, -1): s2, ...}
sage: [a1,a2,a3] = W.domain().simple_roots()
sage: a1+a2+a3
(1, 0, 0)
sage: ref[a1+a2+a3]
s1*s2*s3*s2*s1
sage: sorted(ref)
[s1*s2*s3*s2*s1,
s2*s3*s1*s2*s3*s1*s2,
s3*s1*s2*s3*s1,
s1*s2*s1,
s1,
s2*s3*s2,
s3*s2*s3,
s2,
s3]
如果您想要一个以反射为关键字、以根为值的族,则可以使用反向族::
sage: from pprint import pprint
sage: W = WeylGroup("B3",prefix="s")
sage: [s1,s2,s3] = W.simple_reflections()
sage: altref = W.reflections().inverse_family()
sage: altref
Finite family {s1*s2*s3*s2*s1: (1, 0, 0),
s2*s3*s1*s2*s3*s1*s2: (1, 1, 0),
s3*s1*s2*s3*s1: (1, 0, 1),
s1*s2*s1: (1, 0, -1),
s1: (1, -1, 0),
s2*s3*s2: (0, 1, 0),
s3*s2*s3: (0, 1, 1),
s2: (0, 1, -1),
s3: (0, 0, 1)}
sage: altref[s3*s2*s3]
(0, 1, 1)
备注
此函数的行为在 :issue:`20027` 。
Weyl群被实现为间隙矩阵群。因此,您可以按如下方式显示其字符表:
sage: WeylGroup("D4").character_table()
CT1
<BLANKLINE>
2 6 4 5 1 3 5 5 4 3 3 1 4 6
3 1 . . 1 . . . . . . 1 . 1
<BLANKLINE>
1a 2a 2b 6a 4a 2c 2d 2e 4b 4c 3a 4d 2f
<BLANKLINE>
X.1 1 1 1 1 1 1 1 1 1 1 1 1 1
X.2 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 1
X.3 2 . 2 -1 . 2 2 . . . -1 2 2
X.4 3 -1 -1 . 1 3 -1 -1 -1 1 . -1 3
X.5 3 1 -1 . -1 3 -1 1 1 -1 . -1 3
X.6 3 -1 3 . -1 -1 -1 -1 1 1 . -1 3
X.7 3 -1 -1 . 1 -1 3 -1 1 -1 . -1 3
X.8 3 1 3 . 1 -1 -1 1 -1 -1 . -1 3
X.9 3 1 -1 . -1 -1 3 1 -1 1 . -1 3
X.10 4 -2 . -1 . . . 2 . . 1 . -4
X.11 4 2 . -1 . . . -2 . . 1 . -4
X.12 6 . -2 . . -2 -2 . . . . 2 6
X.13 8 . . 1 . . . . . . -1 . -8
仿射Weyl群¶
仿射Weyl群可以用同样的方法创建。您只需从仿射Cartan类型开始::
sage: W = WeylGroup(['A',2,1],prefix="s")
sage: W.cardinality()
+Infinity
sage: [s0,s1,s2] = W.simple_reflections()
sage: s0*s1*s2*s1*s0
s0*s1*s2*s1*s0
仿射Weyl群不同于经典Weyl群,因为它是无限的。关联的经典Weyl群是可以如下提取的子群:
sage: W = WeylGroup(['A',2,1],prefix="s")
sage: W1 = W.classical(); W1
Parabolic Subgroup of the Weyl Group of type ['A', 2, 1] (as a matrix group
acting on the root space)
sage: W1.simple_reflections()
Finite family {1: s1, 2: s2}
虽然 W1
在本例中同构于 WeylGroup("A2")
它具有不同的矩阵实现:
sage: for s in WeylGroup(['A',2,1]).classical().simple_reflections():
....: print(s)
....: print("")
[ 1 0 0]
[ 1 -1 1]
[ 0 0 1]
<BLANKLINE>
[ 1 0 0]
[ 0 1 0]
[ 1 1 -1]
sage: for s in WeylGroup(['A',2]).simple_reflections():
....: print(s)
....: print("")
[0 1 0]
[1 0 0]
[0 0 1]
<BLANKLINE>
[1 0 0]
[0 0 1]
[0 1 0]
布鲁哈特教派¶
Weyl群上的Bruhat偏序可以定义如下。
如果 u,v in W ,找到一种简化的表达 v 变成简单反射的产物: v = s_1 cdots s_n 。(并不假设 s_i 是截然不同的。)如果省略了一些 s_i 给出一个产品,它表示 u ,那么 u le v 。
在Sage中,Bruhat序被实现为Coxeter群的一种方法,因此它适用于Weyl群,无论是经典的还是仿射的。
如果 u , v in W 然后 u.bruhat_le(v)
退货 True
如果 u le v 在布鲁哈特修道会。
如果 u le v 然后是 Bruhat interval [u,v] 被定义为所有 t 以至于 u le t le v 。您可以尝试按如下方式实施:
sage: W = WeylGroup("A2",prefix="s")
sage: [s1,s2] = W.simple_reflections()
sage: def bi(u,v) : return [t for t in W if u.bruhat_le(t) and t.bruhat_le(v)]
...
sage: bi(s1,s1*s2*s1)
[s1*s2, s2*s1, s1, s1*s2*s1]
这不是一个好的定义,因为它将在以下情况下失败 W 是仿射的,是低效的 W 都很大。Sage有一种Bruhat间隔方法::
sage: W = WeylGroup("A2",prefix="s")
sage: [s1,s2] = W.simple_reflections()
sage: W.bruhat_interval(s1,s1*s2*s1)
[s1*s2*s1, s2*s1, s1*s2, s1]
这甚至适用于仿射Weyl群。
布鲁哈特图¶
参考资料:
The Bruhat graph is a structure on the Bruhat interval. Suppose that u le v. The vertices of the graph are x with u le x le v. There is a vertex connecting x,y in [x,y] if x = y cdot r where r is a reflection. If this is true then either x < y or y < x.
如果 W 是一个经典的Weyl群,Bruhat图在Sage::中实现
sage: W = WeylGroup("A3",prefix="s")
sage: [s1,s2,s3] = W.simple_reflections()
sage: bg = W.bruhat_graph(s2,s2*s1*s3*s2); bg
Digraph on 10 vertices
sage: bg.show3d()
Bruhat图具有Carrell和Peterson研究过的有趣的正则性。如果两个Kazhdan Lusztig多项式都是正则图 P_{u,v} 和 P_{w_0v,w_0u} 为1,其中 w_0 是Long Weyl群元素。它与 Deodhar conjecture Deodhar,Carrell和Peterson,Dyer和Polo证明了这一点。
Deodhar证明了如果 u < v 然后是布鲁哈特间隔 [u,v] 包含的奇数长度的元素与包含偶数长度的元素一样多。我们观察到,这一点通常可以得到加强:如果存在反射 r 使得左(或右)乘以 r 用布鲁哈特间隔 [u,v] 中长度为奇数和偶数的元素之间的显式双射 [u,v] 。
让我们寻找这样的反思。将以下命令放入一个文件并加载该文件:
W = WeylGroup("A3",prefix="s")
[s1,s2,s3] = W.simple_reflections()
ref = W.reflections().keys()
def find_reflection(u,v):
bi = W.bruhat_interval(u,v)
ret = []
for r in ref:
if all( r*x in bi for x in bi):
ret.append(r)
return ret
for v in W:
for u in W.bruhat_interval(1,v):
if u != v:
print((u,v,find_reflection(u,v)))
这表明布鲁哈特间隔由所有对的反射来稳定 (u,v) 使用 u < v 以下两项除外: s_3s_1,s_1s_2s_3s_2s_1 和 s_2,s_2s_3s_1s_2 。现在,正是这些配对使得 uprec v 在Kazhdan和Lusztig的符号中,以及 l(v)-l(u) > 1 。人们不应该轻率地认为这是对配对的一般描述 (u,v) 使得没有反射来稳定Bruhat间隔,因为这不是真的。然而,它确实表明,这个问题值得进一步调查。