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 Isoclinism of groups and crossed modules
3
4
This chapter describes some functions written by Alper Odabaş and Enver
5
Uslu, and reported in their paper [IOU16]. Section 4.1 contains some
6
additional basic functions for crossed modules, constructing quotients,
7
centres, centralizers and normalizers. In Sections 4.2 and 4.3 there are
8
functions dealing specifically with isoclinism for groups and for crossed
9
modules. Since these functions represent a recent addition to the package
10
(as of November 2015), the function names are liable to change in future
11
versions. The notion of isoclinism has been crucial to the enumeration of
12
groups of prime power order, see for example James, Newman and O'Brien,
13
[JNO90].
14
15
16
4.1 More operations for crossed modules
17
18
4.1-1 FactorPreXMod
19
20
FactorPreXMod( X1, X2 )  operation
21
NaturalMorphismByNormalSubPreXMod( X1, X2 )  operation
22
23
When mathcalX_2 = (∂_2 : S_2 -> R_2) is a normal sub-precrossed module of
24
mathcalX_1 = (∂_1 : S_1 -> R_1), then the quotient precrossed module is (∂ :
25
S_2/S_1 -> R_2/R_1) with the induced boundary and action maps. Quotienting a
26
precrossed module by it's Peiffer subgroup is a special case of this
27
construction.
28
29
 Example 
30

31
gap> d24 := DihedralGroup(24);; SetName( d24, "d24" );
32
gap> X24 := XModByAutomorphismGroup( d24 );; Size(X24);
33
[ 24, 48 ]
34
gap> nsx := NormalSubXMods( X24 );; 
35
gap> ids := List( nsx, n -> IdGroup(n) );; 
36
gap> pos1 := Position( ids, [ [4,1], [8,3] ] );;
37
gap> Xn1 := nsx[pos1]; 
38
[Group( [ f2*f4^2, f3*f4 ] )->Group( [ f3, f4, f5 ] )]
39
gap> nat1 := NaturalMorphismByNormalSubPreXMod( X24, Xn1 ); 
40
[[d24->PAut(d24)] => [..]]
41
gap> Qn1 := FactorPreXMod( X24, Xn1 );; 
42
gap> [ Size(Xn1), Size(Qn1) ];
43
[ [ 4, 8 ], [ 6, 6 ] ]
44

45

46
47
4.1-2 IntersectionSubXMods
48
49
IntersectionSubXMods( X0, X1, X2 )  operation
50
51
When X1,X2 are subcrossed modules of X0, then the source and range of their
52
intersection are the intersections of the sources and ranges of X1 and X2
53
respectively.
54
55
 Example 
56

57
gap> pos2 := Position( ids, [ [24,6], [12,4] ] );;
58
gap> Xn2 := nsx[pos2]; 
59
[d24->Group( [ f1*f3, f2, f5 ] )]
60
gap> pos3 := Position( ids, [ [12,2], [24,5] ] );;
61
gap> Xn3 := nsx[pos3]; 
62
[Group( [ f2, f3, f4 ] )->Group( [ f1, f2, f4, f5 ] )]
63
gap> Xn23 := IntersectionSubXMods( X24, Xn2, Xn3 );
64
[Group( [ f2, f3, f4 ] )->Group( [ f2, f5, f2^2, f2*f5, f2^2*f5 ] )]
65
gap> [ Size(Xn2), Size(Xn3), Size(Xn23) ];
66
[ [ 24, 12 ], [ 12, 24 ], [ 12, 6 ] ]
67

68

69
70
4.1-3 Displacement
71
72
Displacement( alpha, r, s )  operation
73
DisplacementSubgroup( X0 )  attribute
74
75
Commutators may be written [r,q] = r^-1q^-1rq = (q^-1)^rq = r^-1r^q, and
76
satisfy identities
77
78
79
[r,q]^p = [r^p,q^p], \qquad [pr,q] = [p,q]^r[r,q], \qquad [r,pq] =
80
[r,q][r,p]^q, \qquad [r,q]^{-1} = [q,r].
81
82

