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
2
4 Non-interactive ANUPQ functions
3
4
Here we describe all the non-interactive functions of the ANUPQ package;
5
i.e. one-shot functions that invoke the pq program in such a way that once
6
GAP has got what it needs, the pq program is allowed to exit. It is expected
7
that most of the time users will only need these functions. The functions
8
interface with three of the four algorithms (see Chapter 'Introduction')
9
provided by the ANU pq C program, and are mainly grouped according to the
10
algorithm of the pq program they relate to.
11
12
In Section 'Computing p-Quotients', we describe the functions that give
13
access to the p-quotient algorithm.
14
15
Section 'Computing Standard Presentations' describe functions that give
16
access to the standard presentation algorithm.
17
18
Section 'Testing p-Groups for Isomorphism' describe functions that implement
19
an isomorphism test for p-groups using the standard presentation algorithm.
20
21
In Section 'Computing Descendants of a p-Group', we describe functions that
22
give access to the p-group generation algorithm.
23
24
To use any of the functions one must have at some stage previously typed:
25
26
 Example 
27
gap> LoadPackage("anupq");
28

29
30
(the response of which we have omitted; see 'Loading the ANUPQ Package').
31
32
It is strongly recommended that the user try the examples provided. To save
33
typing there is a PqExample equivalent for each manual example. We also
34
suggest that to start with you may find the examples more instructive if you
35
set the InfoANUPQ level to 2 (see InfoANUPQ (3.3-1)).
36
37
38
4.1 Computing p-Quotients
39
40
4.1-1 Pq
41
42
Pq( F: options )  function
43
44
returns for the fp or pc group F, the p-quotient of F specified by options,
45
as a pc group. Following the colon, options is a selection of the options
46
from the following list, separated by commas like record components (see
47
Section Reference: Function Call With Options in the GAP Reference Manual).
48
As a minimum the user must supply a value for the Prime option. Below we
49
list the options recognised by Pq (see Chapter 'ANUPQ Options' for detailed
50
descriptions).
51
52
 Prime := p
53
54
 ClassBound := n
55
56
 Exponent := n
57
58
 Relators := rels
59
60
 Metabelian
61
62
 Identities := funcs
63
64
 GroupName := name
65
66
 OutputLevel := n
67
68
 SetupFile := filename
69
70
 PqWorkspace := workspace
71
72
Notes: Pq may also be called with no arguments or one integer argument, in
73
which case it is being used interactively (see Pq (5.3-1)); the same options
74
may be used, except that SetupFile and PqWorkspace are ignored by the
75
interactive Pq function.
76
77
See Section 'Attributes and a Property for fp and pc p-groups' for the
78
attributes and property NuclearRank, MultiplicatorRank and IsCapable which
79
may be applied to the group returned by Pq.
80
81
See also PqEpimorphism (PqEpimorphism (4.1-2)).
82
83
We now give a few examples of the use of Pq. Except for the addition of a
84
few comments and the non-suppression of output (by not using duplicated
85
semicolons) the next 3 examples may be run by typing: PqExample( "Pq" );
86
(see PqExample (3.4-4)).
87
88
 Example 
89
gap> LoadPackage("anupq");; # does nothing if ANUPQ is already loaded
90
gap> # First we get a p-quotient of a free group of rank 2
91
gap> F := FreeGroup("a", "b");; a := F.1;; b := F.2;;
92
gap> Pq( F : Prime := 2, ClassBound := 3 ); 
93
<pc group of size 1024 with 10 generators>
94
gap> # Now let us get a p-quotient of an fp group
95
gap> G := F / [a^4, b^4];
96
<fp group on the generators [ a, b ]>
97
gap> Pq( G : Prime := 2, ClassBound := 3 ); 
98
<pc group of size 256 with 8 generators>
99
gap> # Now let's get a different p-quotient of the same group
100
gap> Pq( G : Prime := 2, ClassBound := 3, Exponent := 4 ); 
101
<pc group of size 128 with 7 generators>
102
gap> # Now we'll get a p-quotient of another fp group
103
gap> # which we will redo using the `Relators' option
104
gap> R := [ a^25, Comm(Comm(b, a), a), b^5 ];
105
[ a^25, a^-1*b^-1*a*b*a^-1*b^-1*a^-1*b*a^2, b^5 ]
106
gap> H := F / R;
107
<fp group on the generators [ a, b ]>
108
gap> Pq( H : Prime := 5, ClassBound := 5, Metabelian );
109
<pc group of size 78125 with 7 generators>
110

