diff --git a/test/AutGroup-tests.jl b/test/AutGroup-tests.jl index 7457c57..48d9cb8 100644 --- a/test/AutGroup-tests.jl +++ b/test/AutGroup-tests.jl @@ -70,7 +70,6 @@ @test l(deepcopy(D)) == (a, b, c, c*d) @test inv(l)(deepcopy(D)) == (a, b, c, c^-1*d) - i,j = 2,4 r = Groups.rmul_autsymbol(i,j) l = Groups.lmul_autsymbol(i,j) @@ -81,19 +80,20 @@ end @testset "AutGroup/Automorphism constructors" begin + f = Groups.AutSymbol("a", 1, Groups.FlipAut(1)) @test isa(Automorphism{3}(f), Groups.GWord) @test isa(Automorphism{3}(f), Automorphism) - @test isa(AutGroup(FreeGroup(3)), Group) + @test isa(AutGroup(FreeGroup(3)), AbstractAlgebra.Group) @test isa(AutGroup(FreeGroup(1)), Groups.AbstractFPGroup) A = AutGroup(FreeGroup(1)) - @test isa(gens(A), Vector{Automorphism{1}}) - @test length(gens(A)) == 1 + @test isa(Groups.gens(A), Vector{Automorphism{1}}) + @test length(Groups.gens(A)) == 1 A = AutGroup(FreeGroup(1), special=true) - @test length(gens(A)) == 0 + @test length(Groups.gens(A)) == 0 A = AutGroup(FreeGroup(2)) - @test length(gens(A)) == 7 - gens = gens(A) + @test length(Groups.gens(A)) == 7 + gens = Groups.gens(A) @test isa(A(Groups.rmul_autsymbol(1,2)), Automorphism) @test A(Groups.rmul_autsymbol(1,2)) in gens @@ -146,15 +146,17 @@ b = Groups.flip_autsymbol(2)*A(inv(Groups.rmul_autsymbol(1,2))) @test a*b == b*a @test a^3 * b^3 == A() - g,h = gens(A)[[1,8]] # (g, h) = (ϱ₁₂, ϱ₃₂) + g,h = Groups.gens(A)[[1,8]] # (g, h) = (ϱ₁₂, ϱ₃₂) @test Groups.domain(A) == NTuple{4, FreeGroupElem}(gens(A.objectGroup)) @test (g*h)(Groups.domain(A)) == (h*g)(Groups.domain(A)) - @test (g*h).savedhash != (h*g).savedhash + @test (g*h).savedhash == zero(UInt) + @test (h*g).savedhash == zero(UInt) a = g*h b = h*g - @test hash(a) == hash(b) + @test hash(a) != zero(UInt) + @test hash(b) == hash(a) @test a.savedhash == b.savedhash @test length(unique([a,b])) == 1 @test length(unique([g*h, h*g])) == 1 @@ -228,6 +230,9 @@ @test Groups.linear_repr(ϱ₁₂^-1) == M @test Groups.linear_repr(λ₁₂^-1) == M + @test Groups.linear_repr(ϱ₁₂*λ₁₂^-1) == eye(N) + @test Groups.linear_repr(λ₁₂^-1*ϱ₁₂) == eye(N) + M = eye(N) M[2,2] = -1 ε₂ = G(Groups.flip_autsymbol(2)) @@ -235,7 +240,8 @@ @test Groups.linear_repr(ε₂) == M @test Groups.linear_repr(ε₂^2) == eye(N) - M = [0.0 0.0 1.0; 1.0 0.0 0.0; 0.0 1.0 0.0] + M = [0 1 0; 0 0 1; 1 0 0] + σ = G(Groups.perm_autsymbol([2,3,1])) @test Groups.linear_repr(σ) == M @test Groups.linear_repr(σ^3) == eye(3) diff --git a/test/DirectProd-tests.jl b/test/DirectProd-tests.jl index 3fb124b..439ba65 100644 --- a/test/DirectProd-tests.jl +++ b/test/DirectProd-tests.jl @@ -1,32 +1,36 @@ @testset "DirectProducts" begin - G = PermutationGroup(3) - g = G([2,3,1]) - F, a = FiniteField(2,3,"a") - @testset "Constructors" begin - @test isa(Groups.DirectProductGroup(G,2), AbstractArray.Group) - @test isa(G×G, AbstractAlgebra.Group) - @test isa(Groups.DirectProductGroup(G,2), Groups.DirectProductGroup{Generic.PermGroup{Int64}}) + G = PermutationGroup(3) + g = G([2,3,1]) - GG = Groups.DirectProductGroup(G,2) + @test Groups.DirectProductGroup(G,2) isa AbstractAlgebra.Group + @test G×G isa AbstractAlgebra.Group + @test Groups.DirectProductGroup(G,2) isa Groups.DirectProductGroup{Generic.PermGroup{Int64}} - @test GG == Groups.DirectProductGroup(G,2) + @test (G×G)×G == DirectProductGroup(G, 3) + @test (G×G)×G == (G×G)×G - @test Groups.DirectProductGroupElem([G(), G()]) == GG() - @test GG(G(), G()) == GG() + F = GF(13) + FF = F×F + @test FF×F == F×FF - @test isa(GG([g, g^2]), GroupElem) - @test isa(GG([g, g^2]), Groups.DirectProductGroupElem{Generic.perm{Int64}}) + GG = DirectProductGroup(G,2) + + @test Groups.DirectProductGroupElem([G(), G()]) == (G×G)() + @test GG(G(), G()) == (G×G)() + + @test GG([g, g^2]) isa GroupElem + @test GG([g, g^2]) isa Groups.DirectProductGroupElem{Generic.perm{Int64}} h = GG([g,g^2]) @test h == GG(h) - @test isa(GG(g, g^2), GroupElem) - @test isa(GG(g, g^2), Groups.DirectProductGroupElem) + @test GG(g, g^2) isa GroupElem + @test GG(g, g^2) isa Groups.DirectProductGroupElem - @test_throws String GG(g,g,g) + @test_throws DomainError GG(g,g,g) @test GG(g,g^2) == h @test size(h) == (2,) @@ -34,46 +38,153 @@ @test h[2] == g^2 h[2] = G() @test h == GG(g, G()) + end - GG = Groups.DirectProductGroup(G,2) - FF = Groups.DirectProductGroup(F,2) - - @testset "Types" begin - @test elem_type(GG) == Groups.DirectProductGroupElem{elem_type(G)} - @test elem_type(FF) == Groups.DirectProductGroupElem{elem_type(F)} - @test parent_type(typeof(GG(g,g^2))) == Groups.DirectProductGroup{typeof(G)} - @test parent_type(typeof(FF(a,a^2))) == Groups.DirectProductGroup{typeof(F)} - - @test isa(FF([0,1]), GroupElem) - @test isa(FF([0,1]), Groups.DirectProductGroupElem) - @test isa(FF([0,1]), Groups.DirectProductGroupElem{elem_type(F)}) - @test_throws MethodError FF(1,0) - end - - @testset "Group arithmetic" begin + @testset "Basic arithmetic" begin + G = PermutationGroup(3) g = G([2,3,1]) - h = GG([g,g^2]) + h = (G×G)([g,g^2]) - @test h^2 == GG(g^2,g) - @test h^6 == GG() + @test h^2 == (G×G)(g^2,g) + @test h^6 == (G×G)() @test h*h == h^2 - @test h*inv(h) == GG() + @test h*inv(h) == (G×G)() + end - @test FF([0,a])*FF([a,1]) == FF(a,1+a) + @testset "elem/parent_types" begin + G = PermutationGroup(3) + g = G([2,3,1]) + + @test elem_type(G×G) == DirectProductGroupElem{elem_type(G)} + @test parent_type(typeof((G×G)(g,g^2))) == Groups.DirectProductGroup{typeof(G)} + @test parent((G×G)(g,g^2)) == DirectProductGroup(G,2) + + F = GF(13) + + @test elem_type(F×F) == DirectProductGroupElem{Groups.AddGrpElem{elem_type(F)}} + @test parent_type(typeof((F×F)(1,5))) == Groups.DirectProductGroup{AddGrp{typeof(F)}} + parent((F×F)(1,5)) == DirectProductGroup(F,2) + end + + @testset "Additive/Multiplicative groups" begin + + R, x = PolynomialRing(QQ, "x") + F, a = NumberField(x^3 + x + 1, "a") + G = PermutationGroup(3) + + GG = Groups.DirectProductGroup(G,2) + FF = Groups.DirectProductGroup(F,2) + + @testset "MltGrp basic functionality" begin + Gr = MltGrp(F) + @test Gr(a) isa MltGrpElem + g = Gr(a) + @test deepcopy(g) isa MltGrpElem + @test inv(g) == Gr(a^-1) + @test Gr() == Gr(1) + @test inv(g)*g == Gr() + end + + @testset "AddGrp basic functionality" begin + Gr = AddGrp(F) + @test Gr(a) isa AddGrpElem + g = Gr(a) + @test deepcopy(g) isa AddGrpElem + @test inv(g) == Gr(-a) + @test Gr() == Gr(0) + @test inv(g)*g == Gr() + end + end + + @testset "Direct Product of Multiplicative Groups" begin + + R, x = PolynomialRing(QQ, "x") + F, a = NumberField(x^3 + x + 1, "a") + FF = Groups.DirectProductGroup(MltGrp(F),2) + + @test FF([a,1]) isa GroupElem + @test FF([a,1]) isa DirectProductGroupElem + @test FF([a,1]) isa DirectProductGroupElem{MltGrpElem{elem_type(F)}} + @test_throws DomainError FF(1,0) + @test_throws DomainError FF([0,1]) + @test_throws DomainError FF([1,0]) + + @test MltGrp(F) isa AbstractAlgebra.Group + @test MltGrp(F) isa MultiplicativeGroup + @test DirectProductGroup(MltGrp(F), 2) isa AbstractAlgebra.Group + @test DirectProductGroup(MltGrp(F), 2) isa DirectProductGroup{MltGrp{typeof(F)}} + + F, a = NumberField(x^3 + x + 1, "a") + FF = DirectProductGroup(MltGrp(F), 2) + + @test FF(a,a+1) == FF([a,a+1]) + @test FF([1,a+1])*FF([a,a]) == FF(a,a^2+a) x, y = FF([1,a]), FF([a^2,1]) - @test x*y == FF([a^2+1, a+1]) - @test inv(x) == FF([1,a]) + @test x*y == FF([a^2, a]) + @test inv(x) == FF([1,-a^2-1]) + + @test parent(x) == FF + end + + @testset "Direct Product of Additive Groups" begin + + R, x = PolynomialRing(QQ, "x") + F, a = NumberField(x^3 + x + 1, "a") + + # Additive Group + @test AddGrp(F) isa AbstractAlgebra.Group + @test AddGrp(F) isa AdditiveGroup + @test DirectProductGroup(AddGrp(F), 2) isa AbstractAlgebra.Group + @test DirectProductGroup(AddGrp(F), 2) isa DirectProductGroup{AddGrp{typeof(F)}} + + FF = DirectProductGroup(AdditiveGroup(F), 2) + + @test FF([0,a]) isa AbstractAlgebra.GroupElem + @test FF(F(0),a) isa DirectProductGroupElem + @test FF(0,0) isa DirectProductGroupElem{AddGrpElem{elem_type(F)}} + + @test FF(F(1),a+1) == FF([1,a+1]) + + @test FF([F(1),a+1])*FF([a,a]) == FF(1+a,2a+1) + + x, y = FF([1,a]), FF([a^2,1]) + @test x*y == FF(a^2+1, a+1) + @test inv(x) == FF([F(-1),-a]) + + @test parent(x) == FF end @testset "Misc" begin - @test order(GG) == 36 + F = GF(5) + + + FF = DirectProductGroup(F,2) + @test order(FF) == 25 + + elts = vec(collect(elements(FF))) + @test length(elts) == 25 + @test all([g*inv(g) for g in elts] .== FF()) + @test all(inv(g*h) == inv(h)*inv(g) for g in elts for h in elts) + + + FF = DirectProductGroup(MultiplicativeGroup(F), 3) @test order(FF) == 64 + elts = vec(collect(elements(FF))) + @test length(elts) == 64 + @test all([g*inv(g) for g in elts] .== FF()) + @test all(inv(g*h) == inv(h)*inv(g) for g in elts for h in elts) + + + G = PermutationGroup(3) + GG = Groups.DirectProductGroup(G,2) + @test order(GG) == 36 + @test isa([elements(GG)...], Vector{Groups.DirectProductGroupElem{elem_type(G)}}) - elts = [elements(GG)...] + elts = vec(collect(elements(GG))) @test length(elts) == 36 @test all([g*inv(g) for g in elts] .== GG()) diff --git a/test/FreeGroup-tests.jl b/test/FreeGroup-tests.jl index 007b6dc..1022ba8 100644 --- a/test/FreeGroup-tests.jl +++ b/test/FreeGroup-tests.jl @@ -41,7 +41,7 @@ end end @testset "FreeGroup" begin - @test isa(FreeGroup(["s", "t"]), Group) + @test isa(FreeGroup(["s", "t"]), AbstractAlgebra.Group) G = FreeGroup(["s", "t"]) @testset "elements constructors" begin diff --git a/test/WreathProd-tests.jl b/test/WreathProd-tests.jl index bf3e1ba..a1443a6 100644 --- a/test/WreathProd-tests.jl +++ b/test/WreathProd-tests.jl @@ -1,18 +1,19 @@ @testset "WreathProducts" begin S_3 = PermutationGroup(3) - F, a = FiniteField(2,3,"a") + R, x = PolynomialRing(QQ, "x") + F, a = NumberField(x^2 + 1, "a") b = S_3([2,3,1]) @testset "Constructors" begin @test isa(Groups.WreathProduct(F, S_3), AbstractAlgebra.Group) @test isa(Groups.WreathProduct(F, S_3), Groups.WreathProduct) - @test isa(Groups.WreathProduct(F, S_3), Groups.WreathProduct{AbstractAlgebra.FqNmodFiniteField}) + @test isa(Groups.WreathProduct(F, S_3), Groups.WreathProduct{AddGrp{Generic.ResField{Generic.Poly{Rational{BigInt}}}}, Int64}) aa = Groups.DirectProductGroupElem([a^0 ,a, a^2]) @test isa(Groups.WreathProductElem(aa, b), AbstractAlgebra.GroupElem) @test isa(Groups.WreathProductElem(aa, b), Groups.WreathProductElem) - @test isa(Groups.WreathProductElem(aa, b), Groups.WreathProductElem{typeof(a)}) + @test isa(Groups.WreathProductElem(aa, b), Groups.WreathProductElem{AddGrpElem{Generic.ResF{Generic.Poly{Rational{BigInt}}}}, Int64}) B3 = Groups.WreathProduct(F, S_3) @@ -23,26 +24,15 @@ @test B3(b) == Groups.WreathProductElem(B3.N(), b) @test B3(aa) == Groups.WreathProductElem(aa, S_3()) - g = B3(aa, b) + @test B3([a^0 ,a, a^2], perm"(1,2,3)") isa WreathProductElem - @test g.p == b - @test g.n == aa - h = deepcopy(g) - - @test hash(g) == hash(h) - - g.n[1] = a - - @test g.n[1] == a - @test g != h - - @test hash(g) != hash(h) + @test B3([a^0 ,a, a^2], perm"(1,2,3)") == B3(aa, b) end @testset "Types" begin B3 = Groups.WreathProduct(F, S_3) - @test elem_type(B3) == Groups.WreathProductElem{elem_type(F), Int} + @test elem_type(B3) == Groups.WreathProductElem{AddGrpElem{elem_type(F)}, Int} @test parent_type(typeof(B3())) == Groups.WreathProduct{parent_type(typeof(B3.N.group())), Int} @@ -50,30 +40,64 @@ @test parent(B3()) == B3 end - @testset "Group arithmetic" begin + @testset "Basic operations on WreathProductElem" begin + aa = Groups.DirectProductGroupElem([a^0 ,a, a^2]) B3 = Groups.WreathProduct(F, S_3) + g = B3(aa, b) - x = B3(B3.N([1,0,0]), B3.P([2,3,1])) - y = B3(B3.N([0,1,1]), B3.P([2,1,3])) + @test g.p == b + @test g.n == DirectProductGroupElem(AddGrpElem.(aa.elts)) - @test x*y == B3(B3.N([0,0,1]), B3.P([3,2,1])) - @test y*x == B3(B3.N([0,0,1]), B3.P([1,3,2])) + h = deepcopy(g) + @test h == g + @test !(g === h) - @test inv(x) == B3(B3.N([0,0,1]), B3.P([3,1,2])) - @test inv(y) == B3(B3.N([1,0,1]), B3.P([2,1,3])) + g.n[1] = parent(g.n[1])(a) - @test inv(x)*y == B3(B3.N([1,1,1]), B3.P([1,3,2])) - @test y*inv(x) == B3(B3.N([0,1,0]), B3.P([3,2,1])) + @test g.n[1] == parent(g.n[1])(a) + @test g != h + + @test hash(g) != hash(h) + + g.n[1] = a + @test g.n[1] == parent(g.n[1])(a) + @test g != h + + @test hash(g) != hash(h) + end + + + @testset "Group arithmetic" begin + B4 = Groups.WreathProduct(GF(3), PermutationGroup(4)) + + x = B4([0,1,2,0], perm"(1,2,3)(4)") + @test inv(x) == B4([1,0,2,0], perm"(1,3,2)(4)") + + y = B4([1,0,1,2], perm"(1,4)(2,3)") + @test inv(y) == B4([1,2,0,2], perm"(1,4)(2,3)") + + @test x*y == B4([0,2,0,2], perm"(1,3,4)(2)") + + @test y*x == B4([1,2,2,2], perm"(1,4,2)(3)") + + + @test inv(x)*y == B4([2,1,2,2], perm"(1,2,4)(3)") + + @test y*inv(x) == B4([1,2,1,0], perm"(1,4,3)(2)") end @testset "Misc" begin - B3 = Groups.WreathProduct(FiniteField(2,1,"a")[1], S_3) - @test order(B3) == 48 + B3 = Groups.WreathProduct(GF(3), S_3) + @test order(B3) == 3^3*6 - Wr = WreathProduct(PermutationGroup(2),S_3) + B3 = Groups.WreathProduct(MultiplicativeGroup(GF(3)), S_3) + @test order(B3) == 2^3*6 + + Wr = WreathProduct(PermutationGroup(2),PermutationGroup(4)) @test isa([elements(Wr)...], Vector{Groups.WreathProductElem{Generic.perm{Int}, Int}}) + @test order(Wr) == 2^4*factorial(4) elts = [elements(Wr)...]