83
84
In a similar way, when a group R acts on a group S, the displacement of s ∈
85
S by r ∈ R is defined to be ⟨ r,s ⟩ := (s^-1)^rs ∈ S. When mathcalX = (∂ : S
86
-> R) is a pre-crossed module, the first crossed module axiom requires ∂⟨
87
r,s ⟩ = [r,∂ s]. For a given action α the Displacement function may be used
88
to calculate ⟨ r,s ⟩. Displacements satisfy the following identities, where
89
s,t ∈ S,~ p,q,r ∈ R:
90
91
92
\langle r,s \rangle^p = \langle r^p,s^p \rangle, \qquad \langle qr,s \rangle
93
= \langle q,s \rangle^r \langle r,s \rangle, \qquad \langle r,st \rangle =
94
\langle r,t \rangle \langle r,s \rangle^t, \qquad \langle r,s \rangle^{-1} =
95
\langle r^{-1},s^r \rangle.
96
97

98
99
The DisplacementSubgroup of mathcalX is the subgroup Disp(mathcalX) of S
100
generated by these displacements. The identities imply ⟨ r,s ⟩^t = ⟨
101
r,st^r^-1} ⟩ ⟨ r^-1,t ⟩, so Disp(mathcalX) is normal in S.
102
103
 Example 
104

105
gap> pos4 := Position( ids, [ [6,2], [24,14] ] );;
106
gap> Xn4 := nsx[pos4];; 
107
gap> Sn4 := Source(Xn4);; 
108
gap> Rn4 := Range(Xn4);; 
109
gap> r := Rn4.1;; s := Sn4.1;; 
110
gap> d := Displacement( XModAction(Xn4), r, s );
111
f4
112
gap> bn4 := Boundary( Xn4 );;
113
gap> Image( bn4, d ) = Comm( r, Image( bn4, s ) ); 
114
true
115
gap> DisplacementSubgroup( Xn4 );
116
Group([ f4 ])
117

118

119
120
4.1-4 CommutatorSubXMod
121
122
CommutatorSubXMod( X, X1, X2 )  operation
123
CrossActionSubgroup( X, X1, X2 )  operation
124
125
When mathcalX_1 = (N -> Q), mathcalX_2 = (M -> P) are two normal subcrossed
126
modules of mathcalX = (∂ : S -> R), the displacements ⟨ p,n ⟩ and ⟨ q,m ⟩
127
all map by ∂ into [Q,P]. These displacements form a normal subgroup of S,
128
called the CrossActionSubgroup. The CommutatorSubXMod
129
[mathcalX_1,mathcalX_2] has this subgroup as source and [P,Q] as range, and
130
is normal in mathcalX.
131
132
 Example 
133

134
gap> CrossActionSubgroup( X24, Xn2, Xn3 );
135
Group([ f2 ])
136
gap> Cn23 := CommutatorSubXMod( X24, Xn2, Xn3 );
137
[Group( [ f2 ] )->Group( [ f2, f5 ] )]
138
gap> Size(Cn23);
139
[ 12, 6 ]
140
gap> Xn23 = Cn23;
141
true
142

143

