File: CHAP002.htm

package info (click to toggle)
gap-cryst 4.1.30-2
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 892 kB
  • sloc: makefile: 111; sh: 11
file content (1013 lines) | stat: -rw-r--r-- 47,572 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
<html><head><title>[cryst] 2 Affine crystallographic groups</title></head>
<body text="#000000" bgcolor="#ffffff">
[<a href = "chapters.htm">Up</a>] [<a href ="CHAP001.htm">Previous</a>] [<a href = "theindex.htm">Index</a>]
<h1>2 Affine crystallographic groups</h1><p>
<P>
<H3>Sections</H3>
<oL>
<li> <A HREF="CHAP002.htm#SECT001">Construction</a>
<li> <A HREF="CHAP002.htm#SECT002">Point group</a>
<li> <A HREF="CHAP002.htm#SECT003">Translation lattice</a>
<li> <A HREF="CHAP002.htm#SECT004">Special methods</a>
<li> <A HREF="CHAP002.htm#SECT005">Maximal subgroups</a>
<li> <A HREF="CHAP002.htm#SECT006">Space groups with a given point group</a>
<li> <A HREF="CHAP002.htm#SECT007">Wyckoff positions</a>
<li> <A HREF="CHAP002.htm#SECT008">Normalizers</a>
<li> <A HREF="CHAP002.htm#SECT009">Color groups</a>
<li> <A HREF="CHAP002.htm#SECT010">Colored AffineCrystGroups</a>
<li> <A HREF="CHAP002.htm#SECT011">International Tables</a>
</ol><p>
<p>
An affine crystallographic group <var>G</var> is a subgroup of the group of all
Euclidean motions of <i>d</i>-dimensional space, with the property that its
subgroup <var>T</var> of all pure translations is a discrete normal subgroup of
finite index. If the rank of the translation subgroup <var>T</var> is <i>d</i>, <var>G</var>
is called a space group. The quotient <var>G</var>/<var>T</var> is called the point group
of <var>G</var>.
<p>
In this package, affine crystallographic groups are represented as
groups of augmented matrices of dimension <i>d</i>+1. Most functions assume
a group of rational matrices, but some may also work with cyclotomic
matrix groups. In particular, it is possible to compute the translation
basis of an affine crystallographic group given in a cyclotomic
representation, and to pass to a rational representation by conjugating 
with that basis. Further functionality for cyclotomic crystallographic 
groups is currently not guaranteed.
<p>
Augmented matrices can take one of two forms. Matrices of the form
<pre>
                     [ M 0 ]
                     [ t 1 ]
</pre>
act from the right on row vectors (<i>x</i>,1). Such a matrix is said to
be an affine matrix acting on the right. Since in <font face="Gill Sans,Helvetica,Arial">GAP</font> all groups
act from the right, this is the preferred representation of an affine
transformation. 
<p>
The second representation of affine transformations is by augmented
matrices of the form 
<pre>
                     [ M t ]
                     [ 0 1 ]
</pre>
which act from the left on column vectors (<i>x</i>,1). Such matrices are
said to be affine matrices acting on the left. This is the
representation usually adopted by crystallographers. 
<p>
<font face="Gill Sans,Helvetica,Arial">Cryst</font> supports affine crystallographic groups in both
representations. Every affine crystallographic group is 
constructed in one of these two representations. 
<p>
Affine crystallographic groups in different representations should
never be mixed, however. It is recommended to adopt one of the two
representations, and then to stick to that decision. In order to
facilitate this, there is a global variable <code>CrystGroupDefaultAction</code>,
whose value is either <code>RightAction</code> or <code>LeftAction</code>. The initial value
is <code>RightAction</code>, but this can be changed with
<p>
<a name = ""></a>
<li><code>SetCrystGroupDefaultAction( </code><var>action</var><code> ) F</code>
<p>
where <var>action</var> must be either <code>RightAction</code> or <code>LeftAction</code>.
Constructor functions without explicit representation
qualifier then will construct an affine crystallographic group
in the representation specified by <code>CrystGroupDefaultAction</code>.
<p>
<p>
<h2><a name="SECT001">2.1 Construction</a></h2>
<p><p>
<a name = "I0"></a>

<a name = "SSEC001.1"></a>
<li><code>AffineCrystGroupOnRight( </code><var>gens</var><code> ) F</code>
<li><code>AffineCrystGroupOnRight( </code><var>genlist</var><code> ) F</code>
<li><code>AffineCrystGroupOnRight( </code><var>genlist</var><code>, </code><var>identity</var><code> ) F</code>
<p>
returns the matrix group generated by <var>gens</var> or <var>genlist</var>, which must
be affine matrices acting on the right, as affine crystallographic
group acting on the right. An already existing group <var>S</var> of affine
matrices acting on the right can be converted to an affine
crystallographic group acting on the right with
<p>
<a name = "SSEC001.2"></a>
<li><code>AsAffineCrystGroupOnRight( </code><var>S</var><code> ) F</code>
<p>
The property
<p>
<a name = "SSEC001.3"></a>
<li><code>IsAffineCrystGroupOnRight( </code><var>S</var><code> ) P</code>
<p>
is <code>true</code> exactly for those groups which have been constructed in the 
above two ways.
<p>
<a name = "SSEC001.4"></a>
<li><code>AffineCrystGroupOnLeft( </code><var>gens</var><code> ) F</code>
<li><code>AffineCrystGroupOnLeft( </code><var>genlist</var><code> ) F</code>
<li><code>AffineCrystGroupOnLeft( </code><var>genlist</var><code>, </code><var>identity</var><code> ) F</code>
<p>
returns the matrix group generated by <var>gens</var> or <var>genlist</var>, which must
be affine matrices acting on the left, as affine crystallographic
group acting on the left. An already existing group <var>S</var> of affine
matrices acting on the left can be converted to an affine
crystallographic group acting on the left with
<p>
<a name = "SSEC001.5"></a>
<li><code>AsAffineCrystGroupOnLeft( </code><var>S</var><code> ) F</code>
<p>
The property
<p>
<a name = "SSEC001.6"></a>
<li><code>IsAffineCrystGroupOnLeft( </code><var>S</var><code> ) P</code>
<p>
is <code>true</code> exactly for those groups which have been constructed in the 
above two ways.
<p>
It is recommended to adopt one representation for affine
crystallographic groups, and then to stick to it. To facilitate
this, routines are provided which assume a default representation.
<p>
<a name = "SSEC001.7"></a>
<li><code>AffineCrystGroup( </code><var>gens</var><code> ) F</code>
<li><code>AffineCrystGroup( </code><var>genlist</var><code> ) F</code>
<li><code>AffineCrystGroup( </code><var>genlist</var><code>, </code><var>identity</var><code> ) F</code>
<p>
calls <code>AffineCrystGroupOnRight</code> or <code>AffineCrystGroupOnLeft</code> with
the same arguments, depending on the value of <code>CrystGroupDefaultAction</code>.
<p>
<a name = "SSEC001.8"></a>
<li><code>AsAffineCrystGroup( </code><var>S</var><code> ) F</code>
<p>
calls <code>AsAffineCrystGroupOnRight</code> or <code>AsAffineCrystGroupOnLeft</code> with
the same argument, depending on the value of <code>CrystGroupDefaultAction</code>.
<p>
<a name = "SSEC001.9"></a>
<li><code>IsAffineCrystGroup( </code><var>S</var><code> ) F</code>
<p>
calls <code>IsAffineCrystGroupOnRight</code> or <code>IsAffineCrystGroupOnLeft</code> with
the same argument, depending on the value of <code>CrystGroupDefaultAction</code>.
<p>
<a name = "SSEC001.10"></a>
<li><code>TransposedMatrixGroup( </code><var>S</var><code> ) A</code>
<p>
returns the transpose of the affine crystallographic group <var>S</var>. 
If <var>S</var> is acting on the right, its transpose is acting on the left,
and vice versa.
<p>
<p>
<h2><a name="SECT002">2.2 Point group</a></h2>
<p><p>
<a name = "I1"></a>

