134 lines
5.1 KiB
Plaintext
134 lines
5.1 KiB
Plaintext
#############################################################################
|
|
##
|
|
#W bol_core_methods.gi Common methods for Bol loops [loops]
|
|
##
|
|
#H @(#)$Id: bol_core_methods.gi, v 3.0.0 2015/06/12 gap Exp $
|
|
##
|
|
#Y Copyright (C) 2004, G. P. Nagy (University of Szeged, Hungary),
|
|
#Y P. Vojtechovsky (University of Denver, USA)
|
|
##
|
|
|
|
|
|
#############################################################################
|
|
##
|
|
#A AssociatedLeftBruckLoop( Q )
|
|
##
|
|
## Given a left Bol loop Q for which x -> x^2 is a permutation,
|
|
## returns the associated left Bruck loop, defined by
|
|
## x o y = (x*((y*y)*x))^(1/2) (default) or
|
|
## x o y = x^(1/2)*(y*x^(1/2)) (commented out)
|
|
|
|
InstallMethod( AssociatedLeftBruckLoop,
|
|
[ IsLeftBolLoop ],
|
|
function( Q )
|
|
local n, ct, squares, roots, new_ct, L, i, j;
|
|
n := Size( Q );
|
|
ct := CanonicalCayleyTable( CayleyTable( Q ) );
|
|
squares := List( [ 1..n ], i -> ct[i][i] );
|
|
if not Size( Set( squares ) ) = n then
|
|
Error( "LOOPS: <1> must be a Bol loop in which squaring is a bijection." );
|
|
fi;
|
|
roots := Inverse( PermList( squares ) ); # square roots
|
|
new_ct := List([1..n], i -> [1..n] );
|
|
for i in [1..n] do for j in [1..n] do
|
|
new_ct[i][j] := (ct[i][ct[ct[j][j]][i]])^roots; # (x*((y*y)*x))^(1/2)
|
|
# new_ct[i][j] := ct[i^roots][ct[ j ][ i^roots ]]; # x^(1/2)*(y*x^(1/2))
|
|
od; od;
|
|
L := LoopByCayleyTable( new_ct ); # the associated left Bruck loop
|
|
SetIsLeftBruckLoop( L, true );
|
|
return L;
|
|
end );
|
|
|
|
|
|
#############################################################################
|
|
##
|
|
#A AssociatedRightBruckLoop( Q )
|
|
##
|
|
## Given a right Bol loop Q for which x -> x^2 is a permutation,
|
|
## returns the associated right Bruck loop, defined by
|
|
## x o y = ((x*(y*y))*x)^(1/2) (default) or
|
|
## x o y = (x^(1/2)*y)*x^(1/2) (commented out)
|
|
|
|
InstallMethod( AssociatedRightBruckLoop,
|
|
[ IsRightBolLoop ],
|
|
function( Q )
|
|
local n, ct, squares, roots, new_ct, L, i, j;
|
|
n := Size( Q );
|
|
ct := CanonicalCayleyTable( CayleyTable( Q ) );
|
|
squares := List( [ 1..n ], i -> ct[i][i] );
|
|
if not Size( Set( squares ) ) = n then
|
|
Error( "LOOPS: <1> must be a right Bol loop in which squaring is a bijection." );
|
|
fi;
|
|
roots := Inverse( PermList( squares ) ); # square roots
|
|
new_ct := List([1..n], i -> [1..n] );
|
|
for i in [1..n] do for j in [1..n] do
|
|
new_ct[i][j] := (ct[ct[j][ct[i][i]]][j])^roots; # x o y = ((y*(x*x))*y)^(1/2)
|
|
# new_ct[i][j] := ct[ct[j^roots][i]][j^roots]; # x o y = (y^(1/2)*x)*y^(1/2)
|
|
od; od;
|
|
L := LoopByCayleyTable( new_ct ); # the associated right Bruck loop
|
|
SetIsRightBruckLoop( L, true );
|
|
return L;
|
|
end );
|
|
|
|
|
|
#############################################################################
|
|
##
|
|
#O IsExactGroupFactorization( G, H1, H2 )
|
|
##
|
|
## Let G be a group and H_1, H_2 subgroups. The triple (G,H_1,H_2) is an
|
|
## exact group factorization, if H_1 \cap H_2 = 1 and G=H_1H_2.
|
|
##
|
|
## Returns true if (G, H1, H2) is an exact group factorization.
|
|
|
|
InstallMethod( IsExactGroupFactorization, "for a group and two subgroups",
|
|
[ IsGroup, IsGroup, IsGroup ],
|
|
function( G, H1, H2 )
|
|
return IsSubgroup(G,H1) and IsSubgroup(G,H2) and Size(G)=Size(H1)*Size(H2) and IsTrivial(Intersection(H1,H2));
|
|
end);
|
|
|
|
|
|
#############################################################################
|
|
##
|
|
#F RightBolLoopByExactGroupFactorization
|
|
##
|
|
## Let (G,H_1,H_2) be an exact group factorization. Define
|
|
## U = G\times G, S = H_1 \times H_2, and T = {(g,g^{-1}) : g in G }.
|
|
## Then (U,S,T) is a right Bol loop folder
|
|
## Returns the right Bol loop corresponding to (U,S,T).
|
|
|
|
InstallGlobalFunction( RightBolLoopByExactGroupFactorizationNC,
|
|
function( g, h1, h2 )
|
|
local f,sect,stab,ghom,st,q,rmlt;
|
|
f := DirectProduct( g, g );
|
|
sect := List( g, x -> Image( Embedding( f, 1 ), x )*Image( Embedding( f, 2 ), x^-1 ) );
|
|
stab := ClosureGroup( Image( Embedding( f, 1 ), h1 ), Image( Embedding( f, 2 ), h2 ) );
|
|
ghom := ActionHomomorphism( f, RightCosets( f, stab ), OnRight );
|
|
st := Image( ghom, sect );;
|
|
q := LoopByRightSection( st );
|
|
SetRightSection( q, st );
|
|
rmlt := Subgroup( f, sect );
|
|
SetRightMultiplicationGroup( q, Image( ghom, Subgroup( f, SmallGeneratingSet( rmlt ) ) ) );
|
|
return q;
|
|
end);
|
|
|
|
InstallGlobalFunction( RightBolLoopByExactGroupFactorization,
|
|
function( arg )
|
|
local g, h1, h2;
|
|
if Length( arg ) = 3 then
|
|
g := arg[1]; h1 := arg[2]; h2 := arg[3];
|
|
elif Length( arg ) = 2 then
|
|
g := arg[1]; h1 := arg[2]; h2 := Stabilizer( g, Orbit( g )[1] );
|
|
elif Length( arg ) = 1 and Length( arg[1] ) = 3 then
|
|
g := arg[1][1]; h1 := arg[1][2]; h2 := arg[1][3];
|
|
elif Length(arg) = 1 and Length( arg[1] ) = 2 then
|
|
g := arg[1][1]; h1 := arg[1][2]; h2 := Stabilizer(g,Orbit(g)[1]);
|
|
else
|
|
Error("LOOPS: Argument must be an exact group factorization or a group with a regular subgroup.");
|
|
fi;
|
|
if not IsExactGroupFactorization( g, h1, h2 ) then
|
|
Error("LOOPS: Argument does not correspond to an exact group factorization.");
|
|
fi;
|
|
return RightBolLoopByExactGroupFactorizationNC( g, h1, h2 );
|
|
end);
|
|
|