Garside monoids and groups, braids.

Chevie.GarsideModule

Garside 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 are the braid group. Here we implement braid groups in the framework 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 generate M.

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); since this is not ensured by the existence of a Garside element, one has to add 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 these 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:

  1. Let M be a locally Garside monoid. Then for b∈ M there is a unique maximal simple left-divisor α(b) of b; any other simple dividing b divides α(b).

  2. Let M be a Garside monoid with Garside element Δ and group of fractions G. Then for any x∈ G, for large enough i we have Δⁱx∈ M.

A consequence of 1. is that every element has a canonical decomposition as a product of simples, called 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 (there an implementation following the work of François Digne for 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:

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 their constituting atoms.

We now describe the dual braid monoid. For that, we first define interval monoids. Given a group W and a set S of generators of W as a monoid, we define the S-length l_S(w) as the minimum number of elements of S needed to write w. We then define left-divisors of x as the d 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 which case we denote this set by [1,w], an "interval" for the poset of S-divisibility. We say that w is Garside for the S-length 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 S-length. 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
source
Chevie.Garside.LocallyGarsideMonoidType

LocallyGarsideMonoid{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) whether M.atoms[i]≼ a
  • isrightdescent(M,a,i::Int) whether a≽ M.atoms[i]
  • isrightascent(M,a,i::Int) whether a*M.atoms[i] is simple
  • *(M,a,b) when a*b is simple returns the simple a*b
  • \(M,a,b) when a≼ b returns the simple a
  • /(M,a,b) when a≽ b returns the simple a/b
source
Chevie.Garside.GarsideMonoidType

GarsideMonoid{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δ.

source
Chevie.Garside.rightascentsFunction

rightascents(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.

source
Chevie.Garside.left_divisorsFunction

left_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]
 [δ]
source

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
source
Chevie.Garside.leftgcdFunction

leftgcd(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

source

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))
source
Chevie.Garside.rightgcdFunction

rightgcd(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

source

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))
source
Chevie.Garside.leftlcmFunction

leftlcm(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

source

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))
source
Chevie.Garside.rightlcmFunction

rightlcm(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

source

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))
source
Chevie.Garside.αMethod

α(b::LocallyGarsideElt)

returns as a Garside element the first term in the normal form of b (b[1] or 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
source
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
source
Chevie.Garside.δadFunction

δ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.δ.

source

δad(b::GarsideElt,i=1)

returns the image of b by the i-th power of the automorphism induced by conjugation by b.M.δ.

source
Chevie.Garside.Brieskorn_normal_formFunction

Brieskorn_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]
source
Chevie.Garside.BraidMonoidType

BraidMonoid(W::CoxeterGroup)

The ordinary monoid of the Artin group associated to W

source

(B::BraidMonoid)(M::DualBraidMonoid,i::Integer)

convert to an element of B the i-th atom of M.

source

(B::BraidMonoid)(M::DualBraidMonoid,s)

convert to an element of B the simple s of M.

source

(B::BraidMonoid)(b::GarsideElt)

b should be a dual braid. Convert b to an element of B.

source
Chevie.Garside.DualBraidMonoidType

DualBraidMonoid(W;c=...)

W should be a well generated complex reflection group and c a Coxeter element of W, which should be a Vector{Int} specifying W(c...). If no c is given a particular one is chosen for Coxeter groups by making the product of elements in a partition of the Coxeter diagram in two sets where in each set elements commute pairwise; for a complex reflection group the representative stored in the Coxeter class is used.

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
 δ
source
Chevie.Garside.hurwitzFunction

hurwitz(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ⱼ.

source

hurwitz(l,v::AbstractVector{<:Integer})

does successively hurwitz(l,i) for each i in v.

source

hurwitz(l,b) the Hurwitz action of the braid b∈ Bₙ on the list l of length n of group elements.

source
Chevie.Garside.fractionFunction
  • fraction(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)
source
PermGroups.Groups.wordMethod

word(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
source
PermGroups.Groups.wordMethod

word(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
source
PermGroups.Groups.elementsMethod

elements(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
source
Chevie.Garside.imageFunction

image(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
source
Chevie.Garside.conjugating_eltFunction

conjugating_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
source
Chevie.Garside.centralizer_gensFunction

centralizer_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
source
Chevie.Garside.CategoryType

Category{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 objects
  • atoms::Vector{Vector{Pair{TM,Int}}} a vector representing the atoms (generators) of the category. It is such that atoms[i] is a Vector of pairs m=>j representing a map m from obj[i] to obj[j]. If the julia objects of type TM belong to a monoid, a general map can be represented as a triple (i,m,j) where m is of type TM representing a map from obj[i] to obj[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
source
Chevie.Garside.CategoryMethod

Category(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
source
Chevie.Garside.conjcatFunction

conjcat(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 same Inf as b.

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
source
Chevie.Garside.endomorphismsFunction

endomorphisms(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
source
GroupPresentations.PresentationMethod

Presentation(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
source
Chevie.Garside.shrinkFunction

shrink(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
source
Chevie.Garside.CorranPicantinMonoidFunction

CorranPicantinMonoid(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

source