The point group <var>P</var> of an affine crystallographic group <var>S</var> is the
quotient <var>S</var>/<var>T</var>, where <var>T</var> is the normal subgroup of all pure 
translations. <var>P</var> is isomorphic to the group generated by the
linear parts of all affine matrices contained in <var>S</var>. In <font face="Gill Sans,Helvetica,Arial">Cryst</font>
this latter group is identified with the point group of <var>S</var>.
<p>
<a name = "SSEC002.1"></a>
<li><code>PointGroup( </code><var>S</var><code> ) A</code>
<p>
returns the point group of <var>S</var>.
<p>
<a name = "SSEC002.2"></a>
<li><code>IsPointGroup( </code><var>P</var><code> ) P</code>
<p>
returns <code>true</code> if and only if <var>P</var> has been constructed as the
point group of an affine crystallographic group <var>S</var>.
<p>
<a name = "SSEC002.3"></a>
<li><code>AffineCrystGroupOfPointGroup( </code><var>P</var><code> ) A</code>
<p>
returns the affine crystallographic group <var>S</var>, from which <var>P</var> has
been constructed.
<p>
<a name = "SSEC002.4"></a>
<li><code>PointHomomorphism( </code><var>S</var><code> ) A</code>
<p>
returns a homomorphism from the affine crystallographic group to its
point group.
<p>
<a name = "SSEC002.5"></a>
<li><code>IsPointHomomorphism( </code><var>H</var><code> ) P</code>
<p>
returns <code>true</code> if and only if <var>H</var> has been constructed as the 
<code>PointHomomorphism</code> of an affine crystallographic group.
<p>
<p>
<h2><a name="SECT003">2.3 Translation lattice</a></h2>
<p><p>
<a name = "I2"></a>

The vectors by which the pure translations in an affine
crystallographic group translate form a discrete lattice, <var>L</var>,
called the translation lattice of <var>S</var>.
<p>
<a name = "SSEC003.1"></a>
<li><code>TranslationBasis( </code><var>S</var><code> ) A</code>
<p>
returns a basis of the translation lattice of <var>S</var>. The basis returned
is unique for the translation lattice.
<p>
<a name = "SSEC003.2"></a>
<li><code>InternalBasis( </code><var>S</var><code> ) A</code>
<p>
returns a basis used internally for many computations. It consists
of the translation basis <var>B</var> of <var>S</var>, extended by further standard
basis vectors if <var>B</var> has not full rank. 
<p>
If a generating set <var>B</var> of the translation lattice of <var>S</var> is known
from somewhere, this knowledge can be added to <var>S</var> with
<p>
<a name = "SSEC003.3"></a>
<li><code>AddTranslationBasis( </code><var>S</var><code>, </code><var>B</var><code> ) F</code>
<p>
This function must do further work, so that <code>SetTranslationBasis</code>
cannot be used for this purpose.  If doubts arise about the
correctness of the translation basis that has been added by hand, 
one can check the correctness of the stored value with
<p>
<a name = "SSEC003.4"></a>
<li><code>CheckTranslationBasis( </code><var>S</var><code> ) F</code>
<p>
An affine crystallographic group <var>S</var> acting on <i>d</i>-dimensional Euclidean
space is called a <strong>space group</strong> if its translation lattice has rank <i>d</i>.
<p>
<a name = "SSEC003.5"></a>
<li><code>IsSpaceGroup( </code><var>S</var><code> ) P</code>
<p>
tests if the affine crystallographic group <var>S</var> is a space group.
<p>
Since many computations are done internally in the <code>InternalBasis</code> of
<var>S</var>, we say that <var>S</var> is in standard form if the <code>InternalBasis</code> is the
standard basis of Euclidean row space or column space, respectively. 
This means that the translation lattice is generated by the first <i>k</i> 
standard basis vectors, where <i>k</i> is the rank of the translation lattice.
<p>
<a name = "SSEC003.6"></a>
<li><code>IsStandardAffineCrystGroup( </code><var>S</var><code> ) P</code>
<p>
checks if <var>S</var> is in standard form.
<p>
<a name = "SSEC003.7"></a>
<li><code>IsStandardSpaceGroup( </code><var>S</var><code> ) P</code>
<p>
checks if <var>S</var> is a space group in standard form.
<p>
<a name = "SSEC003.8"></a>
<li><code>StandardAffineCrystGroup( </code><var>S</var><code> ) F</code>
<p>
returns a conjugate of <var>S</var> which is in standard form.
<p>
If an space group is a semi-direct product of its point group with its
translation subgroup, <var>S</var> is said to be symmorphic.
<p>
<a name = "SSEC003.9"></a>
<li><code>IsSymmorphicSpaceGroup( </code><var>S</var><code> ) P</code>
<p>
checks if the space group <var>S</var> is symmorphic.
<p>
<p>
<h2><a name="SECT004">2.4 Special methods</a></h2>
<p><p>
<a name = "I3"></a>

