Beyond studying a permutation group's internal structure, Magma can compute its full automorphism group, test permutation groups for abstract isomorphism, and work with the cohomology theory needed to build covers and extensions. These computations rely on the same maximal-subgroup machinery used elsewhere in Magma: the non-abelian composition factors of the group must appear in Magma's database of almost simple groups.
Automorphism Groups
AutomorphismGroup(G) computes the full automorphism group of a permutation group G, returned as an object of type GrpAuto.
> G2 := PermutationGroup<24 | ... >;
> #G2;
120
> A := AutomorphismGroup(G2);
> #A;
120
An individual automorphism A.1 is displayed as a mapping showing where each generator of G2 is sent. IsInnerAutomorphism(A.4) tests whether a particular automorphism is inner, i.e. induced by conjugation by an element of G2.
> IsInnerAutomorphism(A.4);
false
Combined with #Centre(G2) and OuterFPGroup(A) (a presentation for the outer automorphism group A/Inn(G2)), this lets you determine that G2 has an outer automorphism group of order 2, witnessed by the non-inner automorphism A.4.
Testing Isomorphism
IsIsomorphic(G, H) tests whether two permutation groups are isomorphic as abstract groups. If they are, it returns true together with an explicit isomorphism; otherwise it returns false.
> G1 := PermutationGroup<20 | ... >;
> G2 := PermutationGroup<24 | ... >;
> #G1; #G2;
120
120
> IsIsomorphic(G1, G2);
false
Both groups have order 120, but they need not be isomorphic — indeed G2 turns out to be perfect while G1 is not, which already rules out an isomorphism. Testing G1 against a symmetric group instead succeeds and gives an explicit map:
> flag, isom := IsIsomorphic(G1, Sym(5));
> flag;
true
> (G1.1)@ isom;
(1, 3, 5, 4, 2)
Here @ applies the isomorphism isom to the generator G1.1, showing its image in Sym(5).
Cohomology and the Schur Multiplicator
Magma also implements the cohomology algorithms of Holt, which let you compute Schur multiplicators, covers, and extensions of a permutation group G. Throughout, p is a prime, K is the field of order p, and F is a finitely presented group with the same number of generators as G, whose relations hold when its generators are mapped onto the corresponding generators of G (an epimorphism F -> G, usually an isomorphism).
pMultiplicator(G, p) returns the invariant factors of the p-part of the Schur multiplicator of G. pCover(G, F, p) then constructs a presentation for the p-cover of G, built as an extension of the p-multiplier by F.
> G := Alt(6);
> &cat [pMultiplicator(G, p[1]): p in FactoredOrder(G)];
[ 2, 3, 1 ]
The multiplicator of Alt(6) has order 2 x 3 = 6. To build the full six-fold cover, we take a two-fold cover first, obtain a permutation representation of it, and then take a three-fold cover of that:
> F := FPGroup(G);
> F2 := pCover(G, F, 2);
> G2 := DegreeReduction(CosetImage(F2, sub<F2|>));
> #G2;
720
> F6 := pCover(G2, F2, 3);
> AbelianQuotientInvariants(F6);
[]
An empty sequence of invariants for AbelianQuotientInvariants(F6) means F6 has trivial abelianization, i.e. it is perfect — as expected for a stem extension of the simple group Alt(6).
Cohomological Dimension and Extensions
CohomologicalDimension(G, M, i) returns the dimension (over K) of the first or second cohomology group of G acting on a K[G]-module M, for i equal to 1 or 2. The second cohomology group H^2(G, M) classifies the extensions of M by G up to equivalence: each basis vector combination corresponds to one extension.
To build these extensions, create an ExtensionProcess(G, M, F), then call Extension(P, Q) for a chosen coefficient sequence Q, or repeatedly call NextExtension(P) to enumerate all p^l extensions (where l is the cohomological dimension). SplitExtension(G, M, F) directly gives the split extension corresponding to the zero cohomology class.
> G := Alt(5);
> M := PermutationModule(G, GF(2));
> CohomologicalDimension(G, M, 2);
1
> F := FPGroup(G);
> P := ExtensionProcess(G, M, F);
> E0 := Extension(P, [0]);
> E1 := Extension(P, [1]);
> AbelianQuotientInvariants(E0);
[ 2 ]
> AbelianQuotientInvariants(E1);
[]
Since the dimension of H^2(Alt(5), M) is 1, there are exactly two extensions of the natural module M by Alt(5). The split extension E0 has a nontrivial abelian quotient (it is not perfect), while the non-split extension E1 turns out to be perfect.