219 lines
7.2 KiB
Plaintext
219 lines
7.2 KiB
Plaintext
#############################################################################
|
|
##
|
|
#W moufang_modifications.gi Moufang modifications [loops]
|
|
##
|
|
#H @(#)$Id: moufang_modifications.gi, v 3.0.0 2015/06/15 gap Exp $
|
|
##
|
|
#Y Copyright (C) 2004, G. P. Nagy (University of Szeged, Hungary),
|
|
#Y P. Vojtechovsky (University of Denver, USA)
|
|
##
|
|
|
|
#############################################################################
|
|
## LOOPS M(G,2)
|
|
## -------------------------------------------------------------------------
|
|
|
|
#############################################################################
|
|
##
|
|
#F LoopMG2( G )
|
|
##
|
|
## Returns the Chein loop M(G,2) constructed from a group <G>.
|
|
## See documentation for details.
|
|
|
|
InstallGlobalFunction( LoopMG2, function( G )
|
|
|
|
local T, inv, n, L, i, j;
|
|
|
|
T := MultiplicationTable( Elements( G ) );
|
|
n := Size( G );
|
|
inv := List( [1..n], i->Position( T[i], 1 ) ); #inverses
|
|
L := List( [1..2*n], i->[]);
|
|
|
|
for i in [1..n] do for j in [1..n] do
|
|
L[ i ][ j ] := T[ i ][ j ]; # g*h = gh
|
|
L[ i ][ j+n ] := T[ j ][ i ] + n; # g*hu = (hg)u
|
|
L[ i+n ][ j ] := T[ i ][ inv[ j ] ] + n; # gu*h = (gh^{-1})u
|
|
L[ i+n ][ j+n ] := T[ inv[ j ] ][ i ]; # gu*hu = h^{-1}g
|
|
od; od;
|
|
|
|
return LoopByCayleyTable( L );
|
|
end);
|
|
|
|
#############################################################################
|
|
## AUXILIARY FUNCTIONS FOR MOUFANG MODIFICATIONS
|
|
## -------------------------------------------------------------------------
|
|
|
|
#############################################################################
|
|
##
|
|
#F LOOPS_PositionList( A, B )
|
|
##
|
|
## input: lists A, B
|
|
## returns: list P, where P[i] is the position of B[i] in A
|
|
|
|
InstallGlobalFunction( LOOPS_PositionList,
|
|
function( A, B )
|
|
local P, b;
|
|
P := [];
|
|
for b in B do Add( P, Position( A, b ) ); od;
|
|
return P;
|
|
end);
|
|
|
|
#############################################################################
|
|
##
|
|
#F LOOPS_Modular( i, m )
|
|
##
|
|
## returns i modulo the set [-m+1..m]
|
|
|
|
InstallGlobalFunction( LOOPS_Modular,
|
|
function(i, m)
|
|
while i>m do i:=i-2*m; od;
|
|
while i<1-m do i:=i+2*m; od;
|
|
return i;
|
|
end);
|
|
|
|
#############################################################################
|
|
##
|
|
#F LOOPS_DVSigma( i, m )
|
|
##
|
|
## Calculates overflow of i modulo [-m+1..m].
|
|
## See documentation for more details.
|
|
|
|
InstallGlobalFunction( LOOPS_DVSigma,
|
|
function( i, m )
|
|
if i > m then return 1; fi;
|
|
if i < 1 - m then return -1; fi;
|
|
return 0;
|
|
end);
|
|
|
|
#############################################################################
|
|
## CYCLIC MODIFICATION
|
|
## -------------------------------------------------------------------------
|
|
|
|
#############################################################################
|
|
##
|
|
#F LoopByCyclicModification( L, S, a, h)
|
|
##
|
|
## Returns the cyclic modification of Moufang loop <L> with parameters
|
|
## <S>, <a>, <h>, as described in the documentation.
|
|
|
|
# (MATH)
|
|
# L is a loop,
|
|
# S is a normal subloop of L, or a set generating a normal subloop of L,
|
|
# L/S is cyclic of order 2m, generated by aS,
|
|
# h is an element of Z(L) and S
|
|
# (PROG)
|
|
# NOTHING IS CHECKED!!
|
|
|
|
InstallGlobalFunction( LoopByCyclicModification, function( L, S, a, h )
|
|
|
|
local n, ih, m, aP, aa, i, iL, T, x, y, z, exponent;
|
|
|
|
# making sure that S is a subloop of L
|
|
if not IsLoop( S ) then S := Subloop( L, S ); fi;
|
|
|
|
# converting all into numbers for faster calculation
|
|
n := Size( L );
|
|
ih := Position( Elements( L ), h^(-1) ); #inverse of h
|
|
h := Position( Elements( L ), h );
|
|
a := Position( Elements( L ), a );
|
|
S := LOOPS_PositionList( Elements( L ), Elements( S ) );
|
|
L := CayleyTable( L );
|
|
|
|
# setting parameter m of the construction
|
|
m := n / ( 2 * Length( S ) );
|
|
|
|
# calculating all cosets a^i, for i in M
|
|
aP := []; aa := 1;
|
|
for i in [ 0..2*m-1 ] do
|
|
Add( aP, List( S, j -> L[ aa ][ j ] ) );
|
|
aa := L[ aa ][ a ];
|
|
od;
|
|
|
|
# into which cosets belong elements of L
|
|
iL := List( [ 1..n ], x -> LOOPS_Modular( LOOPS_SublistPosition(aP, x ) - 1, m ) );
|
|
|
|
# setting up the multiplication table
|
|
T := List( [ 1..n ], i->[] );
|
|
for x in [ 1..n ] do for y in [ 1..n ] do
|
|
z := L[ x ][ y ];
|
|
exponent := LOOPS_DVSigma( iL[ x ] + iL[ y ], m );
|
|
if exponent = 1 then z := L[ z ][ h ]; fi;
|
|
if exponent = -1 then z := L[ z ][ ih ]; fi;
|
|
T[ x ][ y ] := z;
|
|
od; od;
|
|
|
|
return LoopByCayleyTable( T );
|
|
end);
|
|
|
|
#############################################################################
|
|
## DIHEDRAL MODIFICATION
|
|
## -------------------------------------------------------------------------
|
|
|
|
#############################################################################
|
|
##
|
|
#F LoopByDihedralModification( L, S, e, f, h)
|
|
##
|
|
## Returns the dihedral modification of Moufang loop <L> with parameters
|
|
## <S>, <e>, <f>, <h>, as described in the documentation.
|
|
|
|
# (MATH)
|
|
# L is a loop,
|
|
# S is a normal subloop of L, or a set generating a normal subloop of L,
|
|
# L/S is dihedral of order 4m,
|
|
# eS, fS are involutions of L/S such that eS*fS is of order 2m,
|
|
# let G0 be the union of cosets of L/S generated by eS*fS,
|
|
# h is an element of N(L), S and Z(G0).
|
|
# (PROG)
|
|
# NOTHING IS CHECKED!!
|
|
|
|
InstallGlobalFunction( LoopByDihedralModification, function( L, S, e, f, h )
|
|
|
|
local a, G0, n, m, ih, aP, aa, i, eP, fP, eL, fL, T, x, y, z, exp;
|
|
|
|
# making sure that S is a subloop of L
|
|
if not IsLoop( S ) then S := Subloop( L, S ); fi;
|
|
|
|
# obtaining a and G0
|
|
a := e * f;
|
|
G0:= Subloop( L, a * Elements( S ) );
|
|
|
|
# all in numbers
|
|
n := Size( L );
|
|
ih := Position( Elements( L ), h^(-1) ); #inverse of h
|
|
h := Position( Elements( L ), h );
|
|
a := Position( Elements( L ), a );
|
|
e := Position( Elements( L ), e );
|
|
f := Position( Elements( L ), f );
|
|
S := LOOPS_PositionList( Elements( L ), Elements( S ) );
|
|
G0 := LOOPS_PositionList( Elements( L ), Elements( G0 ) );
|
|
L := CayleyTable( L );
|
|
|
|
# setting parameter m
|
|
m := n / ( 4 * Length( S ) );
|
|
|
|
# powers of aS, eS and fS
|
|
aP := []; aa := 1;
|
|
for i in [ 0..2*m-1 ] do
|
|
Add( aP, List( S, i -> L[ aa ][ i ] ) );
|
|
aa := L[ aa ][ a ];
|
|
od;
|
|
eP := List( aP, x -> Union( List( x, y -> [ y, L[ e ][ y ] ] ) ) );
|
|
fP := List( aP, x -> Union( List( x, y -> [ y, L[ y ][ f ] ] ) ) );
|
|
|
|
# into which cosets belong elements of L
|
|
eL := List( [ 1..n ], x -> LOOPS_Modular( LOOPS_SublistPosition(eP, x ) - 1, m ) );
|
|
fL := List( [ 1..n ], x -> LOOPS_Modular( LOOPS_SublistPosition(fP, x ) - 1, m ) );
|
|
|
|
# setting up multiplication table
|
|
T := List( L, x->[] );
|
|
for x in [ 1..n ] do for y in [ 1..n ] do
|
|
if y in G0 then exp := LOOPS_DVSigma( eL[ x ] + fL[ y ], m );
|
|
else exp := (-1)*LOOPS_DVSigma( eL[ x ] + fL[ y ], m ); fi;
|
|
z := L[ x ][ y ];
|
|
if exp = 1 then z := L[ z ][ h ]; fi;
|
|
if exp = -1 then z := L[ z ][ ih ]; fi;
|
|
T[ x ][ y ] := z;
|
|
od; od;
|
|
|
|
return LoopByCayleyTable(T);
|
|
end);
|