In the representation by augmented matrices, affine crystallographic 
groups are infinite matrix groups. Their infinity is relatively
trivial in the sense that they have an abelian normal subgroup of 
finite index. Nevertheless, for many operations special methods
have to be installed that avoid to attempt algorithms that never
finish. These methods all make essential use of the exactness of the
sequence of homomorphism <code>0 -&gt; </code><var>T</var><code> -&gt; </code><var>S</var><code> -&gt; </code><var>P</var><code> -&gt; 1</code>, where
<var>T</var> is the translation subgroup of <var>S</var>, and <var>P</var> its point group.
<p>
All operations for general groups that make sense for affine
crystallographic groups should work also in that case. In 
particular, there should be no restrictions for finite 
<code>AffineCrystGroups</code>. For infinite groups, some restrictions 
apply, however. For instance, algorithms from the orbit-stabilizer 
family can work only if the orbits generated are finite. Note,
however, that <code>Normalizer</code>, <code>Centralizer</code> and <code>RepresentativeAction</code>
in an <code>AffineCrystGroup</code> work even if the corresponding orbit is
infinite.
<p>
Some methods installed for affine crystallographic groups have
a special behavior.
<p>
<a name = "I4"></a>

<a name = "SSEC004.1"></a>
<li><code>\^( </code><var>S</var><code>, </code><var>conj</var><code> )</code>
<p>
If <var>S</var> is an <code>AffineCrystGroupOnRight</code>, the group <var>conj^-1 <strong> S </strong> conj</var> 
is returned. <var>conj</var> must be an affine matrix acting on the right.
If <var>S</var> is an <code>AffineCrystGroupOnLeft</code>, the group <var>conj <strong> S </strong> conj^-1</var> 
is returned. <var>conj</var> must be an affine matrix acting on the left.
<p>
<a name = "SSEC004.2"></a>
<li><code>IsomorphismFpGroup( </code><var>P</var><code> ) A</code>
<p>
returns an isomorphism from the <code>PointGroup</code> <var>P</var> to an isomorphic
<code>FpGroup</code> <var>F</var>. If <var>P</var> is solvable, <var>F</var> is given in a 
power-commutator presentation. 
<p>
<a name = "SSEC004.3"></a>
<li><code>IsomorphismFpGroup( </code><var>S</var><code> ) A</code>
<p>
returns an isomorphism from the <code>AffineCrystGroup</code> <var>S</var> to an isomorphic
<code>FpGroup</code> <var>F</var>. If <var>S</var> is solvable, <var>F</var> is given in a power-commutator 
presentation. The presentation of <var>F</var> is an extension of the presentation
of the point group <var>P</var> of <var>S</var> used in <code>IsomorphismFpGroup( </code><var>P</var><code> )</code>. 
<p>
If the package polycyclic is installed, <font face="Gill Sans,Helvetica,Arial">Cryst</font> automatically loads
it, and then provides special methods for <code>IsomorphismPcpGroup</code>.
<p>
<a name = "SSEC004.4"></a>
<li><code>IsomorphismPcpGroup( </code><var>P</var><code> ) A</code>
<p>
with <var>P</var> a solvable <code>PointGroup</code>, returns an isomorphism from <var>P</var> 
to an isomorphic <code>PcpGroup</code> <var>pcp</var>. For details about <code>PcpGroups</code>, 
we refer to the documentation of the package polycyclic.  
<p>
<a name = "SSEC004.5"></a>
<li><code>IsomorphismPcpGroup( </code><var>S</var><code> ) A</code>
<p>
with <var>S</var> a solvable <code>AffineCrystGroup</code> (i.e., one with a solvable
<code>PointGroup</code>), returns an isomorphism from <var>S</var> to an isomorphic
<code>PcpGroup</code> <var>pcp</var>. The presentation of <var>pcp</var> is an extension of the 
presentation of the point group <var>P</var> of <var>S</var> used in 
<code>IsomorphismPcpGroup( </code><var>P</var><code> )</code>. 
<p>
<p>
<h2><a name="SECT005">2.5 Maximal subgroups</a></h2>
<p><p>
<a name = "I5"></a>

<a name = "I6"></a>

Since an <code>AffineCrystGroup</code> has infinitely many maximal subgroups in general,
in the computation of maximal subgroups it must be further specified which
maximal subgroups are desired. Recall that a maximal subgroup of an
<code>AffineCrystGroup</code> is either latticeequal or classequal. A latticeequal 
subgroup has the same translation lattice as the parent, while a 
classequal subgroup has the same point group as the parent. In the 
classequal case a maximal subgroup always has prime-power index, whereas
in the latticeequal case this is so only in dimensions up to 3.
<p>
<a name = "SSEC005.1"></a>
<li><code>MaximalSubgroupClassReps( </code><var>S</var><code>, </code><var>flags</var><code> ) O</code>
<p>
returns a list of conjugacy class representatives of maximal subgroups
of the <code>AffineCrystGroup</code> <var>S</var>.
<p>
<a name = "SSEC005.2"></a>
<li><code>ConjugacyClassesMaximalSubgroups( </code><var>S</var><code>, </code><var>flags</var><code> ) O</code>
<p>
returns a list of conjugacy classes of maximal subgroups
of the <code>AffineCrystGroup</code> <var>S</var>.
<p>
In these two functions, the argument <var>flags</var> specifies which maximal
subgroups are computed. <var>flags</var> is a record which may have the following
components:
<p>
<p>
<dl compact>
<p>
<dt>   <code>flags.primes := [p1 .. pr]</code> <dd>
   only maximal subgroups of p-power index for the given primes p are 
   computed 
<p>
<dt>   <code>flags.latticeequal := true</code> <dd>
   only latticeequal maximal subgroups are computed
<p>
<dt>   <code>flags.classequal := true</code> <dd>
   only classequal maximal subgroups are computed
<p>
</dl>
<p>
<code>flags.latticeequal</code> and <code>flags.classequal</code> must not both be bound
and <code>true</code>. <code>flags.primes</code> may be omitted only if <code>flags.latticeequal</code> 
is bound and <code>true</code>.
<p>
<pre>
gap&gt; S := SpaceGroupIT(3,222);
SpaceGroupOnRightIT(3,222,'2')
gap&gt; L := MaximalSubgroupClassReps( S, rec( primes := [3,5] ) );;
gap&gt; List( L, IndexInParent );
[ 3, 27, 125 ]
gap&gt; L := MaximalSubgroupClassReps( S,             
&gt;                  rec( classequal := true, primes := [3,5] ) );;
gap&gt; List( L, IndexInParent );                                                 
[ 27, 125 ]
gap&gt; L := MaximalSubgroupClassReps( S,
&gt;                  rec( latticeequal := true, primes := [3,5] ) );;
gap&gt; List( L, IndexInParent );                                       
[ 3 ]
gap&gt; L := MaximalSubgroupClassReps( S, rec( latticeequal := true ) );;
gap&gt; Length(L);
5
gap&gt; List( L, IndexInParent );                                       
[ 2, 2, 2, 3, 4 ]
</pre>
<p>
<p>
<h2><a name="SECT006">2.6 Space groups with a given point group</a></h2>
<p><p>
<a name = "I7"></a>

