Closed hongyi-zhao closed 2 years ago
The groups are not isomorphic because:
gap> GroupHomology(g1,1); [ 2, 6 ] gap> GroupHomology(g2,1); [ 2, 2 ]
See https://www.him.uni-bonn.de/fileadmin/him/Lecture_Notes/lect3.pdf
Sorry, I originally wanted to write in the following form, but due to my carelessness at that time, I wrote in the form you saw:
gap> g1:=Image(IsomorphismPcpGroup(SpaceGroupBBNWZ(3,144)));
Pcp-group with orders [ 3, 0, 0, 0 ]
gap> g2:=Image(IsomorphismPcpGroup(SpaceGroupIT(3,145)));
Pcp-group with orders [ 3, 0, 0, 0 ]
gap> GroupHomology(g1,1);
[ 3, 0 ]
gap> GroupHomology(g2,1);
[ 3, 0 ]
Do you mean that the GroupHomology
command can verify isomorphism in this way? If so, the problem disuccessed here and here can be solved as follows:
gap> pcpBieb:=Filtered([1..219], x -> IsAlmostBieberbachGroup(SpaceGroupPcpGroup(3,x)));
[ 1, 4, 7, 9, 19, 33, 34, 76, 142, 165 ]
gap> sgBieb:=Filtered([1..230], x-> IsAlmostBieberbachGroup(Image(IsomorphismPcpGroup(SpaceGroupBBNWZ(3,x)))));
[ 1, 4, 7, 9, 19, 29, 33, 76, 78, 144, 145, 169, 170 ]
gap> for i in pcpBieb do
> ghpcp:=GroupHomology(SpaceGroupPcpGroup(3,i),1);
> for j in sgBieb do
> ghsg:=GroupHomology(Image(IsomorphismPcpGroup(SpaceGroupBBNWZ(3,j))),1);
> if ghsg = ghpcp then
> Print("SpaceGroupPcpGroup (3, ", i,") is isomorphic to SpaceGroupBBNWZ (3, ", j,")\n");
> fi;
> od;
> od;
SpaceGroupPcpGroup (3, 1) is isomorphic to SpaceGroupBBNWZ (3, 1)
SpaceGroupPcpGroup (3, 4) is isomorphic to SpaceGroupBBNWZ (3, 4)
SpaceGroupPcpGroup (3, 4) is isomorphic to SpaceGroupBBNWZ (3, 29)
SpaceGroupPcpGroup (3, 7) is isomorphic to SpaceGroupBBNWZ (3, 7)
SpaceGroupPcpGroup (3, 9) is isomorphic to SpaceGroupBBNWZ (3, 9)
SpaceGroupPcpGroup (3, 19) is isomorphic to SpaceGroupBBNWZ (3, 19)
SpaceGroupPcpGroup (3, 33) is isomorphic to SpaceGroupBBNWZ (3, 4)
SpaceGroupPcpGroup (3, 33) is isomorphic to SpaceGroupBBNWZ (3, 29)
SpaceGroupPcpGroup (3, 34) is isomorphic to SpaceGroupBBNWZ (3, 33)
SpaceGroupPcpGroup (3, 76) is isomorphic to SpaceGroupBBNWZ (3, 76)
SpaceGroupPcpGroup (3, 76) is isomorphic to SpaceGroupBBNWZ (3, 78)
SpaceGroupPcpGroup (3, 142) is isomorphic to SpaceGroupBBNWZ (3, 144)
SpaceGroupPcpGroup (3, 142) is isomorphic to SpaceGroupBBNWZ (3, 145)
SpaceGroupPcpGroup (3, 165) is isomorphic to SpaceGroupBBNWZ (3, 169)
SpaceGroupPcpGroup (3, 165) is isomorphic to SpaceGroupBBNWZ (3, 170)
And also the isomorphism problem between a self created crystallographic space group from scratch and the corresponding ones provided by cryst or crystcat packages can be verified as follows:
gap> GenSG227Left:=[[[0, 1, 0, 0], [1, 0, 0, 0], [-1, -1, -1, 0], [0, 0, 0, 1]],
> [[-1, -1, -1, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]],
> [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [1, 1, 1, 1/4], [0, 0, 0, 1]],
> [[0, 0, 1, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1]],
> [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [0, 0, -1, 1/4], [0, 0, 0, 1]]];;
gap>
gap> SG227Left:=AffineCrystGroupOnLeft(GenSG227Left);
<matrix group with 5 generators>
gap> GroupHomology(Image(IsomorphismPcpGroup(SG227Left)),1);
[ 2, 2 ]
gap> GroupHomology(SpaceGroupOnLeftBBNWZ(3,227),1);
[ 2, 2 ]
gap> GroupHomology(Image(IsomorphismPcpGroup(SpaceGroupIT(3,227))),1);
[ 2, 2 ]
However, this method seems to be only a necessary condition for isomorphism between two space groups as shown below, so it cannot be used to identify the accurate/explicit Isomorphism:
gap> hgsg:=List([1..230], x-> GroupHomology(Image(IsomorphismPcpGroup(SpaceGroupBBNWZ(3,x))),1));;
gap> Length(AsSet(hgsg));
31
But if we consider the full isomorphic Pcp-group information as shown below, it should really indicate the isomorphism between GenSG227Left
and SpaceGroupOnLeftBBNWZ(3,227)
in this case:
gap> GenSG227Left:=[[[0, 1, 0, 0], [1, 0, 0, 0], [-1, -1, -1, 0], [0, 0, 0, 1]],
> [[-1, -1, -1, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]],
> [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [1, 1, 1, 1/4], [0, 0, 0, 1]],
> [[0, 0, 1, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1]],
> [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [0, 0, -1, 1/4], [0, 0, 0, 1]]];;
gap>
gap> SG227Left:=AffineCrystGroupOnLeft(GenSG227Left);
<matrix group with 5 generators>
gap> Image(IsomorphismPcpGroup(SG227Left));
Pcp-group with orders [ 2, 2, 3, 2, 2, 0, 0, 0 ]
gap> Image(IsomorphismPcpGroup(SpaceGroupOnLeftBBNWZ(3,227)));
Pcp-group with orders [ 2, 3, 2, 2, 2, 0, 0, 0 ]
It seems that all my above statements on the accurate/explicit isomorphism determination between two different space groups are wrong. And for this problem, Eick, Bettina b.eick@tu-braunschweig.de told me the following point of view:
Dear Hongyi Zhao,
in general, testing isomorphism of infinite groups is algorithmically a difficult problem.
I think that in the case of 3-dimensional space groups testing isomorphism is a decidable problem, but I am not aware of an implementation.
Best wishes, Bettina
In addition, I've just found this paper with the title Distinguishing crystallographic groups by their finite quotients, which may be related to the problem discussed here. Although this looks like an easy approach towards distinguishing the groups, an explicit isomorphism still needs to be found then.
Side remark, it seems the method mentioned here, i.e., the Cc-groups (short for "cocyclic groups") method obtained by the cohomology analysis may be a potential feasible method in dealing with this kind of difficulty.
Homology is an invariant so can only be used to show that two space groups are not isomorphic. The following commands are enough for you to decided isomorphism between 3-dimensional Bieberbach groups.
gap> pcpBieb:=Filtered([1..219], x -> IsAlmostBieberbachGroup(SpaceGroupPcpGroup(3,x)));;
gap> inv:=function(k);
> return List([1..3],i->GroupHomology(SpaceGroup(3,k),i));
> end;;
gap> C:=Classify(pcpBieb,inv);
[ [ 1 ], [ 4 ], [ 7 ], [ 9 ], [ 19 ], [ 33 ], [ 34 ], [ 76 ], [ 142 ],
[ 165 ] ]
gap> #So all 10 Bieberbach groups are distinct (up to isomorphism)
gap>
gap> sgBieb:=Filtered([1..230], x-> IsAlmostBieberbachGroup(Image(IsomorphismPcpGroup(SpaceGroupBBNWZ(3,x)))));;
gap> inv2:=function(k);
> return List([1..3],i->GroupHomology(SpaceGroupBBNWZ(3,k),i));
> end;;
gap> C:=Classify(sgBieb,inv2);
[ [ 1 ], [ 4 ], [ 7 ], [ 9 ], [ 19 ], [ 29 ], [ 33 ], [ 76, 78 ],
[ 144, 145 ], [ 169, 170 ] ]
gap> #So 76 and 78 are isomorphic, 144 and 145 are isomorphic, 169,170 are isomorphic
Homology is an invariant so can only be used to show that two space groups are not isomorphic. The following commands are enough for you to decided isomorphism between 3-dimensional Bieberbach groups.
I try to analyze GroupHomology
data of all 3-dimensional space groups as follows:
gap> ghSGData:=[];;
gap> for i in [1..230] do
> Add(ghSGData,List([1..3], x->GroupHomology(SpaceGroupBBNWZ(3, i), x)));
> od;;
gap> Length(Unique(ghSGData));
183
gap> inv2:=function(k);
> return List([1..3], i->GroupHomology(SpaceGroupBBNWZ(3,k),i));
> end;;
gap> ghcls:=Classify([1..230],inv2);
[ [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ], [ 8 ], [ 9 ], [ 10 ], [ 11, 13 ], [ 12 ], [ 14 ], [ 15 ], [ 16 ], [ 17 ], [ 18 ], [ 19 ], [ 20 ], [ 21 ],
[ 22 ], [ 23 ], [ 24, 91, 95 ], [ 25 ], [ 26, 27, 28, 39 ], [ 29 ], [ 30, 34 ], [ 31, 36, 45 ], [ 32 ], [ 33 ], [ 35, 38 ], [ 37, 40, 46 ], [ 41 ], [ 42 ], [ 43 ],
[ 44 ], [ 47 ], [ 48, 50 ], [ 49, 51, 67 ], [ 52 ], [ 53, 59, 63, 72 ], [ 54, 57, 73 ], [ 55 ], [ 56, 62 ], [ 58 ], [ 60 ], [ 61 ], [ 64 ], [ 65 ], [ 66, 74 ],
[ 68 ], [ 69 ], [ 70 ], [ 71 ], [ 75 ], [ 76, 78 ], [ 77 ], [ 79 ], [ 80 ], [ 81 ], [ 82 ], [ 83 ], [ 84 ], [ 85 ], [ 86 ], [ 87 ], [ 88 ], [ 89 ], [ 90 ], [ 92, 96 ],
[ 93 ], [ 94 ], [ 97 ], [ 98 ], [ 99 ], [ 100 ], [ 101 ], [ 102 ], [ 103, 108 ], [ 104 ], [ 105 ], [ 106 ], [ 107 ], [ 109 ], [ 110 ], [ 111, 115, 124, 129, 140 ],
[ 112, 138 ], [ 113 ], [ 114 ], [ 116 ], [ 117, 118 ], [ 119 ], [ 120, 130 ], [ 121 ], [ 122 ], [ 123 ], [ 125 ], [ 126 ], [ 127 ], [ 128 ], [ 131 ], [ 132 ], [ 133 ],
[ 134 ], [ 135 ], [ 136 ], [ 137 ], [ 139 ], [ 141 ], [ 142 ], [ 143 ], [ 144, 145 ], [ 146 ], [ 147 ], [ 148 ], [ 149 ], [ 150 ], [ 151, 153, 178, 179 ], [ 152, 154 ],
[ 155 ], [ 156 ], [ 157 ], [ 158 ], [ 159 ], [ 160 ], [ 161 ], [ 162 ], [ 163 ], [ 164, 192, 193, 194 ], [ 165 ], [ 166 ], [ 167 ], [ 168 ], [ 169, 170 ], [ 171, 172 ],
[ 173 ], [ 174 ], [ 175 ], [ 176 ], [ 177 ], [ 180, 181 ], [ 182 ], [ 183 ], [ 184, 185, 186 ], [ 187 ], [ 188 ], [ 189 ], [ 190 ], [ 191 ], [ 195 ], [ 196 ], [ 197 ],
[ 198 ], [ 199 ], [ 200 ], [ 201 ], [ 202 ], [ 203 ], [ 204 ], [ 205 ], [ 206 ], [ 207 ], [ 208 ], [ 209 ], [ 210 ], [ 211 ], [ 212, 213 ], [ 214 ], [ 215, 226 ],
[ 216 ], [ 217 ], [ 218 ], [ 219 ], [ 220 ], [ 221 ], [ 222 ], [ 223 ], [ 224 ], [ 225 ], [ 227 ], [ 228 ], [ 229 ], [ 230 ] ]
gap> Length(ghcls);
183
gap> Filtered(ghcls, x-> Size(x) >1);
[ [ 11, 13 ], [ 24, 91, 95 ], [ 26, 27, 28, 39 ], [ 30, 34 ], [ 31, 36, 45 ], [ 35, 38 ], [ 37, 40, 46 ], [ 48, 50 ], [ 49, 51, 67 ], [ 53, 59, 63, 72 ],
[ 54, 57, 73 ], [ 56, 62 ], [ 66, 74 ], [ 76, 78 ], [ 92, 96 ], [ 103, 108 ], [ 111, 115, 124, 129, 140 ], [ 112, 138 ], [ 117, 118 ], [ 120, 130 ], [ 144, 145 ],
[ 151, 153, 178, 179 ], [ 152, 154 ], [ 164, 192, 193, 194 ], [ 169, 170 ], [ 171, 172 ], [ 180, 181 ], [ 184, 185, 186 ], [ 212, 213 ], [ 215, 226 ] ]
As you can see, there are only 183 unique sets of data obtained here, which is less than the number of affine space group types (219 in three dimensions) and crystallographic space group types (230 in three dimensions). Any hints for this result?
In addition, there are so many space groups are classified in the same isomorphic type, so how can I decide the exact isomorphism among 230 3-dimensional spaces groups?
gap> inv2:=function(k); > return List([1..3],i->GroupHomology(SpaceGroupBBNWZ(3,k),i)); > end;;
Based on your above trick, I figured out the following method to solve the isomorphism problem between a self created crystallographic space group from scratch and the corresponding ones provided by cryst or crystcat packages can be verified as follows:
gap> GenSG227Left:=[[[0, 1, 0, 0], [1, 0, 0, 0], [-1, -1, -1, 0], [0, 0, 0, 1]],
> [[-1, -1, -1, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]],
> [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [1, 1, 1, 1/4], [0, 0, 0, 1]],
> [[0, 0, 1, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1]],
> [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [0, 0, -1, 1/4], [0, 0, 0, 1]]];;
gap> SG227Left:=AffineCrystGroupOnLeft(GenSG227Left);;
gap> #Verify the SG227Left and SpaceGroupBBNWZ(3,227) are isomorphic
gap> gh1:=List([1..3],i->GroupHomology(Image(IsomorphismPcpGroup(SG227Left)),i));
[ [ 2, 2 ], [ 2, 2, 2 ], [ 2, 2, 2, 2, 2, 12 ] ]
gap> gh2:=List([1..3], i-> GroupHomology(SpaceGroupBBNWZ(3,227), i));
[ [ 2, 2 ], [ 2, 2, 2 ], [ 2, 2, 2, 2, 2, 12 ] ]
gap> gh1=gh2;
true
But the following command is very time-consuming:
gap> List([1..3], i-> GroupHomology(Image(IsomorphismPcpGroup(SpaceGroupIT(3,227))),i));
On my computer it ran for about 10 minutes and still didn't finish, so I terminated the command execution by Ctrl-C
.
gap> pcpBieb:=Filtered([1..219], x -> IsAlmostBieberbachGroup(SpaceGroupPcpGroup(3,x)));;
gap> inv:=function(k);
> return List([1..3],i->GroupHomology(SpaceGroup(3,k),i));
> end;;
gap> C:=Classify(pcpBieb,inv);time;
[ [ 1 ], [ 4 ], [ 7 ], [ 9 ], [ 19 ], [ 33 ], [ 34 ], [ 76 ], [ 142 ],
[ 165 ] ]
5764
It takes about 5 seconds on my laptop.
Mine is as follows:
gap> pcpBieb:=Filtered([1..219], x -> IsAlmostBieberbachGroup(SpaceGroupPcpGroup(3,x)));;
gap> inv:=function(k);
> return List([1..3], i -> GroupHomology(SpaceGroup(3,k),i));
> end;;
gap> C:=Classify(pcpBieb,inv); time;
[ [ 1 ], [ 4 ], [ 7 ], [ 9 ], [ 19 ], [ 33 ], [ 34 ], [ 76 ], [ 142 ], [ 165 ] ]
4897
Note: The SpaceGroup(3,k)
command only works for $1 \le k \le 219$. See here for the related discussion.
The following commands, which do not use any HAP functions, show that the abelian invariants of finite index subroups of index less than or equal to 8 suffice to distinguish between the isomorphism types of all 219 space groups.
gap> inv:=function(k,d)
> local L,G;
> G:=SpaceGroup(3,k);;
> G:=Image(IsomorphismFpGroup(G));;
> L:=LowIndexSubgroupsFpGroup(G,d);;
> L:=List(L,AbelianInvariants);;
> L:=SortedList(L);;
> return L;;
> end;;
gap> C:=Classify([1..219],k->inv(k,5));;
gap> Length(C);
199
gap> C:=RefineClassification(C,k->inv(k,6));;
gap> Length(C);
213
gap> C:=RefineClassification(C,k->inv(k,7));;
gap> Length(C);
213
gap> C:=RefineClassification(C,k->inv(k,8));;
gap> Length(C);
219
Wonderful trick. But this still can't distinguish the 11 pairs of enantiomorphic (or chiral) space groups, as shown below:
gap> inv:=function(k,d)
> local L,G;
> # G:=SpaceGroup(3,k);; # [1..219]
> G:=SpaceGroupBBNWZ(3,k);; # [1..230]
> G:=Image(IsomorphismFpGroup(G));;
> L:=LowIndexSubgroupsFpGroup(G,d);;
> L:=List(L,AbelianInvariants);;
> L:=SortedList(L);;
> return L;;
> end;;
gap> C:=Classify([1..230],k->inv(k,5));;
gap> C:=RefineClassification(C,k->inv(k,8));;
gap> Length(C);
219
gap> Filtered(C,x->Size(x)>1);
[ [ 76, 78 ], [ 91, 95 ], [ 92, 96 ], [ 144, 145 ], [ 151, 153 ], [ 152, 154 ], [ 180, 181 ], [ 178, 179 ], [ 169, 170 ], [ 171, 172 ], [ 212, 213 ] ]
Another question: How to use one command to achieve the purpose of the following commands?
gap> C:=Classify([1..230],k->inv(k,5));;
gap> C:=RefineClassification(C,k->inv(k,8));;
In other words, is the above command equivalent to the following one?
C:=Classify([1..230],k->inv(k,8));;
Side remark: This method has good scalability, that is, it can also be used for space groups higher than 3 dimensions.
https://github.com/gap-packages/hap/issues/75#issuecomment-1180190400 Based on your above trick, I figured out the following method to solve the isomorphism problem between a self created crystallographic space group from scratch and the corresponding ones provided by cryst or crystcat packages can be verified as follows:
gap> GenSG227Left:=[[[0, 1, 0, 0], [1, 0, 0, 0], [-1, -1, -1, 0], [0, 0, 0, 1]], > [[-1, -1, -1, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]], > [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [1, 1, 1, 1/4], [0, 0, 0, 1]], > [[0, 0, 1, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1]], > [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [0, 0, -1, 1/4], [0, 0, 0, 1]]];; gap> SG227Left:=AffineCrystGroupOnLeft(GenSG227Left);; gap> #Verify the SG227Left and SpaceGroupBBNWZ(3,227) are isomorphic gap> gh1:=List([1..3],i->GroupHomology(Image(IsomorphismPcpGroup(SG227Left)),i)); [ [ 2, 2 ], [ 2, 2, 2 ], [ 2, 2, 2, 2, 2, 12 ] ] gap> gh2:=List([1..3], i-> GroupHomology(SpaceGroupBBNWZ(3,227), i)); [ [ 2, 2 ], [ 2, 2, 2 ], [ 2, 2, 2, 2, 2, 12 ] ] gap> gh1=gh2; true
The above method should be revised as follows:
gap> inv2:=function(S,d)
> local L,G;
> # G:=SpaceGroup(3,k);; # [1..219]
> # G:=SpaceGroupBBNWZ(3,k);; # [1..230]
> G:=Image(IsomorphismFpGroup(S));;
> L:=LowIndexSubgroupsFpGroup(G,d);;
> L:=List(L,AbelianInvariants);;
> L:=SortedList(L);;
> return L;;
> end;;
gap> GenSG227Left:=[[[0, 1, 0, 0], [1, 0, 0, 0], [-1, -1, -1, 0], [0, 0, 0, 1]],
> [[-1, -1, -1, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]],
> [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [1, 1, 1, 1/4], [0, 0, 0, 1]],
> [[0, 0, 1, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1]],
> [[-1, 0, 0, 1/4], [0, -1, 0, 1/4], [0, 0, -1, 1/4], [0, 0, 0, 1]]];;
gap> SG227Left:=AffineCrystGroupOnLeft(GenSG227Left);;
gap> inv2(SG227Left,8) = inv2(SpaceGroupBBNWZ(3, 227),8);
true
At this point, another important problem that needs to be solved is how to identify an explicit isomorphism between them. I've tried the following, but still failed to figure out the solution:
gap> img1:=Image(IsomorphismFpGroup(SG227Left));
<fp group on the generators [ f1, f2, f3, f4, f5, f6, f7, f8 ]>
gap> img11:=Image(IsomorphismSimplifiedFpGroup(img1));
<fp group on the generators [ f1, f2, f3 ]>
gap> img2:=Image(IsomorphismFpGroup(SpaceGroupBBNWZ(3, 227)));
<fp group on the generators [ f1, f2, f3, f4, f5, f6, f7, f8 ]>
gap> img21:=Image(IsomorphismSimplifiedFpGroup(img2));
<fp group on the generators [ f1, f2, f4 ]>
gap> RelatorsOfFpGroup(img11);
[ f3^3, (f1*f2^-1)^2, f3^-1*f2^-1*f3^-1*f1^-1*f2*f1, f1*f3^-1*f2^-2*f1*f3, f3^-1*f1*f2^-1*f3*f1*f3*f2^-1, f3^-1*f2*f3*f2^-2*f3*f1*f2^-1*f1^-1, f2^-3*f1^-1*f2^4*f1*f2^-1,
(f3^-1*f2*f1^-1*f3^-1*f1)^2 ]
gap> RelatorsOfFpGroup(img21);
[ f2^3, f1^-1*f4^-2*f1^-1, f1*f4*f1^-1*f4^-1, (f2*f1)^2, (f2^-1*f4^-1*f2*f4^-1)^2, f4*f2*f1^-2*f2*f4^2*f2*f4, ((f4^-1*f2)^2*f4*f2)^2,
f1^-1*(f2*f1^-1*f4)^2*f2^-1*f1*(f2*f4)^2, (f1^-1*(f2^-1*f4^-1)^2*f4^-2*f1*f2*f4^-1)^2 ]
Yes, the commands
gap> C:=Classify([1..219],k->inv(k,5));; gap> C:=RefineClassification(C,k->inv(k,6));; gap> C:=RefineClassification(C,k->inv(k,7));; gap> C:=RefineClassification(C,k->inv(k,8));;
have the same mathematical meaning as the single command
C:=Classify([1..219],k->inv(k,8));;
But I think you'll find the first commands run faster than the last single command.
As for distinguishing between isomorphic space groups that are not the same up to an affine transformation of space that preserves orientation, I don't know how one can use isomorphism invariants to do this. Also, I'm not sure why you would want to, as you already know that SpaceGroupIT(3,k) is distinct from SpaceGroup(3,k') in this sense precisely when k is different to k'.
But I think you'll find the first commands run faster than the last single command.
I have also noticed this situation. Why is there such a performance difference?
Also, I'm not sure why you would want to, as you already know that SpaceGroupIT(3,k) is distinct from SpaceGroup(3,k') in this sense precisely when k is different to k'.
For example, SpaceGroupIT(3,76) and SpaceGroupIT(3,78) have different generators, as described here, and as shown below:
I want to determine the unique SpaceGroupIT (International Tables for Crystallography) number based on the given generators.
gap> C:=Classify([1..219],k->inv(k,5));;
calculates (conjugacy classes of) subgroups of index $\le$ 5 for all 219 groups.
gap> C:=RefineClassification(C,k->inv(k,6));;
calculates subgroups of index $\le$ 6 only for those groups that are not fully distinguished by the first command. And so on.
The command
gap> C:=Classify([1..219],k->inv(k,8));;
calculates (conjugacy classes of) subgroups of index $\le$ 8 for all 219 groups. Enumerating low-index subgroups is a costly calculation.
By the way, it is sometimes quicker to use G:=SimplifiedFpGroup(G) before calling LowIndexSubgroupsFpGroup(G,d);
The commands
gap> G76:=SpaceGroupIT(3,76);;
gap> G78:=SpaceGroupIT(3,78);;
gap> L76:=LowIndexSubgroupsFpGroup(Image(IsomorphismFpGroup(G76)),8);;
gap> L76:=SortedList(List(L76,AbelianInvariants));;
gap> L78:=LowIndexSubgroupsFpGroup(Image(IsomorphismFpGroup(G78)),8);;
gap> L78:=SortedList(List(L78,AbelianInvariants));;
gap> L76=L78;
true
show that G76 is isomorphic to G78. However, I think the commands
gap> A:=ConjugatorSpaceGroups(G76,G78);; gap> Determinant(A); -1
show that the isomorphism required a non-orientable transformation. (But I am not an expert on space groups.)
The command ConjugatorSpaceGroups(G,H) is clearly the one to use to test isomorphism, and orientation preserving isomorphism, of spaces groups.
For the isomorphism determination of an arbitrary given 3 dimensional affine crystallographic group G
, first, use the RefineClassification
method discussed above to determine which 219 affine class it belongs to. If the result is a list of isomorphism, then use the ConjugatorSpaceGroups(G,H)
command to test the orientation preserving isomorphism relations between them. The above approach should be more efficient than looping over 230 space groups directly using the ConjugatorSpaceGroups(G,H)
command, where $H \in SpaceGroupIT(3, x), (1 \le x \le 230)$ .
I've checked the eleven pairs of enantiomorphic space groups (Online Dictionary of Crystallography, ITC-A), as described on AFLOW website:
gap> enantiomorphic_pairs:=[
> [76,78],[91,95],[92,96],[144,145],[151,153],
> [152,154],[169,170],[171,172],[178,179],[180,181],
> [212,213]
> ];;
gap> conj:=List(enantiomorphic_pairs, x-> ConjugatorSpaceGroups(SpaceGroupIT(3,x[1]) ,SpaceGroupIT(3,x[2])));;
gap> PrintArray(conj);
[ [ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ],
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ],
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 1/2, 1 ] ],
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ],
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 1/2, 1 ] ],
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ],
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ],
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ],
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 1/2, 1 ] ],
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 1/2, 1 ] ],
[ [ 0, -1, 0, 0 ], [ 0, 0, 1, 0 ], [ 1, 0, 0, 0 ], [ 1/2, 0, 0, 1 ] ] ]
gap> List(conj, x-> [TraceMat(x{[1..3]}{[1..3]}), DeterminantMat(x{[1..3]}{[1..3]}), Order(x{[1..3]}{[1..3]})]);
[ [ -3, -1, 2 ], [ -3, -1, 2 ], [ -3, -1, 2 ], [ -3, -1, 2 ], [ -3, -1, 2 ], [ -3, -1, 2 ], [ -3, -1, 2 ], [ -3, -1, 2 ], [ -3, -1, 2 ], [ -3, -1, 2 ], [ 0, -1, 6 ] ]
gap> # The trace subtracting by 1 will correspond to that of the point group operation:
gap> last=List(conj, x-> [TraceMat(x)-1, DeterminantMat(x), Order(x)]);
false
Based on all the information above, I still can't figure out how to identify the isomorphism types between them, say, for this case, determine the enantiomorphic (chiral) isomorphic relationship between them based on the result given by ConjugatorSpaceGroups
.
I further carried out the following verification and inspection:
gap> C:=ConjugatorSpaceGroups(SpaceGroupIT(3,76),SpaceGroupIT(3,78));
[ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ]
gap> wyck76:=[];;
gap> for i in WyckoffPositions(SpaceGroupIT(3,76)) do
> for j in WyckoffOrbit(i) do
> # Construct the affine matrix acting on the right.
> # See https://www.gap-system.org/Manuals/pkg/cryst/htm/CHAP002.htm for more details.
> wyck:=DirectSumMat(WyckoffBasis(j),[[1]]);
> wyck[4]{[1..3]}:=WyckoffTranslation(j);
> Add(wyck76, wyck^C);
> od;
> od;
gap> wyck78:=[];;
gap> for i in WyckoffPositions(SpaceGroupIT(3,78)) do
> for j in WyckoffOrbit(i) do
> wyck:=DirectSumMat(WyckoffBasis(j),[[1]]);
> wyck[4]{[1..3]}:=WyckoffTranslation(j);
> Add(wyck78, wyck);
> od;
> od;
gap> PrintArray(wyck78 - wyck76);
[ [ [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 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 ] ] ]
So, the conjugator used by ConjugatorSpaceGroups
translates the space group by one unit basis vectors in all three dimensions.
The following commands, which do not use any HAP functions, show that the abelian invariants of finite index subroups of index less than or equal to 8 suffice to distinguish between the isomorphism types of all 219 space groups.
gap> inv:=function(k,d) > local L,G; > G:=SpaceGroup(3,k);; > G:=Image(IsomorphismFpGroup(G));; > L:=LowIndexSubgroupsFpGroup(G,d);; > L:=List(L,AbelianInvariants);; > L:=SortedList(L);; > return L;; > end;; gap> C:=Classify([1..219],k->inv(k,5));; gap> Length(C); 199 gap> C:=RefineClassification(C,k->inv(k,6));; gap> Length(C); 213 gap> C:=RefineClassification(C,k->inv(k,7));; gap> Length(C); 213 gap> C:=RefineClassification(C,k->inv(k,8));; gap> Length(C); 219
I tried to use the above method as follows, but I got stuck in the penultimate step:
gap> SGGenSet229me:=[[[0, -1, 0, 1/4], [0, 0, -1, 1/4], [-1, 0, 0, 1/4], [0, 0, 0, 1]],
> [[-1, 2, -1, -3/8], [-3/2, 3/2, -1/2, -1/16], [-1/2, 3/2, -3/2, \
> -17/16], [0, 0, 0, 1]]];
[ [ [ 0, -1, 0, 1/4 ], [ 0, 0, -1, 1/4 ], [ -1, 0, 0, 1/4 ], [ 0, 0, 0, 1 ] ], [ [ -1, 2, -1, -3/8 ], [ -3/2, 3/2, -1/2, -1/16 ], [ -1/2, 3/2, -3/2, -17/16 ],
[ 0, 0, 0, 1 ] ] ]
gap> SG229me:=AffineCrystGroupOnLeft(SGGenSet229me);
<matrix group with 2 generators>
gap> LSG229me:=LowIndexSubgroupsFpGroup(SimplifiedFpGroup(Image(IsomorphismFpGroup(SG229me))),8);;
^CError, user interrupt in
i := i + 2; at /home/werner/Public/repo/github.com/gap-system/gap.git/lib/grpfp.gi:3031 called from
iter!.IsDoneIterator( iter ) at /home/werner/Public/repo/github.com/gap-system/gap.git/lib/coll.gi:937 called from
IsDoneIterator( iter ) at /home/werner/Public/repo/github.com/gap-system/gap.git/lib/grpfp.gi:3192 called from
LowIndexSubgroupsFpGroup( G, TrivialSubgroup( Parent( G ) ), n ) at /home/werner/Public/repo/github.com/gap-system/gap.git/lib/grpfp.gi:3219 called from
<function "LowIndexSubgroupsFpGroup supply trivial subgroup">( <arguments> )
called from read-eval loop at *stdin*:28
you can 'return;'
I got stuck in the previous step, so I couldn't run the following step:
gap> SLSG229me:=SortedList(List(LSG229me,AbelianInvariants));
Error, Variable: 'LSG229me' must have a value
not in any function at *stdin*:28
LowIndexSubgroupsFpGroup(G,k) can take a lot of time when k gets large. I tried it your fp group G and it completed in 104 seconds for k=6. You are trying k=8 and that value of k is very likely is going to take more time and memory.
Are there any more efficient alternative methods to solve this problem?
As far as I know the GAP implementation of LowIndexSubgroupsFpGroup is as efficient as any.
Graham
School of Mathematical & Statistical Sciences National University of Ireland, Galway tel: 091 493011
From: hongyi-zhao @.> Sent: Friday, September 23, 2022 1:08 PM To: gap-packages/hap @.> Cc: Ellis, Graham J. @.>; State change @.> Subject: Re: [gap-packages/hap] Check/confirm/verify the isomorphism between two space groups with the help of HAP package. (Issue #75)
EXTERNAL EMAIL: This email originated outside the University of Galway. Do not open attachments or click on links unless you believe the content is safe. RÍOMHPHOST SEACHTRACH: Níor tháinig an ríomhphost seo ó Ollscoil na Gaillimhe. Ná hoscail ceangaltáin agus ná cliceáil ar naisc mura gcreideann tú go bhfuil an t-ábhar sábháilte.
Are there any efficient alternative methods to solve this problem?
— Reply to this email directly, view it on GitHubhttps://github.com/gap-packages/hap/issues/75#issuecomment-1256129974, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AHGCWP6BUSZKEF2FQXZGRRLV7WMVBANCNFSM53DEDGXA. You are receiving this because you modified the open/close state.Message ID: @.***>
Are there alternative methods to complete this job using HAP?
None that I can think of.
According to the explanation here, space groups $P3_1$ (#144) and $P3_2$ (#145) are a pair of enantiomorphic space groups (Online Dictionary of Crystallography, ITC-A), so they are isomorphic.
I try to check/confirm/verify the isomorphism between them as follows but failed:
So, I want to know whether this can be done with the help of HAP package.
Regards, Zhao