111
112
Now we redo the last example to show how one may use the Relators option.
113
Observe that Comm(Comm(b, a), a) is a left normed commutator which must be
114
written in square bracket notation for the pq program and embedded in a pair
115
of double quotes. The function PqGAPRelators (see PqGAPRelators (3.4-2)) can
116
be used to translate a list of strings prepared for the Relators option into
117
GAP format. Below we use it. Observe that the value of R is the same as
118
before.
119
120
 Example 
121
gap> F := FreeGroup("a", "b");;
122
gap> # `F' was defined for `Relators'. We use the same strings that GAP uses
123
gap> # for printing the free group generators. It is *not* necessary to
124
gap> # predefine: a := F.1; etc. (as it was above).
125
gap> rels := [ "a^25", "[b, a, a]", "b^5" ];
126
[ "a^25", "[b, a, a]", "b^5" ]
127
gap> R := PqGAPRelators(F, rels);
128
[ a^25, a^-1*b^-1*a*b*a^-1*b^-1*a^-1*b*a^2, b^5 ]
129
gap> H := F / R;
130
<fp group on the generators [ a, b ]>
131
gap> Pq( H : Prime := 5, ClassBound := 5, Metabelian, 
132
>  Relators := rels );
133
<pc group of size 78125 with 7 generators>
134

135
136
In fact, above we could have just passed F (rather than H), i.e. we could
137
have done:
138
139
 Example 
140
gap> F := FreeGroup("a", "b");;
141
gap> rels := [ "a^25", "[b, a, a]", "b^5" ];
142
[ "a^25", "[b, a, a]", "b^5" ]
143
gap> Pq( F : Prime := 5, ClassBound := 5, Metabelian, 
144
>  Relators := rels );
145
<pc group of size 78125 with 7 generators>
146

147
148
The non-interactive Pq function also allows the options to be passed in two
149
other ways; these alternatives have been included for those familiar with
150
the GAP 3 version of the ANUPQ package; the preferred method of passing
151
options is the one already described. Firstly, they may be passed in a
152
record as a second argument; note that any boolean options must be set
153
explicitly e.g.
154
155
 Example 
156
gap> Pq( H, rec( Prime := 5, ClassBound := 5, Metabelian := true ) );
157
<pc group of size 78125 with 7 generators>
158

159
160
It is also possible to pass them as extra arguments, where each option name
161
appears as a string followed immediately by its value (if not a boolean
162
option) e.g.
163
164
 Example 
165
gap> Pq( H, "Prime", 5, "ClassBound", 5, "Metabelian" );
166
<pc group of size 78125 with 7 generators>
167

168
169
The preceding two examples can be run from GAP via PqExample( "Pq-ni" );
170
(see PqExample (3.4-4)).
171
172
This method of passing options permits abbreviation; the only restriction is
173
that the abbreviation must be unique. So "Pr" may be used for "Prime",
174
"Class" or even just "C" for "ClassBound", etc.
175
176
The following example illustrates the use of the option Identities. We
177
compute the largest finite Burnside group of exponent 5 that also satisfies
178
the 3-Engel identity. Each identity is defined by a function whose arguments
179
correspond to the variables of the identity. The return value of each of
180
those functions is the identity evaluated on the arguments of the function.
181
182
 Example 
