> < ^ Date: Mon, 12 Sep 1994 20:51:00 -0700
> < ^ From: Jacob Hirbawi <hirbawi@commquest.com >
^ Subject: IT type tables for space groups

I am glad to see that the new release of GAP has tables of crystallographic
groups and associated structures. Thanks to the developers for a great piece
of work. The manual also mentions that further functions may be added at a
later time. Here are a couple of items that would be nice to have :

(1) A function that for a given space group gives an IT type table
for the fixed points, symmetry operation types, ... .

(2) A list of centering matrices.

The second item might already exist in this release, but I couldn't find it.
The first is outlined in the book "Crystallographic Groups in Four Dimensional
Space". I actually tried to follow this outline but stumbled at the last, and
probably trickiest, step. I can get the equations for the fixed points and
determine the ones in the unit cell; but collecting this data into IT type
format seems a bit more involved.

In case anyone's interested here's the code I tried along with the example
described in the above book :

```################################################################################
FixedPoints:=function(sgrp)
local data,type,dim,pgrp,elms,mats,invs,nmats,m,v,umats,points,u,w;
```

data:=rec();
type:=sgrp.crSpaceGroupType;
dim:=type;

# presentation and elements of the (finite) point group
pgrp:=FpGroupQClass(type,type,type);
elms:=Elements(pgrp);

# representatives of space group operations
m:=Length(sgrp.generators);
elms:=List(elms,x->MappedWord(x,pgrp.generators,sgrp.generators{[1..m-dim]}));

# non-translation part of space group operations
mats:=List(elms,mat->mat{[1..dim]}{[1..dim]});

```# invariants of the operations : order,trace, determinant, ...
# these can be used to get the Hermann symbol,IT symbol, ... of the operation
invs:=List(mats,
s->[OrderMat(s),
TraceMat(s),
DeterminantMat(s),
Sum(Combinations([1..dim],2),
x->s[x][x]*s[x][x]-s[x][x]*s[x][x])]);
data.invariants:=invs;

# normalize translation part to be in unit cell 0 <= ti < 1
nmats:=Copy(elms);
for m in nmats do
for v in m{[1..dim]} do
w:=v[dim+1]-Int(v[dim+1]);
if w<0      then w:=w+1; fi;
if IsInt(w) then w:=0; fi;
v[dim+1]:=w;
od;
od;
```

# solve m*x + u = x for x; this is done by using 2*dim + 1 variables
# {x1,...,xdim,t,u1,...,udim}; the result "umats" is a dim x dim+1 matrix
# with the i-th row expressing xi as a linear combinations of t,u1,...,udim.
umats:=[];
for m in nmats do
v:=TransposedMat(Concatenation(TransposedMat(m-m^0),TransposedMat(m^0)));
TriangulizeMat(v);
od;
data.equations:=umats;

# generate fixed points in unit cell.
# This uses the above equations and by trial an error on a set of ui's
# in the range -2 <= ui <= 2 finds which points are in the unit cell.
# this approach is probably not the best, but it does seem to work for
# the examples I tried.
points:=[];
for m in umats do
w:=[];
for u in Tuples([-2..2],dim) do
v:=m*Concatenation(,u);
if ForAll(v,x-> 0<=x and x<1) then AddSet(w,v);fi;
od;
od;
data.points:=points;

return data;

```end;
################################################################################

################################################################################
gap> example4:=FixedPoints( SpaceGroup(4,32,1,2,2) );;

# the "invariants" here correspond to the order of the matrix,its trace,
# its  determinant,and one more invariant needed for n>3
gap> PrintArray( example4.invariants );
[ [   1,   4,   1,   6 ],   # identity 1111
[   4,   0,   1,   2 ],   # 44
[   4,   0,   1,   2 ],   # 44
[   2,  -4,   1,   6 ],   # inversion 2222
[   4,   0,   1,   2 ],   # 44
[   4,   0,   1,   2 ],   # 44
[   4,   0,   1,   2 ],   # 44
[   4,   0,   1,   2 ] ]  # 44

# this corresponds to the equations for the fixed points of (S2,s2) in the book
gap> PrintArray( example4.equations );
[ [  -1/2,     0,  -1/2,  -1/2,     1 ],     # x = -1/2 - u2/2 - u3/2 + u4
[   1/2,     0,   1/2,   1/2,     0 ],     # y =  1/2 + u2/2 + u3/2
[     0,     0,  -1/2,   1/2,     0 ],     # z = -u2/2 + u3/2
[  -1/2,  -1/2,  -1/2,     0,     1 ] ]    # w = -1/2 - u1/2 - u2/2 + u4

# this corresponds to the fixed points in the unit cell of (S2,s2) in the book
gap> PrintArray( example4.points );
[ [    0,    0,  1/2,    0 ],
[    0,    0,  1/2,  1/2 ],
[  1/2,  1/2,    0,    0 ],
[  1/2,  1/2,    0,  1/2 ] ]

# the equations for the centers of inversion -- (S3,s3) in the book
gap> PrintArray( example4.equations );
[ [    0,  1/2,    0,    0,    0 ],
[    0,    0,  1/2,    0,    0 ],
[    0,    0,    0,  1/2,    0 ],
[    0,    0,    0,    0,  1/2 ] ]

# the fixed points in the unit cell for the point inversion (S3,s3)
# 12 of these 16 are fixed by other ("larger") operations
gap> PrintArray( example4.points );
[ [    0,    0,    0,    0 ],
[    0,    0,    0,  1/2 ],
[    0,    0,  1/2,    0 ],
[    0,    0,  1/2,  1/2 ],
[    0,  1/2,    0,    0 ],
[    0,  1/2,    0,  1/2 ],
[    0,  1/2,  1/2,    0 ],
[    0,  1/2,  1/2,  1/2 ],
[  1/2,    0,    0,    0 ],
[  1/2,    0,    0,  1/2 ],
[  1/2,    0,  1/2,    0 ],
[  1/2,    0,  1/2,  1/2 ],
[  1/2,  1/2,    0,    0 ],
[  1/2,  1/2,    0,  1/2 ],
[  1/2,  1/2,  1/2,    0 ],
[  1/2,  1/2,  1/2,  1/2 ] ]

# of the 8 operations in the group there are only 5 distinct fixed point sets:
# this is consistent with S1,S2=S4,S3,S5=S7,S6=S8 in the book.
gap> Length(Set(example4.points));
5
################################################################################
```

Jacob Hirbawi <JcbHrb@CERF.net>

> < [top]