mirror of
https://github.com/kalmarek/Groups.jl.git
synced 2024-12-26 02:20:30 +01:00
commit
a5fd4421d5
@ -1,7 +1,7 @@
|
|||||||
name = "Groups"
|
name = "Groups"
|
||||||
uuid = "5d8bd718-bd84-11e8-3b40-ad14f4a32557"
|
uuid = "5d8bd718-bd84-11e8-3b40-ad14f4a32557"
|
||||||
authors = ["Marek Kaluba <kalmar@amu.edu.pl>"]
|
authors = ["Marek Kaluba <kalmar@amu.edu.pl>"]
|
||||||
version = "0.4.0"
|
version = "0.4.1"
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
AbstractAlgebra = "c3fe647b-3220-5bb0-a1ea-a7954cac585d"
|
AbstractAlgebra = "c3fe647b-3220-5bb0-a1ea-a7954cac585d"
|
||||||
|
@ -262,7 +262,7 @@ end
|
|||||||
|
|
||||||
function show(io::IO, G::AutGroup)
|
function show(io::IO, G::AutGroup)
|
||||||
print(io, "Automorphism Group of $(G.objectGroup)\n")
|
print(io, "Automorphism Group of $(G.objectGroup)\n")
|
||||||
print(io, "Generated by $(join(G.gens, ","))")
|
print(io, "Generated by $(gens(G))")
|
||||||
end
|
end
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -31,11 +31,6 @@ function DirectPower(G::DirectPowerGroup{N}, H::Group) where N
|
|||||||
return DirectPowerGroup(G.group, N+1)
|
return DirectPowerGroup(G.group, N+1)
|
||||||
end
|
end
|
||||||
|
|
||||||
function DirectPower(R::AbstractAlgebra.Ring, n::Int)
|
|
||||||
@warn "Creating DirectPower of the multilplicative group!"
|
|
||||||
return DirectPowerGroup(MultiplicativeGroup(R), n)
|
|
||||||
end
|
|
||||||
|
|
||||||
struct DirectPowerGroupElem{N, T<:GroupElem} <: GroupElem
|
struct DirectPowerGroupElem{N, T<:GroupElem} <: GroupElem
|
||||||
elts::NTuple{N,T}
|
elts::NTuple{N,T}
|
||||||
end
|
end
|
||||||
@ -65,7 +60,7 @@ parent(g::DirectPowerGroupElem{N, T}) where {N,T} =
|
|||||||
#
|
#
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
size(g::DirectPowerGroupElem{N}) where N = (N,)
|
Base.size(g::DirectPowerGroupElem{N}) where N = (N,)
|
||||||
Base.IndexStyle(::Type{DirectPowerGroupElem}) = Base.LinearFast()
|
Base.IndexStyle(::Type{DirectPowerGroupElem}) = Base.LinearFast()
|
||||||
Base.getindex(g::DirectPowerGroupElem, i::Int) = g.elts[i]
|
Base.getindex(g::DirectPowerGroupElem, i::Int) = g.elts[i]
|
||||||
|
|
||||||
@ -188,7 +183,6 @@ end
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
order(G::DirectPowerGroup{N}) where N = order(G.group)^N
|
order(G::DirectPowerGroup{N}) where N = order(G.group)^N
|
||||||
length(G::DirectPowerGroup) = order(G)
|
|
||||||
|
|
||||||
function iterate(G::DirectPowerGroup{N}) where N
|
function iterate(G::DirectPowerGroup{N}) where N
|
||||||
elts = collect(G.group)
|
elts = collect(G.group)
|
||||||
@ -212,3 +206,4 @@ function iterate(G::DirectPowerGroup{N}, state) where N
|
|||||||
end
|
end
|
||||||
|
|
||||||
eltype(::Type{DirectPowerGroup{N, G}}) where {N, G} = DirectPowerGroupElem{N, elem_type(G)}
|
eltype(::Type{DirectPowerGroup{N, G}}) where {N, G} = DirectPowerGroupElem{N, elem_type(G)}
|
||||||
|
Base.length(G::DirectPowerGroup) = order(G)
|
||||||
|
@ -3,8 +3,9 @@ change_pow(s::S, n::Integer) where S<:GSymbol = S(s.id, n)
|
|||||||
function Base.iterate(s::GS, i=1) where GS<:GSymbol
|
function Base.iterate(s::GS, i=1) where GS<:GSymbol
|
||||||
return i <= abs(s.pow) ? (GS(s.id, sign(s.pow)), i+1) : nothing
|
return i <= abs(s.pow) ? (GS(s.id, sign(s.pow)), i+1) : nothing
|
||||||
end
|
end
|
||||||
Base.length(s::GSymbol) = abs(s.pow)
|
Base.size(s::GSymbol) = (abs(s.pow), )
|
||||||
Base.size(s::GSymbol) = (length(s), )
|
Base.length(s::GSymbol) = first(size(s))
|
||||||
|
|
||||||
Base.eltype(s::GS) where GS<:GSymbol = GS
|
Base.eltype(s::GS) where GS<:GSymbol = GS
|
||||||
|
|
||||||
Base.isone(s::GSymbol) = iszero(s.pow)
|
Base.isone(s::GSymbol) = iszero(s.pow)
|
||||||
|
@ -6,13 +6,17 @@
|
|||||||
@test_throws MethodError Groups.AutSymbol(:a)
|
@test_throws MethodError Groups.AutSymbol(:a)
|
||||||
@test_throws MethodError Groups.AutSymbol(:a, 1)
|
@test_throws MethodError Groups.AutSymbol(:a, 1)
|
||||||
f = Groups.AutSymbol(:a, 1, Groups.FlipAut(2))
|
f = Groups.AutSymbol(:a, 1, Groups.FlipAut(2))
|
||||||
@test isa(f, Groups.GSymbol)
|
@test f isa Groups.GSymbol
|
||||||
@test isa(f, Groups.AutSymbol)
|
@test f isa Groups.AutSymbol
|
||||||
@test isa(Groups.AutSymbol(perm"(4)"), Groups.AutSymbol)
|
@test Groups.AutSymbol(perm"(4)") isa Groups.AutSymbol
|
||||||
@test isa(Groups.AutSymbol(perm"(1,2,3,4)"), Groups.AutSymbol)
|
@test Groups.AutSymbol(perm"(1,2,3,4)") isa Groups.AutSymbol
|
||||||
@test isa(Groups.transvection_R(1,2), Groups.AutSymbol)
|
@test Groups.transvection_R(1,2) isa Groups.AutSymbol
|
||||||
@test isa(Groups.transvection_R(3,4), Groups.AutSymbol)
|
@test Groups.transvection_R(3,4) isa Groups.AutSymbol
|
||||||
@test isa(Groups.flip(3), Groups.AutSymbol)
|
@test Groups.flip(3) isa Groups.AutSymbol
|
||||||
|
|
||||||
|
@test Groups.id_autsymbol() isa Groups.AutSymbol
|
||||||
|
@test inv(Groups.id_autsymbol()) isa Groups.AutSymbol
|
||||||
|
@test inv(Groups.id_autsymbol()) == Groups.id_autsymbol()
|
||||||
end
|
end
|
||||||
|
|
||||||
a,b,c,d = gens(FreeGroup(4))
|
a,b,c,d = gens(FreeGroup(4))
|
||||||
@ -88,35 +92,44 @@
|
|||||||
@test isa(Automorphism{3}(f), Automorphism)
|
@test isa(Automorphism{3}(f), Automorphism)
|
||||||
@test isa(AutGroup(FreeGroup(3)), AbstractAlgebra.Group)
|
@test isa(AutGroup(FreeGroup(3)), AbstractAlgebra.Group)
|
||||||
@test isa(AutGroup(FreeGroup(1)), Groups.AbstractFPGroup)
|
@test isa(AutGroup(FreeGroup(1)), Groups.AbstractFPGroup)
|
||||||
|
|
||||||
A = AutGroup(FreeGroup(1))
|
A = AutGroup(FreeGroup(1))
|
||||||
@test isa(Groups.gens(A), Vector{Automorphism{1}})
|
@test Groups.gens(A) isa Vector{Automorphism{1}}
|
||||||
@test length(Groups.gens(A)) == 1
|
@test length(Groups.gens(A)) == 1
|
||||||
|
@test length(Groups.gens(Aut(FreeGroup(1)))) == 1
|
||||||
|
@test Groups.gens(A) == [A(Groups.flip(1))]
|
||||||
|
|
||||||
A = AutGroup(FreeGroup(1), special=true)
|
A = AutGroup(FreeGroup(1), special=true)
|
||||||
@test length(Groups.gens(A)) == 0
|
@test isempty(Groups.gens(A))
|
||||||
|
@test Groups.gens(SAut(FreeGroup(1))) == Automorphism{1}[]
|
||||||
|
|
||||||
A = AutGroup(FreeGroup(2))
|
A = AutGroup(FreeGroup(2))
|
||||||
@test length(Groups.gens(A)) == 7
|
@test length(Groups.gens(A)) == 7
|
||||||
Agens = Groups.gens(A)
|
Agens = Groups.gens(A)
|
||||||
|
@test A(first(Agens)) isa Automorphism
|
||||||
|
|
||||||
@test isa(A(Groups.transvection_R(1,2)), Automorphism)
|
@test A(Groups.transvection_R(1,2)) isa Automorphism
|
||||||
@test A(Groups.transvection_R(1,2)) in Agens
|
@test A(Groups.transvection_R(1,2)) in Agens
|
||||||
|
|
||||||
@test isa(A(Groups.transvection_R(2,1)), Automorphism)
|
@test A(Groups.transvection_R(2,1)) isa Automorphism
|
||||||
@test A(Groups.transvection_R(2,1)) in Agens
|
@test A(Groups.transvection_R(2,1)) in Agens
|
||||||
|
|
||||||
@test isa(A(Groups.transvection_R(1,2)), Automorphism)
|
@test A(Groups.transvection_R(1,2)) isa Automorphism
|
||||||
@test A(Groups.transvection_R(1,2)) in Agens
|
@test A(Groups.transvection_R(1,2)) in Agens
|
||||||
|
|
||||||
@test isa(A(Groups.transvection_R(2,1)), Automorphism)
|
@test A(Groups.transvection_R(2,1)) isa Automorphism
|
||||||
@test A(Groups.transvection_R(2,1)) in Agens
|
@test A(Groups.transvection_R(2,1)) in Agens
|
||||||
|
|
||||||
@test isa(A(Groups.flip(1)), Automorphism)
|
@test A(Groups.flip(1)) isa Automorphism
|
||||||
@test A(Groups.flip(1)) in Agens
|
@test A(Groups.flip(1)) in Agens
|
||||||
|
|
||||||
@test isa(A(Groups.flip(2)), Automorphism)
|
@test A(Groups.flip(2)) isa Automorphism
|
||||||
@test A(Groups.flip(2)) in Agens
|
@test A(Groups.flip(2)) in Agens
|
||||||
|
|
||||||
@test isa(A(Groups.AutSymbol(perm"(1,2)")), Automorphism)
|
@test A(Groups.AutSymbol(perm"(1,2)")) isa Automorphism
|
||||||
@test A(Groups.AutSymbol(perm"(1,2)")) in Agens
|
@test A(Groups.AutSymbol(perm"(1,2)")) in Agens
|
||||||
|
|
||||||
|
@test A(Groups.id_autsymbol()) isa Automorphism
|
||||||
end
|
end
|
||||||
|
|
||||||
A = AutGroup(FreeGroup(4))
|
A = AutGroup(FreeGroup(4))
|
||||||
@ -144,8 +157,8 @@
|
|||||||
@test f²^2 == one(A)
|
@test f²^2 == one(A)
|
||||||
@test !isone(f²)
|
@test !isone(f²)
|
||||||
|
|
||||||
a = A(Groups.transvection_L(1,2))*Groups.flip(2)
|
a = A(Groups.λ(1,2))*Groups.ε(2)
|
||||||
b = Groups.flip(2)*A(inv(Groups.transvection_L(1,2)))
|
b = Groups.ε(2)*A(inv(Groups.λ(1,2)))
|
||||||
@test a*b == b*a
|
@test a*b == b*a
|
||||||
@test a^3 * b^3 == one(A)
|
@test a^3 * b^3 == one(A)
|
||||||
g,h = Groups.gens(A)[[1,8]] # (g, h) = (ϱ₁₂, ϱ₃₂)
|
g,h = Groups.gens(A)[[1,8]] # (g, h) = (ϱ₁₂, ϱ₃₂)
|
||||||
@ -253,6 +266,8 @@
|
|||||||
@test Groups.abelianize(σ^3) == Matrix{Int}(I, N, N)
|
@test Groups.abelianize(σ^3) == Matrix{Int}(I, N, N)
|
||||||
@test Groups.abelianize(σ)^3 == Matrix{Int}(I, N, N)
|
@test Groups.abelianize(σ)^3 == Matrix{Int}(I, N, N)
|
||||||
|
|
||||||
|
@test Groups.abelianize(G(Groups.id_autsymbol())) == Matrix{Int}(I, N, N)
|
||||||
|
|
||||||
function test_homomorphism(S, r)
|
function test_homomorphism(S, r)
|
||||||
for elts in Iterators.product([[g for g in S] for _ in 1:r]...)
|
for elts in Iterators.product([[g for g in S] for _ in 1:r]...)
|
||||||
prod(Groups.abelianize.(elts)) == Groups.abelianize(prod(elts)) || error("linear representaton test failed at $elts")
|
prod(Groups.abelianize.(elts)) == Groups.abelianize(prod(elts)) || error("linear representaton test failed at $elts")
|
||||||
|
@ -38,6 +38,7 @@ end
|
|||||||
@test length(FreeGroupElem(t)) == 2
|
@test length(FreeGroupElem(t)) == 2
|
||||||
@test Groups.FreeSymbol(:s, 1) != Groups.FreeSymbol(:s, 2)
|
@test Groups.FreeSymbol(:s, 1) != Groups.FreeSymbol(:s, 2)
|
||||||
@test Groups.FreeSymbol(:s, 1) != Groups.FreeSymbol(:t, 1)
|
@test Groups.FreeSymbol(:s, 1) != Groups.FreeSymbol(:t, 1)
|
||||||
|
@test collect(Groups.FreeSymbol(:s, 2)) == [i for i in Groups.FreeSymbol(:s, 2)] == [s, s]
|
||||||
end
|
end
|
||||||
|
|
||||||
@testset "FreeGroup" begin
|
@testset "FreeGroup" begin
|
||||||
@ -52,8 +53,10 @@ end
|
|||||||
@test eltype(gens(G)) == FreeGroupElem
|
@test eltype(gens(G)) == FreeGroupElem
|
||||||
@test length(gens(G)) == 2
|
@test length(gens(G)) == 2
|
||||||
|
|
||||||
@test collect(s*t) == Groups.syllables(s*t)
|
|
||||||
tt, ss = Groups.FreeSymbol(:t), Groups.FreeSymbol(:s)
|
tt, ss = Groups.FreeSymbol(:t), Groups.FreeSymbol(:s)
|
||||||
|
@test Groups.GroupWord([tt, inv(tt)]) isa FreeGroupElem
|
||||||
|
|
||||||
|
@test collect(s*t) == Groups.syllables(s*t)
|
||||||
@test collect(t^2) == [tt, tt]
|
@test collect(t^2) == [tt, tt]
|
||||||
ttinv = Groups.FreeSymbol(:t, -1)
|
ttinv = Groups.FreeSymbol(:t, -1)
|
||||||
w = t^-2*s^3*t^2
|
w = t^-2*s^3*t^2
|
||||||
@ -66,7 +69,8 @@ end
|
|||||||
|
|
||||||
@test collect(ttinv) == [ttinv]
|
@test collect(ttinv) == [ttinv]
|
||||||
|
|
||||||
@test Groups.GroupWord([tt, inv(tt)]) isa FreeGroupElem
|
@test isone(t^0)
|
||||||
|
@test !isone(t^1)
|
||||||
end
|
end
|
||||||
|
|
||||||
@testset "internal arithmetic" begin
|
@testset "internal arithmetic" begin
|
||||||
@ -80,6 +84,13 @@ end
|
|||||||
tt = deepcopy(t)
|
tt = deepcopy(t)
|
||||||
@test string(Groups.lmul!(tt, tt, inv(tt))) == "(id)"
|
@test string(Groups.lmul!(tt, tt, inv(tt))) == "(id)"
|
||||||
|
|
||||||
|
w = deepcopy(t)
|
||||||
|
@test length(Groups.rmul!(w, t)) == 2
|
||||||
|
@test length(Groups.lmul!(w, inv(t))) == 1
|
||||||
|
w = AbstractAlgebra.mul!(w, w, s)
|
||||||
|
@test length(w) == 2
|
||||||
|
@test length(Groups.lmul!(w, inv(s))) == 3
|
||||||
|
|
||||||
tt = deepcopy(t)
|
tt = deepcopy(t)
|
||||||
push!(tt, inv(t_symb))
|
push!(tt, inv(t_symb))
|
||||||
@test string(tt) == "t*t^-1"
|
@test string(tt) == "t*t^-1"
|
||||||
@ -150,7 +161,7 @@ end
|
|||||||
@test findlast(s^-1*t^-1, c) == 3
|
@test findlast(s^-1*t^-1, c) == 3
|
||||||
@test findprev(s, s*t*s*t, 4) == 3
|
@test findprev(s, s*t*s*t, 4) == 3
|
||||||
@test findprev(s*t, s*t*s*t, 2) == 1
|
@test findprev(s*t, s*t*s*t, 2) == 1
|
||||||
@test findlast(t^2*s, c) === nothing
|
@test findprev(Groups.FreeSymbol(:t, 2), c, 4) === nothing
|
||||||
|
|
||||||
w = s*t*s^-1
|
w = s*t*s^-1
|
||||||
subst = Dict{FreeGroupElem, FreeGroupElem}(w => s^1, s*t^-1 => t^4)
|
subst = Dict{FreeGroupElem, FreeGroupElem}(w => s^1, s*t^-1 => t^4)
|
||||||
|
Loading…
Reference in New Issue
Block a user