183
gap> F := FreeGroup(2);
184
<free group on the generators [ f1, f2 ]>
185
gap> Burnside5 := x->x^5;
186
function( x ) ... end
187
gap> Engel3 := function( x,y ) return PqLeftNormComm( [x,y,y,y] ); end;
188
function( x, y ) ... end
189
gap> Pq( F : Prime := 5, Identities := [ Burnside5, Engel3 ] );
190
#I Class 1 with 2 generators.
191
#I Class 2 with 3 generators.
192
#I Class 3 with 5 generators.
193
#I Class 3 with 5 generators.
194
<pc group of size 3125 with 5 generators>
195

196
197
The above example can be run from GAP via PqExample( "B5-5-Engel3-Id" );
198
(see PqExample (3.4-4)).
199
200
4.1-2 PqEpimorphism
201
202
PqEpimorphism( F: options )  function
203
204
returns for the fp or pc group F an epimorphism from F onto the p-quotient
205
of F specified by options; the possible options options and required option
206
("Prime") are as for Pq (see Pq (4.1-1)). PqEpimorphism only differs from Pq
207
in what it outputs; everything about what must/may be passed as input to
208
PqEpimorphism is the same as for Pq. The same alternative methods of passing
209
options to the non-interactive Pq function are available to the
210
non-interactive version of PqEpimorphism.
211
212
Notes: PqEpimorphism may also be called with no arguments or one integer
213
argument, in which case it is being used interactively (see PqEpimorphism
214
(5.3-2)), and the options SetupFile and PqWorkspace are ignored by the
215
interactive PqEpimorphism function.
216
217
See Section 'Attributes and a Property for fp and pc p-groups' for the
218
attributes and property NuclearRank, MultiplicatorRank and IsCapable which
219
may be applied to the image group of the epimorphism returned by
220
PqEpimorphism.
221
222
 Example 
223
gap> F := FreeGroup (2, "F");
224
<free group on the generators [ F1, F2 ]>
225
gap> phi := PqEpimorphism( F : Prime := 5, ClassBound := 2 );
226
[ F1, F2 ] -> [ f1, f2 ]
227
gap> Image( phi );
228
<pc group of size 3125 with 5 generators>
229

230
231
Typing: PqExample( "PqEpimorphism" ); runs the above example in GAP
232
(see PqExample (3.4-4)).
233
234
4.1-3 PqPCover
235
236
PqPCover( F: options )  function
237
238
returns for the fp or pc group F, the p-covering group of the p-quotient of
239
F specified by options, as a pc group, i.e. the p-covering group of the
240
p-quotient Pq( F : options ). Thus the options that PqPCover accepts are
241
exactly those expected for Pq (and hence as a minimum the user must supply a
242
value for the Prime option; see Pq (4.1-1) for more details), except in the
243
following special case.
244
245
If F is already a p-group, in the sense that IsPGroup(F) is true, then
246
247
Prime
248
defaults to PrimePGroup(F), if not supplied and HasPrimePGroup(F) =
249
true; and
250
251
ClassBound
252
defaults to PClassPGroup(F) if HasPClassPGroup(F) = true if not
253
supplied, or to the usual default of 63, otherwise.
254
255
The same alternative methods of passing options to the non-interactive Pq
256
function are available to the non-interactive version of PqPCover.
257
258
We now give a few examples of the use of PqPCover. These examples are just a
259
subset of the ones we gave for Pq (see Pq (4.1-1)), except that in each
260
instance the command Pq has been replaced with PqPCover. Essentially the
261
same examples may be run by typing: PqExample( "PqPCover" ); (see PqExample
262
(3.4-4)).
263
264
 Example 
