mirror of
https://github.com/kalmarek/Groups.jl.git
synced 2024-10-15 07:20:35 +02:00
separate SAut(F_n) from AutomorphismGroups
This commit is contained in:
parent
190fe1f201
commit
f74b48b890
@ -28,11 +28,10 @@ import OrderedCollections: OrderedSet
|
|||||||
include("new_types.jl")
|
include("new_types.jl")
|
||||||
include("new_hashing.jl")
|
include("new_hashing.jl")
|
||||||
include("normalform.jl")
|
include("normalform.jl")
|
||||||
|
|
||||||
include("new_transvections.jl")
|
|
||||||
include("gersten_relations.jl")
|
|
||||||
include("new_autgroups.jl")
|
include("new_autgroups.jl")
|
||||||
|
|
||||||
|
include("groups/sautFn.jl")
|
||||||
|
|
||||||
end # module New
|
end # module New
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
34
src/groups/sautFn.jl
Normal file
34
src/groups/sautFn.jl
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
include("transvections.jl")
|
||||||
|
include("gersten_relations.jl")
|
||||||
|
|
||||||
|
function SpecialAutomorphismGroup(F::FreeGroup; ordering = KnuthBendix.LenLex, kwargs...)
|
||||||
|
|
||||||
|
n = length(KnuthBendix.alphabet(F)) ÷ 2
|
||||||
|
A, rels = gersten_relations(n, commutative = false)
|
||||||
|
S = KnuthBendix.letters(A)[1:2(n^2-n)]
|
||||||
|
|
||||||
|
rws = KnuthBendix.RewritingSystem(rels, ordering(A))
|
||||||
|
KnuthBendix.knuthbendix!(rws; kwargs...)
|
||||||
|
return AutomorphismGroup(F, S, rws, ntuple(i -> gens(F, i), n))
|
||||||
|
end
|
||||||
|
|
||||||
|
KnuthBendix.alphabet(G::AutomorphismGroup{<:FreeGroup}) = alphabet(rewriting(G))
|
||||||
|
|
||||||
|
function relations(G::AutomorphismGroup{<:FreeGroup})
|
||||||
|
n = length(KnuthBendix.alphabet(object(G))) ÷ 2
|
||||||
|
return last(gersten_relations(n, commutative = false))
|
||||||
|
end
|
||||||
|
|
||||||
|
evaluate(f::FPGroupElement{<:AutomorphismGroup{<:FreeGroup}}) = evaluate!(domain(f), f)
|
||||||
|
|
||||||
|
function evaluate!(
|
||||||
|
t::NTuple{N,T},
|
||||||
|
f::FPGroupElement{<:AutomorphismGroup{<:FreeGroup}},
|
||||||
|
tmp = one(first(t)),
|
||||||
|
) where {T<:FPGroupElement,N}
|
||||||
|
A = alphabet(f)
|
||||||
|
for idx in word(f)
|
||||||
|
t = @inbounds evaluate!(t, A[idx], alphabet(object(parent(f))), tmp)::NTuple{N,T}
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
@ -1,6 +1,3 @@
|
|||||||
abstract type GSymbol end
|
|
||||||
Base.literal_pow(::typeof(^), t::GSymbol, ::Val{-1}) = inv(t)
|
|
||||||
|
|
||||||
struct Transvection <: GSymbol
|
struct Transvection <: GSymbol
|
||||||
id::Symbol
|
id::Symbol
|
||||||
ij::UInt8
|
ij::UInt8
|
@ -12,26 +12,8 @@ struct AutomorphismGroup{G<:Group,T,R,S} <: AbstractFPGroup
|
|||||||
end
|
end
|
||||||
|
|
||||||
object(G::AutomorphismGroup) = G.group
|
object(G::AutomorphismGroup) = G.group
|
||||||
|
|
||||||
function SpecialAutomorphismGroup(F::FreeGroup; ordering = KnuthBendix.LenLex, kwargs...)
|
|
||||||
|
|
||||||
n = length(KnuthBendix.alphabet(F)) ÷ 2
|
|
||||||
A, rels = gersten_relations(n, commutative = false)
|
|
||||||
S = KnuthBendix.letters(A)[1:2(n^2-n)]
|
|
||||||
|
|
||||||
rws = KnuthBendix.RewritingSystem(rels, ordering(A))
|
|
||||||
KnuthBendix.knuthbendix!(rws; kwargs...)
|
|
||||||
return AutomorphismGroup(F, S, rws, ntuple(i -> gens(F, i), n))
|
|
||||||
end
|
|
||||||
|
|
||||||
KnuthBendix.alphabet(G::AutomorphismGroup{<:FreeGroup}) = alphabet(rewriting(G))
|
|
||||||
rewriting(G::AutomorphismGroup) = G.rws
|
rewriting(G::AutomorphismGroup) = G.rws
|
||||||
|
|
||||||
function relations(G::AutomorphismGroup)
|
|
||||||
n = length(KnuthBendix.alphabet(object(G))) ÷ 2
|
|
||||||
return last(gersten_relations(n, commutative = false))
|
|
||||||
end
|
|
||||||
|
|
||||||
function equality_data(f::FPGroupElement{<:AutomorphismGroup})
|
function equality_data(f::FPGroupElement{<:AutomorphismGroup})
|
||||||
imf = evaluate(f)
|
imf = evaluate(f)
|
||||||
# return normalform!.(imf)
|
# return normalform!.(imf)
|
||||||
@ -107,16 +89,6 @@ Base.show(io::IO, A::AutomorphismGroup) = print(io, "automorphism group of ", ob
|
|||||||
domain(f::FPGroupElement{<:AutomorphismGroup}) = deepcopy(parent(f).domain)
|
domain(f::FPGroupElement{<:AutomorphismGroup}) = deepcopy(parent(f).domain)
|
||||||
# tuple(gens(object(parent(f)))...)
|
# tuple(gens(object(parent(f)))...)
|
||||||
|
|
||||||
evaluate(f::FPGroupElement{<:AutomorphismGroup{<:FreeGroup}}) = evaluate!(domain(f), f)
|
evaluate(f::FPGroupElement{<:AutomorphismGroup}) = throw("you need to implement `evaluate(::typeof(f))`")
|
||||||
|
|
||||||
function evaluate!(
|
|
||||||
t::NTuple{N,T},
|
|
||||||
f::FPGroupElement{<:AutomorphismGroup{<:FreeGroup}},
|
|
||||||
tmp = one(first(t)),
|
|
||||||
) where {T<:FPGroupElement,N}
|
|
||||||
A = alphabet(f)
|
|
||||||
for idx in word(f)
|
|
||||||
t = @inbounds evaluate!(t, A[idx], alphabet(object(parent(f))), tmp)::NTuple{N,T}
|
|
||||||
end
|
|
||||||
return t
|
|
||||||
end
|
end
|
||||||
|
@ -197,3 +197,8 @@ function Base.show(io::IO, G::FPGroup)
|
|||||||
join(io, relations(G), ", ")
|
join(io, relations(G), ", ")
|
||||||
print(io, "⟩")
|
print(io, "⟩")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
## GSymbol aka letter of alphabet
|
||||||
|
|
||||||
|
abstract type GSymbol end
|
||||||
|
Base.literal_pow(::typeof(^), t::GSymbol, ::Val{-1}) = inv(t)
|
||||||
|
Loading…
Reference in New Issue
Block a user