Lattices from Matrix Groups

In Magma a G-lattice L is a lattice upon which a finite integral matrix group G acts by right multiplication.

Each G-lattice L has references to both the original ("natural") group G which acts on the standard lattice in which L is embedded and also the reduced group of L which is the reduced representation of G on the basis of L.

Contents

Creation of G-Lattices

The following functions create G-lattices. Note that the group G must be a finite integral matrix group.

Lattice(G) : GrpMat -> Lat
Given a finite integral matrix group G, return the standard G-lattice (with standard basis and rank equal to the degree of G).
LatticeWithBasis(G, B) : GrpMat, ModMatRngElt -> Lat
Given a finite integral matrix group G and a non-singular matrix B whose row space is invariant under G (i.e., Bg = TgB for each g∈G where Tg is a unimodular integral matrix depending on g), return the G-lattice with basis matrix B. (The number of columns of B must equal the degree of G; G acts naturally on the lattice spanned by B.)
LatticeWithBasis(G, B, M) : GrpMat, ModMatRngElt, AlgMatElt -> Lat
Given a finite integral matrix group G, a non-singular matrix B whose row space is invariant under G (i.e., Bg = TgB for all g∈G where Tg is a unimodular integral matrix depending on g) and a positive definite matrix M invariant under G (i.e., gMgtr=M for all g∈G) return the G-lattice with basis matrix B and inner product matrix M. (The number of columns of B must equal the degree of G and both the number of rows and the number of columns of M must equal the degree of G; G acts naturally on the lattice spanned by B and fixes the Gram matrix of the lattice).
LatticeWithGram(G, F) : GrpMat, AlgMatElt -> Lat
Given a finite integral matrix group G and a positive definite matrix F invariant under G (i.e., gFgtr=F for all g∈G) return the G-lattice with standard basis and inner product matrix F (and thus Gram matrix F). (Both the number of rows and the number of columns of M must equal the degree of G; G fixes the Gram matrix of the returned lattice).

Operations on G-Lattices

The following functions provide basic operations on G-lattices.

IsGLattice(L) : Lat -> GrpMat
Given a lattice L, return whether L is a G-lattice (i.e., there is a group associated with L).
Group(L) : Lat -> GrpMat
Given a G-lattice L, return the matrix group of the (reduced) action of G on L. The resulting group thus acts on the coordinate lattice of L (like the automorphism group).
NumberOfActionGenerators(L) : Lat -> RngIntElt
Nagens(L) : Lat -> RngIntElt
Given a G-lattice L, return the number of generators of G.
ActionGenerator(L, i) : Lat, RngIntElt -> GrpMat
Given a G-lattice L, return the i-th generator of the (reduced) action of G on L. This is the reduced action of the i-th generator of the original group G (which may be the identity matrix).
NaturalGroup(L) : Lat -> GrpMat
Given a G-lattice L, return the matrix group of the (natural) action of G on L. The resulting group thus acts on L naturally.
NaturalActionGenerator(L, i) : Lat, RngIntElt -> GrpMat
Given a G-lattice L, return the i-th generator of the natural action of G on L. This is simply the i-th generator of the original group G.

Invariant Forms

The functions in this section compute invariant forms for G-lattices.