265
gap> F := FreeGroup("a", "b");; a := F.1;; b := F.2;;
266
gap> PqPCover( F : Prime := 2, ClassBound := 3 );
267
<pc group of size 262144 with 18 generators>
268
gap> 
269
gap> # Now let's get a p-cover of a p-quotient of an fp group
270
gap> G := F / [a^4, b^4];
271
<fp group on the generators [ a, b ]>
272
gap> PqPCover( G : Prime := 2, ClassBound := 3 );
273
<pc group of size 16384 with 14 generators>
274
gap> 
275
gap> # Now let's get a p-cover of a different p-quotient of the same group
276
gap> PqPCover( G : Prime := 2, ClassBound := 3, Exponent := 4 );
277
<pc group of size 8192 with 13 generators>
278
gap> 
279
gap> # Now we'll get a p-cover of a p-quotient of another fp group
280
gap> # which we will redo using the `Relators' option
281
gap> R := [ a^25, Comm(Comm(b, a), a), b^5 ];
282
[ a^25, a^-1*b^-1*a*b*a^-1*b^-1*a^-1*b*a^2, b^5 ]
283
gap> H := F / R;
284
<fp group on the generators [ a, b ]>
285
gap> PqPCover( H : Prime := 5, ClassBound := 5, Metabelian );
286
<pc group of size 48828125 with 11 generators>
287
gap> 
288
gap> # Now we redo the previous example using the `Relators' option
289
gap> F := FreeGroup("a", "b");;
290
gap> rels := [ "a^25", "[b, a, a]", "b^5" ];
291
[ "a^25", "[b, a, a]", "b^5" ]
292
gap> PqPCover( F : Prime := 5, ClassBound := 5, Metabelian, 
293
>  Relators := rels );
294
<pc group of size 48828125 with 11 generators>
295

296
297
298
4.2 Computing Standard Presentations
299
300
4.2-1 PqStandardPresentation
301
302
PqStandardPresentation( F: options )  function
303
StandardPresentation( F: options )  method
304
305
return the p-quotient specified by options of the fp or pc p-group F, as an
306
fp group which has a standard presentation. Here options is a selection of
307
the options from the following list (see Chapter 'ANUPQ Options' for
308
detailed descriptions). Section 'Hints and Warnings regarding the use of
309
Options' gives some important hints and warnings regarding option usage, and
310
Section Reference: Function Call With Options in the GAP Reference Manual
311
describes their record-like syntax.
312
313
 Prime := p
314
315
 pQuotient := Q
316
317
 ClassBound := n
318
319
 Exponent := n
320
321
 Metabelian
322
323
 GroupName := name
324
325
 OutputLevel := n
326
327
 StandardPresentationFile := filename
328
329
 SetupFile := filename
330
331
 PqWorkspace := workspace
332
333
Unless F is a pc p-group, the user must supply either the option Prime or
334
the option pQuotient (if both Prime and pQuotient are supplied, the prime p
335
is determined by applying PrimePGroup (see PrimePGroup (Reference:
336
PrimePGroup) in the Reference Manual) to the value of pQuotient).
337
338
The options for PqStandardPresentation may also be passed in the two other
339
alternative ways described for Pq (see Pq (4.1-1)). StandardPresentation
340
does not provide these alternative ways of passing options.
341
342
Notes: In contrast to the function Pq (see Pq (4.1-1)) which returns a pc
343
group, PqStandardPresentation or StandardPresentation returns an fp group.
344
This is because the output is mainly used for isomorphism testing for which
345
an fp group is enough. However, the presentation is a polycyclic
346
presentation and if you need to do any further computation with this group
347
(e.g. to find the order) you can use the function PcGroupFpGroup
348
(see PcGroupFpGroup (Reference: PcGroupFpGroup) in the GAP Reference Manual)
349
to form a pc group.
350
351
If the user does not supply a p-quotient Q via the pQuotient option and the
352
prime p is either supplied or F is a pc p-group, then a p-quotient Q is
353
computed. If the user does supply a p-quotient Q via the pQuotient option,
354
the package AutPGrp is called to compute the automorphism group of Q; an
355
error will occur that asks the user to install the package AutPGrp if the
356
automorphism group cannot be computed.
357
358
The attributes and property NuclearRank, MultiplicatorRank and IsCapable are
359
set for the group returned by PqStandardPresentation or StandardPresentation
360
(see Section 'Attributes and a Property for fp and pc p-groups').
361
362
We illustrate the method with the following examples.
363
364
 Example 
