Group Abstract Group Abstract

Message Boards Message Boards

0
|
4.8K Views
|
8 Replies
|
0 Total Likes
View groups...
Share
Share this post:

The pure translation affine conjugating transformation of a space group.

Posted 3 years ago

I want to find the pure translation affine conjugating transformation of a space group, as shown below:

In[152]:= gensSG141ITA1={
 {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0,0,0,1}},
 {{-1, 0, 0, 1/2}, {0, -1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}},
 {{0, -1, 0, 0}, {1, 0, 0, 1/2}, {0, 0, 1, 1/4}, {0,0,0, 1}},
 {{-1, 0, 0, 1/2}, {0,  1, 0,  0}, {0,  0,  -1, 3/4}, {0,0,0, 1}},
 {{-1, 0, 0, 0}, {0, -1, 0, 1/2}, {0, 0, -1, 1/4}, {0,0,0, 1}},
 {{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}}
}; 
C3={{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0,1}};

Inverse[C3] . # . C3 -# &/@gensSG141ITA1;
AffineTransform[{#[[1;;3,1;;3]],#[[1;;3,4]]}//FractionalPart]&/@%

Out[155]= {TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )]}

In the above example, the C3 is the desired matrix. But how can I find this result without knowing it?

Regards, Zhao

POSTED BY: Hongyi Zhao
8 Replies
Posted 3 years ago

Using the non-translation generators of the group $I 4_1/a m d$ [origin 1] (No. 141) provided here, I finally solved this problem in GAP, as shown below:

gap> SGGenElemITA141O1:=[
>  [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0,0,0,1]],
>  [[-1, 0, 0, 1/2], [0, -1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]],
>  [[0, -1, 0, 0], [1, 0, 0, 1/2], [0, 0, 1, 1/4], [0,0,0, 1]],
>  [[-1, 0, 0, 1/2], [0,  1, 0,  0], [0,  0,  -1, 3/4], [0,0,0, 1]],
>  [[-1, 0, 0, 0], [0, -1, 0, 1/2], [0, 0, -1, 1/4], [0,0,0, 1]],
>  [[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]]
> ];;
gap> SGITA141O1:=AffineCrystGroupOnLeft(SGGenElemITA141O1);
<matrix group with 6 generators>
gap> TNGenElemSGITA141O1:=GeneratorsOfGroup(TranslationNormalizer(SGITA141O1));
[ [ [ 1, 0, 0, 1/2 ], [ 0, 1, 0, 1/2 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ], 
  [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ] ]
gap> List(TNGenElemSGITA141O1, x-> SGITA141O1^x=SGITA141O1);
[ true, true, true ]

# With the help of some custom Mathematica functions, obtain all possible translations in Mod 1 format:
# "TNGenElemSGITA141O1=[ [ [ 1, 0, 0, 1/2 ], [ 0, 1, 0, 1/2 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ], 
#   [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ] ];;"//StringReplace[#,{"\n "->"","["->"{","]"->"}",":="->"=",";"->""}]&//ToExpression;
# AffCrystGroupOnLeft[%];
# #[[1;;3,4]]&/@Select[%, # != IdentityMatrix[4]&]//Matrix2GAP

gap> transTNSGITA141O1:=[[0, 0, 1/2],
> [1/2, 1/2, 0],
> [1/2, 1/2, 1/2]];
[ [ 0, 0, 1/2 ], [ 1/2, 1/2, 0 ], [ 1/2, 1/2, 1/2 ] ]
gap> for i in SGGenElemITA141O1 do
>   for j in TNGenElemSGITA141O1 do
>     c:= i^j - i;
>     l:=c{[1..3]}{[1..3]};
>     t:=List(c{[1..3]}[4],x->FractionModOne(x)); 
>     # Print(l," ",l = Zero(IdentityMat(3)),"\n");
>     # Print(t," ",t =[0,0,0] or t in transTNGenElemSGITA227O1,"\n"); 
>     Print(l = Zero(IdentityMat(3)) and (t =[0,0,0] or t in transTNSGITA141O1)," ");
>   od;
> od;
true true true true true true true true true true true true true true true true true true

All elements of the group TNSGITA141O1 generated by TNGenElemSGITA141O1 will do the trick. Here, I checked for confirmation using all possible translations in Mod 1 format, i.e., the elements of transTNSGITA141O1.

For related discussions, see here.

POSTED BY: Hongyi Zhao
Posted 3 years ago

I learnt that space-groups operate in R3 and the elements of a space-group are (mostly) written as

g =( R, T ) , R being a Rotation( (3,3)matrix) and T a translation-(3)vector

g operates on a vector x as g.x = R.x +T .

and the composition law is

(R1,T1).(R2,T2) = ( R1.R2 , R2.T1 +T2 ).

All this in R3.

And

Ok, it could be like this : write every (3)vector in the form {x,y,z,1}. Then

um = gensSG141ITA1[[5]] um.{x, y, z, 1}

and conventionally

umrot = um[[1 ;; 3, 1 ;; 3]] umtrans = um[[1 ;; 3, 4]] umrot.{x, y, z} + umtrans

Is that the "procedure"?

Yes. Exactly.

What are the ideas (and procedures) to say that a (4,4)-matrix is an element of a space-group? How do you operate with a (4,4)-matrix on a (3)-vector?

And

Ok, I understand now how to decribe a space-group by (4,4)matrices. But what exactly is meant by generators?

See the description here:

enter image description here

This is essentially the same as above, but with (4,4) matrices. Then I think the fundamental translations are of interest.

DeleteDuplicates[Take[#, 3] & /@ (Last[Transpose[#]] & /@ gensSG141ITA1)]

But what now?

See the following checking on these fundamental translations:

In[17]:= (*
This is essentially the same as above, but with (4,4) matrices.
Then I think the fundamental translations are of interest. 
*)
DeleteDuplicates[Take[#, 3] & /@ (Last[Transpose[#]] & /@ gensSG141ITA1)]

Out[17]= {{0, 0, 0}, {1/2, 1/2, 1/2}, {0, 1/2, 1/4}, {1/2, 0, 3/4}}

In GAP, the following result is obtained:

gap> gensSG141ITA1:=[
>  [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0,0,0,1]],
>  [[-1, 0, 0, 1/2], [0, -1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]],
>  [[0, -1, 0, 0], [1, 0, 0, 1/2], [0, 0, 1, 1/4], [0,0,0, 1]],
>  [[-1, 0, 0, 1/2], [0,  1, 0,  0], [0,  0,  -1, 3/4], [0,0,0, 1]],
>  [[-1, 0, 0, 0], [0, -1, 0, 1/2], [0, 0, -1, 1/4], [0,0,0, 1]],
>  [[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]]
> ];;
gap> SG141ITA1:=AffineCrystGroupOnLeft(gensSG141ITA1);
<matrix group with 6 generators>

gap> CC:=[
>   [[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0,1]],
>   [[1, 0, 0, 0], [0, 1, 0, 1/2], [0, 0, 1, 1/4], [0,0,0,1]],
>   [[1, 0, 0, 1/2], [0, 1, 0, 0], [0, 0, 1, 3/4], [0,0,0,1]]
>   ];
[ [ [ 1, 0, 0, 1/2 ], [ 0, 1, 0, 1/2 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 1/2 ], [ 0, 0, 1, 1/4 ], [ 0, 0, 0, 1 ] ], 
  [ [ 1, 0, 0, 1/2 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 3/4 ], [ 0, 0, 0, 1 ] ] ]
gap> List(CC, x-> SG141ITA1^x=SG141ITA1);
[ true, false, false ]

So, only the first fundamental translation, i.e., [[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0,1]], can preserve the space group unchanged when conjugating on the space group with them.

Side remark: The 3 dimension affine group can be used to represent the 3 dimension space group based on the rotation group, a.k.a., point group and the Abelian group corresponding to the fundamental translations. The space group of a crystal splits as a semidirect product iff the space group is symmorphic, as described here. If not, generally speaking, the above process can be described by group expansion.

P.S.:

As described here:

The dimension of an affine space is defined as the dimension of the vector space of its translations. An affine space of dimension one is an affine line. An affine space of dimension 2 is an affine plane. An affine subspace of dimension n – 1 in an affine space or a vector space of dimension n is an affine hyperplane.

POSTED BY: Hongyi Zhao

Ok, I understand now how to decribe a space-group by (4,4)matrices. But what exactly is meant by generators?

In my opinion one has to determine the rotation (or whatever) group in the upper left half. This can be done by

nxtgens = 
  DeleteDuplicates[
   Transpose[MapAt[Function[x, {0, 0, 0, 1}], Transpose[#], 4]] & /@ 
    gensSG141ITA1];
MatrixForm /@ gensSG141ITA1
MatrixForm /@ nxtgens

newgroup = gengroupn[nxtgens];
newgroup // Length
MatrixForm /@ newgroup

This is essentially the same as above, but with (4,4) matrices. Then I think the fundamental translations are of interest.

DeleteDuplicates[Take[#, 3] & /@ (Last[Transpose[#]] & /@ gensSG141ITA1)]

But what now?

POSTED BY: Hans Dolhaine

Hello Zhao,

I still don't understand what you want. And I have difficulties to see what is going on.

I learnt that space-groups operate in R3 and the elements of a space-group are (mostly) written as

g =( R, T ) , R being a Rotation( (3,3)matrix) and T a translation-(3)vector

g operates on a vector x as g.x = R.x +T .

and the composition law is

(R1,T1).(R2,T2) = ( R1.R2 , R2.T1 +T2 ).

All this in R3. What are the ideas (and procedures) to say that a (4,4)-matrix is an element of a space-group? How do you operate with a (4,4)-matrix on a (3)-vector?

And yes, of course: if a group has infinite-many elements (like a translation-group) gengroupn will not come to an end.

P.S.

Ok, it could be like this : write every (3)vector in the form {x,y,z,1}. Then

um = gensSG141ITA1[[5]]
um.{x, y, z, 1}

and conventionally

umrot = um[[1 ;; 3, 1 ;; 3]]
umtrans = um[[1 ;; 3, 4]]
umrot.{x, y, z} + umtrans

Is that the "procedure"?

POSTED BY: Hans Dolhaine
Posted 3 years ago

Hi Hans Dolhaine,

Thank you for your wonderful code snippet.

I would like to add some additional comments:

  • You said the following:

    I must admit I do not understand at all your problem and what du want to achieve.

I mean C3 is a pure translation, aka, {1/2,1/2,1/2}, and it's also an invariant transformation of the corresponding space group discussed here, as shown by the following checking:

In[78]:= gensSG141ITA1={
 {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0,0,0,1}},
 {{-1, 0, 0, 1/2}, {0, -1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}},
 {{0, -1, 0, 0}, {1, 0, 0, 1/2}, {0, 0, 1, 1/4}, {0,0,0, 1}},
 {{-1, 0, 0, 1/2}, {0,  1, 0,  0}, {0,  0,  -1, 3/4}, {0,0,0, 1}},
 {{-1, 0, 0, 0}, {0, -1, 0, 1/2}, {0, 0, -1, 1/4}, {0,0,0, 1}},
 {{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}}
}; 

C3={{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0,1}};
Inverse[C3] . # . C3 -# &/@gensSG141ITA1;
AffineTransform[{#[[1;;3,1;;3]],#[[1;;3,4]]}//FractionalPart]&/@%;
TM=TransformationMatrix/@%

generalC3={{1, 0, 0, n1+ 1/2}, {0, 1, 0, n2+1/2}, {0, 0, 1, n3+1/2}, {0,0,0,1}};
Inverse[generalC3] . # . generalC3 -# &/@gensSG141ITA1;
AffineTransform[{#[[1;;3,1;;3]],#[[1;;3,4]]}//FractionalPart]&/@%//FullSimplify[#, Element[{n1, n2, n3}, Integers]]&;
TM==TransformationMatrix/@%

Out[82]= {{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 
   1}}, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0,
    0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0, 0, 0, 
   0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0, 0, 0, 0}, {0, 
   0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0, 0, 0, 0}, {0, 0, 0, 
   0}, {0, 0, 0, 0}, {0, 0, 0, 1}}}

Out[86]= True

Also see the following GAP code snippet for further confirmation/verification of this fact:

gap> gensSG141ITA1:=[
>  [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0,0,0,1]],
>  [[-1, 0, 0, 1/2], [0, -1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]],
>  [[0, -1, 0, 0], [1, 0, 0, 1/2], [0, 0, 1, 1/4], [0,0,0, 1]],
>  [[-1, 0, 0, 1/2], [0,  1, 0,  0], [0,  0,  -1, 3/4], [0,0,0, 1]],
>  [[-1, 0, 0, 0], [0, -1, 0, 1/2], [0, 0, -1, 1/4], [0,0,0, 1]],
>  [[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]]
> ];;
gap> SG141ITA1:=AffineCrystGroupOnLeft(gensSG141ITA1);
<matrix group with 6 generators>
gap> C3:=[[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0,1]];
[ [ 1, 0, 0, 1/2 ], [ 0, 1, 0, 1/2 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ]
gap> SG141ITA1^C3=SG141ITA1;
true
gap> AffineCrystGroupOnLeft(List(GeneratorsOfGroup(SG141ITA1),x-> C3^-1 * x * C3 ))=SG141ITA1;
true

And I just want to find such transformations.

  • gensSG141ITA1 are the generators of space group I 41/a m d [origin 1] (No. 141), corresponding to the data given here.

The 3 * 3 sub-matrices resided in the up-left portion are the corresponding point group elements. For your information: the following results, given by GAP, are consistent with the results of the approach you used here:

    gap> gensSG141ITA1:=[
    >  [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0,0,0,1]],
    >  [[-1, 0, 0, 1/2], [0, -1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]],
    >  [[0, -1, 0, 0], [1, 0, 0, 1/2], [0, 0, 1, 1/4], [0,0,0, 1]],
    >  [[-1, 0, 0, 1/2], [0,  1, 0,  0], [0,  0,  -1, 3/4], [0,0,0, 1]],
    >  [[-1, 0, 0, 0], [0, -1, 0, 1/2], [0, 0, -1, 1/4], [0,0,0, 1]],
    >  [[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]]
    > ];;
    gap> SG141ITA1:=AffineCrystGroupOnLeft(gensSG141ITA1);
    <matrix group with 6 generators>
    gap> PG141ITA1:=PointGroup(SG141ITA1);
    <matrix group of size 16 with 4 generators>
    gap> GeneratorsOfGroup(PG141ITA1);
    [ [ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, 1 ] ], [ [ 0, -1, 0 ], [ 1, 0, 0 ], [ 0, 0, 1 ] ], [ [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, -1 ] ], 
      [ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, -1 ] ] ]
    gap> IdGroup(PG141ITA1);
    [ 16, 11 ]
    gap> ccl:=ConjugacyClasses(PG141ITA1);
    [ [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]^G, [ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, 1 ] ]^G, [ [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, -1 ] ]^G, 
      [ [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]^G, [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, -1 ] ]^G, [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, 1 ] ]^G, 
      [ [ 0, -1, 0 ], [ 1, 0, 0 ], [ 0, 0, -1 ] ]^G, [ [ 0, -1, 0 ], [ 1, 0, 0 ], [ 0, 0, 1 ] ]^G, [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, -1 ] ]^G, 
      [ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, -1 ] ]^G ]
    gap> Size(ccl);
    10
    gap> List(ccl, x-> [TraceMat(Representative(x)), Size(x)]);
    [ [ 3, 1 ], [ -1, 1 ], [ -1, 2 ], [ 1, 2 ], [ -1, 2 ], [ 1, 2 ], [ -1, 2 ], [ 1, 2 ], [ 1, 1 ], [ -3, 1 ] ]
  • The space group is an infinite affine matrix group, so, your gengroupn function will fall into an infinite loop:

    In[1]:= gengroupn[ge1_] := Module[{}, ge = ge1;
      ne = Length[ge];
      l1 = 1;
      ne = Length[ge];
      While[l1 <= ne, l2 = 1;
       While[l2 <= ne, res = FullSimplify[Together[ge[[l1]] . ge[[l2]]]];
        If[! MemberQ[ge, res], ne++; AppendTo[ge, res]];
        l2++];
       l1++];
      ge]
    
    In[2]:= gensSG141ITA1 = {{{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 
         0}, {0, 0, 0, 1}}, {{-1, 0, 0, 1/2}, {0, -1, 0, 1/2}, {0, 0, 1, 
         1/2}, {0, 0, 0, 1}}, {{0, -1, 0, 0}, {1, 0, 0, 1/2}, {0, 0, 1, 
         1/4}, {0, 0, 0, 1}}, {{-1, 0, 0, 1/2}, {0, 1, 0, 0}, {0, 0, -1, 
         3/4}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, -1, 0, 1/2}, {0, 0, -1, 
         1/4}, {0, 0, 0, 1}}, {{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 
         1/2}, {0, 0, 0, 1}}};
    
    In[3]:= gengroupn[gensSG141ITA1]
    
    Out[3]= $Aborted
    

A possible method is to find the fractional part of the shifted part modulo 1 as the representative elements of the group. But I still don't know how to generate such a group using Wolfram language.

Regards, Zhao

POSTED BY: Hongyi Zhao

Hello Hongyi Zhao,

I must admit I do not understand at all your problem and what du want to achieve. Looking at

gensSG141ITA1 = {{{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 
     1}}, {{-1, 0, 0, 1/2}, {0, -1, 0, 1/2}, {0, 0, 1, 1/2}, {0, 0, 0,
      1}}, {{0, -1, 0, 0}, {1, 0, 0, 1/2}, {0, 0, 1, 1/4}, {0, 0, 0, 
     1}}, {{-1, 0, 0, 1/2}, {0, 1, 0, 0}, {0, 0, -1, 3/4}, {0, 0, 0, 
     1}}, {{-1, 0, 0, 0}, {0, -1, 0, 1/2}, {0, 0, -1, 1/4}, {0, 0, 0, 
     1}}, {{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0, 0, 0,1}}};
MatrixForm /@ gensSG141ITA1

I noticed that the first 3 entries in the fourth line are always zero. So I got the idea that the (3,3)-matrices in the upper left portion might be of interest. Therefore I isolated them and deleted duplicates.

newmat = DeleteDuplicates[#[[1 ;; 3, 1 ;; 3]] & /@ gensSG141ITA1];
MatrixForm /@ newmat
Length[newmat]

That there are duplicates (the IdentityMatrix occurs twice) already shows that these (3,3)-matrices are not likely to be of significance. And these matrices do not form a group: there is at least one product that is not member of the set of matrices (newmat)

i = 2; j = 3;
MemberQ[newmat, newmat[[i]].newmat[[j]]]

Apply the following procedure to construct a group from generating elements (matrices)

gengroupn[ge1_] := Module[{},
  ge = ge1;
  ne = Length[ge];
  l1 = 1;
  ne = Length[ge];
  While[l1 <= ne,
   l2 = 1;
   While[l2 <= ne,
    res = FullSimplify[Together[ge[[l1]].ge[[l2]]]];
    If[! MemberQ[ge, res],
     ne++; AppendTo[ge, res]];
    l2++];
   l1++];
  ge
  ]

and

gg = gengroupn[newmat];
ne = Length[gg]
MatrixForm /@ gg

Interesting enough the resulting group is hermitian: Transpose[g] == Inverse[g]

gginv = Inverse /@ gg;
gginv - Transpose /@ gg

Now I determined the classes of conjugated elements. There are two types of classes. 4 which contain just one element and six containing two elements

kL = {{gg[[1]]}};
ind = Range[Length[gg]];
nk = 1;
Do[
 If[ind[[j1]] =!= 0,
  nk = nk + 1;
  k1 = {};                                  (*start class with empty \
set  *)
  t1 = gg[[j1]];                   (*get group element *) 
  AppendTo[k1, t1];
  ind[[j1]] = 0;
  Do[                                               (* 
   look for a conjugated element  *)
   If[
    ind[[j2]] =!= 0,
    t2 = gg[[j2]];     (* get element   *)
    pt = 2;
    flag = 0;
    While[flag == 0 && pt <= Length[gg],
     t3 = gg[[pt]];
     If[t3.t2 == t1.t3,
      flag = 1;
      ind[[j2]] = 0;
      AppendTo[k1, t2]];
     pt++
     ]
    ],
   {j2, j1 + 1, Length[gg]}];
  AppendTo[kL, k1]
  ],
 {j1, 2, Length[gg]}]

ColumnForm[Map[MatrixForm, #] & /@ kL]
Map[Tr, #] & /@ kL

The classes may be constructed with a considerable shorter method

kL2 = DeleteDuplicates[Function[x, Union[Transpose[#].x.# & /@ gg]] /@ gg];

ColumnForm[Map[MatrixForm, #] & /@ kL2]
Map[Tr, #] & /@ kL2

The elements of the classes of Length one form a (sub)group of gg. Get all elements of classes with length 1

klen1 = Flatten[Select[kL, Length[#] == 1 &], 1];
MatrixForm /@ klen1

and take these as generating elements

gsub = gengroupn[klen1];
Length[gsub]
MatrixForm /@ gsub

giving the set klen1 again. So klen1 is a subgroup of gg.

I am afraid (and pretty sure) that will not help you with your problem, but I just wanted to let you know.

POSTED BY: Hans Dolhaine
Posted 3 years ago

Hi Hans Dolhaine,

Sorry, my description is not clear enough. I don't mean the command run by you gives "zero-matrices". Instead, I mean the result of subtraction of these two affine transformations has the following feature: the linear part is "zero-matrices" and the translation part is integer component vectors. As shown below:

 In[57]:= gensSG141ITA1={
 {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0,0,0,1}},
 {{-1, 0, 0, 1/2}, {0, -1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}},
 {{0, -1, 0, 0}, {1, 0, 0, 1/2}, {0, 0, 1, 1/4}, {0,0,0, 1}},
 {{-1, 0, 0, 1/2}, {0,  1, 0,  0}, {0,  0,  -1, 3/4}, {0,0,0, 1}},
 {{-1, 0, 0, 0}, {0, -1, 0, 1/2}, {0, 0, -1, 1/4}, {0,0,0, 1}},
 {{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}}
}; 
C3={{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0,1}};

Inverse[C3] . # . C3 -# &/@gensSG141ITA1
AffineTransform[{#[[1;;3,1;;3]],#[[1;;3,4]]}//FractionalPart]&/@%;
TransformationMatrix/@%

Out[59]= {{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 
   0}}, {{0, 0, 0, -1}, {0, 0, 0, -1}, {0, 0, 0, 0}, {0, 0, 0, 
   0}}, {{0, 0, 0, -1}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 
   0}}, {{0, 0, 0, -1}, {0, 0, 0, 0}, {0, 0, 0, -1}, {0, 0, 0, 
   0}}, {{0, 0, 0, -1}, {0, 0, 0, -1}, {0, 0, 0, -1}, {0, 0, 0, 
   0}}, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}}

Out[61]= {{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 
   1}}, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0,
    0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0, 0, 0, 
   0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0, 0, 0, 0}, {0, 
   0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0, 0, 0, 0}, {0, 0, 0, 
   0}, {0, 0, 0, 0}, {0, 0, 0, 1}}}
POSTED BY: Hongyi Zhao

On my machine (version 7.0) this

Inverse[C3] . # . C3 -# &/@gensSG141ITA1;

doesn't produce "zero-matrices" .

POSTED BY: Hans Dolhaine
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard