[GAP Forum] Crystallographic action

Joachim Neubueser joachim.neubueser at math.rwth-aachen.de
Wed Dec 20 12:17:37 GMT 2006


Dear Mathieu,

As far as we understand, you can achieve what you want in the
following way: After reading your code below, do:

gap> op := function(v,m) return VectorMod1(v*m); end;;

This provides an "action" function for acting with elements of
your affine group on vectors mod 1. Now you can do things like

gap> v := VectorMod1([1/2,0,0]);
[ 1/2, 0, 0, 1 ]
gap> o := Orbit(GroupAffine,v,op);
[ [ 1/2, 0, 0, 1 ], [ 0, 0, 1/2, 1 ], [ 0, 1/2, 0, 1 ], [ 3/4, 3/4, 1/4, 1 ], 
  [ 1/4, 1/4, 1/4, 1 ], [ 3/4, 1/4, 3/4, 1 ], [ 1/4, 3/4, 3/4, 1 ], 
  [ 1/2, 1/2, 1/2, 1 ] ]

Since in your example G/T is small you can test for equivalence by
just testing whether another vector is contained in the orbit.
You can also use RepresentativeAction:

gap> RepresentativeAction(GroupAffine,v,[1/4,3/4,3/4,1],op);
[ [ 0, -1, 0, 0 ], [ 1, 0, 0, 0 ], [ 0, 0, 1, 0 ], [ 1/4, 5/4, 3/4, 1 ] ]
gap> RepresentativeAction(GroupAffine,v,[0,0,0,1],op);      
fail

You also can compute stabilizers:

gap> s := Stabilizer(GroupAffine,v,op);
<matrix group with 21 generators>

This of course also enumerates the orbit internally.

We hope we understood you right and this helps,
   Joachim Neubueser and Max Neunhoeffer

On Wed, Dec 06, 2006 at 11:14:27AM +0100, Mathieu Dutour wrote:
> 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
> 
> _______________________________________________
> Forum mailing list
> Forum at mail.gap-system.org
> http://mail.gap-system.org/mailman/listinfo/forum
> 



More information about the Forum mailing list