<a name = "SSEC006.1"></a>
<li><code>SpaceGroupsByPointGroupOnRight( </code><var>P</var><code> ) O</code>
<li><code>SpaceGroupsByPointGroupOnRight( </code><var>P</var><code>, </code><var>norm</var><code> ) O</code>
<li><code>SpaceGroupsByPointGroupOnRight( </code><var>P</var><code>, </code><var>norm</var><code>, </code><var>orbsflag</var><code> ) O</code>
<p>
where <var>P</var> is any finite subgroup of <i>GL</i>(<i>d</i>,<b>Z</b>), returns a list of 
all space groups (acting on the right) with point group <var>P</var>, up to 
conjugacy in the full translation group of Euclidean space. All 
these space groups are returned as <code>AffineCrystGroupOnRight</code> in 
standard representation.  If a second argument is present, which must 
be a list of elements of the normalizer of <var>P</var> in <i>GL</i>(<i>d</i>,<b>Z</b>), only 
space groups inequivalent under conjugation with these elements are 
returned.  If these normalizer elements, together with <var>P</var>, generate 
the full normalizer of <var>P</var> in <i>GL</i>(<i>d</i>,<b>Z</b>), then exactly one 
representative of each space group type is obtained. 
If the third argument <var>orbsflag</var>, which must be <code>false</code> or <code>true</code>,
is also present and <code>true</code>, all space groups up to conjugacy in
the full translation group are returned, but these space groups are 
collected into orbits under the conjugation action with elements from
<var>norm</var>.
<p>
<pre>
gap&gt; P := Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ] ]);
Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ] ])
gap&gt; norm := GeneratorsOfGroup( NormalizerInGLnZ( P ) );
[ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ], [ [ -1, 0 ], [ 0, -1 ] ],
  [ [ 1, 0 ], [ 0, -1 ] ], [ [ 0, 1 ], [ 1, 0 ] ] ]
gap&gt; SpaceGroupsByPointGroupOnRight( P );
[ &lt;matrix group with 4 generators&gt;, &lt;matrix group with 4 generators&gt;, 
  &lt;matrix group with 4 generators&gt;, &lt;matrix group with 4 generators&gt; ]
gap&gt; SpaceGroupsByPointGroupOnRight( P, norm );
[ &lt;matrix group with 4 generators&gt;, &lt;matrix group with 4 generators&gt;, 
  &lt;matrix group with 4 generators&gt; ]
gap&gt; SpaceGroupsByPointGroupOnRight( P, norm, true );
[ [ &lt;matrix group with 4 generators&gt; ], 
  [ &lt;matrix group with 4 generators&gt;, &lt;matrix group with 4 generators&gt; ], 
  [ &lt;matrix group with 4 generators&gt; ] ]
</pre>
<p>
<a name = "SSEC006.2"></a>
<li><code>SpaceGroupTypesByPointGroupOnRight( </code><var>P</var><code> ) O</code>
<li><code>SpaceGroupTypesByPointGroupOnRight( </code><var>P</var><code>, </code><var>orbsflag</var><code> ) O</code>
<p>
returns a list of space group type representatives (acting on the right) 
of the point group <var>P</var>. As in the case of <code>SpaceGroupsByPointGroupOnRight</code>,
if the boolean argument <var>orbsflag</var> is present and <code>true</code>, not only space
group type representatives, but all space groups up to conjugacy in
the full translation group are returned. These are then collected 
into lists of space groups of the same space group type.
<p>
<pre>
gap&gt; SpaceGroupTypesByPointGroupOnRight( P );
[ &lt;matrix group with 4 generators&gt;, &lt;matrix group with 4 generators&gt;, 
  &lt;matrix group with 4 generators&gt; ]
gap&gt; SpaceGroupTypesByPointGroupOnRight( P, true );
[ [ &lt;matrix group with 4 generators&gt; ], 
  [ &lt;matrix group with 4 generators&gt;, &lt;matrix group with 4 generators&gt; ], 
  [ &lt;matrix group with 4 generators&gt; ] ]
</pre>
<p>
<a name = "SSEC006.3"></a>
<li><code>SpaceGroupsByPointGroupOnLeft( </code><var>P</var><code> ) O</code>
<li><code>SpaceGroupsByPointGroupOnLeft( </code><var>P</var><code>, </code><var>norm</var><code> ) O</code>
<li><code>SpaceGroupsByPointGroupOnLeft( </code><var>P</var><code>, </code><var>norm</var><code>, </code><var>orbsflag</var><code> ) O</code>
<p>
works the same way as <code>SpaceGroupsByPointGroupOnRight</code>, except that
the space groups acting from the left are returned.
<p>
<a name = "SSEC006.6"></a>
<li><code>SpaceGroupTypesByPointGroupOnLeft( </code><var>P</var><code> ) O</code>
<li><code>SpaceGroupTypesByPointGroupOnLeft( </code><var>P</var><code>, </code><var>orbsflag</var><code> ) O</code>
<p>
works the same way as <code>SpaceGroupTypesByPointGroupOnRight</code>, except that
the space groups acting from the left are returned.
<p>
<a name = "SSEC006.5"></a>
<li><code>SpaceGroupsByPointGroup( </code><var>P</var><code> ) O</code>
<li><code>SpaceGroupsByPointGroup( </code><var>P</var><code>, </code><var>norm</var><code> ) O</code>
<li><code>SpaceGroupsByPointGroup( </code><var>P</var><code>, </code><var>norm</var><code>, </code><var>orbsflag</var><code> ) O</code>
<p>
calls <code>SpaceGroupByPointGroupOnRight</code> or <code>SpaceGroupByPointGroupOnLeft</code> 
with the same arguments, depending on the value of <code>CrystGroupDefaultAction</code>.
<p>
<li><code>SpaceGroupTypesByPointGroupOnLeft( </code><var>P</var><code> ) O</code>
<li><code>SpaceGroupTypesByPointGroupOnLeft( </code><var>P</var><code>, </code><var>orbsflag</var><code> ) O</code>
<p>
calls either <code>SpaceGroupTypesByPointGroupOnRight</code> or
<code>SpaceGroupTypesByPointGroupOnLeft</code> with the same arguments, depending
on the variable <code>CrystGroupDefaultAction</code>.
<p>
<p>
<h2><a name="SECT007">2.7 Wyckoff positions</a></h2>
<p><p>
A Wyckoff position of a space group <var>S</var> is an equivalence class of
points in Euclidean space, having stabilizers which are conjugate
subgroups of <var>S</var>.  Apart from a subset of lower dimension, which
contains points with even bigger stabilizers, a Wyckoff position
consists of an <var>S</var>-orbit of some affine subspace <var>A</var>. In <font face="Gill Sans,Helvetica,Arial">Cryst</font>,
a Wyckoff position <var>W</var> is specified by such a representative affine
subspace.
<p>
<a name = "SSEC007.1"></a>
<li><code>WyckoffPositions( </code><var>S</var><code> ) A</code>
<p>
returns the list of Wyckoff positions of the space group <var>S</var>.
<p>
<pre>
gap&gt; S := SpaceGroupIT(2,14);
SpaceGroupOnRightIT(2,14,'1')
gap&gt; W := WyckoffPositions(S);
[ &lt; Wyckoff position, point group 1, translation := [ 0, 0 ], 
    basis := [  ] &gt;
    , &lt; Wyckoff position, point group 1, translation := [ 1/3, 2/3 ], 
    basis := [  ] &gt;
    , &lt; Wyckoff position, point group 1, translation := [ 2/3, 1/3 ], 
    basis := [  ] &gt;
    , &lt; Wyckoff position, point group 2, translation := [ 0, 0 ], 
    basis := [ [ 1, -1 ] ] &gt;
    , &lt; Wyckoff position, point group 3, translation := [ 0, 0 ], 
    basis := [ [ 1, 0 ], [ 0, 1 ] ] &gt;
     ]
