2021-05-28 14:20:17 +02:00
|
|
|
include("transvections.jl")
|
|
|
|
include("gersten_relations.jl")
|
|
|
|
|
2022-10-14 01:14:38 +02:00
|
|
|
function SpecialAutomorphismGroup(F::FreeGroup; ordering=KnuthBendix.LenLex, kwargs...)
|
2021-05-28 14:20:17 +02:00
|
|
|
|
2021-06-21 19:14:42 +02:00
|
|
|
n = length(alphabet(F)) ÷ 2
|
2022-10-13 23:21:42 +02:00
|
|
|
A, rels = gersten_relations(n, commutative=false)
|
|
|
|
S = [A[i] for i in 1:2:length(A)]
|
2021-05-28 14:20:17 +02:00
|
|
|
|
2022-10-13 23:38:18 +02:00
|
|
|
max_rules = 1000 * n
|
2021-06-29 16:54:00 +02:00
|
|
|
|
2022-10-13 23:38:18 +02:00
|
|
|
rws = Logging.with_logger(Logging.NullLogger()) do
|
|
|
|
rws = KnuthBendix.RewritingSystem(rels, ordering(A))
|
2022-04-02 15:51:29 +02:00
|
|
|
# the rws is not confluent, let's suppress warning about it
|
2022-10-13 23:38:18 +02:00
|
|
|
KnuthBendix.knuthbendix(rws, KnuthBendix.Settings(; max_rules=max_rules, kwargs...))
|
2022-04-02 15:51:29 +02:00
|
|
|
end
|
2022-10-13 23:41:05 +02:00
|
|
|
|
|
|
|
idxA = KnuthBendix.IndexAutomaton(rws)
|
|
|
|
return AutomorphismGroup(F, S, idxA, ntuple(i -> gens(F, i), n))
|
2021-05-28 14:20:17 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
function relations(G::AutomorphismGroup{<:FreeGroup})
|
2021-06-21 19:14:42 +02:00
|
|
|
n = length(alphabet(object(G))) ÷ 2
|
2022-10-14 01:14:38 +02:00
|
|
|
return last(gersten_relations(n, commutative=false))
|
2021-05-28 14:20:17 +02:00
|
|
|
end
|