gap-packages / hap

Homological Algebra Programming
https://gap-packages.github.io/hap/
9 stars 9 forks source link

Check/confirm/verify the isomorphism between two space groups with the help of HAP package. #75

Closed hongyi-zhao closed 2 years ago

hongyi-zhao commented 2 years ago

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:

gap> g1:=SpaceGroupPcpGroup(3,144);
Pcp-group with orders [ 3, 2, 0, 0, 0 ]
gap> g2:=SpaceGroupPcpGroup(3,145);
Pcp-group with orders [ 2, 3, 0, 0, 0 ]
gap> IsomorphismGroups(g1,g2);
Error, cannot test isomorphism of infinite groups at /home/werner/Public/repo/github.com/gap-system/gap.git/lib/morpheus.gi:2835 called from
<function "IsomorphismGroups">( <arguments> )
 called from read-eval loop at *stdin*:4
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue

So, I want to know whether this can be done with the help of HAP package.

Regards, Zhao

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

hongyi-zhao commented 2 years ago

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 ]
hongyi-zhao commented 2 years ago

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.

grahamknockillaree commented 2 years ago

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
hongyi-zhao commented 2 years ago

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.

grahamknockillaree commented 2 years ago
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.

hongyi-zhao commented 2 years ago

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.

grahamknockillaree commented 2 years ago

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
hongyi-zhao commented 2 years ago

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.

hongyi-zhao commented 2 years ago

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 ]
grahamknockillaree commented 2 years ago

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

hongyi-zhao commented 2 years ago

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:

image

I want to determine the unique SpaceGroupIT (International Tables for Crystallography) number based on the given generators.

grahamknockillaree commented 2 years ago
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.

hongyi-zhao commented 2 years ago
  1. 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)$ .

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

hongyi-zhao commented 2 years ago

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.

hongyi-zhao commented 2 years ago

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
grahamknockillaree commented 2 years ago

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.

hongyi-zhao commented 2 years ago

Are there any more efficient alternative methods to solve this problem?

grahamknockillaree commented 2 years ago

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: @.***>

hongyi-zhao commented 2 years ago

Are there alternative methods to complete this job using HAP?

grahamknockillaree commented 2 years ago

None that I can think of.