365
gap> F := FreeGroup( "a", "b" );; a := F.1;; b := F.2;;
366
gap> G := F / [a^25, Comm(Comm(b, a), a), b^5];
367
<fp group on the generators [ a, b ]>
368
gap> S := StandardPresentation( G : Prime := 5, ClassBound := 10 );
369
<fp group on the generators [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, 
370
 f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26 ]>
371
gap> IsPcGroup( S );
372
false
373
gap> # if we need to compute with S we should convert it to a pc group
374
gap> Spc := PcGroupFpGroup( S );
375
<pc group of size 1490116119384765625 with 26 generators>
376
gap> 
377
gap> H := F / [ a^625, Comm(Comm(Comm(Comm(b, a), a), a), a)/Comm(b, a)^5,
378
>  Comm(Comm(b, a), b), b^625 ];;
379
gap> StandardPresentation( H : Prime := 5, ClassBound := 15, Metabelian );
380
<fp group on the generators [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, 
381
 f12, f13, f14, f15, f16, f17, f18, f19, f20 ]>
382
gap> 
383
gap> F4 := FreeGroup( "a", "b", "c", "d" );;
384
gap> a := F4.1;; b := F4.2;; c := F4.3;; d := F4.4;;
385
gap> G4 := F4 / [ b^4, b^2 / Comm(Comm (b, a), a), d^16,
386
>  a^16 / (c * d), b^8 / (d * c^4) ];
387
<fp group on the generators [ a, b, c, d ]>
388
gap> K := Pq( G4 : Prime := 2, ClassBound := 1 );
389
<pc group of size 4 with 2 generators>
390
gap> StandardPresentation( G4 : pQuotient := K, ClassBound := 14 );
391
<fp group with 53 generators>
392

393
394
Typing: PqExample( "StandardPresentation" ); runs the above example in GAP
395
(see PqExample (3.4-4)).
396
397
4.2-2 EpimorphismPqStandardPresentation
398
399
EpimorphismPqStandardPresentation( F: options )  function
400
EpimorphismStandardPresentation( F: options )  method
401
402
Each of the above functions accepts the same arguments and options as the
403
function StandardPresentation (see StandardPresentation (4.2-1)) and returns
404
an epimorphism from the fp or pc group F onto the finitely presented group
405
given by a standard presentation, i.e. if S is the standard presentation
406
computed for the p-quotient of F by StandardPresentation then
407
EpimorphismStandardPresentation returns the epimorphism from F to the group
408
with presentation S.
409
410
Note: The attributes and property NuclearRank, MultiplicatorRank and
411
IsCapable are set for the image group of the epimorphism returned by
412
EpimorphismPqStandardPresentation or EpimorphismStandardPresentation (see
413
Section 'Attributes and a Property for fp and pc p-groups').
414
415
We illustrate the function with the following example.
416
417
 Example 
418
gap> F := FreeGroup(6, "F");
419
<free group on the generators [ F1, F2, F3, F4, F5, F6 ]>
420
gap> # For printing GAP uses the symbols F1, ... for the generators of F
421
gap> x := F.1;; y := F.2;; z := F.3;; w := F.4;; a := F.5;; b := F.6;;
422
gap> R := [x^3 / w, y^3 / w * a^2 * b^2, w^3 / b,
423
>  Comm (y, x) / z, Comm (z, x), Comm (z, y) / a, z^3 ];;
424
gap> Q := F / R;
425
<fp group on the generators [ F1, F2, F3, F4, F5, F6 ]>
426
gap> # For printing GAP also uses the symbols F1, ... for the generators of Q
427
gap> # (the same as used for F) ... but the gen'rs of Q and F are different:
428
gap> GeneratorsOfGroup(F) = GeneratorsOfGroup(Q);
429
false
430
gap> G := Pq( Q : Prime := 3, ClassBound := 3 );
431
<pc group of size 729 with 6 generators>
432
gap> phi := EpimorphismStandardPresentation( Q : Prime := 3,
433
>  ClassBound := 3 );
434
[ F1, F2, F3, F4, F5, F6 ] -> [ f1*f2^2*f3*f4^2*f5^2, f1*f2*f3*f5, f3^2, 
435
 f4*f6^2, f5, f6 ]