</pre>
<p>
In the previous example, <var>S</var> has three kinds of special points
(the basis is empty), whose representatives all have a stabilizer 
with the a point group in the same conjugacy class (with label 1),
one kind of special line (the basis has length 1), and the general
position.
<p>
<a name = "SSEC007.2"></a>
<li><code>WyckoffPositionsByStabilizer( </code><var>S</var><code>, </code><var>sub</var><code> ) O</code>
<p>
where <var>S</var> is a space group and <var>sub</var> a subgroup of the point group or
a list of such subgroups, determines only the Wyckoff positions whose
representatives have a stabilizer with a point group conjugate to the 
subgroup <var>sub</var> or to a subgroup contained in the list <var>sub</var>, respectively.
<p>
<pre>
gap&gt; sub := Group([ [ [ 0, -1 ], [ -1, 0 ] ] ]);
Group([ [ [ 0, -1 ], [ -1, 0 ] ] ])
gap&gt; IsSubgroup( PointGroup( S ), sub );
true
gap&gt; WyckoffPositionsByStabilizer( S, sub );
[ &lt; Wyckoff position, point group 1, translation := [ 0, 0 ], 
    basis := [ [ 1, -1 ] ] &gt;
     ]
</pre>
<p>
<a name = "SSEC007.3"></a>
<li><code>IsWyckoffPosition( </code><var>obj</var><code> ) R</code>
<p>
checks whether <var>obj</var> is a Wyckoff position.
<p>
<pre>
gap&gt; ForAll( W, IsWyckoffPosition );
true
</pre>
<p>
<a name = "SSEC007.4"></a>
<li><code>WyckoffBasis( </code><var>W</var><code> ) O</code>
<p>
returns a basis of the representative affine subspace of the Wyckoff 
position <var>W</var>.
<p>
<pre>
gap&gt; WyckoffBasis( W[4] );
[ [ 1, -1 ] ]
</pre>
<p>
<a name = "SSEC007.5"></a>
<li><code>WyckoffTranslation( </code><var>W</var><code> ) O</code>
<p>
returns a point of the representative affine subspace of the Wyckoff 
position <var>W</var>.
<p>
<pre>
gap&gt; WyckoffTranslation( W[3] );
[ 2/3, 1/3 ]
</pre>
<p>
<a name = "SSEC007.6"></a>
<li><code>WyckoffSpaceGroup( </code><var>W</var><code> ) O</code>
<p>
returns the space group of which <var>W</var> is a Wyckoff position.
<p>
<pre>
gap&gt; WyckoffSpaceGroup( W[1] );
SpaceGroupOnRightIT(2,14,'1')
</pre>
<p>
<a name = "SSEC007.7"></a>
<li><code>WyckoffStabilizer( </code><var>W</var><code> ) O</code>
<p>
returns the stabilizer of the (generic) points in the representative
affine subspace of the Wyckoff position <var>W</var>. This stabilizer is a
subgroup of the space group of <var>W</var>, and thus an <code>AffineCrystGroup</code>.
<p>
<pre>
gap&gt; stab := WyckoffStabilizer( W[4] );
Group([ [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, 1 ] ] ])
gap&gt; IsAffineCrystGroupOnRight( stab );
true
</pre>
<p>
<a name = "SSEC007.8"></a>
<li><code>WyckoffOrbit( </code><var>W</var><code> ) O</code>
<p>
determines the orbit of the representative affine subspace <var>A</var> of the 
Wyckoff position <var>W</var> under the space group <var>S</var> of <var>W</var> (modulo lattice 
translations). The affine subspaces in this orbit are then converted 
into a list of Wyckoff positions, which is returned. The Wyckoff 
positions in this list are just different representations of <var>W</var>. 
Their <code>WyckoffBasis</code> and <code>WyckoffTranslation</code> are chosen such that 
the induced parametrizations of their representative subspaces are 
mapped onto each other under the space group operation.
<p>
<pre>
gap&gt; orb := WyckoffOrbit( W[4] );
[ &lt; Wyckoff position, point group 2, translation := [ 0, 0 ], 
    basis := [ [ -2, -1 ] ] &gt;
    , &lt; Wyckoff position, point group 2, translation := [ 0, 0 ], 
    basis := [ [ 1, -1 ] ] &gt;
    , &lt; Wyckoff position, point group 2, translation := [ 0, 0 ], 
    basis := [ [ 1, 2 ] ] &gt;
     ]
gap&gt; Set(orb);
[ &lt; Wyckoff position, point group 2, translation := [ 0, 0 ], 
    basis := [ [ -2, -1 ] ] &gt;
     ]
