2017-05-15 10:12:46 +02:00
|
|
|
|
@testset "Automorphisms" begin
|
|
|
|
|
using Nemo
|
|
|
|
|
G = PermutationGroup(4)
|
|
|
|
|
|
|
|
|
|
@testset "AutSymbol" begin
|
|
|
|
|
@test_throws MethodError Groups.AutSymbol("a")
|
|
|
|
|
@test_throws MethodError Groups.AutSymbol("a", 1)
|
2017-05-15 17:30:18 +02:00
|
|
|
|
f = Groups.AutSymbol("a", 1, :(a()), v -> v)
|
2017-05-15 10:12:46 +02:00
|
|
|
|
@test isa(f, Groups.GSymbol)
|
|
|
|
|
@test isa(f, Groups.AutSymbol)
|
|
|
|
|
@test isa(Groups.perm_autsymbol(G([1,2,3,4])), Groups.AutSymbol)
|
|
|
|
|
@test isa(Groups.rmul_autsymbol(1,2), Groups.AutSymbol)
|
|
|
|
|
@test isa(Groups.lmul_autsymbol(3,4), Groups.AutSymbol)
|
|
|
|
|
@test isa(Groups.flip_autsymbol(3), Groups.AutSymbol)
|
|
|
|
|
end
|
|
|
|
|
|
2017-07-05 16:26:35 +02:00
|
|
|
|
a,b,c,d = Nemo.gens(FreeGroup(4))
|
2017-05-15 10:12:46 +02:00
|
|
|
|
domain = [a,b,c,d]
|
|
|
|
|
|
|
|
|
|
@testset "flip_autsymbol correctness" begin
|
|
|
|
|
@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 "perm_autsymbol correctness" begin
|
|
|
|
|
σ = Groups.perm_autsymbol(G([1,2,3,4]))
|
|
|
|
|
@test σ(domain) == domain
|
|
|
|
|
@test inv(σ)(domain) == domain
|
|
|
|
|
|
|
|
|
|
σ = Groups.perm_autsymbol(G([2,3,4,1]))
|
|
|
|
|
@test σ(domain) == [b, c, d, a]
|
|
|
|
|
@test inv(σ)(domain) == [d, a, b, c]
|
|
|
|
|
|
|
|
|
|
σ = Groups.perm_autsymbol(G([2,1,4,3]))
|
|
|
|
|
@test σ(domain) == [b, a, d, c]
|
|
|
|
|
@test inv(σ)(domain) == [b, a, d, c]
|
|
|
|
|
|
|
|
|
|
σ = Groups.perm_autsymbol(G([2,3,1,4]))
|
|
|
|
|
@test σ(domain) == [b,c,a,d]
|
|
|
|
|
@test inv(σ)(domain) == [c,a,b,d]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@testset "rmul/lmul_autsymbol correctness" begin
|
|
|
|
|
i,j = 1,2
|
|
|
|
|
r = Groups.rmul_autsymbol(i,j)
|
|
|
|
|
l = Groups.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 = Groups.rmul_autsymbol(i,j)
|
|
|
|
|
l = Groups.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 = Groups.rmul_autsymbol(i,j)
|
|
|
|
|
l = Groups.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 = Groups.rmul_autsymbol(i,j)
|
|
|
|
|
l = Groups.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 "AutGroup/AutGroupElem constructors" begin
|
2017-05-15 17:30:18 +02:00
|
|
|
|
f = Groups.AutSymbol("a", 1, :(a()), v -> v)
|
|
|
|
|
@test isa(AutGroupElem(f), Groups.GWord)
|
2017-05-15 10:12:46 +02:00
|
|
|
|
@test isa(AutGroupElem(f), AutGroupElem)
|
2017-05-15 17:30:18 +02:00
|
|
|
|
@test isa(AutGroup(FreeGroup(3)), Nemo.Group)
|
|
|
|
|
@test isa(AutGroup(FreeGroup(1)), Groups.FPGroup)
|
2017-05-15 10:12:46 +02:00
|
|
|
|
A = AutGroup(FreeGroup(1))
|
2017-07-05 16:26:35 +02:00
|
|
|
|
@test isa(Nemo.gens(A), Vector{AutGroupElem})
|
|
|
|
|
@test length(Nemo.gens(A)) == 1
|
2017-05-15 17:30:18 +02:00
|
|
|
|
A = AutGroup(FreeGroup(1), special=true)
|
2017-07-05 16:26:35 +02:00
|
|
|
|
@test length(Nemo.gens(A)) == 0
|
2017-05-15 17:30:18 +02:00
|
|
|
|
A = AutGroup(FreeGroup(2))
|
2017-07-05 16:26:35 +02:00
|
|
|
|
@test length(Nemo.gens(A)) == 7
|
|
|
|
|
gens = Nemo.gens(A)
|
2017-05-15 17:30:18 +02:00
|
|
|
|
|
|
|
|
|
@test isa(A(Groups.rmul_autsymbol(1,2)), AutGroupElem)
|
|
|
|
|
@test A(Groups.rmul_autsymbol(1,2)) in gens
|
|
|
|
|
|
|
|
|
|
@test isa(A(Groups.rmul_autsymbol(2,1)), AutGroupElem)
|
|
|
|
|
@test A(Groups.rmul_autsymbol(2,1)) in gens
|
|
|
|
|
|
|
|
|
|
@test isa(A(Groups.lmul_autsymbol(1,2)), AutGroupElem)
|
|
|
|
|
@test A(Groups.lmul_autsymbol(1,2)) in gens
|
|
|
|
|
|
|
|
|
|
@test isa(A(Groups.lmul_autsymbol(2,1)), AutGroupElem)
|
|
|
|
|
@test A(Groups.lmul_autsymbol(2,1)) in gens
|
|
|
|
|
|
|
|
|
|
@test isa(A(Groups.flip_autsymbol(1)), AutGroupElem)
|
|
|
|
|
@test A(Groups.flip_autsymbol(1)) in gens
|
|
|
|
|
|
|
|
|
|
@test isa(A(Groups.flip_autsymbol(2)), AutGroupElem)
|
|
|
|
|
@test A(Groups.flip_autsymbol(2)) in gens
|
|
|
|
|
|
|
|
|
|
@test isa(A(Groups.perm_autsymbol(PermutationGroup(2)([2,1]))),
|
|
|
|
|
AutGroupElem)
|
|
|
|
|
@test A(Groups.perm_autsymbol(PermutationGroup(2)([2,1]))) in gens
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
A = AutGroup(FreeGroup(4))
|
|
|
|
|
|
|
|
|
|
@testset "eltary functions" begin
|
|
|
|
|
|
|
|
|
|
f = Groups.perm_autsymbol(G([2,3,4,1]))
|
|
|
|
|
@test (Groups.change_pow(f, 2)).pow == 1
|
|
|
|
|
@test (Groups.change_pow(f, -2)).pow == 1
|
|
|
|
|
@test (inv(f)).pow == 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f = Groups.perm_autsymbol(G([2,1,4,3]))
|
|
|
|
|
@test isa(inv(f), Groups.AutSymbol)
|
|
|
|
|
|
|
|
|
|
@test_throws DomainError f^-1
|
|
|
|
|
@test_throws MethodError f*f
|
|
|
|
|
|
|
|
|
|
@test A(f)^-1 == A(inv(f))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@testset "reductions/arithmetic" begin
|
|
|
|
|
f = Groups.perm_autsymbol(G([2,3,4,1]))
|
|
|
|
|
|
|
|
|
|
f² = Groups.r_multiply(A(f), [f], reduced=false)
|
|
|
|
|
@test Groups.simplify_perms!(f²) == false
|
|
|
|
|
@test f²^2 == A()
|
|
|
|
|
|
|
|
|
|
a = A(Groups.rmul_autsymbol(1,2))*Groups.flip_autsymbol(2)
|
|
|
|
|
b = Groups.flip_autsymbol(2)*A(inv(Groups.rmul_autsymbol(1,2)))
|
|
|
|
|
@test a*b == b*a
|
|
|
|
|
@test a^3 * b^3 == A()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@testset "specific Aut(F4) tests" begin
|
|
|
|
|
N = 4
|
|
|
|
|
G = AutGroup(FreeGroup(N))
|
|
|
|
|
S = G.gens
|
|
|
|
|
@test isa(S, Vector{Groups.AutSymbol})
|
|
|
|
|
S = [G(s) for s in unique(S)]
|
|
|
|
|
@test isa(S, Vector{AutGroupElem})
|
2017-07-05 16:26:35 +02:00
|
|
|
|
@test S == Nemo.gens(G)
|
2017-05-15 17:30:18 +02:00
|
|
|
|
@test length(S) == 51
|
|
|
|
|
S_inv = [S..., [inv(s) for s in S]...]
|
|
|
|
|
@test length(unique(S_inv)) == 75
|
|
|
|
|
|
|
|
|
|
G = AutGroup(FreeGroup(N), special=true, outer=true)
|
2017-07-05 16:26:35 +02:00
|
|
|
|
S = Nemo.gens(G)
|
2017-05-15 17:30:18 +02:00
|
|
|
|
S_inv = [G(), S..., [inv(s) for s in S]...]
|
|
|
|
|
S_inv = unique(S_inv)
|
|
|
|
|
B_2 = [i*j for (i,j) in Base.product(S_inv, S_inv)]
|
|
|
|
|
@test length(B_2) == 2401
|
|
|
|
|
@test length(unique(B_2)) == 1777
|
2017-05-15 10:12:46 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|