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
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