</pre>
<p>
<a name = "SSEC007.9"></a>
<li><code>WyckoffGraph( </code><var>W</var><code> [, def ] ) O</code>
<li><code>WyckoffGraph( </code><var>S</var><code> [, def ] ) O</code>
<p>
displays the incidence relations of a set of Wyckoff positions graphically.
This function is available only under <font face="Gill Sans,Helvetica,Arial">XGAP</font>. In the first form, <var>W</var> is
a list of Wyckoff positions, which must belong to the same space group.
In the second form, <var>S</var> is a space group; in this case, the function is
applied to the complete list of Wyckoff positions of <var>S</var>. In both forms,
a second argument, <var>def</var>, is possible, which is a record with optional
components <code>title</code>, <code>width</code> and <code>height</code>, specifying the title, width
and height of the graphic sheet on which the graph will be displayed.
<p>
Each vertex of the graph represents a Wyckoff position. Vertices are
arranged in horizontal layers, determined by the dimension <var>s</var> of the 
Wyckoff position and the size <var>s</var> of its stabilizer. For each layer, 
the list <var>[ d, s ]</var> is displayed at the right border of the graphic 
sheet. The vertical positions of the layers are ordered according to 
the dimension of the Wyckoff position (primary criterion, smaller 
dimension above) and the size of the stabilizer (secondary criterion, 
bigger stabilizer above). Two Wyckoff positions are connected if the 
closure of the lower one contains the upper one. Two Wyckoff positions
are connected by a line only if there is no Wyckoff position in between. 
The connection line is labelled with the number of affine subspaces 
contained in the lower Wyckoff position that contain a fixed 
representative affine subspace of the upper Wyckoff position.
For instance, if the lower Wyckoff position consists of a space
group orbit of lines (and thus the upper one of an orbit of points), 
the label of the connection line is the number of lines in the orbit 
which cross a fixed representative point of the upper Wyckoff position.
<p>
The initial layout of the graph is not always optimal. In particular,
several connection lines can be drawn on top of each other, so that
it is not easy to see who is connected with whom. With the left
mouse button, the graph can be rearranged, however. Just drag each 
vertex to a more suitable place. Note, however, that a vertex can not 
leave its layer. For more details, please consult the <font face="Gill Sans,Helvetica,Arial">XGAP</font> manual.
<p>
By right-clicking on a vertex, a popup menu with information on the
Wyckoff position of that vertex appears. It informs on the size of
the <code>WyckoffStabilizer</code>, the dimension of the Wyckoff position, 
the length of the <code>WyckoffOrbit</code> (modulo lattice translations),
the translation and basis of a representative affine subspace, the
isomorphims type of the <code>WyckoffStabilizer</code>, and the ConjugacyClassInfo
of the point group <var>P</var> of the <code>WyckoffStabilizer</code>. The ConjugacyClassInfo
lists for each conjugacy class of elements of <var>P</var> the number of that 
class, the order, trace and determinant of its elements, and the 
size of the class. This information is useful to identify the 
geometric operation of the stabilizer. The isomorphism type and
ConjugacyClassInfo may not be displayed initially. It this case,
they can be obtained by left-clicking on them, or by left-clicking
on the button labelled <var>all</var>. Unfortunately, the popup window 
cannot be resized automatically, and since the ConjugacyClassInfo 
needs several lines for the display, the information may be hidden 
behind the border of the window. You will have to use the slider of
the popup window to make it visible, or resize the window with the
help of your window manager. Alternatively, you can right-click 
again on the same vertex, in which case a new popup window of 
sufficient size appears. 
<p>
<p>
<h2><a name="SECT008">2.8 Normalizers</a></h2>
<p><p>
<a name = "I8"></a>

At present, most of the functions in this section require that the 
<font face="Gill Sans,Helvetica,Arial">GAP</font> package <font face="Gill Sans,Helvetica,Arial">CaratInterface</font> is installed (and compiled). Otherwise,
they are available only for space groups from the crystallographic 
groups catalogue or the International Tables (section <a href="CHAP002.htm#SECT011">International Tables</a>).
<p>
<a name = "SSEC008.1"></a>
<li><code>NormalizerPointGroupInGLnZ( </code><var>P</var><code> ) A</code>
<p>
returns the normalizer of the <code>PointGroup</code> <var>P</var> in the group of 
all unimodular transformations of the lattice spanned by the
<code>InternalBasis</code> <var>B</var> of the <code>AffineCrystGroup</code> <var>S</var> of <var>P</var>. 
If <var>S</var> is in standard representation, this is the same as 
<code>Normalizer( GL(dim,Integers), P )</code>, otherwise it is
<code>Normalizer( GL(dim,Integers), P^(B^-1) )^B</code>. This notion
probably makes sense only if <var>S</var> is a space group. Note that 
<var>P</var> must have elements with integer entries (which is the case 
if <var>S</var> is a space group).
<p>
<a name = "SSEC008.2"></a>
<li><code>CentralizerPointGroupInGLnZ( </code><var>P</var><code> ) A</code>
<p>
returns the centralizer of the <code>PointGroup</code> <var>P</var> in the group of 
all unimodular transformations of the lattice spanned by the
<code>InternalBasis</code> <var>B</var> of the <code>AffineCrystGroup</code> <var>S</var> of <var>P</var>. 
If <var>S</var> is in standard representation, this is the same as 
<code>Centralizer( GL(dim,Integers), P )</code>, otherwise it is
<code>Centralizer( GL(dim,Integers), P^(B^-1) )^B</code>. This notion
probably makes sense only if <var>S</var> is a space group. Note that 
<var>P</var> must have elements with integer entries (which is the case 
if <var>S</var> is a space group).
<p>
<a name = "I9"></a>

<a name = "SSEC008.3"></a>
<li><code>TranslationNormalizer( </code><var>S</var><code> ) F</code>
<p>
returns the normalizer of the space group <var>S</var> in the full translation
group. At present, this function is implemented only for space groups,
not for general <code>AffineCrystGroups</code>.  The translation normalizer <var>TN</var>
of <var>S</var> may contain a continuous subgroup <var>C</var>.  A basis of the space of
such continuous translations is bound in <code>TN!.continuousTranslations</code>.
Since this subgroup is not finitely generated, it is <strong>not</strong> contained
in the group generated by <code>GeneratorsOfGroup( </code><var>TN</var><code> )</code>. Properly speaking, 
the translation normalizer is the span of <var>TN</var> and <var>C</var> together.
<p>
<a name = "I10"></a>

