Groups.jl/test/runtests.jl

287 lines
10 KiB
Julia
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Groups
using Base.Test
# write your own tests here
@testset "Groups" begin
@testset "Groups.FreeSymbols" begin
s = Groups.FreeSymbol("s")
t = Groups.FreeSymbol("t")
@testset "defines" begin
@test isa(Groups.FreeSymbol("aaaaaaaaaaaaaaaa"), Groups.GSymbol)
@test Groups.FreeSymbol("abc").pow == 1
@test isa(s, Groups.FreeSymbol)
@test isa(t, Groups.FreeSymbol)
end
@testset "eltary functions" begin
@test length(s) == 1
@test Groups.change_pow(s, 0) == Groups.change_pow(t, 0)
@test length(Groups.change_pow(s, 0)) == 0
@test inv(s).pow == -1
@test Groups.FreeSymbol("s", 3) == Groups.change_pow(s, 3)
@test Groups.FreeSymbol("s", 3) != Groups.FreeSymbol("t", 3)
@test Groups.change_pow(inv(s), -3) == inv(Groups.change_pow(s, 3))
end
@testset "powers" begin
s⁴ = Groups.change_pow(s,4)
@test s⁴.pow == 4
@test Groups.change_pow(s, 4) == Groups.FreeSymbol("s", 4)
end
end
@testset "FreeGroupElems" begin
s = Groups.FreeSymbol("s")
t = Groups.FreeSymbol("t", -2)
@testset "defines" begin
@test isa(Groups.GWord(s), Groups.GWord)
@test isa(Groups.GWord(s), FreeGroupElem)
@test isa(FreeGroupElem(s), Groups.GWord)
@test isa(convert(FreeGroupElem, s), Groups.GWord)
@test isa(convert(FreeGroupElem, s), FreeGroupElem)
@test isa(Vector{FreeGroupElem}([s,t]), Vector{FreeGroupElem})
@test length(FreeGroupElem(s)) == 1
@test length(FreeGroupElem(t)) == 2
end
@testset "eltary functions" begin
@test_skip (s*s).symbols == (s^2).symbols
@test_skip Vector{Groups.GWord{Groups.FreeSymbol}}([s,t]) ==
Vector{FreeGroupElem}([s,t])
@test_skip Vector{Groups.GWord}([s,t]) ==
[Groups.GWord(s), Groups.GWord(t)]
@test_skip hash([t^1,s^1]) == hash([t^2*inv(t),s*inv(s)*s])
end
end
@testset "FreeGroup" begin
@test isa(FreeGroup(["s", "t"]), Nemo.Group)
@test isa(FreeGroup(["s", "t"]), Nemo.FPGroup)
@test isa(FreeGroup(2), Nemo.FPGroup)
G = FreeGroup(["s", "t"])
@testset "elements constructors" begin
@test isa(G(), FreeGroupElem)
@test eltype(G.gens) == Groups.FreeSymbol
@test length(G.gens) == 2
@test_skip eltype(G.rels) == FreeGroupElem
@test_skip length(G.rels) == 0
@test eltype(generators(G)) == FreeGroupElem
@test length(generators(G)) == 2
end
s, t = generators(G)
@testset "internal arithmetic" begin
t_symb = Groups.FreeSymbol("t")
tt = deepcopy(t)
@test string(Groups.r_multiply!(tt,[inv(t_symb)]; reduced=true)) ==
"(id)"
tt = deepcopy(t)
@test string(Groups.r_multiply!(tt,[inv(t_symb)]; reduced=false)) ==
"t*t^-1"
tt = deepcopy(t)
@test string(Groups.l_multiply!(tt,[inv(t_symb)]; reduced=true)) ==
"(id)"
tt = deepcopy(t)
@test string(Groups.l_multiply!(tt,[inv(t_symb)]; reduced=false)) ==
"t^-1*t"
end
@testset "reductions" begin
@test length(G().symbols) == 1
@test length((G()*G()).symbols) == 0
@test G() == G()*G()
w = deepcopy(s)
push!(w.symbols, (s^-1).symbols[1])
@test Groups.reduce!(w) == parent(w)()
o = (t*s)^3
@test o == t*s*t*s*t*s
p = (t*s)^-3
@test p == s^-1*t^-1*s^-1*t^-1*s^-1*t^-1
@test o*p == parent(o*p)()
w = FreeGroupElem([o.symbols..., p.symbols...])
w.parent = G
@test Groups.reduce!(w).symbols ==Vector{Groups.FreeSymbol}([])
end
@testset "binary/inv operations" begin
@test parent(s) == G
@test parent(s) === parent(deepcopy(s))
@test isa(s*t, FreeGroupElem)
@test parent(s*t) == parent(s^2)
@test s*s == s^2
@test inv(s*s) == inv(s^2)
@test inv(s)^2 == inv(s^2)
@test inv(s)*inv(s) == inv(s^2)
@test inv(s*t) == inv(t)*inv(s)
w = s*t*s^-1
@test inv(w) == s*t^-1*s^-1
@test (t*s*t^-1)^10 == t*s^10*t^-1
@test (t*s*t^-1)^-10 == t*s^-10*t^-1
end
@testset "replacements" begin
a = Groups.FreeSymbol("a")
b = Groups.FreeSymbol("b")
@test Groups.is_subsymbol(a, Groups.change_pow(a,2)) == true
@test Groups.is_subsymbol(a, Groups.change_pow(a,-2)) == false
@test Groups.is_subsymbol(b, Groups.change_pow(a,-2)) == false
@test Groups.is_subsymbol(inv(b), Groups.change_pow(b,-2)) == true
c = s*t*s^-1*t^-1
@test findfirst(c, s^-1*t^-1) == 3
@test findnext(c*s^-1, s^-1*t^-1,3) == 3
@test findnext(c*s^-1*t^-1, s^-1*t^-1,4) == 5
@test findfirst(c*t, c) == 0
w = s*t*s^-1
subst = Dict{FreeGroupElem, FreeGroupElem}(w => s^1, s*t^-1 => t^4)
@test Groups.replace(c, 1, s*t, G()) == s^-1*t^-1
@test Groups.replace(c, 1, w, subst[w]) == s*t^-1
@test Groups.replace(s*c*t^-1, 1, w, subst[w]) == s^2*t^-2
@test Groups.replace(t*c*t, 2, w, subst[w]) == t*s
@test Groups.replace_all!(s*c*s*c*s, subst) == s*t^4*s*t^4*s
end
end
@testset "Automorphisms" begin
using Nemo
@testset "AutSymbol" begin
@test_throws MethodError AutSymbol("a")
@test_throws MethodError AutSymbol("a", 1)
f = AutSymbol("a", 1, :(a()), v -> v)
@test isa(f, Groups.GSymbol)
@test isa(f, Groups.AutSymbol)
@test isa(Groups.perm_autsymbol(
PermutationGroup(4)([1,2,3,4])), AutSymbol)
@test isa(Groups.rmul_autsymbol(1,2), AutSymbol)
@test isa(Groups.lmul_autsymbol(3,4), AutSymbol)
@test isa(Groups.flip_autsymbol(3), AutSymbol)
end
@testset "flip_autsymbol correctness" begin
a,b,c,d = generators(FreeGroup(4))
domain = [a,b,c,d]
@test Groups.flip_autsymbol(1)(domain) == [a^-1, b,c,d]
@test Groups.flip_autsymbol(2)(domain) == [a, b^-1,c,d]
@test Groups.flip_autsymbol(3)(domain) == [a, b,c^-1,d]
@test Groups.flip_autsymbol(4)(domain) == [a, b,c,d^-1]
@test inv(Groups.flip_autsymbol(1))(domain) == [a^-1, b,c,d]
@test inv(Groups.flip_autsymbol(2))(domain) == [a, b^-1,c,d]
@test inv(Groups.flip_autsymbol(3))(domain) == [a, b,c^-1,d]
@test inv(Groups.flip_autsymbol(4))(domain) == [a, b,c,d^-1]
end
#
# @testset "symmetric_AutSymbol correctness" begin
# a,b,c,d = [FreeGroupElem(Groups.FreeSymbol(i)) for i in ["a", "b", "c", "d"]]
# domain = [a,b,c,d]
# σ = symmetric_AutSymbol([1,2,3,4])
# @test σ(domain) == domain
# @test inv(σ)(domain) == domain
#
# σ = symmetric_AutSymbol([2,3,4,1])
# @test σ(domain) == [b, c, d, a]
# @test inv(σ)(domain) == [d, a, b, c]
#
# σ = symmetric_AutSymbol([2,1,4,3])
# @test σ(domain) == [b, a, d, c]
# @test inv(σ)(domain) == [b, a, d, c]
#
# σ = symmetric_AutSymbol([2,3,1,4])
# @test σ(domain) == [b,c,a,d]
# @test inv(σ)(domain) == [c,a,b,d]
# end
#
# @testset "mul_AutSymbol correctness" begin
# a,b,c,d = [FreeGroupElem(Groups.FreeSymbol(i)) for i in ["a", "b", "c", "d"]]
# domain = [a,b,c,d]
# i,j = 1,2
# r = rmul_AutSymbol(i,j)
# l = lmul_AutSymbol(i,j)
# @test r(domain) == [a*b,b,c,d]
# @test inv(r)(domain) == [a*b^-1,b,c,d]
# @test l(domain) == [b*a,b,c,d]
# @test inv(l)(domain) == [b^-1*a,b,c,d]
#
# i,j = 3,1
# r = rmul_AutSymbol(i,j)
# l = lmul_AutSymbol(i,j)
# @test r(domain) == [a,b,c*a,d]
# @test inv(r)(domain) == [a,b,c*a^-1,d]
# @test l(domain) == [a,b,a*c,d]
# @test inv(l)(domain) == [a,b,a^-1*c,d]
#
#
# i,j = 4,3
# r = rmul_AutSymbol(i,j)
# l = lmul_AutSymbol(i,j)
# @test r(domain) == [a,b,c,d*c]
# @test inv(r)(domain) == [a,b,c,d*c^-1]
# @test l(domain) == [a,b,c,c*d]
# @test inv(l)(domain) == [a,b,c,c^-1*d]
#
#
# i,j = 2,4
# r = rmul_AutSymbol(i,j)
# l = lmul_AutSymbol(i,j)
# @test r(domain) == [a,b*d,c,d]
# @test inv(r)(domain) == [a,b*d^-1,c,d]
# @test l(domain) == [a,d*b,c,d]
# @test inv(l)(domain) == [a,d^-1*b,c,d]
# end
#
# @testset "AutWords" begin
# f = AutSymbol("a", 1, :(a()), v -> v)
# @test isa(GWord(f), GWord)
# @test isa(GWord(f), AutWord)
# @test isa(AutWord(f), AutWord)
# @test isa(f*f, AutWord)
# @test isa(f^2, AutWord)
# @test isa(f^-1, AutWord)
# end
#
# @testset "eltary functions" begin
# f = symmetric_AutSymbol([2,1,4,3])
# @test isa(inv(f), AutSymbol)
# @test isa(f^-1, AutWord)
# @test f^-1 == GWord(inv(f))
# @test inv(f) == f
# end
#
# @testset "reductions/arithmetic" begin
# f = symmetric_AutSymbol([2,1,4,3])
# f² = Groups.r_multiply(AutWord(f), [f], reduced=false)
# @test Groups.simplify_perms!(f²) == false
# @test f² == one(typeof(f*f))
#
# a = rmul_AutSymbol(1,2)*flip_AutSymbol(2)
# b = flip_AutSymbol(2)*inv(rmul_AutSymbol(1,2))
# @test a*b == b*a
# @test a^3 * b^3 == one(a)
# end
#
# @testset "specific Aut(𝔽₄) tests" begin
# N = 4
# import Combinatorics.nthperm
# SymmetricGroup(n) = [nthperm(collect(1:n), k) for k in 1:factorial(n)]
# indexing = [[i,j] for i in 1:N for j in 1:N if i≠j]
#
# σs = [symmetric_AutSymbol(perm) for perm in SymmetricGroup(N)[2:end]];
# ϱs = [rmul_AutSymbol(i,j) for (i,j) in indexing]
# λs = [lmul_AutSymbol(i,j) for (i,j) in indexing]
# ɛs = [flip_AutSymbol(i) for i in 1:N];
#
# S = vcat(ϱs, λs, σs, ɛs)
# S = vcat(S, [inv(s) for s in S])
# @test isa(S, Vector{AutSymbol})
# @test length(S) == 102
# @test length(unique(S)) == 75
# S₁ = [GWord(s) for s in unique(S)]
# @test isa(S₁, Vector{AutWord})
# p = prod(S₁)
# @test length(p) == 53
# end
# end
end