InvariantForms(L) : Lat -> [ AlgMatElt ]
For a G-lattice L, return a basis for the space of invariant bilinear forms for G (represented by their Gram matrices) as a sequence of matrices. The first entry of the sequence is a positive definite symmetric form for G.
InvariantForms(L, n) : Lat, RngIntElt -> [ AlgMatElt ]
For a G-lattice L, return a sequence consisting of n≥0 invariant bilinear forms for G.
SymmetricForms(L) : Lat -> [ AlgMatElt ]
For a G-lattice L, return a basis for the space of symmetric invariant bilinear forms for G. The first entry of the sequence is a positive definite symmetric form of G.
SymmetricForms(L, n) : Lat, RngIntElt -> [ AlgMatElt ]
For a G-lattice L, return a sequence of n≥0 independent symmetric invariant bilinear forms for G. The first entry of the first sequence (if n>0) is a positive definite symmetric form for G.
AntisymmetricForms(L) : Lat -> [ AlgMatElt ]
For a G-lattice L, return a basis for the space of antisymmetric invariant bilinear forms for G.
AntisymmetricForms(L, n) : Lat, RngIntElt -> [ AlgMatElt ]
For a G-lattice L, return a sequence of n≥0 independent antisymmetric invariant bilinear forms for G.
NumberOfInvariantForms(L) : Lat -> RngIntElt, RngIntElt
For a G-lattice L, return the dimension of the space of (symmetric and anti-symmetric) invariant bilinear forms for G. The algorithm uses a modular method which is always correct and is faster than the actual computation of the forms.
NumberOfSymmetricForms(L) : Lat -> RngIntElt
For a G-lattice L, return the dimension of the space of symmetric invariant bilinear forms for G.
NumberOfAntisymmetricForms(L) : Lat -> RngIntElt
For a G-lattice L, return the dimension of the space of antisymmetric invariant bilinear forms for G.
PositiveDefiniteForm(L) : Lat -> AlgMatElt
For a G-lattice L, return a positive definite symmetric form for G. This is a positive definite matrix F such that gFgtr=F for all g∈G.

Endomorphisms

The functions in this subsection compute endomorphisms of G-lattices. This is done by approximating the averaging operator over the group and applying it to random elements.

EndomorphismRing(L) : Lat -> AlgMat
For a G-lattice L, return the endomorphism ring of L as a matrix algebra over Q.
Endomorphisms(L, n) : Lat, RngIntElt -> [ AlgMatElt ]
For a G-lattice L, return a sequence containing n independent endomorphisms of L as elements of the corresponding matrix algebra over Q. n must be in the range [0 .. d], where d is the dimension of the endomorphism ring of L. This function may be useful in situations where the full endomorphism algebra is not required, e.g., to split a reducible lattice.
DimensionOfEndomorphismRing(L) : Lat -> RngIntElt
Return the dimension of the endomorphism algebra of the G-lattice L by a modular method (which always yields a correct answer).
CentreOfEndomorphismRing(L) : Lat -> AlgMat
For a G-lattice L, return the centre of the endomorphism ring of L as a matrix algebra over Q.

This function can be used to split a reducible lattice into its homogeneous components.

CentralEndomorphisms(L, n) : Lat, RngIntElt -> [ AlgMatElt ]
For a G-lattice L, return a sequence containing n independent central endomorphisms of L as elements of the corresponding matrix algebra over Q. n must be in the range [0 .. d], where d is the dimension of the centre of the endomorphism ring of L.
DimensionOfCentreOfEndomorphismRing(L) : Lat -> RngIntElt
Return the dimension of the centre of the endomorphism algebra of the G-lattice L by a modular method (which always yields a correct answer).

G-invariant Sublattices

The functions in this section compute G-invariant sublattices of a given G-lattice L.

For a fixed prime p, the algorithm constructs the maximal G-invariant sublattices of L as kernels of Fp G-epimorphisms L/pL to S for some simple FpG-module S as described in [Ple74].

Iterating this process yields all G-invariant sublattices of L whose index in L is a p-power. Finally, intersecting lattices of coprime index yields all sublattices of L.

Sublattices(G, Q) : GrpMat, [ RngIntElt ] -> [ Lat ], BoolElt
Sublattices(G, Q) : [ Mtrx ], [ RngIntElt ] -> [ Lat ], BoolElt
Sublattices(L, Q) : Lat, [ RngIntElt ] -> [ Lat ], BoolElt
    Limit: RngIntElt                    Default: ∞
    Levels: RngIntElt                   Default: ∞
    Projections: [Mtrx]                 Default: []
Given either
(a)
an integral matrix group G with natural lattice L=Zn
(b)
a sequence G of integral matrices generating a Z-order in Qn x n with natural lattice L= Zn
(c)
a G-lattice L in Qn.

together with a set or sequence Q of primes, compute the G-invariant sublattices of L (as a sequence) which are not contained in p L for any p ∈Q and whose index in L is a product of elements of Q.

This set of G-invariant sublattices of L is finite if and only if Qp tensor L is irreducible as a Qp G-module for all p∈Q.

Setting the parameter Limit := n will terminate the computation after n sublattices have been found.

