2021-06-10 12:55:21 +02:00
using PermutationGroups
2021-07-07 10:41:34 +02:00
using Groups . KnuthBendix
2021-06-10 12:55:21 +02:00
@testset " Wajnryb presentation for Σ₄₁ " begin
genus = 4
2021-08-13 16:20:31 +02:00
Fn = FreeGroup ( 2 genus )
G = SpecialAutomorphismGroup ( Fn )
2021-06-10 12:55:21 +02:00
2021-08-13 16:20:31 +02:00
T = Groups . mcg_twists ( G )
2021-07-21 16:26:22 +02:00
2021-07-12 11:11:39 +02:00
# symplectic pairing in the free Group goes like this:
2021-07-07 10:41:34 +02:00
# f1 ↔ f5
# f2 ↔ f6
# f3 ↔ f7
# f4 ↔ f8
T = let G = G
( Tas , Tα s , Tes ) = Groups . mcg_twists ( G )
2021-06-10 12:55:21 +02:00
Ta = G . ( Tas )
Tα = G . ( Tα s )
Tes = G . ( Tes )
[ Ta ; Tα ; Tes ]
end
a1 = T [ 1 ] ^ - 1 # Ta₁
a2 = T [ 5 ] ^ - 1 # Tα ₁
a3 = T [ 9 ] ^ - 1 # Te₁₂
a4 = T [ 6 ] ^ - 1 # Tα ₂
a5 = T [ 12 ] ^ - 1 # Te₂₃
a6 = T [ 7 ] ^ - 1 # Tα ₃
a7 = T [ 14 ] ^ - 1 # Te₃₄
a8 = T [ 8 ] ^ - 1 # Tα ₄
b0 = T [ 2 ] ^ - 1 # Ta₂
2021-07-07 10:41:34 +02:00
a0 = ( a1 * a2 * a3 ) ^ 4 * b0 ^ - 1 # from the 3-chain relation
X = a4 * a5 * a3 * a4 # auxillary, not present in the Primer
b1 = X ^ - 1 * a0 * X
2021-06-10 12:55:21 +02:00
b2 = T [ 10 ] ^ - 1 # Te₁₃
2021-07-07 10:41:34 +02:00
As = T [ [ 1 , 5 , 9 , 6 , 12 , 7 , 14 , 8 ] ] # the inverses of the elements a
@testset " preserving relator " begin
F = Groups . object ( G )
2021-07-21 16:26:22 +02:00
R = prod ( commutator ( gens ( F , 2 i + 1 ) , gens ( F , 2 i + 2 ) ) for i in 0 : genus - 1 )
2021-07-07 10:41:34 +02:00
for g in T
2021-07-20 11:02:12 +02:00
@test g ( R ) == R
2021-07-07 10:41:34 +02:00
end
end
2021-06-10 12:55:21 +02:00
@testset " commutation relations " begin
for ( i , ai ) in enumerate ( As ) #the element ai here is actually the inverse of ai before. It does not matter for commutativity. Also, a0 is as defined before.
for ( j , aj ) in enumerate ( As )
2021-07-07 10:41:34 +02:00
if abs ( i - j ) > 1
@test ai * aj == aj * ai
2021-06-10 12:55:21 +02:00
elseif i ≠ j
2021-07-07 10:41:34 +02:00
@test ai * aj != aj * ai
2021-06-10 12:55:21 +02:00
end
end
if i != 4
2021-07-07 10:41:34 +02:00
@test a0 * ai == ai * a0
2021-06-10 12:55:21 +02:00
end
end
end
@testset " braid relations " begin
for ( i , ai ) in enumerate ( As ) #the element ai here is actually the inverse of ai before. It does not matter for braid relations.
for ( j , aj ) in enumerate ( As )
2021-07-07 10:41:34 +02:00
if abs ( i - j ) == 1
@test ai * aj * ai == aj * ai * aj
2021-06-10 12:55:21 +02:00
end
end
end
2021-07-07 10:41:34 +02:00
@test a0 * a4 * a0 == a4 * a0 * a4 # here, a0 and a4 are as before
2021-06-10 12:55:21 +02:00
end
2021-07-20 10:16:59 +02:00
@testset " 3-chain relation " begin
x = a4 * a3 * a2 * a1 * a1 * a2 * a3 * a4 # auxillary; does not have a name in the Primer
@test b0 == x * a0 * x ^ - 1
end
2021-06-10 12:55:21 +02:00
@testset " Lantern relation " begin
@testset " b2 definition " begin
2021-07-07 10:41:34 +02:00
@test b2 == ( a2 * a3 * a1 * a2 ) ^ - 1 * b1 * ( a2 * a3 * a1 * a2 )
2021-06-10 12:55:21 +02:00
# some additional tests, checking what explicitly happens to the generators of the π₁ under b2
2021-07-07 10:41:34 +02:00
d = Groups . domain ( b2 )
2021-07-21 16:26:22 +02:00
img = evaluate ( b2 )
z = img [ 3 ] * d [ 3 ] ^ - 1
@test img [ 1 ] == d [ 1 ]
@test img [ 2 ] == d [ 2 ]
@test img [ 3 ] == z * d [ 3 ]
@test img [ 4 ] == z * d [ 4 ] * z ^ - 1
@test img [ 5 ] == z * d [ 5 ] * z ^ - 1
@test img [ 6 ] == z * d [ 6 ] * z ^ - 1
@test img [ 7 ] == d [ 7 ] * z ^ - 1
@test img [ 8 ] == d [ 8 ]
2021-06-10 12:55:21 +02:00
end
@testset " b2: commutation relations " begin
2021-07-07 10:41:34 +02:00
@test b2 * a1 == a1 * b2
@test b2 * a2 != a2 * b2
@test b2 * a3 == a3 * b2
@test b2 * a4 == a4 * b2
@test b2 * a5 == a5 * b2
@test b2 * a6 != a6 * b2
2021-06-10 12:55:21 +02:00
end
@testset " b2: braid relations " begin
2021-07-07 10:41:34 +02:00
@test a2 * b2 * a2 == b2 * a2 * b2
@test a6 * b2 * a6 == b2 * a6 * b2
2021-06-10 12:55:21 +02:00
end
@testset " lantern " begin
2021-07-07 10:41:34 +02:00
u = ( a6 * a5 ) ^ - 1 * b1 * ( a6 * a5 )
x = ( a6 * a5 * a4 * a3 * a2 * u * a1 ^ - 1 * a2 ^ - 1 * a3 ^ - 1 * a4 ^ - 1 ) # yet another auxillary
2021-06-10 12:55:21 +02:00
# x = (a4^-1*a3^-1*a2^-1*a1^-1*u*a2*a3*a4*a5*a6)
2022-04-02 15:53:55 +02:00
2021-07-07 10:41:34 +02:00
b3 = x * a0 * x ^ - 1
2022-04-02 15:53:55 +02:00
b3im = evaluate ( b3 )
b3cim = let g = b3
2021-08-13 16:20:31 +02:00
f = Groups . compiled ( g )
f ( Groups . domain ( g ) )
end
@test b3im == b3cim
2021-07-07 10:41:34 +02:00
@test a0 * b2 * b1 == a1 * a3 * a5 * b3
2022-04-02 15:53:55 +02:00
@time evaluate ( x )
let g = b3
f = Groups . compiled ( g )
f ( Groups . domain ( g ) )
@time f ( Groups . domain ( g ) )
end
2021-06-10 12:55:21 +02:00
end
end
2021-07-07 10:41:34 +02:00
Base . conj ( t :: Groups . Transvection , p :: Perm ) =
Groups . Transvection ( t . id , t . i ^ p , t . j ^ p , t . inv )
2021-06-10 12:55:21 +02:00
2021-07-07 10:41:34 +02:00
function Base . conj ( elt :: FPGroupElement , p :: Perm )
2021-06-10 12:55:21 +02:00
G = parent ( elt )
2021-07-07 10:41:34 +02:00
A = alphabet ( elt )
return G ( [ A [ conj ( A [ idx ] , p ) ] for idx in word ( elt ) ] )
2021-06-10 12:55:21 +02:00
end
@testset " Te₂₃ definition " begin
Te₁₂ , Te₂₃ = T [ 9 ] , T [ 12 ]
G = parent ( Te₁₂ )
2021-07-07 10:41:34 +02:00
F₈ = Groups . object ( G )
2021-07-21 16:26:22 +02:00
( δ , d , γ , c , β , b , α , a ) = Groups . gens ( F₈ )
Groups . domain ( Te₁₂ )
2021-06-10 12:55:21 +02:00
2021-07-07 10:41:34 +02:00
img_Te₂₃ = evaluate ( Te₂₃ )
y = c * β ^ - 1 * b ^ - 1 * β
2021-07-21 16:26:22 +02:00
@test img_Te₂₃ == ( δ , d , y * γ , y * c * y ^ - 1 , β * y ^ - 1 , b , α , a )
2021-06-10 12:55:21 +02:00
2021-07-21 16:26:22 +02:00
σ = perm " (7,5,3)(8,6,4) "
2021-06-10 12:55:21 +02:00
Te₂₃_σ = conj ( Te₁₂ , σ )
2021-07-07 10:41:34 +02:00
# @test word(Te₂₃_σ ) == word(Te₂₃)
2021-06-10 12:55:21 +02:00
2021-07-07 10:41:34 +02:00
@test evaluate ( Te₂₃_σ ) == evaluate ( Te₂₃ )
2021-06-10 12:55:21 +02:00
@test Te₂₃ == Te₂₃_σ
end
@testset " Te₃₄ definition " begin
Te₁₂ , Te₃₄ = T [ 9 ] , T [ 14 ]
G = parent ( Te₁₂ )
2021-07-07 10:41:34 +02:00
F₈ = Groups . object ( G )
2021-07-21 16:26:22 +02:00
( δ , d , γ , c , β , b , α , a ) = Groups . gens ( F₈ )
2021-06-10 12:55:21 +02:00
2021-07-21 16:26:22 +02:00
σ = perm " (7,3)(8,4)(5,1)(6,2) "
2021-06-10 12:55:21 +02:00
Te₃₄_σ = conj ( Te₁₂ , σ )
@test Te₃₄ == Te₃₄_σ
end
2021-07-07 10:41:34 +02:00
@testset " hyperelliptic τ is central " begin
2021-08-13 16:20:31 +02:00
τ = Groups . rotation_element ( G )
2021-07-07 10:41:34 +02:00
τᵍ = τ ^ genus
2021-07-20 10:16:59 +02:00
symplectic_gens = let genus = genus , G = G
π ₁Σ = Groups . SurfaceGroup ( genus , 0 )
2021-08-13 16:20:31 +02:00
s_twists = Groups . symplectic_twists ( π ₁Σ )
G . ( word ( t . autFn_word ) for t in s_twists )
2021-07-20 10:16:59 +02:00
end
@test all ( sg * τᵍ == τᵍ * sg for sg in symplectic_gens )
2021-07-07 10:41:34 +02:00
end
2021-06-10 12:55:21 +02:00
end