mirror of
https://github.com/kalmarek/Groups.jl.git
synced 2024-12-25 02:05:30 +01:00
fix inverses and symplectic twists to finally arrive at SAut(π₁Σ)
This commit is contained in:
parent
1d4e219687
commit
0fbdbbde14
@ -20,10 +20,18 @@ end
|
|||||||
function SurfaceGroup(genus::Integer, boundaries::Integer)
|
function SurfaceGroup(genus::Integer, boundaries::Integer)
|
||||||
@assert genus > 1
|
@assert genus > 1
|
||||||
|
|
||||||
|
# The (confluent) rewriting systems comes from
|
||||||
|
# S. Hermiller, Rewriting systems for Coxeter groups
|
||||||
|
# Journal of Pure and Applied Algebra
|
||||||
|
# Volume 92, Issue 2, 7 March 1994, Pages 137-148
|
||||||
|
# https://doi.org/10.1016/0022-4049(94)90019-1
|
||||||
|
# Note: the notation is "inverted":
|
||||||
|
# a_g of the article becomes A_g here.
|
||||||
|
|
||||||
ltrs = String[]
|
ltrs = String[]
|
||||||
for i in 1:genus
|
for i in 1:genus
|
||||||
subscript = join('₀'+d for d in reverse(digits(i)))
|
subscript = join('₀'+d for d in reverse(digits(i)))
|
||||||
append!(ltrs, ["a" * subscript, "A" * subscript, "b" * subscript, "B" * subscript])
|
append!(ltrs, ["A" * subscript, "a" * subscript, "B" * subscript, "b" * subscript])
|
||||||
end
|
end
|
||||||
Al = Alphabet(reverse!(ltrs))
|
Al = Alphabet(reverse!(ltrs))
|
||||||
|
|
||||||
@ -66,17 +74,17 @@ relations(S::SurfaceGroup) = S.relations
|
|||||||
function symplectic_twists(π₁Σ::SurfaceGroup)
|
function symplectic_twists(π₁Σ::SurfaceGroup)
|
||||||
g = genus(π₁Σ)
|
g = genus(π₁Σ)
|
||||||
|
|
||||||
saut = SpecialAutomorphismGroup(FreeGroup(2g))
|
saut = SpecialAutomorphismGroup(FreeGroup(2g), maxrules=100)
|
||||||
|
|
||||||
Aij = [SymplecticMappingClass(π₁Σ, saut, :A, i, j) for i in 1:g for j in 1:g if i≠j]
|
Aij = [SymplecticMappingClass(saut, :A, i, j) for i in 1:g for j in 1:g if i≠j]
|
||||||
|
|
||||||
Bij = [SymplecticMappingClass(π₁Σ, saut, :B, i, j) for i in 1:g for j in i+1:g]
|
Bij = [SymplecticMappingClass(saut, :B, i, j) for i in 1:g for j in 1:g if i≠j]
|
||||||
|
|
||||||
mBij = [SymplecticMappingClass(π₁Σ, saut, :B, i, j, minus=true) for i in 1:g for j in i+1:g]
|
mBij = [SymplecticMappingClass(saut, :B, i, j, minus=true) for i in 1:g for j in 1:g if i≠j]
|
||||||
|
|
||||||
Bii = [SymplecticMappingClass(π₁Σ, saut, :B, i, i) for i in 1:g]
|
Bii = [SymplecticMappingClass(saut, :B, i, i) for i in 1:g]
|
||||||
|
|
||||||
mBii = [SymplecticMappingClass(π₁Σ, saut, :B, i, i, minus=true) for i in 1:g]
|
mBii = [SymplecticMappingClass(saut, :B, i, i, minus=true) for i in 1:g]
|
||||||
|
|
||||||
return [Aij; Bij; mBij; Bii; mBii]
|
return [Aij; Bij; mBij; Bii; mBii]
|
||||||
end
|
end
|
||||||
@ -86,5 +94,10 @@ KnuthBendix.alphabet(G::AutomorphismGroup{<:SurfaceGroup}) = rewriting(G)
|
|||||||
function AutomorphismGroup(π₁Σ::SurfaceGroup; kwargs...)
|
function AutomorphismGroup(π₁Σ::SurfaceGroup; kwargs...)
|
||||||
S = vcat(symplectic_twists(π₁Σ)...)
|
S = vcat(symplectic_twists(π₁Σ)...)
|
||||||
A = Alphabet(S)
|
A = Alphabet(S)
|
||||||
return AutomorphismGroup(π₁Σ, S, A, ntuple(i->gens(π₁Σ, i), 2genus(π₁Σ)))
|
|
||||||
|
# this is to fix the definitions of symplectic twists:
|
||||||
|
# with i->gens(π₁Σ, i) the corresponding automorphisms return
|
||||||
|
# reversed words
|
||||||
|
domain = ntuple(i->inv(gens(π₁Σ, i)), 2genus(π₁Σ))
|
||||||
|
return AutomorphismGroup(π₁Σ, S, A, domain)
|
||||||
end
|
end
|
||||||
|
@ -175,8 +175,6 @@ struct SymplecticMappingClass{T, F} <: GSymbol
|
|||||||
minus::Bool
|
minus::Bool
|
||||||
inv::Bool
|
inv::Bool
|
||||||
autFn_word::T
|
autFn_word::T
|
||||||
perm::Vector{Int}
|
|
||||||
invperm::Vector{Int}
|
|
||||||
f::F
|
f::F
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -185,8 +183,7 @@ Base.:(==)(a::SymplecticMappingClass, b::SymplecticMappingClass) = a.autFn_word
|
|||||||
Base.hash(a::SymplecticMappingClass, h::UInt) = hash(a.autFn_word, h)
|
Base.hash(a::SymplecticMappingClass, h::UInt) = hash(a.autFn_word, h)
|
||||||
|
|
||||||
function SymplecticMappingClass(
|
function SymplecticMappingClass(
|
||||||
Σ::SurfaceGroup,
|
sautFn::AutomorphismGroup{<:FreeGroup},
|
||||||
sautFn,
|
|
||||||
id::Symbol,
|
id::Symbol,
|
||||||
i::Integer,
|
i::Integer,
|
||||||
j::Integer;
|
j::Integer;
|
||||||
@ -195,11 +192,12 @@ function SymplecticMappingClass(
|
|||||||
)
|
)
|
||||||
@assert i > 0 && j > 0
|
@assert i > 0 && j > 0
|
||||||
id === :A && @assert i ≠ j
|
id === :A && @assert i ≠ j
|
||||||
@assert 2genus(Σ) == ngens(object(sautFn))
|
@assert iseven(ngens(object(sautFn)))
|
||||||
|
genus = ngens(object(sautFn))÷2
|
||||||
|
|
||||||
A = KnuthBendix.alphabet(sautFn)
|
A = alphabet(sautFn)
|
||||||
λ = ΡΛ(:λ, A, 2genus(Σ))
|
λ = ΡΛ(:λ, A, 2genus)
|
||||||
ϱ = ΡΛ(:ϱ, A, 2genus(Σ))
|
ϱ = ΡΛ(:ϱ, A, 2genus)
|
||||||
|
|
||||||
w = if id === :A
|
w = if id === :A
|
||||||
Te(λ, ϱ, i, j) *
|
Te(λ, ϱ, i, j) *
|
||||||
@ -229,14 +227,14 @@ function SymplecticMappingClass(
|
|||||||
throw("Type not recognized: $id")
|
throw("Type not recognized: $id")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# w is a word defined in the context of A (= alphabet(sautFn))
|
||||||
|
# so this "coercion" is correct
|
||||||
a = sautFn(w)
|
a = sautFn(w)
|
||||||
g = genus(Σ)
|
|
||||||
perm = [2g:-2:1; (2g-1):-2:1]
|
|
||||||
|
|
||||||
f = compiled(a)
|
f = compiled(a)
|
||||||
# f = t -> evaluate!(t, a)
|
# f = t -> evaluate!(t, a)
|
||||||
|
|
||||||
res = SymplecticMappingClass(id, UInt(i), UInt(j), minus, inverse, a, perm, invperm(perm), f)
|
res = SymplecticMappingClass(id, UInt(i), UInt(j), minus, inverse, a, f)
|
||||||
|
|
||||||
return res
|
return res
|
||||||
end
|
end
|
||||||
@ -255,7 +253,7 @@ function Base.inv(m::SymplecticMappingClass)
|
|||||||
inv_w = inv(m.autFn_word)
|
inv_w = inv(m.autFn_word)
|
||||||
# f(t) = evaluate!(t, inv_w)
|
# f(t) = evaluate!(t, inv_w)
|
||||||
f = compiled(inv_w)
|
f = compiled(inv_w)
|
||||||
return SymplecticMappingClass(m.id, m.i, m.j, m.minus, !m.inv, inv_w, m.perm, m.invperm, f)
|
return SymplecticMappingClass(m.id, m.i, m.j, m.minus, !m.inv, inv_w, f)
|
||||||
end
|
end
|
||||||
|
|
||||||
function evaluate!(
|
function evaluate!(
|
||||||
@ -263,9 +261,9 @@ function evaluate!(
|
|||||||
smc::SymplecticMappingClass,
|
smc::SymplecticMappingClass,
|
||||||
tmp=nothing,
|
tmp=nothing,
|
||||||
) where {N,T}
|
) where {N,T}
|
||||||
|
t = smc.f(t)
|
||||||
t = smc.f(t[smc.perm])[smc.invperm]
|
for i in 1:N
|
||||||
|
normalform!(t[i])
|
||||||
|
end
|
||||||
return t
|
return t
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user