Setting the parameter Levels := n will only compute sublattices M such that L/M has at most n composition factors.

The optional parameter Projections can be a sequence of n by n matrices that describe projections on Qn that map L to itself. In this case, Magma will only compute those sublattices of L which have the same images under the projections as L does.

The second return value indicates whether the returned sequence contains all such sublattices or not.

Sublattices(G, p) : GrpMat, RngIntElt -> [ Lat ], BoolElt
Sublattices(L, p) : Lat, RngIntElt -> [ Lat ], BoolElt
    Limit: RngIntElt                    Default: ∞
    Levels: RngIntElt                   Default: ∞
    Projections: [Mtrx]                 Default: []
The same as the above where the set Q consists only of the given ptime p.
Sublattices(G) : GrpMat -> [ Lat ], BoolElt
Sublattices(L) : Lat -> [ Lat ], BoolElt
    Limit: RngIntElt                    Default: ∞
    Levels: RngIntElt                   Default: ∞
    Projections: [Mtrx]                 Default: []
For an integral matrix group G or a G-lattice L this intrinsic equals the one above with Q taken to be the prime divisors of the order of G.
SublatticeClasses(G) : GrpMat -> [ Lat ]
    MaximalOrders: BoolElt              Default: false
For an integral matrix group G returns representatives for the isomorphism classes of G-invariant lattices (i.e. the orbits under the unit group of the endomorphism ring E of G).

If MaximalOrders is set to true, only sublattice classes which are invariant under some maximal order of E are considered.

Currently the function requires E to be a field.

Example GLat_Sublattices (H33E5)

We construct sublattices of the standard G-lattice where G is an absolutely irreducible degree-8 integral matrix representation of the group GL(2, 3) x (S)3.

We first define the group G.