<a name = "SSEC008.4"></a>
<li><code>AffineNormalizer( </code><var>S</var><code> ) F</code>
<p>
returns the affine normalizer of the space group <var>S</var>.  The affine
normalizer <var>AF</var> contains the translation normalizer as a subgroup.
Similarly as with <code>TranslationNormalizer</code>, the subgroup <var>C</var> of
continuous translations, which is not finitely generated, is not part
of the group that is returned.  However, a basis of the space of
continuous translations is bound in the component 
<code>AF!.continuousTranslations</code>.
<p>
<a name = "SSEC008.5"></a>
<li><code>AffineInequivalentSubgroups( </code><var>S</var><code>, </code><var>sub</var><code> ) F</code>
<p>
takes as input a space group <var>S</var> and list of subgroups of <var>S</var>,
and returns a sublist of affine inequivalent subgroups.
Note that the affine normalizer of <var>S</var> must be discrete in the
current implementation. If it is not, <code>fail</code> is returned. 
<p>
For two space groups <var>S1</var> and <var>S2</var> of the same dimension (and
acting from the same side), 
<p>
<a name = "SSEC008.6"></a>
<li><code>ConjugatorSpaceGroups( </code><var>S1</var><code>, </code><var>S2</var><code> ) F</code>
<p>
returns an affine matrix <var>m</var> such that <code>S1^m = S2</code>, of <code>fail</code>
if no such matrix exists, i.e., if the two space groups are not
equivalent. This function requires that the <font face="Gill Sans,Helvetica,Arial">GAP</font> package
<font face="Gill Sans,Helvetica,Arial">CaratInterface</font> is installed (and compiled).
<p>
<p>
<h2><a name="SECT009">2.9 Color groups</a></h2>
<p><p>
A color group <var>C</var> is a group whose elements are colored in the following 
way. The elements having the same color as the identity element <code>One(C)</code> 
form a subgroup <var>H</var> of finite index <var>n</var>. <var>H</var> is called the <code>ColorSubgroup</code> 
of <var>C</var>. Elements of <var>C</var> have the same color if and only if they are 
in the same right coset of <var>H</var> in <var>C</var>. The labelling of the colors,
which runs from 1 to <var>n</var>, is determined by a fixed labelling of the 
right cosets of <var>H</var>. The list of right cosets of <var>H</var> is stored in
the attribute <code>ColorCosetList</code>. The color of the elements of a 
coset corresponds to the position of the coset in that list. Elements 
of <var>H</var> by definition have color 1, i.e., the coset with representative 
<code>One(C)</code> is always the first element of the <code>ColorCosetList</code> of <var>C</var>. 
Color groups which have a parent inherit their coloring from that parent, 
including the labelling of the colors. As with other groups, color groups 
having no parent are their own parent.
<p>
Right multiplication by a fixed element <var>g</var> of <var>C</var> induces a permutation 
<var>p(g)</var> of the colors of the parent of <var>C</var>.  This defines a natural 
homomorphism of <var>C</var> into the symmetric group of degree <var>n</var>. The image 
of this homomorphism is called the <code>ColorPermGroup</code> of <var>C</var>, and the 
homomorphism to it is called the <code>ColorHomomorphism</code> of <var>C</var>.
<p>
<a name = "SSEC009.1"></a>
<li><code>ColorGroup( </code><var>G</var><code>, </code><var>H</var><code> ) F</code>
<p>
constructs a colored copy of <var>G</var>, with color subgroup <var>H</var> (which
should have finite index in <var>G</var>). Color groups constructed in this way
are always their own parent. It is not possible to set their
parent attribute to a different value.
<p>
Groups which may be colored include, in particular, <code>AffineCrystGroups</code>,  
but coloring of any finite group should work as well.
<p>
<a name = "SSEC009.2"></a>
<li><code>IsColorGroup( </code><var>G</var><code> ) P</code>
<p>
checks whether <var>G</var> is a color group.
<p>
<a name = "SSEC009.3"></a>
<li><code>ColorSubgroup( </code><var>G</var><code> ) A</code>
<p>
returns the color subgroup of <var>G</var>.
<p>
<a name = "SSEC009.4"></a>
<li><code>ColorCosetList( </code><var>G</var><code> ) A</code>
<p>
returns the color labelling cosets of <var>G</var>.
<p>
<a name = "SSEC009.5"></a>
<li><code>ColorOfElement( </code><var>G</var><code>, </code><var>elem</var><code> ) F</code>
<p>
returns the color of an element of <var>G</var>.
<p>
<a name = "SSEC009.6"></a>
<li><code>ColorPermGroup( </code><var>G</var><code> ) A</code>
<p>
returns the ColorPermGroup of <var>G</var>, which is the permutation group 
induced by <var>G</var> acting on the colors of the parent of <var>G</var>.
<p>
<a name = "SSEC009.7"></a>
<li><code>ColorHomomorphism( </code><var>G</var><code> ) A</code>
<p>
returns the homomomorphism from <var>G</var> to its <code>ColorPermGroup</code>.
<p>
<a name = "SSEC009.8"></a>
<li><code>Subgroup( </code><var>C</var><code>, </code><var>elems</var><code> ) O</code>
<p>
where <var>C</var> is a color group, returns the colored subgroup <var>U</var> of <var>C</var>
generated by <var>elems</var>. The parent of <var>U</var> is set to the parent of <var>C</var>, 
from which the coloring of <var>U</var> is inherited.
<p>
<pre>
gap&gt; G := Group(  (1,2,3), (2,3,4) );
Group([ (1,2,3), (2,3,4) ])
gap&gt; H := Group( (1,2,3) ); 
Group([ (1,2,3) ])
gap&gt; C := ColorGroup( G, H );
Group([ (1,2,3), (2,3,4) ])
gap&gt; ColorSubgroup( C ) = H;
true
gap&gt; ColorCosetList( C );
[ RightCoset(Group( [ (1,2,3) ] ),()), RightCoset(Group( [ (1,2,3) ] ),(1,2)
    (3,4)), RightCoset(Group( [ (1,2,3) ] ),(1,3)(2,4)), 
  RightCoset(Group( [ (1,2,3) ] ),(1,4)(2,3)) ]
gap&gt; List( last, x -&gt; ColorOfElement( C, Representative(x) ) );
[ 1, 2, 3, 4 ]
gap&gt; U := Subgroup( C, [(1,3)(2,4)] );
Group([ (1,3)(2,4) ])
gap&gt; IsColorGroup( U );
true
gap&gt; ColorSubgroup( U );
Group(())
gap&gt; ColorCosetList( U );
[ RightCoset(Group( () ),()), RightCoset(Group( () ),(1,3)(2,4)) ]
gap&gt; List( last, x -&gt; ColorOfElement( U, Representative(x) ) );
[ 1, 3 ]
</pre>
<p>
<p>
<h2><a name="SECT010">2.10 Colored AffineCrystGroups</a></h2>
<p><p>
If <var>C</var> is a colored <code>AffineCrystGroup</code> whose <code>ColorSubgroup</code> is 
lattice-equal (translationengleich) with <var>C</var>, then the <code>PointGroup</code> of 
<var>C</var> can consistently be colored. In that case,
<p>
<a name = "SSEC010.1"></a>
<li><code>PointGroup( C ) A</code>
<p>
returns a colored point group. Otherwise, the <code>PointGroup</code> of <var>C</var> is
an ordinary, uncolored group.
<p>
<pre>
gap&gt; S := SpaceGroupIT( 2, 10 );                                  
SpaceGroupOnRightIT(2,10,'1')
gap&gt; m := MaximalSubgroupClassReps( S, rec( primes := [2] ) );    
[ &lt;matrix group with 4 generators&gt;, &lt;matrix group with 3 generators&gt;, 
  &lt;matrix group with 4 generators&gt; ]
