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 above examples is the braid group. We implement braid groups as a special case of a general implementation of Garside monoids and groups.

We first 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, right cancellability and the symbol . We say that x is an atom if 1 and x are its only left or right 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. The divisors of Δ are called the simples of M. A Garside monoid embeds into its group of fractions, which is called a Garside group; the monoid defines a Garside structure for the group of fractions. 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 more generally locally Garside monoids, which have the same axioms, excepted lcms do not always exist, but exist if any common multiple exists; they also do not have Garside elements. 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); each element is still divisible by finitely many simples, but the set 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.

There is another generalization, quasi-Garside monoids, where we relax the axiom that an element has finititely many divisors (there may me infinitely atoms). We do not implement this but the package AffineA implements, following the work of François Digne, the dual braid monoid of the affine Coxeter group W(Ãₙ) which is of this type.

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 any b∈ M there is a unique maximal (for divisibility) simple left-divisor α(b) of b. In a Garside monoid it is the leftgcd(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 of M 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))… For locally Garside monoids we use the normal form to represent elements of M. When M is Garside we use 2. to represent any element 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 (this sequence thus does not contain the identity or Delta). We see that in our implementation the simples is another type that the type of Garside elements. Thus a Garside monoid is a parametrized type whose most general instance is the type LocallyGarsideMonoid{T} where T is the type of the simples.

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 associated positive braid monoid B⁺ 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.

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

The operations * and ^ (exponentiation) are implemented for locally Garside elements (and also multiplication of a Garside element by a simple) and in addition the operations \ and '/' (left and right division), inv and ^ (inverse and conjugation) for Garside elements (and conjugation of a Garside element by a simple).

julia> w*w
1213243.4

julia> w*W(1) # multiplication by a simple
12134

julia> W(1)*w
1.1234

julia> w^3  # the terms of the normal form are printed separated by a .
121321432.343

julia> B(1,2)\w
34

julia> w/B(3,4)
12

julia> w^B(1) # conjugation
2134

julia> w^W(1) # conjugation by a simple
2134

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)⁻¹

julia> B(-4,-3,-2,-1) # another way of entering the same element
(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 l_S and 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 (see reflength) and for S_S the reflections which divide w for the reflection length (for Coxeter groups all reflections divide a Coxeter element but this is not the case for well-generated complex reflection groups); the simples of the dual monoid are of cardinality the generalized Catalan numbers (see 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'∈M where M is Garside are conjugate in the group of fractions G 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 in Garside groups 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 simples). 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, denoted SS(w). Thus a way to determine if w and w' are conjugate is to find representatives w₁∈SS(w), w'₁∈SS(w') of them in their super summit set, and then enumerate SS(w) and see if it contains w'₁. This can also be used to compute the centralizer of an element: if we consider the super summit set as a category whose objects are its elements and morphisms are the conjugations by simple elements, the centralizer of w₁ is given by the endomorphisms of that 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) # would return nothing if b, c are not conjugate
(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)) # SS(b) as a category
category with 10 objects and 32 generating maps

julia> C.obj # the elements of SS(b). Notice it contains c
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> C=conjcat(b) # with no Val argument computes the sliding circuits
category with 2 objects and 6 generating maps

julia> C.obj # the elements of the sliding circuits
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,s₁,…,sₙ) leftgcdc(M::LocallyGarsideMonoid,s₁,…,sₙ)

s₁,…,sₙ should be simples of M. The function returns the left gcd d of the sᵢ.

leftgcdc returns (d,(d⁻¹s₁,…,d⁻¹sₙ))

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,s₁,…,sₙ) rightgcdc(M::LocallyGarsideMonoid,s₁,…,sₙ)

s₁,…,sₙ should be simples of M. The function returns the right gcd d of the sᵢ.

rightgcdc returns (d,(s₁d⁻¹,…,sₙ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,s₁,…,sₙ) leftlcmc(M::GarsideMonoid,s₁,…,sₙ)

s₁,…,sₙ should be simples of M. The function returns the left lcm m of the sᵢ.

leftlcmc returns (m,(ms₁⁻¹,…,msₙ⁻¹))

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,s₁,…,sₙ) rightlcmc(M::GarsideMonoid,s₁,…,sₙ)

s₁,…,sₙ should be simples of M. The function returns the right lcm m of the sᵢ.

rightlcmc returns (m,(s₁⁻¹m,…,sₙ⁻¹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 (the expression 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
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.δ (that is x^(M.δ^i)).

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

The following expression computes the orbit of the list l under the various Huwitz actions: orbit(1:length(l)-1,l,hurwitz).

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

The struct Category{TO,TM} represents a finite category whose objects are of type TO and maps of type TM. It has two fields:

  • .obj::Vector{TO} the objects
  • .atoms::Vector{Vector{Pair{TM,Int}}} a vector of same length as .obj representing the atoms (generators) of the category; atoms[i] is a Vector of pairs m=>j holding a map m from obj[i] to obj[j].
julia> W=coxsym(4);B=BraidMonoid(W);b=B(1,1,2,2,3)
1.12.23

julia> print(conjcat(b))
Category([B(1,2,2,1,3),B(2,1,3,1,2),B(2,1,3,3,2),B(3,2,2,1,3)],[
[B(1,2)=>2, B(2,1,3)=>3],
[B(2,1,3)=>1, B(1,3,2,1)=>4],
[B(2,1,3)=>4, B(1,2,3,2)=>1],
[B(2,1,3)=>2, B(3,2)=>3]])

julia> xprint(conjcat(b);graph=true) # show graphically the category
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 two functions:

  • atomsfrom(o) given an object o returns the list of atoms from o. - action(o,m) returns the resulting object obtained by applying the map m to the object o. If action is not given, it is assumed that o^m does the job.

The result is a Category{TO,TM} where TO=typeof(o) and TM is the eltype of the result of atomsfrom.

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::Integer) Assuming the atoms of C are invertible by inv and maps multiply with *, 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) # generators of centralizer
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