144
145
4.1-5 DerivedSubXMod
146
147
DerivedSubXMod( X0 )  attribute
148
149
The DerivedSubXMod of mathcalX is the normal subcrossed module
150
[mathcalX,mathcalX] = (∂' : Disp(mathcalX) -> [R,R]) where ∂' is the
151
restriction of ∂ (see page 66 of Norrie's thesis [Nor87]).
152
153
 Example 
154

155
gap> DXn4 := DerivedSubXMod( Xn4 ); 
156
[Group( [ f4 ] )->Group( [ f2 ] )]
157

158

159
160
4.1-6 FixedPointSubgroupXMod
161
162
FixedPointSubgroupXMod( X0, T, Q )  operation
163
StabilizerSubgroupXMod( X0, T, Q )  operation
164
165
The FixedPointSubgroupXMod(X,T,Q) for mathcalX=(∂ : S -> R) is the subgroup
166
Fix(mathcalX,T,Q) of elements t ∈ T leqslant S individually fixed under the
167
action of Q leqslant R.
168
169
The StabilizerSubgroupXMod(X,T,Q) for mathcalX is the subgroup
170
Stab(mathcalX,T,Q) of Q leqslant R whose elements act trivially on the whole
171
of T leqslant S (see page 19 of Norrie's thesis [Nor87]).
172
173
 Example 
174

175
gap> fix := FixedPointSubgroupXMod( Xn4, Sn4, Rn4 );
176
Group([ f3*f4 ])
177
gap> stab := StabilizerSubgroupXMod( Xn4, Sn4, Rn4 );
178
Group([ f5, f2*f3 ])
179

180

181
182
4.1-7 CentreXMod
183
184
CentreXMod( X0 )  attribute
185
Centralizer( X, Y )  operation
186
Normalizer( X, Y )  operation
187
188
The centre Z(mathcalX) of mathcalX = (∂ : S -> R) has as source the fixed
189
point subgroup Fix(mathcalX,S,R). The range is the intersection of the
190
centre Z(R) with the stabilizer subgroup.
191
192
When mathcalY = (T -> Q) is a subcrossed module of mathcalX = (∂ : S -> R),
193
the centralizer C_mathcalX}(mathcalY) of mathcalY has as source the fixed
194
point subgroup Fix(mathcalX,S,Q). The range is the intersection of the
195
centralizer C_R(Q) with Stab(mathcalX,T,R).
196
197
The normalizer N_mathcalX}(mathcalY) of mathcalY has as source the subgroup
198
of S consisting of the displacements ⟨ s,q ⟩ which lie in S.
199
200
 Example 
201

202
gap> ZXn4 := CentreXMod( Xn4 ); 
203
[Group( [ f3*f4 ] )->Group( [ f3, f5 ] )]
204
gap> IdGroup( ZXn4 );
205
[ [ 2, 1 ], [ 4, 2 ] ]
206
gap> CDXn4 := Centralizer( Xn4, DXn4 );
207
[Group( [ f3*f4 ] )->Group( [ f2 ] )]
208
gap> IdGroup( CDXn4 ); 
209
[ [ 2, 1 ], [ 3, 1 ] ]
210
gap> NDXn4 := Normalizer( Xn4, DXn4 ); 
211
[Group( <identity> of ... )->Group( [ f5, f2*f3 ] )]
212
gap> IdGroup( NDXn4 );
213
[ [ 1, 1 ], [ 12, 5 ] ]
214

215

216
217
4.1-8 CentralQuotient
218
219
CentralQuotient( G )  attribute
220
221
The CentralQuotient of a group G is the crossed module (G -> G/Z(G)) with
222
the natural homomorphism as the boundary map. This is a special case of
223
XModByCentralExtension (see 2.1).
224
225
Similarly, the central quotient of a crossed module mathcalX is the crossed
226
square (mathcalX ⇒ mathcalX/Z(mathcalX) (see section 8.2).
227
228
 Example 
229

230
gap> Q24 := CentralQuotient( d24 ); Size( Q24 ); 
231
[d24->Group( [ f1, f2, f3 ] )]
232
[ 24, 12 ]
233

234

235
236
4.1-9 IsAbelian2DimensionalGroup
237
238
IsAbelian2DimensionalGroup( X0 )  property
239
IsAspherical2DimensionalGroup( X0 )  property
240
IsSimplyConnected2DimensionalGroup( X0 )  property
241
IsFaithful2DimensionalGroup( X0 )  property
242
243
A crossed module is abelian if it equal to its centre. This is the case when
244
the range group is abelian and the action is trivial.
245
246
A crossed module is aspherical if the boundary has trivial kernel.
247
248
A crossed module is simply connected if the boundary has trivial cokernel.
249
250
A crossed module is faithful if the action is faithful.
251
252
 Example 
253

254
gap> [ IsAbelian2DimensionalGroup(Xn4), IsAbelian2DimensionalGroup(X24) ];
255

256
[ false, false ]
257
gap> pos7 := Position( ids, [ [3,1], [6,1] ] );;
258

259
gap> [ IsAspherical2DimensionalGroup(nsx[pos7]), IsAspherical2DimensionalGroup(X24) ];
260

261
[ true, false ]
262

263
gap> [ IsSimplyConnected2DimensionalGroup(Xn4), IsSimplyConnected2DimensionalGroup(X24) ];
264
[ true, true ]
265
gap> [ IsFaithful2DimensionalGroup(Xn4), IsFaithful2DimensionalGroup(X24) ]; 
266
[ false, true ] 
267

268

269
270
4.1-10 LowerCentralSeriesOfXMod
271
272
LowerCentralSeriesOfXMod( X0 )  attribute
273
IsNilpotent2DimensionalGroup( X0 )  property
274
NilpotencyClass2DimensionalGroup( X0 )  attribute
275
276
Let mathcalY be a subcrossed module of mathcalX. A  series of length n from
277
mathcalX to mathcalY has the form
278
279
280
\mathcal{X} ~=~ \mathcal{X}_0 ~\unrhd~ \mathcal{X}_1 ~\unrhd~ \cdots
281
~\unrhd~ \mathcal{X}_i ~\unrhd~ \cdots ~\unrhd~ \mathcal{X}_n ~=~
282
\mathcal{Y} \quad (1 \leqslant i \leqslant n).
283
284

285
286
The quotients mathcalF_i = mathcalX_i / mathcalX_i-1 are the factors of the
287
series.
288
289
A factor mathcalF_i is central if mathcalX_i-1 ⊴ mathcalX and mathcalF_i is
290
a subcrossed module of the centre of mathcalX / mathcalX_i-1.
291
292
A series is central if all its factors are central.
293
294
mathcalX is soluble if it has a series all of whose factors are abelian.
295
296
mathcalX is nilpotent is it has a series all of whose factors are central
297
factors of mathcalX.
298
299
The lower central series of mathcalX is the sequence (see [Nor87], p.77):
300
301
302
\mathcal{X} ~=~ \Gamma_1(\mathcal{X}) ~\unrhd~ \Gamma_2(\mathcal{X})
303
~\unrhd~ \cdots \qquad \mbox{where} \qquad \Gamma_j(\mathcal{X}) ~=~ [
304
\Gamma_{j-1}(\mathcal{X}), \mathcal{X}].
305
306

307
308
If mathcalX is nilpotent, then its lower central series is its most rapidly
309
descending central series.
310
311
The least integer c such that Γ_c+1(mathcalX) is the trivial crossed module
312
is the nilpotency class of mathcalX.
313
314
 Example 
315

316
gap> LowerCentralSeries(X24); 
317
[ [d24->PAut(d24)], [Group( [ f2 ] )->Group( [ f2, f5 ] )], 
318
 [Group( [ f3*f4^2 ] )->Group( [ f2 ] )], [Group( [ f4 ] )->Group( [ f2 ] )] 
319
 ]
320
gap> IsNilpotent2DimensionalGroup(X24); 
321
false
322
gap> NilpotencyClassOf2DimensionalGroup(X24);
323
0
324

325

326
327
4.1-11 AllXMods
328
329
AllXMods( args )  function
330
331
The global function AllXMods may be called in three ways: as AllXMods(S,R)
332
to compute all crossed modules with chosen source and range groups; as
333
AllXMods([n,m]) to compute all crossed modules with a given size; or as
334
AllXMods(ord) to compute all crossed modules whose associated cat1-groups
335
have a given size ord.
336
337
In the example we see that there are 4 crossed modules (C_6 -> S_3); forming
338
a subset of the 17 crossed modules with size [6,6]; and that these form a
339
subset of the 205 crossed modules whose cat1-group has size 36. There are 40
340
precrossed modules with size [6,6].
341
342
 Example 
343

344
gap> xc6s3 := AllXMods( SmallGroup(6,2), SmallGroup(6,1) );; 
345
gap> Length( xc6s3 ); 
346
4
347
gap> x66 := AllXMods( [6,6] );; 
348
gap> Length( x66 );
349
17
350
gap> x36 := AllXMods( 36 );; 
351
gap> Length( x36 ); 
352
205
353
gap> size36 := List( x36, x -> [ Size(Source(x)), Size(Range(x)) ] );;
354
gap> Collected( size36 );
355
[ [ [ 1, 36 ], 14 ], [ [ 2, 18 ], 7 ], [ [ 3, 12 ], 21 ], [ [ 4, 9 ], 14 ], 
356
 [ [ 6, 6 ], 17 ], [ [ 9, 4 ], 102 ], [ [ 12, 3 ], 8 ], [ [ 18, 2 ], 18 ], 
357
 [ [ 36, 1 ], 4 ] ]
358

359

360
361
4.1-12 IsomorphismXMods
362
363
IsomorphismXMods( X1, X2 )  operation
364
AllXModsUpToIsomorphism( list )  operation
365
366
The function IsomorphismXMods computes an isomorphism μ : mathcalX_1 ->
367
mathcalX_2, provided one exists, or else returns fail. In the example below
368
we see that the 17 crossed modules of size [6,6] in x66 (see the previous
369
subsection) fall into 9 isomorphism classes.
370
371
The function AllXModsUpToIsomorphism takes a list of crossed modules and
372
partitions them into isomorphism classes.
373
374
 Example 
375

376
gap> IsomorphismXMods( x66[1], x66[2] );
377
[[Group( [ f1, f2 ] )->Group( [ f1, f2 ] )] => [Group( [ f1, f2 ] )->Group( 
378
[ f1, f2 ] )]]
379
gap> iso66 := AllXModsUpToIsomorphism( x66 );; Length( iso66 ); 
380
9 
381

382

383
384
385
4.2 Isoclinism for groups
386
387
4.2-1 Isoclinism
388
389
Isoclinism( G, H )  operation
390
AreIsoclinicDomains( G, H )  operation
391
392
Let G,H be groups with central quotients Q(G) and Q(H) and derived subgroups
393
[G,G] and [H,H] respectively. Let c_G : G/Z(G) × G/Z(G) -> [G,G] and c_H :
394
H/Z(H) × H/Z(H) -> [H,H] be the two commutator maps. An isoclinism G ∼ H is
395
a pair of isomorphisms (η,ξ) where η : G/Z(G) -> H/Z(H) and ξ : [G,G] ->
396
[H,H] such that c_G * ξ = (η × η) * c_H. Isoclinism is an equivalence
397
relation, and all abelian groups are isoclinic to the trivial group.
398
399
 Example 
400

401
gap> G := SmallGroup( 64, 6 );; StructureDescription( G ); 
402
"(C8 x C4) : C2"
403
gap> QG := CentralQuotient( G );; IdGroup( QG );
404
[ [ 64, 6 ], [ 8, 3 ] ]
405
gap> H := SmallGroup( 32, 41 );; StructureDescription( H );
406
"C2 x Q16"
407
gap> QH := CentralQuotient( H );; IdGroup( QH );
408
[ [ 32, 41 ], [ 8, 3 ] ]
409
gap> Isoclinism( G, H );
410
[ [ f1, f2, f3 ] -> [ f1, f2*f3, f3 ], [ f3, f5 ] -> [ f4*f5, f5 ] ]
411
gap> K := SmallGroup( 32, 43 );; StructureDescription( K );
412
"(C2 x D8) : C2"
413
gap> QK := CentralQuotient( K );; IdGroup( QK ); 
414
[ [ 32, 43 ], [ 16, 11 ] ]
415
gap> AreIsoclinicDomains( G, K );
416
false
417

418

419
420
4.2-2 IsStemDomain
421
422
IsStemDomain( G )  property
423
IsoclinicStemDomain( G )  attribute
424
AllStemGroupIds( n )  operation
425
AllStemGroupFamilies( n )  operation
426
427
A group G is a stem group if Z(G) ≤ [G,G]. Every group is isoclinic to a
428
stem group, but distinct stem groups may be isoclinic. For example, groups
429
D_8, Q_8 are two isoclinic stem groups.
430
431
The function IsoclinicStemDomain  returns a stem group isoclinic to G.
432
433
The function AllStemGroupIds returns the IdGroup list of the stem groups of
434
a specified size, while AllStemGroupFamilies splits this list into
435
isoclinism classes.
436
437
 Example 
438

439
gap> DerivedSubgroup(G); 
440
Group([ f3, f5 ])
441
gap> IsStemDomain( G );
442
false
443
gap> IsoclinicStemDomain( G );
444
<pc group of size 16 with 4 generators>
445
gap> AllStemGroupIds( 32 );
446
[ [ 32, 6 ], [ 32, 7 ], [ 32, 8 ], [ 32, 18 ], [ 32, 19 ], [ 32, 20 ], 
447
 [ 32, 27 ], [ 32, 28 ], [ 32, 29 ], [ 32, 30 ], [ 32, 31 ], [ 32, 32 ], 
448
 [ 32, 33 ], [ 32, 34 ], [ 32, 35 ], [ 32, 43 ], [ 32, 44 ], [ 32, 49 ], 
449
 [ 32, 50 ] ]
450
gap> AllStemGroupFamilies( 32 );
451
[ [ [ 32, 6 ], [ 32, 7 ], [ 32, 8 ] ], [ [ 32, 18 ], [ 32, 19 ], [ 32, 20 ] ],
452
 [ [ 32, 27 ], [ 32, 28 ], [ 32, 29 ], [ 32, 30 ], [ 32, 31 ], [ 32, 32 ], 
453
 [ 32, 33 ], [ 32, 34 ], [ 32, 35 ] ], [ [ 32, 43 ], [ 32, 44 ] ], 
454
 [ [ 32, 49 ], [ 32, 50 ] ] ]
455

456

457
458
4.2-3 IsoclinicRank
459
460
IsoclinicRank( G )  attribute
461
IsoclinicMiddleLength( G )  attribute
462
463
Let G be a finite p-group. Then log_p |[G,G] / (Z(G) ∩ [G,G])| is called the
464
middle length of G. Also log_p |Z(G) ∩ [G,G]| + log_p |G/Z(G)| is called the
465
rank of G. These invariants appear in the tables of isoclinism families of
466
groups of order 128 in [JNO90].
467
468
 Example 
469

470
gap> IsoclinicMiddleLength(G);
471
1
472
gap> IsoclinicRank(G);
473
4
474

475

476
477
478
4.3 Isoclinism for crossed modules
479
480
4.3-1 Isoclinism
481
482
Isoclinism( X0, Y0 )  operation
483
AreIsoclinicDomains( X0, Y0 )  operation
484
485
Let mathcalX,mathcalY be crossed modules with central quotients Q(mathcalX)
486
and Q(mathcalY), and derived subcrossed modules [mathcalX,mathcalX] and
487
[mathcalY,mathcalY] respectively. Let c_mathcalX : Q(mathcalX) × Q(mathcalX)
488
-> [mathcalX,mathcalX] and c_mathcalY : Q(mathcalY) × Q(mathcalY) ->
489
[mathcalY,mathcalY] be the two commutator maps. An isoclinism mathcalX ∼
490
mathcalY is a pair of bijective morphisms (η,ξ) where η : Q(mathcalX) ->
491
Q(mathcalY) and ξ : [mathcalX,mathcalX] -> [mathcalY,mathcalY] such that
492
c_mathcalX * ξ = (η × η) * c_mathcalY. Isoclinism is an equivalence
493
relation, and all abelian crossed modules are isoclinic to the trivial
494
crossed module.
495
496
 Example 
497

498
gap> C8 := Cat1(16,8,1);;
499
gap> X8 := XMod(C8); IdGroup( X8 );
500
[Group( [ f1*f2*f3, f3, f4 ] )->Group( [ f2, f2 ] )]
501
[ [ 8, 1 ], [ 2, 1 ] ]
502
gap> C9 := Cat1(32,9,1);
503
[(C8 x C2) : C2=>Group( [ f2, f2 ] )]
504
gap> X9 := XMod( C9 ); IdGroup( X9 );
505
[Group( [ f1*f2*f3, f3, f4, f5 ] )->Group( [ f2, f2 ] )]
506
[ [ 16, 5 ], [ 2, 1 ] ]
507
gap> AreIsoclinicDomains( X8, X9 );
508
true
509
gap> ism89 := Isoclinism( X8, X9 );;
510
gap> Display( ism89 );
511
[ [[Group( [ f1 ] )->Group( [ f2 ] )] => [Group( [ f1 ] )->Group( [ f2 ] )]], 
512
 [[Group( [ f3 ] )->Group( <identity> of ... )] => [Group( 
513
 [ f3 ] )->Group( <identity> of ... )]] ]
514

515

516
517
4.3-2 IsStemDomain
518
519
IsStemDomain( X0 )  property
520
IsoclinicStemDomain( X0 )  property
521
522
A crossed module mathcalX is a stem crossed module if Z(mathcalX) ≤
523
[mathcalX,mathcalX]. Every crossed module is isoclinic to a stem crossed
524
module, but distinct stem crossed modules may be isoclinic.
525
526
A method for IsoclinicStemDomain has yet to be implemented.
527
528
 Example 
529

530
gap> IsStemDomain(X8);
531
true
532
gap> IsStemDomain(X9);
533
false
534

535

536
537
4.3-3 IsoclinicRank
538
539
IsoclinicRank( X0 )  attribute
540
IsoclinicMiddleLength( X0 )  attribute
541
542
The formulae in subsection 4.2-3 are applied to the crossed module.
543
544
 Example 
545

546
gap> IsoclinicMiddleLength(X8);
547
[ 1, 0 ]
548
gap> IsoclinicRank(X8); 
549
[ 3, 1 ]
550

551

552
553
554