CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.

| Download

GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it

Views: 418346
1
We introduce a way to calculate a sufficient part of an orbit and the
2
stabilizer of a point.
3
4
5
<Section><Heading>Orbit Stabilizer for Crystallographic Groups</Heading>
6
7
<ManSection>
8
<Meth Name="OrbitStabilizerInUnitCubeOnRight"
9
Arg="group, x"/>
10
<Returns>
11
A record containing
12
<List>
13
<Item>
14
<K>.stabilizer</K>: the stabilizer of <Arg>x</Arg>.
15
</Item>
16
<Item>
17
<K>.orbit</K> set of vectors from <M>[0,1)^n</M> which
18
represents the orbit.
19
</Item>
20
</List>
21
</Returns>
22
<Description>
23
Let <Arg>x</Arg> be a rational vector from <M>[0,1)^n</M> and
24
<Arg>group</Arg> a space group in standard form.
25
26
The function then calculates the part of the orbit which lies inside the
27
cube <M>[0,1)^n</M> and the stabilizer of <Arg>x</Arg>. Observe that every
28
element of the full orbit differs from a point in the returned orbit only
29
by a pure translation.
30
</Description>
31
</ManSection>
32
33
Note that the restriction to points from <M>[0,1)^n</M> makes sense if orbits
34
should be compared and the vector passed to
35
<C>OrbitStabilizerInUnitCubeOnRight</C> should be an element of the returned
36
orbit (part).
37
38
<Example>
39
<![CDATA[
40
gap> S:=SpaceGroup(3,5);;
41
gap> OrbitStabilizerInUnitCubeOnRight(S,[1/2,0,9/11]);
42
rec( orbit := [ [ 0, 1/2, 2/11 ], [ 1/2, 0, 9/11 ] ],
43
stabilizer := Group([ [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ],
44
[ 0, 0, 0, 1 ] ] ]) )
45
gap> OrbitStabilizerInUnitCubeOnRight(S,[0,0,0]);
46
rec( orbit := [ [ 0, 0, 0 ] ], stabilizer := <matrix group with 2 generators> )
47
]]>
48
</Example>
49
50
If you are interested in other parts of the orbit, you can use <Ref
51
Meth="VectorModOne"/> for the base point and the functions <Ref
52
Meth="ShiftedOrbitPart"/>, <Ref Meth="TranslationsToOneCubeAroundCenter"/> and
53
<Ref Meth="TranslationsToBox"/> for the resulting orbit<Br/>
54
55
Suppose we want to calculate the part of the orbit of <C>[4/3,5/3,7/3]</C> in
56
the cube of sidelength <C>1</C> around this point:
57
58
<Example>
59
gap> S:=SpaceGroup(3,5);;
60
gap> p:=[4/3,5/3,7/3];;
61
gap> o:=OrbitStabilizerInUnitCubeOnRight(S,VectorModOne(p)).orbit;
62
[ [ 1/3, 2/3, 1/3 ], [ 1/3, 2/3, 2/3 ] ]
63
gap> box:=p+[[-1,1],[-1,1],[-1,1]];
64
[ [ 1/3, 8/3, 7/3 ], [ 1/3, 8/3, 7/3 ], [ 1/3, 8/3, 7/3 ] ]
65
gap> o2:=Concatenation(List(o,i->i+TranslationsToBox(i,box)));;
66
gap> # This is what we looked for. But it is somewhat large:
67
gap> Size(o2);
68
54
69
</Example>
70
71
72
<ManSection>
73
<Meth Name="OrbitStabilizerInUnitCubeOnRightOnSets"
74
Arg="group, set"/>
75
<Returns>
76
A record containing
77
<List>
78
<Item>
79
<K>.stabilizer</K>: the stabilizer of <Arg>set</Arg>.
80
</Item>
81
<Item>
82
<K>.orbit</K> set of sets of vectors from <M>[0,1)^n</M> which
83
represents the orbit.
84
</Item>
85
</List>
86
</Returns>
87
88
<Description>
89
Calculates orbit and stabilizer of a set of vectors. Just as <Ref
90
Meth="OrbitStabilizerInUnitCubeOnRight"></Ref>, it needs input from
91
<M>[0,1)^n</M>.
92
93
The returned orbit part <K>.orbit</K> is a set of sets such that every
94
element of <K>.orbit</K> has a non-trivial intersection with the
95
cube <M>[0,1)^n</M>. In general, these sets will not lie inside
96
<M>[0,1)^n</M> completely.
97
</Description>
98
</ManSection>
99
100
<Example>
101
gap> S:=SpaceGroup(3,5);;
102
gap> OrbitStabilizerInUnitCubeOnRightOnSets(S,[[0,0,0],[0,1/2,0]]);
103
rec( orbit := [ [ [ -1/2, 0, 0 ], [ 0, 0, 0 ] ],
104
[ [ 0, 0, 0 ], [ 0, 1/2, 0 ] ],
105
[ [ 1/2, 0, 0 ], [ 1, 0, 0 ] ] ],
106
stabilizer := Group([ [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ],
107
[ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ] ]) )
108
</Example>
109
110
<ManSection>
111
<Meth Name="OrbitPartInVertexSetsStandardSpaceGroup"
112
Arg="group vertexset allvertices"/>
113
<Returns>
114
Set of subsets of <A>allvertices</A>.
115
</Returns>
116
<Description>
117
If <A>allvertices</A> is a set of vectors and <A>vertexset</A> is
118
a subset thereof, then <Ref
119
Meth="OrbitPartInVertexSetsStandardSpaceGroup"></Ref> returns
120
that part of the orbit of <A>vertexset</A> which consists entirely of
121
subsets of <A>allvertices</A>.
122
Note that,unlike the other <C>OrbitStabilizer</C> algorithms, this does not
123
require the input to lie in some particular part of the space.
124
</Description>
125
</ManSection>
126
127
<Example>
128
gap> S:=SpaceGroup(3,5);;
129
gap> OrbitPartInVertexSetsStandardSpaceGroup(S,[[0,1,5],[1,2,0]],
130
> Set([[1,2,0],[2,3,1],[1,2,6],[1,1,0],[0,1,5],[3/5,7,12],[1/17,6,1/2]]));
131
[ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ], [ [ 1, 2, 6 ], [ 2, 3, 1 ] ] ]
132
gap> OrbitPartInVertexSetsStandardSpaceGroup(S, [[1,2,0]],
133
> Set([[1,2,0],[2,3,1],[1,2,6],[1,1,0],[0,1,5],[3/5,7,12],[1/17,6,1/2]]));
134
[ [ [ 0, 1, 5 ] ], [ [ 1, 1, 0 ] ], [ [ 1, 2, 0 ] ], [ [ 1, 2, 6 ] ], [ [ 2, 3, 1 ] ] ]
135
</Example>
136
137
138
<ManSection>
139
<Meth Name="OrbitPartInFacesStandardSpaceGroup"
140
Arg="group vertexset faceset"/>
141
<Returns>
142
Set of subsets of <A>faceset</A>.
143
</Returns>
144
<Description>
145
This calculates the orbit of a space group on sets restricted to a set of
146
faces.<Br/>
147
If <A>faceset</A> is a set of sets of vectors and <A>vertexset</A> is
148
an element of <A>faceset</A>, then <Ref
149
Meth="OrbitPartInFacesStandardSpaceGroup"></Ref> returns
150
that part of the orbit of <A>vertexset</A> which consists entirely of
151
elements of <A>faceset</A>.<Br/>
152
Note that,unlike the other <C>OrbitStabilizer</C> algorithms, this does not
153
require the input to lie in some particular part of the space.
154
</Description>
155
</ManSection>
156
157
158
159
<ManSection>
160
<Meth Name="OrbitPartAndRepresentativesInFacesStandardSpaceGroup"
161
Arg="group vertexset faceset"/>
162
<Returns>
163
A set of face-matrix pairs .
164
</Returns>
165
<Description>
166
This is a slight variation of
167
<Ref Meth="OrbitPartInFacesStandardSpaceGroup"></Ref>
168
that also returns a representative for every orbit element.
169
</Description>
170
</ManSection>
171
172
<Example>
173
gap> S:=SpaceGroup(3,5);;
174
gap> OrbitPartInVertexSetsStandardSpaceGroup(S,[[0,1,5],[1,2,0]],
175
> Set([[1,2,0],[2,3,1],[1,2,6],[1,1,0],[0,1,5],[3/5,7,12],[1/17,6,1/2]]));
176
[ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ], [ [ 1, 2, 6 ], [ 2, 3, 1 ] ] ]
177
gap> OrbitPartInFacesStandardSpaceGroup(S,[[0,1,5],[1,2,0]],
178
> Set( [ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ], [[1/17,6,1/2],[1,2,7]]]));
179
[ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ] ]
180
gap> OrbitPartAndRepresentativesInFacesStandardSpaceGroup(S,[[0,1,5],[1,2,0]],
181
> Set( [ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ], [[1/17,6,1/2],[1,2,7]]]));
182
[ [ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ],
183
[ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ] ] ]
184
</Example>
185
186
187
188
<ManSection>
189
<Meth Name="StabilizerOnSetsStandardSpaceGroup"
190
Arg="group set"/>
191
<Returns>finite group of affine matrices (OnRight)</Returns>
192
<Description>
193
Given a set <A>set</A> of vectors and a space group <A>group</A> in
194
standard form, this method calculates the stabilizer of that set in
195
the full crystallographic group.<Br/>
196
</Description>
197
</ManSection>
198
199
<Example>
200
<![CDATA[
201
gap> G:=SpaceGroup(3,12);;
202
gap> v:=[ 0, 0,0 ];;
203
gap> s:=StabilizerOnSetsStandardSpaceGroup(G,[v]);
204
<matrix group with 2 generators>
205
gap> s2:=OrbitStabilizerInUnitCubeOnRight(G,v).stabilizer;
206
<matrix group with 2 generators>
207
gap> s2=s;
208
true
209
]]>
210
</Example>
211
212
<ManSection>
213
<Meth Name="RepresentativeActionOnRightOnSets"
214
Arg="group set imageset"/>
215
<Returns>
216
Affine matrix.
217
</Returns>
218
<Description>
219
Returns an element of the space group
220
<M>S</M> which takes the set <A>set</A> to the set
221
<A>imageset</A>. The group must be in standard form and act on the right.
222
</Description>
223
</ManSection>
224
225
<Example>
226
gap> S:=SpaceGroup(3,5);;
227
gap> RepresentativeActionOnRightOnSets(G, [[0,0,0],[0,1/2,0]],
228
> [ [ 0, 1/2, 0 ], [ 0, 1, 0 ] ]);
229
[ [ 0, -1, 0, 0 ], [ -1, 0, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 1, 0, 1 ] ]
230
</Example>
231
232
233
<Subsection><Heading>Getting other orbit parts</Heading>
234
235
<Package>HAPcryst</Package> does not calculate the full orbit but only the part
236
of it having coefficients between <M>-1/2</M> and <M>1/2</M>. The other parts
237
of the orbit can be calculated using the following functions.
238
</Subsection>
239
240
<ManSection>
241
<Meth Name="ShiftedOrbitPart" Arg="point, orbitpart"/>
242
<Returns>Set of vectors </Returns>
243
<Description>
244
Takes each vector in <A>orbitpart</A> to the cube unit cube centered in
245
<A>point</A>.
246
</Description>
247
</ManSection>
248
249
<Example>
250
gap> ShiftedOrbitPart([0,0,0],[[1/2,1/2,1/3],-[1/2,1/2,1/2],[19,3,1]]);
251
[ [ 1/2, 1/2, 1/3 ], [ 1/2, 1/2, 1/2 ], [ 0, 0, 0 ] ]
252
gap> ShiftedOrbitPart([1,1,1],[[1/2,1/2,1/2],-[1/2,1/2,1/2]]);
253
[ [ 3/2, 3/2, 3/2 ] ]
254
</Example>
255
256
257
258
<ManSection>
259
<Meth Name="TranslationsToOneCubeAroundCenter" Arg="point, center"/>
260
<Returns>List of integer vectors</Returns>
261
<Description>
262
This method returns the list of all integer vectors which translate
263
<A>point</A> into the box <A>center</A><M>+[-1/2,1/2]^n</M>
264
</Description>
265
</ManSection>
266
267
<Example>
268
gap> TranslationsToOneCubeAroundCenter([1/2,1/2,1/3],[0,0,0]);
269
[ [ 0, 0, 0 ], [ 0, -1, 0 ], [ -1, 0, 0 ], [ -1, -1, 0 ] ]
270
gap> TranslationsToOneCubeAroundCenter([1,0,1],[0,0,0]);
271
[ [ -1, 0, -1 ] ]
272
</Example>
273
274
275
<ManSection>
276
<Meth Name="TranslationsToBox" Arg="point, box"/>
277
<!-- <Returns>List of integer vectors or the empty list</Returns>-->
278
<Returns>An iterator of integer vectors or the empty iterator</Returns>
279
<Description>
280
Given a vector <M>v</M> and a list of pairs, this function returns the
281
translation vectors (integer vectors) which take <M>v</M> into the box
282
<A>box</A>. The box <A>box</A> has to be given as a list of pairs.
283
</Description>
284
</ManSection>
285
286
<Example>
287
gap> TranslationsToBox([0,0],[[1/2,2/3],[1/2,2/3]]);
288
[ ]
289
gap> TranslationsToBox([0,0],[[-3/2,1/2],[1,4/3]]);
290
[ [ -1, 1 ], [ 0, 1 ] ]
291
gap> TranslationsToBox([0,0],[[-3/2,1/2],[2,1]]);
292
Error, Box must not be empty called from
293
...
294
</Example>
295
296
297
298
</Section>
299
300