436
gap> Source(phi); # This is the group Q (GAP uses F1, ... for gen'r symbols)
437
<fp group of size infinity on the generators [ F1, F2, F3, F4, F5, F6 ]>
438
gap> Range(phi); # This is the group G (GAP uses f1, ... for gen'r symbols)
439
<fp group on the generators [ f1, f2, f3, f4, f5, f6 ]>
440
gap> AssignGeneratorVariables(G);
441
#I Assigned the global variables [ f1, f2, f3, f4, f5, f6 ]
442
gap> # Just to see that the images of [F1, ..., F6] do generate G
443
gap> Group([ f1*f2^2*f3, f1*f2*f3*f4*f5^2*f6^2, f3^2, f4, f5, f6 ]) = G;
444
true
445
gap> Size( Image(phi) );
446
729
447

448
449
Typing: PqExample( "EpimorphismStandardPresentation" ); runs the above
450
example in GAP (see PqExample (3.4-4)). Note that AssignGeneratorVariables
451
(see AssignGeneratorVariables (Reference: AssignGeneratorVariables)) has
452
only been available since GAP 4.3.
453
454
455
4.3 Testing p-Groups for Isomorphism
456
457
4.3-1 IsPqIsomorphicPGroup
458
459
IsPqIsomorphicPGroup( G, H )  function
460
IsIsomorphicPGroup( G, H )  method
461
462
each return true if G is isomorphic to H, where both G and H must be pc
463
groups of prime power order. These functions compute and compare in GAP the
464
fp groups given by standard presentations for G and H (see
465
StandardPresentation (4.2-1)).
466
467
 Example 
468
gap> G := Group( (1,2,3,4), (1,3) );
469
Group([ (1,2,3,4), (1,3) ])
470
gap> P1 := Image( IsomorphismPcGroup( G ) );
471
Group([ f1, f2, f3 ])
472
gap> P2 := SmallGroup( 8, 5 );
473
<pc group of size 8 with 3 generators>
474
gap> IsIsomorphicPGroup( P1, P2 );
475
false
476
gap> P3 := SmallGroup( 8, 4 );
477
<pc group of size 8 with 3 generators>
478
gap> IsIsomorphicPGroup( P1, P3 );
479
false
480
gap> P4 := SmallGroup( 8, 3 );
481
<pc group of size 8 with 3 generators>
482
gap> IsIsomorphicPGroup( P1, P4 );
483
true
484

485
486
Typing: PqExample( "IsIsomorphicPGroup" ); runs the above example in GAP
487
(see PqExample (3.4-4)).
488
489
490
4.4 Computing Descendants of a p-Group
491
492
4.4-1 PqDescendants
493
494
PqDescendants( G: options )  function
495
496
returns, for the pc group G which must be of prime power order with a
497
confluent pc presentation (see IsConfluent (Reference: IsConfluent for pc
498
groups) in the GAP Reference Manual), a list of descendants (pc groups) of
499
G. Following the colon options a selection of the options listed below
500
should be given, separated by commas like record components (see
501
Section Reference: Function Call With Options in the GAP Reference Manual).
502
See Chapter 'ANUPQ Options' for detailed descriptions of the options.
503
504
The automorphism group of each descendant D is also computed via a call to
505
the AutomorphismGroupPGroup function of the AutPGrp package.
506
507
 ClassBound := n
508
509
 Relators := rels
510
511
 OrderBound := n
512
513
 StepSize := n, StepSize := list
514
515
 RankInitialSegmentSubgroups := n
516
517
 SpaceEfficient
518
519
 CapableDescendants
520
521
 AllDescendants := false
522
523
 Exponent := n
524
525
 Metabelian
526
527
 GroupName := name
528
529
 SubList := sub
530
531
 BasicAlgorithm
532
533
 CustomiseOutput := rec
534
535
 SetupFile := filename
536
537
 PqWorkspace := workspace
