1
0
mirror of https://github.com/kalmarek/Groups.jl.git synced 2024-12-26 02:20:30 +01:00

add rotation_element and correct Te, Ta, Tα

This commit is contained in:
Marek Kaluba 2021-08-13 13:51:45 +02:00
parent 4014b4f7b8
commit 67e7a3105e
No known key found for this signature in database
GPG Key ID: 8BF1A3855328FC15

View File

@ -5,8 +5,8 @@ struct ΡΛ
end end
function Base.getindex(rl::ΡΛ, i::Integer, j::Integer) function Base.getindex(rl::ΡΛ, i::Integer, j::Integer)
@assert 1 i rl.N @assert 1 i rl.N "Got $i > $(rl.N)"
@assert 1 j rl.N @assert 1 j rl.N "Got $j > $(rl.N)"
@assert i j @assert i j
@assert rl.id (, :ϱ) @assert rl.id (, :ϱ)
rl.id == && return Word([rl.A[λ(i, j)]]) rl.id == && return Word([rl.A[λ(i, j)]])
@ -19,11 +19,16 @@ function Te_diagonal(λ::Groups.ΡΛ, ϱ::Groups.ΡΛ, i::Integer)
N = λ.N N = λ.N
@assert iseven(N) @assert iseven(N)
A = λ.A
n = N ÷ 2 n = N ÷ 2
j = i + 1 j = i + 1
@assert 1 <= i < n
A = λ.A if i == n
τ = rotation_element(λ, ϱ)
return inv(A, τ) * Te_diagonal(λ, ϱ, 1) * τ
end
@assert 1 <= i < n
NI = (2n - 2i) + 1 NI = (2n - 2i) + 1
NJ = (2n - 2j) + 1 NJ = (2n - 2j) + 1
@ -44,43 +49,104 @@ end
function Te_lantern(A::Alphabet, b₀::T, a₁::T, a₂::T, a₃::T, a₄::T, a₅::T) where {T} function Te_lantern(A::Alphabet, b₀::T, a₁::T, a₂::T, a₃::T, a₄::T, a₅::T) where {T}
a₀ = (a₁ * a₂ * a₃)^4 * inv(A, b₀) a₀ = (a₁ * a₂ * a₃)^4 * inv(A, b₀)
X = a₄ * a₅ * a₃ * a₄ X = a₄ * a₅ * a₃ * a₄ # from Primer
b₁ = inv(A, X) * a₀ * X b₁ = inv(A, X) * a₀ * X # from Primer
Y = a₂ * a₃ * a₁ * a₂ Y = a₂ * a₃ * a₁ * a₂
return inv(A, Y) * b₁ * Y # b₂ return inv(A, Y) * b₁ * Y # b₂ from Primer
end end
Ta(λ::Groups.ΡΛ, i::Integer) = (@assert λ.id == ; λ[λ.N-2i+1, λ.N-2i+2]) function Ta(λ::Groups.ΡΛ, i::Integer)
@assert λ.id == ;
Tα(λ::Groups.ΡΛ, i::Integer) = (@assert λ.id == ; inv(λ.A, λ[λ.N-2i+2, λ.N-2i+1])) return λ[mod1(λ.N-2i+1, λ.N), mod1(λ.N-2i+2, λ.N)]
end
function Tα(λ::Groups.ΡΛ, i::Integer)
@assert λ.id == ;
return inv(λ.A, λ[mod1(λ.N-2i+2, λ.N), mod1(λ.N-2i+1, λ.N)])
end
function Te(λ::ΡΛ, ϱ::ΡΛ, i, j) function Te(λ::ΡΛ, ϱ::ΡΛ, i, j)
@assert i j @assert i j
i, j = i < j ? (i, j) : (j, i)
@assert λ.N == ϱ.N @assert λ.N == ϱ.N
@assert λ.A == ϱ.A @assert λ.A == ϱ.A
@assert λ.id == && ϱ.id == :ϱ @assert λ.id == && ϱ.id == :ϱ
@assert iseven(λ.N)
genus = λ.N÷2
i = mod1(i, genus)
j = mod1(j, genus)
@assert 1 i λ.N @assert 1 i λ.N
@assert 1 j λ.N @assert 1 j λ.N
if j == i + 1 A = λ.A
if mod(j - (i + 1), genus) == 0
return Te_diagonal(λ, ϱ, i) return Te_diagonal(λ, ϱ, i)
else else
return Te_lantern( return inv(A, Te_lantern(
λ.A, A,
Ta(λ, i + 1), # Our notation: # Primer notation:
Ta(λ, i), inv(A, Ta(λ, i + 1)), # b₀
Tα(λ, i), inv(A, Ta(λ, i)), # a₁
Te(λ, ϱ, i, i + 1), inv(A, Tα(λ, i)), # a₂
Tα(λ, i + 1), inv(A, Te_diagonal(λ, ϱ, i)), # a₃
Te(λ, ϱ, i + 1, j), inv(A, Tα(λ, i + 1)), # a₄
) inv(A, Te(λ, ϱ, i + 1, j)), # a₅
))
end end
end end
"""
rotation_element(G::AutomorphismGroup{<:FreeGroup})
Return the element of `G` which corresponds to shifting generators of the free group.
In the corresponding mapping class group this element acts by rotation of the surface anti-clockwise.
"""
function rotation_element(G::AutomorphismGroup{<:FreeGroup})
A = alphabet(G)
@assert iseven(ngens(object(G)))
genus = ngens(object(G)) ÷ 2
λ = ΡΛ(, A, 2genus)
ϱ = ΡΛ(:ϱ, A, 2genus)
return G(rotation_element(λ, ϱ))
end
function rotation_element(λ::ΡΛ, ϱ::ΡΛ)
@assert iseven(λ.N)
genus = λ.N÷2
A = λ.A
halftwists = map(1:genus-1) do i
j = i + 1
x = Ta(λ, j) * inv(A, Ta(λ, i)) * Tα(λ, j) * Te_diagonal(λ, ϱ, i)
δ = x * Tα(λ, i) * inv(A, x)
c =
inv(A, Ta(λ, j)) *
Te(λ, ϱ, i, j) *
Tα(λ, i)^2 *
inv(A, δ) *
inv(A, Ta(λ, j)) *
Ta(λ, i) *
δ
z =
Te_diagonal(λ, ϱ, i) *
inv(A, Ta(λ, i)) *
Tα(λ, i) *
Ta(λ, i) *
inv(A, Te_diagonal(λ, ϱ, i))
Ta(λ, i) * inv(A, Ta(λ, j) * Tα(λ, j))^6 * (Ta(λ, j) * Tα(λ, j) * z)^4 * c
end
τ = (Ta(λ, 1) * Tα(λ, 1))^6 * prod(halftwists)
return τ
end
function mcg_twists(G::AutomorphismGroup{<:FreeGroup}) function mcg_twists(G::AutomorphismGroup{<:FreeGroup})
@assert iseven(ngens(object(G))) @assert iseven(ngens(object(G)))