> G := MatrixGroup<8, IntegerRing() |
>    [-1,  0,  0,  0,  0,  0,  0,  0,
>      0,  0, -1,  0,  0,  0,  0,  0,
>      0,  0,  0,  1,  0,  0,  0,  0,
>      0,  1,  0,  0,  0,  0,  0,  0,
>     -1,  0,  0,  0,  1,  0,  0,  0,
>      0,  0, -1,  0,  0,  0,  1,  0,
>      0,  0,  0,  1,  0,  0,  0, -1,
>      0,  1,  0,  0,  0, -1,  0,  0],
>
>    [ 0,  0,  0,  0,  0,  0,  0,  1,
>      0,  0,  0,  0,  0,  0,  1,  0,
>      0,  0,  0,  0, -1,  0,  0,  0,
>      0,  0,  0,  0,  0,  1,  0,  0,
>      0,  0,  0, -1,  0,  0,  0,  1,
>      0,  0, -1,  0,  0,  0,  1,  0,
>      1,  0,  0,  0, -1,  0,  0,  0,
>      0, -1,  0,  0,  0,  1,  0,  0]>;
We next compute the unique positive definite form F fixed by G.
> time F := PositiveDefiniteForm(G);
Time: 0.050
> F;
[2 0 0 0 1 0 0 0]
[0 2 0 0 0 1 0 0]
[0 0 2 0 0 0 1 0]
[0 0 0 2 0 0 0 1]
[1 0 0 0 2 0 0 0]
[0 1 0 0 0 2 0 0]
[0 0 1 0 0 0 2 0]
[0 0 0 1 0 0 0 2]
We now compute all sublattices of the standard G-lattice.
> time Sub := Sublattices(G);
Time: 0.370
> #Sub;
18
For each sublattice we compute the invariant positive definite form for the group given by the action of G on the sublattice.
> PrimitiveMatrix := func<X |
>     P ! ((ChangeRing(P, RationalField()) ! X) / GCD(Eltseq(X)))
>         where P is Parent(X)>;
> FF := [PrimitiveMatrix(B * F * Transpose(B))
>             where B is BasisMatrix(L): L in Sub];
We next create the sequence of all the lattices whose Gram matrices are given by the (LLL-reduced) forms.
> Sub := [LatticeWithGram(LLLGram(F)) : F in FF];
> #Sub;
18
We now compute representatives for the Z-isomorphism classes of the sequence of lattices.
> Rep := [];
> for L in Sub do
>     if forall{LL: LL in Rep | not IsIsometric(L, LL)} then
>         Append(~Rep, L);
>     end if;
> end for;
> #Rep;
4
Thus there are 4 non-isomorphic sublattices. We note the size of the automorphism group, the determinant, the minimum and the kissing number of each lattice. (In fact, the automorphism groups of these 4 lattices happen to be maximal finite subgroups of GL(8, Q) and all have GL(2, 3) x (S)3 as a common irreducible subgroup.)
> time A := [AutomorphismGroup(L) : L in Rep];
Time: 0.240
> [#G: G in A];
[ 497664, 6912, 696729600, 2654208 ]
> [Determinant(L): L in Rep];
[ 81, 1296, 1, 16 ]
> [Minimum(L): L in Rep];
[ 2, 4, 2, 2 ]
> [KissingNumber(L): L in Rep];
[ 24, 72, 240, 48 ]
Finally, we note that each lattice is isomorphic to a standard construction based on root lattices.
> l := IsIsometric(Rep[1],
>        TensorProduct(Lattice("A", 2), StandardLattice(4))); l;
true
> l := IsIsometric(Rep[2],
>        TensorProduct(Lattice("A", 2), Lattice("F", 4))); l;
true
> l := IsIsometric(Rep[3], Lattice("E", 8)); l;
true
> l := IsIsometric(Rep[4],
>        TensorProduct(Lattice("F", 4), StandardLattice(2))); l;

Example GLat_Sublattices2 (H33E6)

This example illustrates the optional argument Projections.
> G := MatrixGroup<4, IntegerRing() |
> [ -1, 0, 1, 0, 0, -1, 1, -3, -1, 0, 0, 0, 0, 0, 0, 1 ],
> [ -1, 0, 0, 0, -3, 2, 0, 3, 0, 0, -1, 0, 1, -1, 0, -1 ] >;
> E := EndomorphismRing(G);
> I := CentralIdempotents(ChangeRing(E, RationalField())); I;
[
    [ 0  0  0  0]
    [-1  1  0  0]
    [ 0  0  0  0]
    [ 0  0  0  1],
    [1 0 0 0]
    [1 0 0 0]
    [0 0 1 0]
    [0 0 0 0]
]
Since the central idempotents are all integral, they map the standard lattice Zn to itself. Even though this group G fixes infinitely many sublattices of Zn (even up to scalar multiples), there can only be finitely many which have the same images under the central idempotents as Zn.
> S := Sublattices(G : Projections:= I); #S;
3
So in this case there are only three such lattices. To check that the lattices do project correctly, we can use
> I := [ Matrix(Integers(), i) : i in I ];
> Images := [ [Image(BasisMatrix(s) * i) : i in I] : s in S ];
> #Set(Images) eq 1;
true

Lattice of Sublattices

Magma can construct the lattice V of all G-invariant sublattices of the standard lattice L = Zn. Various properties of the lattice V may then be examined. Magma only stores the primitive sublattices of L, i.e. those sublattices that are not contained in kL for some k > 1.

In general, G fixes infinitely many primitive lattices. Thus one has to limit the number of sublattices to be constructed just as in the Sublattice intrinsic. In this case, all operations on V like coercions, intersections, sums etc. assume that the result of the operation is again is a scalar multiple of some element stored in V.

The lattice V has type LatLat and elements of V have type LatLatElt and are numbered from 1 to n where n is the number of primitive sublattices of L that have been constructed in the beginning.

Creating the Lattice of Sublattices
SublatticeLattice(G, Q) : GrpMat, [ RngIntElt ] -> LatLat, BoolElt
SublatticeLattice(G, Q) : [ Mtrx ], [ RngIntElt ] -> LatLat, BoolElt
    Limit: RngIntElt                    Default: ∞
    Levels: RngIntElt                   Default: ∞
    Projections: [ Mtrx ]               Default: []
Given either an integral matrix group G of degree n or a sequence G of integral matrices generating a Z-order in Qn x n together with a set or sequence Q of primes, compute the G-invariant sublattices of Zn (as a sequence) which are not contained in p Zn for any p ∈Q and whose index in Zn is a product of elements of Q.

The second return value indicates whether all G-invariant lattices have been constructed.

The optional parameters are the same as for the Sublattices intrinsic.

SublatticeLattice(G, p) : GrpMat, RngIntElt -> LatLat, BoolElt
SublatticeLattice(G, p) : [ Mtrx ], RngIntElt -> LatLat, BoolElt
    Limit: RngIntElt                    Default: ∞
    Levels: RngIntElt                   Default: ∞
    Projections: [ Mtrx ]               Default: []
Same as above where the set Q consists only of the given prime p.
SublatticeLattice(G) : GrpMat -> LatLat, BoolElt
    Limit: RngIntElt                    Default: ∞
    Levels: RngIntElt                   Default: ∞
    Projections: [ Mtrx ]               Default: []
Same as above where the set Q is taken to be set of prime divisors of the order of the group G.

Example GLat_SublatticeLatticeCreate (H33E7)

This example shows how to create a lattice of sublattices.
> G:= sub< GL(2, Integers()) | [0,1,-1,0] >;
> V:= SublatticeLattice(G); V;
Lattice of 2 sublattices
Operations on the Lattice of Sublattices

In the following, V is a lattice of G-invariant lattices for some group or Z-order G and Q denotes the set of primes that where used to create V.

# V : LatLat -> RngIntElt
The number of (primitive) lattices stored in V.
V ! i: LatLat, RngIntElt -> LatLatElt
The i-th element of the lattice V with respect to the internal labeling.
V ! M: LatLat, Lat -> LatLatElt
V ! M: LatLat, Mtrx -> LatLatElt
Given a (basis matrix of some) G-invariant lattice M, create the element of the lattice V corresponding to M.
NumberOfLevels( V ) : LatLat -> RngIntElt
The number of different levels (layers) stored in V. Note that levels are counted starting from 0.
Level(V, i) : LatLat, RngIntElt -> [ LatLatElt ]
The primitive lattices stored at the i-th level (layer). Note that levels are counted starting from 0.
Levels(v) : LatLat -> [ [LatLatElt] ]
The i-th entry of the result is a sequence of the primitive lattice elements lying on the i - 1-th level.
Primes(V) : LatLat -> [ RngIntElt ]
The primes that where used to create V.
Constituents(V) : LatLat -> SeqEnum
A sequence containing the constituents (simple Fp G - modules) that where used during the construction of the G-lattices in V.
IntegerRing() ! e : RngInt, LatLatElt -> RngIntElt
The integer corresponding to lattice element e.
e + f : LatLatElt, LatLatElt -> LatLatElt
The sum of the lattice elements e and f.
e meet f : LatLatElt, LatLatElt -> LatLatElt
The intersection of the lattice elements e and f.
e eq f : LatLatElt, LatLatElt -> BoolElt
Tests whether e and f are equal.
MaximalSublattices(e) : LatLatElt -> [ LatLatElt ], [ RngIntElt ]
The sequence S of maximal sublattices of e having index p for some p ∈Q. The second return value is a list C of integers such that S[i]/e is isomorphic to the C[i]-th constituent of V. The ordering of the constituents is the same as in the Constituents intrinsic.
MinimalSuperlattices(e) : LatLatElt -> [ LatLatElt ] , [ RngIntElt ]
The sequence S of minimal superlattices of e in which e has index p for some p ∈Q. The second return value is a list C of integers such that e/S[i] is isomorphic to the C[i]-th constituent of V. The ordering of the constituents is the same as in the Constituents intrinsic.
Lattice(e) : SubModLatElt -> Lat
The G-lattice corresponding to e.
BasisMatrix(e) : SubModLatElt -> Mtrx
Morphism(e) : SubModLatElt -> Mtrx
The basis matrix of the G-lattice corresponding to e.

Example GLat_SublatticeLattice (H33E8)

Let G be the automorphism group of the root lattice A5. Since G is absolutely irreducible, it fixes only finitely many lattices up to scalars. We explore them.
> G:= AutomorphismGroup(Lattice("A", 5));
> FactoredOrder(G);
[ <2, 5>, <3, 2>, <5, 1> ]
> #SublatticeLattice(G, 5);
1
Hence there are no primitive sublattices between L and 5L. Hence it suffices to check only the lattices at 2 and 3 the two remaining prime divisors of the order of G.
> V:= SublatticeLattice(G, {2,3}); #V;
4
> M:= MaximalSublattices(V ! 1); M;
[
    sublattice number 2,
    sublattice number 3
]
> V ! 2 meet V ! 3;
sublattice number 4
Moreover, the second and third lattice are (up to rescaling) dual to each other with respect to some G-invariant form.
> F:= PositiveDefiniteForm(G);
> L:= Dual(Lattice(BasisMatrix(V ! 2), F) : Rescale:= false);
> V ! L;
sublattice number 3 times 1/6
In particular, every G-invariant lattice can be constructed from lattice number 2 by taking scalar multiples, duals, sums and intersections. For example the standard lattice can be written as:
> (V ! 2) + (V ! (6*L));
sublattice number 1

Example GLat_SublatticeLattice2 (H33E9)

Let G be the 8-dimensional (faithful) rational representation of SL(2, 7). Its endomorphism ring E is isomorphic to Q(Sqrt( - 7)). We find all G-invariant lattices of G that are invariant under the maximal order M of E up to multiplication with elements in E. After this is done, we quickly obtain all finite subgroups of GL(8, Q) (up to conjugacy) that include a normal subgroup conjugate to G.

To shorten the example, we choose G such that the standard lattice L is already invariant under M.

> SetSeed(1);
> G:= MatrixGroup<8, IntegerRing() |
>    [ 0, 1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, -1, 1,
>      0, 0, 0, 1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 1,
>      0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, -1, 0, -1, 1,
>      0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -2, 1 ],
>    [ 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0,
>     -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 1,
>      0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0,
>      0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] >; #G;
336
> E:= EndomorphismRing(G);
> M:= MaximalOrder(ChangeRing(E, RationalField()));
> ok, M:= CanChangeUniverse(Basis(M), MatrixRing(Integers(), 8)); ok;
true
So L is M-invariant. The lattices at the primes 3 and 7 are multiples of L as we can see as follows:
> w7:= IntegralMatrix(E.2 - Trace(E.2)/8);
> w7 div:= GCD( Eltseq(w7) );                   // a square root of 7
> V:= SublatticeLattice([ Matrix(G.i) : i in [1..Ngens(G)] ] cat M, [3,7]); #V;
2
> V ! w7;
sublattice number 2
So it remains to check the lattices at 2. The two prime ideals in M over 2 are generated by p and q where
> p:= 1 - (w7+1) div 2;
> q:= (w7+1) div 2;
> Gens:= [ Matrix(G.i) : i in [1..Ngens(G)] ];
> V:= SublatticeLattice(Gens cat M, 2: Levels:= 3);
> Levels(V);
[
    [
        sublattice number 1
    ],
    [
        sublattice number 2,
        sublattice number 3
    ],
    [
        sublattice number 4,
        sublattice number 5,
        sublattice number 6
    ],
    [
        sublattice number 7,
        sublattice number 8,
        sublattice number 9,
        sublattice number 10
    ]
]
> [ V | BasisMatrix(V ! i)*x : i in [1..3], x in [p,q] ];
[
    sublattice number 4,
    sublattice number 7,
    sublattice number 8,
    sublattice number 6,
    sublattice number 9,
    sublattice number 10
]
So the lattice numbers 1, 2, 3 and 5 represent the orbits of the action of E on the set of all MG-invariant lattices. Moreover, every matrix group N normalizing G acts on the MG-invariant lattices and (up to conjugacy) thus fixes one of these four lattices. If it fixes L, it also fixes V!2 + V!3 = V!5 and vice versa. Similarly, it fixes V!2 if and only if it fixes V!3.
> F:= PositiveDefiniteForm(G);
> N1:= Normalizer(AutomorphismGroup(LatticeWithGram(F)), G); #N1;
672
> A:= AutomorphismGroup(Lattice(BasisMatrix(V ! 2), F) : NaturalAction);
> N2:= Normalizer(A, ChangeRing(G, Rationals())); #N2;
336
So N1 (which is isomorphic to 2.L(2, 7):2) is up to conjugacy the only proper finite extension of G in GL(8, Q).
V2.28, 13 July 2023