538
539
Notes: The function PqDescendants uses the automorphism group of G which it
540
computes via the package AutPGrp. If this package is not installed an error
541
may be raised. If the automorphism group of G is insoluble, the pq program
542
will call GAP together with the AutPGrp package for certain orbit-stabilizer
543
calculations. (So, in any case, one should ensure the AutPGrp package is
544
installed.)
545
546
The attributes and property NuclearRank, MultiplicatorRank and IsCapable are
547
set for each group of the list returned by PqDescendants (see
548
Section 'Attributes and a Property for fp and pc p-groups').
549
550
The options options for PqDescendants may be passed in an alternative manner
551
to that already described, namely you can pass PqDescendants a record as an
552
argument, which contains as entries some (or all) of the above mentioned.
553
Those parameters which do not occur in the record are set to their default
554
values.
555
556
Note that you cannot set both OrderBound and StepSize.
557
558
In the first example we compute all descendants of the Klein four group
559
which have exponent-2 class at most 5 and order at most 2^6.
560
561
 Example 
562
gap> F := FreeGroup( "a", "b" );; a := F.1;; b := F.2;;
563
gap> G := PcGroupFpGroup( F / [ a^2, b^2, Comm(b, a) ] );
564
<pc group of size 4 with 2 generators>
565
gap> des := PqDescendants( G : OrderBound := 6, ClassBound := 5 );;
566
gap> Length(des);
567
83
568
gap> List(des, Size); 
569
[ 8, 8, 8, 16, 16, 16, 32, 16, 16, 16, 16, 16, 32, 32, 64, 64, 32, 32, 32, 
570
 32, 32, 32, 32, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 32, 32, 32, 32, 
571
 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 32, 32, 32, 32, 32, 64, 64, 64, 
572
 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 
573
 64, 64, 64, 64, 64, 64, 64 ]
574
gap> List(des, d -> Length( PCentralSeries( d, 2 ) ) - 1 );
575
[ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
576
 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 
577
 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
578
 4, 4, 4, 5, 5, 5, 5, 5 ]
579

580
581
Below, we compute all capable descendants of order 27 of the elementary
582
abelian group of order 9.
583
584
 Example 
585
gap> F := FreeGroup( 2, "g" );
586
<free group on the generators [ g1, g2 ]>
587
gap> G := PcGroupFpGroup( F / [ F.1^3, F.2^3, Comm(F.1, F.2) ] );
588
<pc group of size 9 with 2 generators>
589
gap> des := PqDescendants( G : OrderBound := 3, ClassBound := 2,
590
>  CapableDescendants );
591
[ <pc group of size 27 with 3 generators>, 
592
 <pc group of size 27 with 3 generators> ]
593
gap> List(des, d -> Length( PCentralSeries( d, 3 ) ) - 1 );
594
[ 2, 2 ]
595
gap> # For comparison let us now compute all descendants
596
gap> PqDescendants( G : OrderBound := 3, ClassBound := 2);
597
[ <pc group of size 27 with 3 generators>, 
598
 <pc group of size 27 with 3 generators>, 
599
 <pc group of size 27 with 3 generators> ]
600

601
602
In the third example, we compute all capable descendants of the elementary
603
abelian group of order 5^2 which have exponent-5 class at most 3, exponent
604
5, and are metabelian.
605
606
 Example 
607
gap> F := FreeGroup( 2, "g" );;
608
gap> G := PcGroupFpGroup( F / [ F.1^5, F.2^5, Comm(F.2, F.1) ] );
609
<pc group of size 25 with 2 generators>
610
gap> des := PqDescendants( G : Metabelian, ClassBound := 3,
611
>  Exponent := 5, CapableDescendants );
612
[ <pc group of size 125 with 3 generators>, 
613
 <pc group of size 625 with 4 generators>, 
614
 <pc group of size 3125 with 5 generators> ]
615
gap> List(des, d -> Length( PCentralSeries( d, 5 ) ) - 1 );
616
[ 2, 3, 3 ]
617
gap> List(des, d -> Length( DerivedSeries( d ) ) );
618
[ 3, 3, 3 ]
619
gap> List(des, d -> Maximum( List( Elements(d), Order ) ) );
620
[ 5, 5, 5 ]
621

