> < ^ Date: Wed, 20 Jul 1994 13:31:00 -0400
> < ^ From: Franz Gaehler <gaehler@itap.physik.uni-stuttgart.de >
< ^ Subject: space groups, and a bug

[Almost all mailer daemons rejected this message originally,
because the 'From:' line contained a single unbalanced '"'.
Apologies to those who have more forgiving mailer daemons,
and see this message now for the second time. mS]

Der GAPers,

I have been trying to do some space group computations with GAP,
and ran into what seems to be a bug (gap3r3p0 on IBM RS/6000).
Since infinite matrix groups are not supported, the only way to
deal with space groups seemed to be to represent them as finitely
presented groups. I was interested in the subgroup structure of
some 6D space group, whose point group is isomorphic to A5.
In order to make the problem simpler, I have divided all groups
by a translation sublattice common to all space groups I wanted
to consider. Here is the session:

```gap> f := FreeGroup("A","B","t1","t2","t3","t4","t5","t6");;
gap>
gap> A :=f.1;; B := f.2;;
gap> t1:=f.3;; t2:=f.4;; t3:=f.5;; t4:=f.6;; t5:=f.7;; t6:=f.8;;
gap>
gap> # relators between rotations
gap>
gap> rel:=[ A^5, B^3, (A*B)^2 ];;
gap>
gap> # add relators between translations
gap>
gap> Append(rel,
>   [(t1*t2)/(t2*t1), (t1*t3)/(t3*t1), (t1*t4)/(t4*t1),
>    (t1*t5)/(t5*t1), (t1*t6)/(t6*t1),
>    (t2*t3)/(t3*t2), (t2*t4)/(t4*t2),
>    (t2*t5)/(t5*t2), (t2*t6)/(t6*t2),
>    (t3*t4)/(t4*t3), (t3*t5)/(t5*t3), (t3*t6)/(t6*t3),
>    (t4*t5)/(t5*t4), (t4*t6)/(t6*t4), (t5*t6)/(t6*t5)]);;
gap>
gap> # add relators beween rotations and translations
gap>
gap> Append(rel,
>   [(A*t1)/(t1*A), (A*t2)/(t3*A), (A*t3)/(t4*A),
>    (A*t4)/(t5*A), (A*t5)/(t6*A), (A*t6)/(t2*A),
>    (B*t1)/(t2*B), (B*t2)/(t3*B), (B*t3)/(t1*B),
>    (B*t4)/(t6*B), (t4*B*t5)/(B), (t5*B*t6)/(B)]);;
gap>
gap> # divide by sublattice
gap>
gap> Append(rel,
>   [t2*t3*t4*t5*t6,     (t1*t3*t6)/(t4*t5), (t1*t4*t2)/(t5*t6),
>    (t1*t5*t3)/(t6*t2), (t1*t6*t4)/(t2*t3), (t1*t2*t5)/(t3*t4)]);;
gap>
gap> # define the big, symmorphic space group
gap>
gap> spg:=f/rel;;
gap>
gap> A :=spg.1;; B :=spg.2;;
gap> t1:=spg.3;; t2:=spg.4;; t3:=spg.5;; t4:=spg.6;; t5:=spg.7;; t6:=spg.8;;
gap>
gap> # here are some (sub-) space groups having the translation sublattice
gap> # divided out above
gap>
gap> ug0:=Subgroup(spg, [A, B]);;
gap> ug1:=Subgroup(spg, [t1*t3^-1*t5*A, B]);;
gap> ug2:=Subgroup(spg, [t1^2*t3^-2*t5^2*A, B]);;
gap> ug3:=Subgroup(spg, [t1^3*t3^-3*t5^3*A, B]);;
gap> ug4:=Subgroup(spg, [t1^4*t3^-4*t5^4*A, B]);;
gap>
gap> # all these subgroups have index 125 in spg
gap>
gap> Index(spg, ug0);
125
gap>
gap> # are there any groups between spg and ug0 ?
gap>
gap> lst:=LowIndexSubgroupsFpGroup(spg, ug0, 25);
[ Subgroup( Group( A, B, t1, t2, t3, t4, t5, t6 ), [ A, t1 ] ) ]
gap>
gap> # this is wrong, as is the following result!
gap>
gap> List(lst,h->Index(spg,h));
[ 1 ]
gap>
gap> # correct is:
gap>
gap> Index(spg, Subgroup(spg, [ A, t1 ]) );
300
gap>
gap> Size(spg); Size(ug0); Size( Subgroup(spg, [ A, t1 ]));
7500
60
25
```

Anyone know what's going on here? I had been asking for subgroups
of index (at most) 25 in spg, not of order 25!

How do other people deal with space groups? Finitely presented
groups do not seem to be ideal. When I do something like

LowIndexSubgroupsFpGroup(spg, TrivialSubgroup(spg), 125);

it takes ages (after some 30 hours (on an IBM RS/6000) it was still
not finished, so I stopped it).

Another option would be to represent space group elements by
augmented matrices. The problem of infinite matrix groups could
be circumvented by dividing out a suitable sublattice. The
translation part of augmented matrices then would have to
be taken modulo a lattice. If matrices are expressed with respect
to a lattice basis of that lattice, the translation components
had to be taken modulo 1, at least when comparing matrices,
possibly also in matrix multiplication, in order to prevent
elements from growing indefinitely.

Perhaps even better would be to set up a group of translations as
Z^n modulo some sublattice L of Z^n (possibly with L=m*Z^n).
If representatives of such equivalence classes could be represented
as integral vectors modulo L, one would have a natural action
of a matrix point group on such translation vectors. One could then
build a semi-direct product of a finite matrix (point) group with
such a finite translation group, and consider suitable subgroups
thereof.

What would be involved in using such a scheme? Implementation of
a new domain of 'augmented matrices modulo a lattice', or a new
domain of translations in 'Z^n modulo L'? Would this be feasible?
How could this be implemented? And would it be efficient?

Thanks for any suggestions.

Best regards, Franz Gaehler

> < [top]