1
0
mirror of https://github.com/kalmarek/Groups.jl.git synced 2024-12-25 18:15:29 +01:00

fix inverses and symplectic twists to finally arrive at SAut(π₁Σ)

This commit is contained in:
Marek Kaluba 2021-08-13 13:55:35 +02:00
parent 1d4e219687
commit 0fbdbbde14
No known key found for this signature in database
GPG Key ID: 8BF1A3855328FC15
2 changed files with 35 additions and 24 deletions

View File

@ -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

View File

@ -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