Garside monoids and groups, braids.
Chevie.Garside
Chevie.Garside.BraidMonoid
Chevie.Garside.Category
Chevie.Garside.Category
Chevie.Garside.DualBraidMonoid
Chevie.Garside.GarsideMonoid
Chevie.Garside.LocallyGarsideMonoid
GroupPresentations.Presentation
Chevie.CoxGroups.isleftdescent
Chevie.CoxGroups.leftdescents
Chevie.Garside.Brieskorn_normal_form
Chevie.Garside.CorranPicantinMonoid
Chevie.Garside.centralizer_gens
Chevie.Garside.conjcat
Chevie.Garside.conjugating_elt
Chevie.Garside.endomorphisms
Chevie.Garside.fraction
Chevie.Garside.hurwitz
Chevie.Garside.image
Chevie.Garside.left_divisors
Chevie.Garside.leftgcd
Chevie.Garside.leftlcm
Chevie.Garside.rightascents
Chevie.Garside.rightgcd
Chevie.Garside.rightlcm
Chevie.Garside.shrink
Chevie.Garside.α
Chevie.Garside.α
Chevie.Garside.δad
PermGroups.Groups.elements
PermGroups.Groups.word
PermGroups.Groups.word
Chevie.Garside
— ModuleGarside monoids are a general class of monoids whose most famous examples are the braid and dual braid monoids. They have groups of fractions, which in both examples is the braid group. Here we implement braid groups as part of a general implementation of Garside monoids and groups.
To define Garside monoids we introduce some vocabulary about divisibility in monoids. A left-divisor of x
is a d
such that there exists y
with x=dy
(and then we say that x
is a right multiple of d
, and write d≼ x
). We say that a monoid M
is left cancellable if an equality dx=dy
implies x=y
. We define symmetrically right-divisors, left multiples and right cancellability. We say that x
is an atom if 1
and x
are its only divisors. A left gcd of x
and y
is a common left divisor d
of x
and y
such that any other common left-divisor is a left-divisor of d
. Similarly a right lcm of x
and y
is a common multiple which is a left-divisor of any other common multiple.
We call Garside a monoid M
which:
- is left and right cancellable.
- is generated by its atoms.
- admits left and right gcds and lcms.
- is such that any element has only finitely many left (or right) divisors.
- admits a Garside element, which is an element
Δ
whose set of left and right-divisors coincide and generateM
.
Garside elements are not unique, but there is a unique minimal one (for divisibility); we assume that a Garside element Δ
has been chosen. Then the divisors of Δ
are called the simples of M
. A Garside monoid embeds into its group of fractions, which is called a Garside group (a group can have several different Garside structures, for instance braid groups of finite Coxeter groups have an ordinary and a dual braid monoid).
We also implement locally Garside monoids, which are monoids where lcms do not always exist, but exist if any common multiple exists; the set of simples is then not defined by a Garside element, but by the condition that they contain the atoms and are closed under lcms and taking divisors (see BDM01); we keep the condition that each element is divisible by finitely many simples (but the number of simples can be infinite). The most important example is the Artin monoid of an infinite Coxeter group. It is not known whether locally Garside monoids embed in their group of fractions (although this has been proved for Artin monoids of Coxeter groups by Paris Paris01), and thus computing in the monoid does not help for computing in the group; only the monoid is implemented here for these cases.
What allows computing with Garside and locally Garside monoids, and Garside groups, is the fact that they admit normal forms –- these normal forms were exhibited for braid monoids of Coxeter groups by Deligne Del72, who extended earlier work of Brieskorn, Saito BS72 and Garside Gar69:
Let
M
be a locally Garside monoid. Then forb∈ M
there is a unique maximal simple left-divisorα(b)
ofb
; any other simple dividingb
dividesα(b)
.Let
M
be a Garside monoid with Garside elementΔ
and group of fractionsG
. Then for anyx∈ G
, for large enoughi
we haveΔⁱx∈ M
.
A consequence of 1. is that every element has a canonical decomposition as a product of simples, its left-greedy normal form. If we define ω(x)
by x=α(x)ω(x)
, then the normal form of x
is α(x)α(ω(x))α(ω^2(x))…
We use the normal form to represent elements of M
, and when M
is Garside we use 2. to represent elements of G
: given x∈ G
we compute the smallest power i
such that Δⁱ x∈ M
, and we represent x
by the pair (i,Δ⁻ⁱx)
. We are thus reduced to the case where x∈ M
, not divisible by Δ
, where we represent x
by the sequence of simples that make up its normal form.
We now describe Artin-Tits braid monoids. Let (W,S)
be a Coxeter system, that is W
has presentation
⟨s∈ S∣s²=1, sts⋯ =tst⋯ (mₛₜ factors on each side) for s,t∈ S⟩
for some Coxeter matrix mₛₜ
. The braid group B
associated to (W,S)
is the group defined by the presentation
⟨𝐬∈ 𝐒∣ 𝐬𝐭𝐬⋯ =𝐭𝐬𝐭⋯ (mₛₜ factors on each side) for 𝐬,𝐭∈ 𝐒⟩
The positive braid monoid B⁺
associated with W
is the monoid defined by the presentation above –- it identifies with the submonoid of B
generated by 𝐒
by Paris01. This monoid is locally Garside, with the set of simples in bijection with the elements of W
and with 𝐒
as atoms; we will denote by 𝐖
the set of simples, and by 𝐰 ↦ w
the bijection between simples and elements of W
. The group W
has a length defined in terms of reduced expressions. Similarly, having only homogeneous relations, B⁺
has a natural length function. Then 𝐖
can be characterised as the subset of elements of B⁺
with the same length as their image in W
.
If W
is finite, then B⁺
is Garside with Garside element the element of 𝐖
whose image is the longest element of W
. A finite Coxeter group is also a reflection group in a real vector space, thus in its complexified V
, and B
also has a topological definition as the fundamental group of the space Vʳᵉᵍ/W
, where Vʳᵉᵍ
is the set of elements of V
which are not fixed by any non-identity element of S
; however, we will not use this here.
We implement in general only monoids which have a finite number of atoms (the package AffineA
implements, following the work of François Digne, the dual braid monoid of the affine Coxeter group W(Ãₙ)
).
Given a Coxeter group W
,
julia> W=coxgroup(:A,4)
A₄
julia> B=BraidMonoid(W)
BraidMonoid(A₄)
constructs the associated braid monoid, and then, used as a function, B
constructs elements of the braid monoid (or group when W
is finite) from a list of generators indices given as arguments:
julia> w=B(1,2,3,4) # represents 𝐬₁𝐬₂𝐬₃𝐬₄
1234
julia> w^3 # the terms of the normal form are printed separated by a .
121321432.343
julia> word(α(w^3))
9-element Vector{Int64}:
1
2
1
3
2
1
4
3
2
julia> w^4
Δ.232432
julia> inv(w)
(1234)⁻¹
How an element of a Garside group is printed is controlled by the IOcontext
attribute ':greedy'. By default, elements are printed as fractions a⁻¹b
where a
and b
have no left common divisor. Each of a
and b
is printed using its left-greedy normal form, that is a maximal power of the Garside element followed by the rest. One can print the entire element in the left-greedy normal from by setting the IOContext
:greedy=>true
; with the same w
as above we have:
julia> xrepr(w^-1,greedy=true,limit=true)
"Δ⁻¹.232432"
By default, repr
gives w
back in a form which after assigning B=BraidMonoid(W)
can be input back into Julia:
julia> repr(w)
"B(1,2,3,4)"
julia> repr(w^3)
"B(1,2,1,3,2,1,4,3,2,3,4,3)"
julia> repr(w^-1)
"B(-4,-3,-2,-1)"
In general elements of a Garside monoid are displayed as a list of the indices of their constituting atoms.
We will now describe the dual braid monoid. First we define interval monoids. Given a group W
and a set S
of generators of W
as a monoid, we define the length l_S(w)
as the minimum number of elements of S
needed to write w
. We then define left-divisors of x
as those d∈W
such that there exists y
with x=dy
and l_S(d)+l_S(y)=l_S(x)
. We say that w∈ W
is balanced if its set of left and right divisors coincide; in this case we denote this set by [1,w]
, an interval for the poset of S
-divisibility. We say that w
is Garside for l_S
if it is balanced and [1,w]
is a lattice (where upper and lower bounds are lcms and gcds), which generates W
. Then we have the theorem:
Suppose w
is Garside for the l_S
. Then the monoid M
with generators [1,w]
and relations xy=z
whenever xy=z
holds in W
and l_S(x)+l_S(y)=l_S(z)
, is a Garside monoid, with simples [1,w]
and atoms S
. It is called the interval monoid defined by the interval [1,w]
.
The Artin-Tits braid monoid is an interval monoid by taking for S
the Coxeter generators, in which case l_S
is the Coxeter length, and taking for w
the longest element of W
. The dual monoid, constructed by Birman, Ko and Lee for type A
and by Bessis for all well-generated complex reflection groups, is obtained in a similar way, by taking this time for w
a Coxeter element, for l_S
the reflection length 'reflength' and for S_S
the reflections which divide w
for the reflection length (for Coxeter groups all reflections divide w
but for well-generated complex reflection groups not all reflections divide); for the dual monoid the simples are of cardinality the generalized Catalan numbers catalan
. An interval monoid has naturally an inverse morphism from M
to W
, called 'image' which is the quotient map from the interval monoid to W
which sends back simple braids to [1,w]
.
A last pertinent notion is reversible monoids. Since we store left normal forms, it is easy to compute left lcms and gcds, but hard to compute right lcms and gcds. But this becomes easy to do if the monoid has an operation 'reverse', which has the property that 'a' is a left-divisor of 'b' if and only if 'reverse(a)' is a right-divisor of 'reverse(b)'. This holds for Artin-Tits and dual braid monoids of groups generated by true reflections; Artin-Tits monoids have a reverse
operation which consists of reversing a word, written as a list of atoms. The dual monoid also has a reverse
operation defined in the same way, but this operation changes monoid: it goes from the dual monoid for the Coxeter element w
to the dual monoid for the Coxeter element w⁻¹
. The operations 'rightlcm' and 'rightgcd', and some other algorithms, have faster implementations if the monoid has a reverse
operation.
This module implements also functions to solve the conjugacy problem and compute centralizers in Garside groups, following the work of Franco, Gebhardt and Gonzalez-Meneses.
Two elements w
and w'
of a monoid M
are conjugate in M
if there exists x∈ M
such that wx=xw'
; if M
satisfies the Öre conditions, it has a group of fractions where this becomes x⁻¹wx=w'
, the usual definition of conjugacy. A special case which is even closer to conjugacy in the group is if there exists y∈ M
such that w=xy
and w'=yx
. This relation is not transitive in general, but we call cyclic conjugacy the transitive closure of this relation, a restricted form of conjugacy.
The next observation is that if w,w'
are conjugate in the group of fractions of the Garside monoid M
then they are conjugate in M
, since if wx=xw'
then there is a power Δⁱ
which is central and such that xΔⁱ∈ M
. Then wxΔⁱ=xΔⁱ w'
is a conjugation in M
.
The crucial observation for solving the conjugacy problem is to introduce inf(w):=sup{i such that Δ⁻ⁱw∈ M}
and sup(w):=inf{i such that w⁻¹Δⁱ∈ M}
, and to notice that the number of conjugates of w
with same inf
and sup
as w
is finite (since our monoids have a finite number of atoms). Further, a theorem of Birman shows that the maximum inf
and minimum sup
in a conjugacy class can be achieved simultaneously; the elements achieving this are called the super summit set of w
. Thus a way to determine if two elements are conjugate is to find a representative of both of them in their super summit set, and then solve conjugacy within that set. This can also be used to compute the centralizer of an element: if we consider the super summit set as the objects of a category whose morphisms are the conjugations by simple elements, the centralizer is given by the endomorphisms of the given object. For the implementation of finite categories we use, see the docstrings of Category
and endomorphisms
.
We illustrate this on an example:
julia> b=B(2,1,4,1,4)
214.14
julia> c=B(1,4,1,4,3)
14.143
julia> d=conjugating_elt(b,c)
(1)⁻¹21321432
julia> b^d
14.143
julia> centralizer_gens(b)
3-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
321432.213243
21.1
4
julia> C=conjcat(b;ss=Val(:ss))
category with 10 objects and 32 generating maps
julia> C.obj
10-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
1214.4
214.14
124.24
1343.1
14.124
143.13
24.214
134.14
13.134
14.143
There is a faster solution to the conjugacy problem given in gebgon10: for each b∈ M
, they define a particular simple left-divisor of b
, its preferred prefix such that the operation slide which cyclically conjugates b
by its preferred prefix, is eventually periodic, and the period is contained in the super summit set of x
. We say that x
is in its sliding circuit if some iterated slide of x
is equal to x
. The set of sliding circuits in a given conjugacy class is smaller than the super summit set, thus allows to solve the conjugacy problem faster. Continuing from the above example,
julia> word(W,preferred_prefix(b))
2-element Vector{Int64}:
2
1
julia> b^B(preferred_prefix(b))
1214.4
julia> b1=b^B(preferred_prefix(b))
1214.4
julia> C=conjcat(b)
category with 2 objects and 6 generating maps
julia> C.obj
2-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
1214.4
1343.1
Finally, we have implemented Hao Zheng's algorithm to extract roots in a Garside monoid:
julia> W=coxgroup(:A,3)
A₃
julia> B=BraidMonoid(W)
BraidMonoid(A₃)
julia> Pi=B(B.δ)^2
Δ²
julia> root(Pi,2)
Δ
julia> root(Pi,3)
1232
julia> root(Pi,4)
132
Chevie.Garside.LocallyGarsideMonoid
— TypeLocallyGarsideMonoid{T}
is the abstract type of locally Garside monoids, where T
is the type of simples. Such a monoid M
needs, for a,b
simples, to implement the functions
one(M)
isleftdescent(M,a,i::Int)
whetherM.atoms[i]≼ a
isrightdescent(M,a,i::Int)
whethera≽ M.atoms[i]
isrightascent(M,a,i::Int)
whethera*M.atoms[i]
is simple*(M,a,b)
whena*b
is simple returns the simplea*b
\(M,a,b)
whena≼ b
returns the simplea
/(M,a,b)
whena≽ b
returns the simplea/b
Chevie.Garside.GarsideMonoid
— TypeGarsideMonoid{T}
is the abstract type of Garside monoids, where T
is the type of simples. Such a monoid M
should implement the same methods as LocallyGarsideMonoid
except that isrightascent(M,a)
is automatically defined as isleftdescent(M,\(M,a,M.δ),i)
.
An implementation should have fields M.δ
, M.stringδ
An interval monoid should have a field M.orderδ
.
Chevie.CoxGroups.isleftdescent
— Methodisleftdescent(M,w,i)
returns true
if and only if the i
-th atom of the locally Garside monoid M
left-divides the simple w
.
Chevie.CoxGroups.leftdescents
— Methodleftdescents(b::LocallyGarsideElt)
the list of indices of the atoms which left-divide b
Chevie.Garside.rightascents
— Functionrightascents(M,s)
where s
is a simple return the right ascents of s
, that is the list of i
such that s*M.atoms[i]
is still simple.
Chevie.Garside.left_divisors
— Functionleft_divisors(M::LocallyGarsideMonoid, s)
left_divisors(M::LocallyGarsideMonoid, s,i)
all the left-divisors of the simple element s
of M
, as a vector of vectors of simples, where the i+1-th vector of simples holds the left-divisors of length i in the atoms. If a third argument i
is given, returns the list of divisors of length i
.
julia> W=coxgroup(:A,3)
A₃
julia> B=BraidMonoid(W)
BraidMonoid(A₃)
julia> map(x->B.(x),left_divisors(B,W(1,3,2)))
4-element Vector{Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}}:
[.]
[1, 3]
[13]
[132]
julia> B=DualBraidMonoid(W)
DualBraidMonoid(A₃,c=[1, 3, 2])
julia> map(x->B.(x),left_divisors(B,W(1,3,2)))
4-element Vector{Vector{GarsideElt{Perm{Int16}, DualBraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}}:
[.]
[1, 2, 3, 4, 5, 6]
[12, 13, 15, 25, 34, 45]
[δ]
left_divisors(b::LocallyGarsideElt[, i])
returns all left-divisors of b
(left-divisors of length i
if specified)
julia> B=DualBraidMonoid(coxsym(4))
DualBraidMonoid(𝔖 ₄,c=[1, 3, 2])
julia> left_divisors(B(1,5,4,3))
10-element Vector{GarsideElt{Perm{Int16}, DualBraidMonoid{Perm{Int16}, CoxSym{Int16}}}}:
.
1
1.4
1.4.2
1.4.3
5
6
15
15.4
15.4.3
julia> left_divisors(B(1,5,4,3),1)
3-element Vector{GarsideElt{Perm{Int16}, DualBraidMonoid{Perm{Int16}, CoxSym{Int16}}}}:
1
5
6
Chevie.Garside.leftgcd
— Functionleftgcd(M::LocallyGarsideMonoid,simp...)
leftgcdc(M::LocallyGarsideMonoid,simp...)
simp
should be simples of M
. The function returns the left gcd d
of the simp
.
leftgcdc
returns d
followed by the tuple of complements inv(d).*simp
leftgcd(a₁,…,aₙ)
leftgcdc(a₁,…,aₙ)
a₁,…,aₙ
should be elements of the same (locally) Garside monoid. The function returns the left gcd d
of a₁,…,aₙ
.
leftgcdc
returns (d,(d⁻¹a₁,…,d⁻¹aₙ))
.
julia> W=coxgroup(:A,3)
A₃
julia> B=BraidMonoid(W)
BraidMonoid(A₃)
julia> leftgcdc(B(2,1,2)^2,B(3,2)^2)
(2, (121.21, 32.2))
Chevie.Garside.rightgcd
— Functionrightgcd(M::LocallyGarsideMonoid,simp...)
rightgcdc(M::LocallyGarsideMonoid,simp...)
simp
should be simples of M
. The function returns the right gcd d
of the simp
.
rightgcdc
returns d
followed by the tuple of complements simp./d
rightgcd(a₁,…,aₙ)
rightgcdc(a₁,…,aₙ)
a₁,…,aₙ
should be elements of the same (locally) Garside monoid. The function returns the right gcd d
of a₁,…,aₙ
rightgcdc
returns (d,(a₁/d,…,aₙ/d))
.
julia> W=coxgroup(:A,3)
A₃
julia> B=BraidMonoid(W)
BraidMonoid(A₃)
julia> rightgcdc(B(2,1,2)^2,B(3,2)^2)
(2.2, (12.21, 23))
Chevie.Garside.leftlcm
— Functionleftlcm(M::GarsideMonoid,simp...)
leftlcmc(M::GarsideMonoid,simp...)
simp
should be simples of M
. The function returns the left lcm m
of the simp
.
leftlcmc
returns m
followed by the tuple of complements m./simp
leftlcm(a₁,…,aₙ)
leftlcmc(a₁,…,aₙ)
a₁,…,aₙ
should be elements of the same Garside monoid. The function returns the least common left multiple m
of a₁,…,aₙ
.
leftlcmc
returns '(m,(m/a₁,…,m/aₙ))`.
julia> B=BraidMonoid(coxgroup(:A,3))
BraidMonoid(A₃)
julia> leftlcmc(B(2,1,2)^2,B(3,2)^2)
(Δ.121, (123, 23.321))
Chevie.Garside.rightlcm
— Functionrightlcm(M::GarsideMonoid,simp...)
rightlcmc(M::GarsideMonoid,simp...)
simp
should be simples of M
. The function returns the right lcm m
of the simp
.
rightlcmc
returns m
followed by the tuple of complements simp.\m
rightlcm(a₁,…,aₙ)
rightlcmc(a₁,…,aₙ)
a₁,…,aₙ
should be elements of the same Garside monoid. The function returns the least common right multiple m
of a₁,…,aₙ
.
rightlcmc
returns '(m,(a₁⁻¹m,…,aₙ⁻¹m))`.
julia> B=BraidMonoid(coxgroup(:A,3))
BraidMonoid(A₃)
julia> rightlcmc(B(2,1,2)^2,B(3,2)^2)
(Δ², (321.123, 12321.321))
Chevie.Garside.α
— Methodα(b::LocallyGarsideElt)
returns as a Garside element the first term in the normal form of b
(b[1]
returns this term as a simple).
julia> W=coxgroup(:A,3)
A₃
julia> b=BraidMonoid(W)(2,1,2,1,1)
121.1.1
julia> α(b)
121
Chevie.Garside.α
— Methodα(b::LocallyGarsideElt,I)
returns the longest prefix of b using only b.M.atoms[I]
julia> W=coxgroup(:A,4);B=BraidMonoid(W)
BraidMonoid(A₄)
julia> w0=B(longest(W))
Δ
julia> α(w0,[1,2,3])
121321
Chevie.Garside.δad
— Functionδad(M::GarsideMonoid,x,i=1)
returns the image of the simple x
by the i
-th power of the automorphism induced by conjugation by M.δ
(that is x^(M.δ^i)
).
δad(b::GarsideElt,i=1)
returns the image of b
by the i
-th power of the automorphism induced by conjugation by b.M.δ
.
Chevie.Garside.Brieskorn_normal_form
— FunctionBrieskorn_normal_form(b::LocallyGarsideElt)
Brieskorn citeBri71 has noticed that if L(b)
is the left descent set of b
(see leftdescents
), and if b_(L(b))
is the right lcm of L(b)
, then b_(L(b))
left-divides b
. We can now divide b
by b_(L(b))
and continue this process with the quotient. In this way, we obtain an expression b=b_(L₁)⋯ b_(Lᵣ)
where Lᵢ=L(b_(Lᵢ)⋯ b_(Lᵣ))
for all i
, which we call the Brieskorn normal form of b
. The function Brieskorn_normal_form
returns a description of this form, by returning the list of sets L(b)
which describe the above decomposition.
julia> W=coxgroup(:E,8);B=BraidMonoid(W)
BraidMonoid(E₈)
julia> w=B(2,3,4,2,3,4,5,4,2,3,4,5,6,5,4,2,3,4,5,6,7,6,5,4,2,3,4,5,6,7,8)
2342345423456542345676542345678
julia> Brieskorn_normal_form(w)
2-element Vector{Vector{Int64}}:
[2, 3, 4, 5, 6, 7]
[8]
julia> Brieskorn_normal_form(w^2)
2-element Vector{Vector{Int64}}:
[2, 3, 4, 5, 6, 7, 8]
[2, 3, 4, 5, 6]
Chevie.Garside.BraidMonoid
— TypeBraidMonoid(W::CoxeterGroup)
The ordinary monoid of the Artin group associated to W
(B::BraidMonoid)(M::DualBraidMonoid,i::Integer)
convert to an element of B
the i
-th atom of M
.
(B::BraidMonoid)(M::DualBraidMonoid,s)
convert to an element of B
the simple s
of M
.
(B::BraidMonoid)(b::GarsideElt)
b
should be a dual braid. Convert b
to an element of B
.
Chevie.Garside.DualBraidMonoid
— TypeDualBraidMonoid(W;c=xxx)
W
should be a well generated complex reflection group and c
a Coxeter element of W
, given as a word (a Vector{Int}
) specifiying the element W(c...)
.
If no c
is given a particular one is chosen (what the notation xxx
above tries to convey).
For Ẁ
a Coxeter groups the Coxeter diagram is partitioned in two sets where in each set reflections commute pairwise; c
is the product of the product of the reflections in each set.
For a complex reflection group the representative stored in the Coxeter class is used for c
.
The function returns the dual braid monoid determined by W
and c
julia> W=coxgroup(:A,3)
A₃
julia> B=DualBraidMonoid(W)
DualBraidMonoid(A₃,c=[1, 3, 2])
julia> B(2,1,2,1,1)
12.1.1.1
julia> B(-1,-2,-3,1,1)
(25.1)⁻¹1.1
julia> W=crg(4)
G₄
julia> B=DualBraidMonoid(W)
DualBraidMonoid(G₄,c=[1, 2])
julia> left_divisors(B(B.δ))
5-element Vector{GarsideElt{Perm{Int16}, DualBraidMonoid{Perm{Int16}, PRG{Cyc{Rational{Int64}}, Int16}}}}:
.
1
2
3
δ
Chevie.Garside.hurwitz
— Functionhurwitz(l,i::Integer)
the Hurwitz action of the generator σᵢ of the braid group Bₙ on the list l
of length n
of group elements, which replaces lᵢ,lᵢ₊₁
by lᵢ₊₁,lᵢ^lᵢ₊₁
. If i<0
, does the action of inv(σⱼ)
where j=-i
, which replaces lⱼ,lⱼ₊₁
by lⱼ₊₁^inv(lⱼ),lⱼ
.
hurwitz(l,v::AbstractVector{<:Integer})
does successively hurwitz(l,i)
for each i
in v
.
hurwitz(l,b)
the Hurwitz action of the braid b∈ Bₙ
on the list l
of length n
of group elements.
Chevie.Garside.fraction
— Functionfraction(b::GarsideElt)
denominator(b::GarsideElt)
numerator(b::GarsideElt)
fraction(b)
returns a tuple (x,y)
of positive Garside elements with trivial leftgcd
and such that b=x\y
. For such a decomposition, denominator(b)
returns x
and numerator(b)
returns y
.
julia> B=BraidMonoid(coxgroup(:A,3))
BraidMonoid(A₃)
julia> b=B( 2, 1, -3, 1, 1)
(23)⁻¹321.1.1
julia> fraction(b)
(23, 321.1.1)
PermGroups.Groups.word
— Methodword(M::GarsideMonoid,w)
returns a word in the atoms of M
representing the simple w
julia> B=BraidMonoid(coxgroup(:A,3))
BraidMonoid(A₃)
julia> word(B,B.δ)
6-element Vector{Int64}:
1
2
1
3
2
1
PermGroups.Groups.word
— Methodword(b::GarsideElt)
returns a description of b
as a list of the atoms of which it is a product. If b
is in the Garside group but not the Garside monoid, it is represented in fraction normal form where as a special convention the inverses of the atoms are represented by negating the corresponding integer.
julia> B=BraidMonoid(coxgroup(:A,3))
BraidMonoid(A₃)
julia> b=B(2,1,2,1,1)*inv(B(2,2))
(21)⁻¹1.12.21
julia> word(b)
7-element Vector{Int64}:
-1
-2
1
1
2
2
1
PermGroups.Groups.elements
— Methodelements(M::LocallyGarsideMonoid,l::Integer)
elements(M::LocallyGarsideMonoid,v::AbstractVector{<:Integer})
M
should have an additive length function (that is, a product of l
atoms is not equal to any product of less than l
atoms). elements(M,l)
returns the list of elements of length l
in M
.
In the second form elements
returns all elements of length i
for i∈ v
.
julia> M=BraidMonoid(coxgroup(:A,2))
BraidMonoid(A₂)
julia> elements(M,4)
12-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
Δ.1
Δ.2
12.21
12.2.2
1.12.2
1.1.12
1.1.1.1
21.12
21.1.1
2.21.1
2.2.21
2.2.2.2
Chevie.Garside.image
— Functionimage(b::GarsideElt)
This function is defined only if b
is an element of an interval monoid, for instance a braid. It returns the image of b
in the group of which the monoid is an interval monoid. For instance it gives the projection of a braid in an Artin monoid back to the Coxeter group.
julia> W=coxsym(4)
𝔖 ₄
julia> b=BraidMonoid(W)(2,1,2,1,1)
121.1.1
julia> p=image(b)
(1,3)
julia> word(W,p)
3-element Vector{Int64}:
1
2
1
Chevie.Garside.conjugating_elt
— Functionconjugating_elt(b,b₁[,F];ss=Val(:sc))
b
and b₁
should be elements of the same Garside group. The function returns a
such that b^a=b₁
if such exists, and nothing
otherwise. If an argument ss
is given, the computation is done in the corresponding category –- see conjcat
. If an argument F
is given it should be an automorphism of the braid monoid, like the Frobenius of a reflection coset attached to b.M.W
; the computation is then done in the corresponding F
-conjugacy category.
julia> W=coxgroup(:D,4)
D₄
julia> B=BraidMonoid(W)
BraidMonoid(D₄)
julia> b=B(2,3,1,2,4,3)
231243
julia> b1=B(1,4,3,2,2,2)
1432.2.2
julia> conjugating_elt(b,b1)
(134312.23)⁻¹
julia> c=conjugating_elt(b,b1;ss=Val(:cyc))
232.2
julia> b^c
1432.2.2
julia> WF=spets(W,Perm(1,2,4))
³D₄
julia> F=Frobenius(WF);
julia> c=B(3,4,3,1,2,3)
343123
julia> conjugating_elt(b,c,F)
124312
julia> ^(b,B(1,2,4,3,1,2),F)
343123
Chevie.Garside.centralizer_gens
— Functioncentralizer_gens(b[,F];ss=Val(:sc))
a list of generators of the centralizer of b
. The computation is done by computing the endomorphisms of the object b
in the category of its sliding circuits. If an argument ss
is given, the computation is done in the corresponding category –- see conjcat
.
If an argument F
is given it should be an automorphism of the braid monoid, like the Frobenius of a reflection coset attached to b.M.W
; then the F
-centralizer is computed.
julia> W=coxgroup(:D,4)
D₄
julia> B=BraidMonoid(W)
BraidMonoid(D₄)
julia> w=B(4,4,4)
4.4.4
julia> cc=centralizer_gens(w)
8-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
1
(31432)⁻¹231432
(1)⁻¹34.431
(2)⁻¹34.432
(32431)⁻¹132431
4
34.43
2
julia> shrink(cc)
5-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
4
2
1
34.43
(3243)⁻¹13243
julia> centralizer_gens(w;ss=Val(:cyc))
1-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
4
julia> F=Frobenius(spets(W,Perm(1,2,4)));
julia> centralizer_gens(w,F)
2-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
124
312343123
Chevie.Garside.Category
— TypeCategory{TO,TM}
is the type of a finite category whose objects are of type TO
and maps of type TM
. It is represented as a struct
with two fields:
obj::Vector{TO}
the objectsatoms::Vector{Vector{Pair{TM,Int}}}
a vector representing the atoms (generators) of the category. It is such thatatoms[i]
is aVector
of pairsm=>j
representing a mapm
fromobj[i]
toobj[j]
. If the julia objects of typeTM
belong to a monoid, a general map can be represented as a triple(i,m,j)
wherem
is of typeTM
representing a map fromobj[i]
toobj[j]
.
A category is graphically shown by giving the :graph
io property:
julia> W=coxsym(4);M=BraidMonoid(W)
BraidMonoid(𝔖 ₄)
julia> xprint(conjcat(M(1,1,2,2,3));graph=true)
category with 4 objects and 8 generating maps
1232 12 213 213 213 32
213.32―――➔ 12.213―➔ 213.12――➔ 12.213――➔ 213.32――➔ 32.213―➔ 213.32
1321 213
213.12―――➔ 32.213――➔ 213.12
Chevie.Garside.Category
— MethodCategory(atomsfrom::Function,o;action::Function=^)
constructs a category from an initial object o
and a function atomsfrom(o)
which given object o
returns atoms from o
as "maps" m
such that the target object is action(o,m)
.
As an example we construct a Garside category associated to the braid group of G₃₁
, realized as the centralizer of a 4th root of δ³⁰
in the dual braid monoid of E₈
; that is the fixed points of δad¹⁵
in the 2-divided category.
julia> W=coxgroup(:E,8);M=DualBraidMonoid(W)
DualBraidMonoid(E₈,c=[1, 4, 6, 8, 3, 2, 5, 7])
julia> s4=left_divisors(M,M.δ,4); # simples of length 4
julia> s=M(s4[findfirst(x->x*δad(M,x,8)==M.δ,s4)])#an object of 2-divided cat
(1 8 17 35)
julia> "the right-lcms of the `δⁱ`-orbits on `leftdescents(b)`"
function satoms(b,i)
M=b.M
ld=M.atoms[leftdescents(b)]
di=Perm(ld,δad.(Ref(M),ld,i))
if isnothing(di) error(b," is not δ^$i-stable") end
map(o->M(rightlcm(M,ld[o]...)),orbits(di,eachindex(ld)))
end
satoms
julia> Category(x->satoms(x,15),s;action=(o,m)->inv(m)*o*δad(m,8))
category with 88 objects and 660 generating maps
Chevie.Garside.conjcat
— Functionconjcat(b[,F];ss=Val(:sc))
returns the conjugacy category of the summit set of b
of the required type.
- By default, computes the category of sliding circuits of
b
. - If
ss==Val(:ss)
, computes the super summit set. - If
ss==Val(:cyc)
, computes the cyclic conjugacy category. - If
ss==Val(:inf)
computes the category of all conjugate elements with sameInf
asb
.
If an argument F
is given it should be the Frobenius of a Reflection coset attached to b.M.W
. Then the F
-conjugacy category is returned.
julia> W=coxgroup(:A,4)
A₄
julia> w=BraidMonoid(W)(4,3,3,2,1)
43.321
julia> C=conjcat(w)
category with 2 objects and 4 generating maps
julia> C.obj # the (sliding circuits) summit set
2-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
32143
21324
julia> xprint(C;graph=true) # show the conjugations among the summit set
category with 2 objects and 4 generating maps
32143 21343 21324 13214
32143────→ 32143────→ 21324────→ 21324────→ 32143
julia> conjcat(w;ss=Val(:ss)).obj # the super summit set
4-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, FiniteCoxeterGroup{Perm{Int16},Int64}}}}:
32143
13243
21432
21324
Chevie.Garside.endomorphisms
— Functionendomorphisms(C::Category,o)
returns generators of the endomorphisms of C.obj[o]
julia> W=coxsym(4);M=BraidMonoid(W)
BraidMonoid(𝔖 ₄)
julia> endomorphisms(conjcat(M(1,1,2,2,3)),1)
2-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, CoxSym{Int16}}}}:
213.1232
12.213
GroupPresentations.Presentation
— MethodPresentation(M::GarsideMonoid)
returns a presentation of the Garside group defined by M
(as given in theorem 4.1 of Dehornoy-Paris 1999).
julia> M=DualBraidMonoid(coxgroup(:A,3))
DualBraidMonoid(A₃,c=[1, 3, 2])
julia> p=Presentation(M)
Presentation: 6 generators, 15 relators, total length 62
julia> simplify(p)
<< presentation with 3 generators, 4 relators of total length 26>>
<< presentation with 3 generators, 3 relators of total length 16>>
julia> display_balanced(p)
1: ab=ba
2: cac=aca
3: cbc=bcb
Chevie.Garside.shrink
— Functionshrink(l::Vector{<:GarsideElt})
The list l
is a list of elements of the same Garside group G
. This function tries to find another set of generators of the subgroup of G
generated by the elements of l
, of smaller total length (the length being counted as returned by the function word
). This can be use to simplify the result of centralizer_gens
, or other braid subgroups.
julia> B=BraidMonoid(coxsym(3))
BraidMonoid(𝔖 ₃)
julia> b=[B(1)^3,B(2)^3,B(-2,-1,-1,2,2,2,2,1,1,2),B(1,1,1,2)]
4-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, CoxSym{Int16}}}}:
1.1.1
2.2.2
(1.12)⁻¹2.2.2.21.12
1.1.12
julia> shrink(b)
2-element Vector{GarsideElt{Perm{Int16}, BraidMonoid{Perm{Int16}, CoxSym{Int16}}}}:
2
1
Chevie.Garside.CorranPicantinMonoid
— FunctionCorranPicantinMonoid(e,n,k=1)
returns the interval monoid defined by G. Neaime, http://arxiv.org/abs/1707.06864, which generalizes the Corran-Picantin monoid for G(e,e,n)
.
In this monoid δ
has image
the element of G(e,e,n)
corresponding to the diagonal matrix whose diagonal entries except the first are equal to E(e)^k
; this monoid is isomorphic to the Corran-Picantin monoid for G(e,e,n)
when gcd(k,e)=1
.
julia> C=CorranPicantinMonoid(3,3)
CorranPicantinMonoid(3,3,3)
julia> word(C(C.δ))
6-element Vector{Int64}:
1
3
4
1
3
4
julia> Matrix(C,C.δ)
3×3 Matrix{Cyc{Int64}}:
ζ₃ 0 0
0 ζ₃ 0
0 0 ζ₃
julia> b=C(1,2,3,4)^3
1.2.341.2.341.2.34
julia> Matrix(C,b[3])
3×3 Matrix{Cyc{Int64}}:
0 0 ζ₃
0 ζ₃² 0
1 0 0
© July 2017 –- Jean Michel and Georges Neaime