gap&gt; List( last, x -&gt; TranslationBasis(x) = TranslationBasis(S) );
[ false, true, false ]
gap&gt; C := ColorGroup( S, m[1] );; IsColorGroup( PointGroup( C ) );
false
gap&gt; C := ColorGroup( S, m[2] );; IsColorGroup( PointGroup( C ) );
true
</pre>
<p>
Two colorings of a <strong>space group</strong> <var>S</var> are <strong>equivalent</strong> if the two
<code>ColorSubgroups</code> are conjugate in the affine normalizer of <var>S</var>.
For instance, a list of inequivalent index-2 <code>ColorSubgroups</code> of 
<var>S</var> can be obtained with the following code:
<p>
<a name = "I11"></a>

<pre>
gap&gt; sub := MaximalSubgroupClassReps( S, rec( primes := [2] ) );
[ &lt;matrix group with 4 generators&gt;, &lt;matrix group with 3 generators&gt;, 
  &lt;matrix group with 4 generators&gt; ]
gap&gt; List( sub, Size );
[ infinity, infinity, infinity ]
gap&gt; sub := Filtered( sub, s -&gt; IndexInParent( s ) = 2 );
[ &lt;matrix group of size infinity with 4 generators&gt;, 
  &lt;matrix group of size infinity with 3 generators&gt;, 
  &lt;matrix group of size infinity with 4 generators&gt; ]
gap&gt; Length( AffineInequivalentSubgroups( S, sub ) );
2
</pre>
<p>
Note that <code>AffineInequivalentSubgroups</code> requires the <font face="Gill Sans,Helvetica,Arial">GAP</font> package 
<font face="Gill Sans,Helvetica,Arial">CaratInterface</font> to be installed. Otherwise, this function is supported
only for <code>AffineCrystGroups</code> constructed from the crystallographic groups 
catalog.
<p>
<p>
<h2><a name="SECT011">2.11 International Tables</a></h2>
<p><p>
For the user's convenience, a table with the 17 plane groups and the
230 space groups is included in <font face="Gill Sans,Helvetica,Arial">Cryst</font>. These groups are given in 
exactly the same settings (i.e., choices of basis and origin) as in 
the International Tables. Space groups with a centered lattice are
therefore given in the non-primitive basis crystallographers are
used to. This is in contrast to the crystallographic groups catalogue,
where always a primitive basis is used.
<p>
For some of the 3D space groups, two different settings are available.
The possible settings are labelled with the characters <code>'1'</code>,
<code>'2'</code>,<code>'b'</code>,<code>'c'</code>,<code>'h'</code> and <code>'r'</code>.
If only one setting is available, it is labelled <code>'1'</code>. For
some space groups there exists a point with higher symmetry than the
origin of the <code>'1'</code> setting. In such cases, a second setting
<code>'2'</code> is available, which has this high symmetry point as
origin. This second setting <code>'2'</code> then is the default setting.
Space groups which have a unique axis can have this axis in <var>b</var>
direction (setting<code>'b'</code>) or <var>c</var> direction (setting
<code>'c'</code>). <code>'b'</code> is the default setting. Rhombohedral 
space groups are given in a hexagonal basis (setting <code>'h'</code>) and
in a rhombohedral basis (setting <code>'r'</code>). <code>'h'</code> is the 
default setting.
<p>
<a name = "SSEC011.1"></a>
<li><code>SpaceGroupSettingsIT( </code><var>dim</var><code>, </code><var>nr</var><code> ) F</code>
<p>
returns a string, whose characters label the available settings of
the space group with number <var>nr</var> and dimension <var>dim</var>.
<p>
<a name = "SSEC011.2"></a>
<li><code>SpaceGroupOnRightIT( </code><var>dim</var><code>, </code><var>nr</var><code> ) F</code>
<li><code>SpaceGroupOnRightIT( </code><var>dim</var><code>, </code><var>nr</var><code>, </code><var>setting</var><code> ) F</code>
<p>
returns space group number <var>nr</var> in dimension <var>dim</var> in the
representation acting on the right. In the third argument,
the desired setting can be specified. Otherwise, the space 
group is returned in the default setting for that space group.
<p>
<a name = "SSEC011.3"></a>
<li><code>SpaceGroupOnLeftIT( </code><var>dim</var><code>, </code><var>nr</var><code> ) F</code>
<li><code>SpaceGroupOnLeftIT( </code><var>dim</var><code>, </code><var>nr</var><code>, </code><var>setting</var><code> ) F</code>
<p>
returns space group number <var>nr</var> in dimension <var>dim</var> in the
representation acting on the left. In the third argument,
the desired setting can be specified. Otherwise, the space 
group is returned in the default setting for that space group.
<p>
<a name = "SSEC011.4"></a>
<li><code>SpaceGroupIT( </code><var>dim</var><code>, </code><var>nr</var><code> ) F</code>
<li><code>SpaceGroupIT( </code><var>dim</var><code>, </code><var>nr</var><code>, </code><var>setting</var><code> ) F</code>
<p>
returns either <code>SpaceGroupOnRightIT</code> or <code>SpaceGroupOnLeftIT</code> with
the same arguments, depending on the value of <code>CrystGroupDefaultAction</code>.
<p>
<pre>
gap&gt; SpaceGroupSettingsIT( 3, 146 );
"hr"
gap&gt; SpaceGroupOnRightIT( 3, 146 );        
SpaceGroupOnRightIT(3,146,'h')
gap&gt; SpaceGroupOnRightIT( 3, 146, 'r' );
SpaceGroupOnRightIT(3,146,'r')
</pre>
<p>
<p>
[<a href = "chapters.htm">Up</a>] [<a href ="CHAP001.htm">Previous</a>] [<a href = "theindex.htm">Index</a>]
<P>
<address>cryst manual<br>September 2025
</address></body></html>