Weyl groups (experimental features)
This page is an addition to the documentation of Weyl groups with the additional experimental features.
Exchange lemma and Braid moves
braid_moves
— Methodbraid_moves(W::WeylGroup, w1::Vector{UInt8}, w2::Vector{UInt8}) -> Vector{Tuple{Int,Int,Int}}
Return the braid moves required to transform the reduced expression w2
into the reduced expression w1
with respect to the Weyl group W
. A braid move (n, len, dir)
should be understood as follows:
n
is the position where the braid move startslen
is the length of the braid movedir
is the direction of the braid move. Iflen=2
orlen=3
,dir
is0
or-1
. Iflen=4
orlen=6
,dir
is-2
or-3
if the root atn
is short, otherwisedir
is-1
. This information can be used, when computing the tropical Plücker relations.
If w1
and w2
do not define the same element in W
, the behaviour is arbitrary.
Examples
julia> W = weyl_group(:A, 3);
julia> braid_moves(W, UInt8[1,2,1,3,2,1], UInt8[1,3,2,1,3,2])
4-element Vector{Tuple{Int64, Int64, Int64}}:
(4, 2, 0)
(2, 3, -1)
(4, 3, -1)
(3, 2, 0)
julia> W = weyl_group(:B, 2);
julia> braid_moves(W, UInt8[2,1,2,1], UInt8[1,2,1,2])
1-element Vector{Tuple{Int64, Int64, Int64}}:
(1, 4, -2)
This function is part of the experimental code in Oscar. Please read here for more details.
apply_braid_move!
— Methodapply_braid_move!(w::Vector{UInt8}, mv::Tuple{Int,Int,Int}) -> Vector{UInt8}
Apply the braid move mv
to the word w
and return the result. If mv
is not a valid braid move for w
, the behaviour is arbitrary. See also braid_moves
.
This function is part of the experimental code in Oscar. Please read here for more details.
Conversion to other group types
For many computations, it may be suitable to have a WeylGroup
as a different kind of group object, to e.g. use functionality that is only available for that other type.
The conversion functions come in pairs: one only creates an isomorphic group object, the other also computes the isomorphism.
isomorphism
— Methodisomorphism(::Type{FPGroup}, W::WeylGroup) -> Map{WeylGroup, FPGroup}
Return an isomorphism from W
to a group H
of type FPGroup
.
H
will be the quotient of a free group with the same rank as W
, where we have the natural 1-to-1 correspondence of generators, modulo the Coxeter relations of W
.
Isomorphisms are cached in W
, subsequent calls of isomorphism(FPGroup, W)
yield identical results.
If only the image of such an isomorphism is needed, use fp_group(W)
.
This function is part of the experimental code in Oscar. Please read here for more details.
isomorphism
— Methodisomorphism(::Type{PermGroup}, W::WeylGroup) -> Map{WeylGroup, PermGroup}
Return an isomorphism from W
to a group H
of type PermGroup
. An exception is thrown if no such isomorphism exists.
The generators of H
are in the natural 1-1 correspondence with the generators of W
.
If the type of W
is irreducible and not $E_6$ or $E_7$, then the degree of H
is optimal. See [Sau14] for the optimal permutation degrees of Weyl groups.
Isomorphisms are cached in W
, subsequent calls of isomorphism(PermGroup, W)
yield identical results.
If only the image of such an isomorphism is needed, use permutation_group(W)
.
This function is part of the experimental code in Oscar. Please read here for more details.
Parabolic subgroups
parabolic_subgroup
— Functionparabolic_subgroup(W::WeylGroup, vec::Vector{<:Integer}, w::WeylGroupElem=one(W)) -> WeylGroup, Map{WeylGroup, WeylGroup}
Return a Weyl group P
and an embedding $f:P\to W$ such that $f(P)$ is the subgroup U
of W
generated by [inv(w)*u*w for u in gens(W)[vec]]
. Further, f
maps gen(P, i)
to inv(w)*gen(W, vec[i])*w
. The elements of vec
must be pairwise distinct integers in 1:number_of_generators(W)
and vec
must be non-empty.
Examples
julia> W = weyl_group(:B, 3)
Weyl group
of root system of rank 3
of type B3
julia> P1, f1 = parabolic_subgroup(W, [1, 2])
(Weyl group of root system of type A2, Map: P1 -> W)
julia> f1(P1[1] * P1[2]) == W[1] * W[2]
true
julia> P2, f2 = parabolic_subgroup(W, [1, 2], W[1])
(Weyl group of root system of type A2, Map: P2 -> W)
julia> f2(P2[1]) == W[1] && f2(P2[2]) == W[1] * W[2] * W[1]
true
julia> P3, f3 = parabolic_subgroup(W, [1,3,2])
(Weyl group of root system of type B3 (non-canonical ordering), Map: P3 -> W)
julia> f3(P3[2]) == W[3]
true
This function is part of the experimental code in Oscar. Please read here for more details.
parabolic_subgroup_with_projection
— Methodparabolic_subgroup_with_projection(W::WeylGroup, vec::Vector{<:Integer}; check::Bool=true) -> WeylGroup, Map{WeylGroup, WeylGroup}, Map{WeylGroup, WeylGroup}
Return a triple (P, emb, proj)
that describes a factor of W
, that is, a product of irreducible factors. Here P, emb =
parabolic_subgroup
(W, vec)
and proj
is the projection map from W
onto P
, which is a left-inverse of emb
.
If check = true
, then it is checked whether vec
actually describes a union of irreducible components of the Dynkin diagram.
Examples
julia> W = weyl_group([(:A, 3), (:B, 3)])
Weyl group
of root system of rank 6
of type A3 x B3
julia> P1, f1, p1 = parabolic_subgroup_with_projection(W, [1,2,3])
(Weyl group of root system of type A3, Map: P1 -> W, Map: W -> P1)
julia> p1(W[1]*W[4]*W[2]*W[6]) == P1[1] * P1[2]
true
julia> P2, f2, p2 = parabolic_subgroup_with_projection(W, [4,6,5])
(Weyl group of root system of type B3 (non-canonical ordering), Map: P2 -> W, Map: W -> P2)
julia> p2(W[5]) == P2[3]
true
This function is part of the experimental code in Oscar. Please read here for more details.
Irreducible factors
irreducible_factors
— Methodirreducible_factors(W::WeylGroup; morphisms::Bool=false)
If morphisms
is true
, return a triple (U, emb, proj)
that describes the irreducible factors of W
. That is, U
, emb
, proj
are vectors whose length is the number of irreducible components of the Dynkin diagram of W
, and for each i
, (U[i], emb[i], proj[i])
describes the i
-th factor of W
as described in parabolic_subgroup_with_projection
.
If morphisms
is false
, return only U
.
The order of the irreducible factors is the one given by cartan_type_with_ordering
.
See also inner_direct_product(::AbstractVector{WeylGroup})
.
Examples
julia> W = weyl_group([(:A, 3), (:B, 4)]);
julia> irreducible_factors(W)
2-element Vector{WeylGroup}:
Weyl group of root system of type A3
Weyl group of root system of type B4
julia> U, emb, proj = irreducible_factors(W; morphisms=true)
(WeylGroup[Weyl group of root system of type A3, Weyl group of root system of type B4], Map{WeylGroup, WeylGroup}[Map: Weyl group -> W, Map: Weyl group -> W], Map{WeylGroup, WeylGroup}[Map: W -> Weyl group, Map: W -> Weyl group])
julia> emb[1](U[1][1]) == W[1]
true
julia> proj[2](W[4]) == U[2][1]
true
This function is part of the experimental code in Oscar. Please read here for more details.
Inner direct products
inner_direct_product
— Methodinner_direct_product(L::AbstractVector{WeylGroup}; morphisms::Bool=false)
inner_direct_product(L::WeylGroup...; morphisms::Bool=false)
If morphisms
is false
, then return a Weyl group W
that is isomorphic to the direct product of the Weyl groups in L
. The generators of W
are in natural 1-1 correspondence with the generators of the groups in L
in the given order.
If morphisms
is true
, return a triple (W, emb, proj)
where W
is as above and emb
, proj
are vectors such that emb[i]
(resp., proj[i]
) is the embedding of L[i]
into W
(resp., the projection of W
onto L[i]
).
See also inner_direct_product(::AbstractVector{T}) where {T<:Union{PcGroup, SubPcGroup, FPGroup, SubFPGroup}}
.
Examples
julia> W1 = weyl_group(:A, 2); W2 = weyl_group(:B, 3);
julia> W, emb, proj = inner_direct_product(W1, W2; morphisms=true)
(Weyl group of root system of type A2 x B3, Map{WeylGroup, WeylGroup}[Map: W1 -> W, Map: W2 -> W], Map{WeylGroup, WeylGroup}[Map: W -> W1, Map: W -> W2])
julia> proj[2](W[3]) == W2[1]
true
julia> gens(W) == vcat(emb[1].(gens(W1)), emb[2].(gens(W2)))
true
This function is part of the experimental code in Oscar. Please read here for more details.