622
623
The examples "PqDescendants-1", "PqDescendants-2" and "PqDescendants-3" (in
624
order) are essentially the same as the above three examples (see PqExample
625
(3.4-4)).
626
627
4.4-2 PqSupplementInnerAutomorphisms
628
629
PqSupplementInnerAutomorphisms( D )  function
630
631
returns a generating set for a supplement to the inner automorphisms of D,
632
in the form of a record with fields agAutos, agOrder and glAutos, as
633
provided by the pq program. One should be very careful in using these
634
automorphisms for a descendant calculation.
635
636
Note: In principle there must be a way to use those automorphisms in order
637
to compute descendants but there does not seem to be a way to hand back
638
these automorphisms properly to the pq program.
639
640
 Example 
641
gap> Q := Pq( FreeGroup(2) : Prime := 3, ClassBound := 1 );
642
<pc group of size 9 with 2 generators>
643
gap> des := PqDescendants( Q : StepSize := 1 );
644
[ <pc group of size 27 with 3 generators>, 
645
 <pc group of size 27 with 3 generators>, 
646
 <pc group of size 27 with 3 generators> ]
647
gap> S := PqSupplementInnerAutomorphisms( des[3] );
648
rec( agAutos := [ ], agOrder := [ 3, 2, 2, 2 ], 
649
 glAutos := [ Pcgs([ f1, f2, f3 ]) -> [ f1*f2^2, f2, f3 ], 
650
 Pcgs([ f1, f2, f3 ]) -> [ f1^2, f2, f3^2 ], 
651
 Pcgs([ f1, f2, f3 ]) -> [ f1^2, f2, f3^2 ] ] )
652
gap> A := AutomorphismGroupPGroup( des[3] );
653
rec( 
654
 agAutos := [ Pcgs([ f1, f2, f3 ]) -> [ f1^2, f2, f3^2 ], 
655
 Pcgs([ f1, f2, f3 ]) -> [ f1*f2^2, f2, f3 ], 
656
 Pcgs([ f1, f2, f3 ]) -> [ f1*f3, f2, f3 ], 
657
 Pcgs([ f1, f2, f3 ]) -> [ f1, f2*f3, f3 ] ], agOrder := [ 2, 3, 3, 3 ], 
658
 glAutos := [ ], glOper := [ ], glOrder := 1, 
659
 group := <pc group of size 27 with 3 generators>, 
660
 one := IdentityMapping( <pc group of size 27 with 3 generators> ), 
661
 size := 54 )
662

663
664
Typing: PqExample( "PqSupplementInnerAutomorphisms" ); runs the above
665
example in GAP (see PqExample (3.4-4)).
666
667
Note that by also including PqStart as a second argument to PqExample one
668
can see how it is possible, with the aid of PqSetPQuotientToGroup
669
(see PqSetPQuotientToGroup (5.3-7)), to do the equivalent computations with
670
the interactive versions of Pq and PqDescendants and a single pq process
671
(recall pq is the name of the external C program).
672
673
4.4-3 PqList
674
675
PqList( filename: [SubList := sub] )  function
676
677
reads a file with name filename (a string) and returns the list L of pc
678
groups (or with option SubList a sublist of L or a single pc group in L)
679
defined in that file. If the option SubList is passed and has the value sub,
680
then it has the same meaning as for PqDescendants, i.e. if sub is an integer
681
then PqList returns L[sub]; otherwise, if sub is a list of integers PqList
682
returns Sublist(L, sub ).
683
684
Both PqList and SavePqList (see SavePqList (4.4-4)) can be used to save and
685
restore a list of descendants (see PqDescendants (4.4-1)).
686
687
4.4-4 SavePqList
688
689
SavePqList( filename, list )  function
690
691
writes a list of descendants list to a file with name filename (a string).
692
693
SavePqList and PqList (see PqList (4.4-3)) can be used to save and restore,
694
respectively, the results of PqDescendants (see PqDescendants (4.4-1)).
695
696
697