[GAP Forum] Crystallographic action

Mathieu Dutour Mathieu.Dutour at ens.fr
Wed Dec 6 10:14:27 GMT 2006


Dear all,

I have yet again a question on group actions. This time with
crystallographic actions.

I have a crystallographic group G, i.e. G acts on R^3 by affine
transformations (boring computer code is given at the end of the
message).

We have a finite index normal subgroup Z^3 of translations T of G.
I want to consider the action of G/T on the torus (R/Z)^3.
A representation of G/T can be obtained by taking the linear part
of the affine transformations. I want to test if two elements of
(R/Z)^3 are equivalent under G/T and to compute the stabilizer
of an element.

The problem is that the group G is infinite. If I take some generators
up to translation of G then clearly I cannot define the morphism phi
from G/T to G. But I need to define it somehow because I need matrices
of G to act on R^3 followed by reduction mod 1.

I see two solutions to the problem:

1> One solution is to force the image of the morphism to be computed even
if it has no sense by using the free group trick.
This makes the following:

FuncAction_V1:=function(eClass, eGen)
  local nbGen, f, hom, hom2;
  nbGen:=Length(ListLinearMat);
  f:=FreeGroup(nbGen);
  hom:=GroupHomomorphismByImagesNC(f, GroupLinear, GeneratorsOfGroup(f), ListLinearMat);
  hom2:=GroupHomomorphismByImagesNC(f, GroupAffine, GeneratorsOfGroup(f), ListAffineMat);
  return VectorMod1(eClass*Image(hom2, PreImagesRepresentative(hom, eGen)));
end;
Stab:=Stabilizer(GroupLinear, eVect, FuncAction_V1);
eElt:=RepresentativeAction(GroupLinear, eVect, fVect, FuncAction_V1);

2> The second possibility is to use gens, acts in the following syntax
Stabilizer(Grp, pt, gens, acts, FuncAct)

In our case this makes the following code:
FuncAction_V2:=function(eClass, eGen)
  return VectorMod1(eClass*eGen);
end;
Stab:=Stabilizer(GroupLinear, eVect, ListLinearMat, ListAffineMat, FuncAction_V2);
eElt:=RepresentativeAction(GroupLinear, eVect, fVect, ListLinearMat, ListAffineMat, FuncAction_V2);

My questions are the following:
--Is there a way to bypass the FreeGroup construction in the first method?
--Is the second construction legal?
In examples it works but I worry that I do not have a morphism from
GroupLinear to GroupAffine and the reference manual is quite explicit
about "homomorphism phi:G---> H"
--What is the most efficient method?

Thank you in advance for any help.

  Mathieu



Mat1:=[
[-1 ,0 ,0  ,0],
[0  ,-1,0  ,0],
[0  ,0 ,1  ,0],
[1/2,0 ,1/2,1]];
Mat2:=[
[0  ,1 ,0,0],
[0  ,0 ,1,0],
[1  ,0 ,0,0],
[0  ,0 ,0,1]];
Mat3:=[
[0  ,1  ,0  ,0],
[1  ,0  ,0  ,0],
[0  ,0  ,-1 ,0],
[3/4,1/4,1/4,1]];
Mat4:=[
[0  ,1   ,0,0],
[-1 ,0   ,0,0],
[0  ,0   ,1,0],
[1/4,3/4 ,1/4,1]];
Mat5:=[
[0  ,0   ,1  ,0],
[0  ,-1  ,0  ,0],
[1  ,0   ,0  ,0],
[1/4,1/4 ,3/4,1]];

ListAffineMat:=[Mat1, Mat2, Mat3, Mat4, Mat5];
ListLinearMat:=[];
for eMat in ListAffineMat
do
  eMatRed:=List(eMat{[1..3]}, x->x{[1..3]});
  Add(ListLinearMat, eMatRed);
od;
GroupAffine:=Group(ListAffineMat);
GroupLinear:=Group(ListLinearMat);

FractionMod1:=function(eFrac)
  local a, b;
  b:=NumeratorRat(eFrac);
  a:=DenominatorRat(eFrac);
  return (b mod a)/a;
end;

VectorMod1:=function(eVect)
  return Concatenation(List(eVect{[1..3]}, x->FractionMod1(x)), [1]);
end;



-- 
Mathieu Dutour Sikiric		Researcher in Mathematics
Telephone:.(+385)1 4571 237	and Computer Science
Cell Phone: (+385)9 19 36 30 80	Laboratory of satellite oceanography
E-mail: Mathieu.Dutour at ens.fr	Rudjer Boskovic Institute
http://www.liga.ens.fr/~dutour	Zagreb Croatia
skype name: mathieudutour



More information about the Forum mailing list