# Constructing the group $SL_2(GF(2)[x]/(x^3))$ in GAP

Is it possible to construct the finite group $\mathrm{SL}_2(\mathrm{GF}(2)[x]/(x^3))$ in GAP? It is easy to construct special linear groups over finite rings of the form $\mathbb{Z}/n$ using SL(2,Integers mod n), but this doesn't seem to work over finite quotients of the polynomial ring $\mathrm{GF}(2)[x]$.

Alternatively, since the group in question has 384 elements, it is part of GAP's library of groups of small order. Is it possible to identify it in the library?

The built in constructors for SL only work for particular rings, so your best chance will be to take some elements until they generate the group. Lets start by constructing the underlying ring amd look at its elements:

gap> r:=PolynomialRing(GF(2),"x");
GF(2)[x]
gap> AssignGeneratorVariables(r);
#I  Assigned the global variables [ x ]
gap> q:=r/Ideal(r,[x^3]);
<ring GF(2),(1),(x),(x2)>
gap> Size(q);
8
gap> eq:=Elements(q);one:=One(q);zer:=Zero(q);
[ 0*(1), (x2), (x), (x)+(x2), (1), (1)+(x2), (1)+(x), (1)+(x)+(x2) ]
(1)
0*(1)


Now form some matrices --presumably $\left(\begin{array}{cc}1&a\\0&1\end{array}\right)$ for $a$ running through ring generators, and their transversals will do:

gap> gens:=[];;
[ [ (1), (1) ], [ 0*(1), (1) ] ]
[ [ (1), (x2) ], [ 0*(1), (1) ] ]
[ [ (1), (x) ], [ 0*(1), (1) ] ]
[ [ (1), 0*(1) ], [ (1), (1) ] ]
[ [ (1), 0*(1) ], [ (x2), (1) ] ]
[ [ (1), 0*(1) ], [ (x), (1) ] ]
gap> List(gens,Order);
[ 2, 2, 2, 2, 2, 2 ]


A problem we will run into is that for these matrices the standard Inverse operation does not claim to be applicable. Thus we add as a workaround a pathetic inversion routine for lists that are elements of finite order (this is a bit of a hack), it simply calculates a suitable power.

InstallOtherMethod(InverseMutable,"over finite order rings",true,
[IsListOrCollection],0,
function(elm)
local o;
o:=Order(elm);
if o=fail or o=infinity then
TryNextMethod();
fi;
if o=1 then return elm;
else return elm^(o-1);fi;
end);


Now we can form the group, check that it is all and find the identification number in the small groups library (which presumably answers your question)

gap> g:=Group(gens);;
gap> Size(g);
384
gap> IdGroup(g);
[ 384, 20086 ]


For a concrete correspondence one can give, for example, permutations:

gap> hom:=IsomorphismPermGroup(g);
<action isomorphism>
gap> GeneratorsOfGroup(Image(hom));
[ (1,3)(4,8)(5,9)(6,16)(7,18)(10,13)(11,14)(12,20)(15,33)(17,36)(19,37)(21,
29)(22,30)(23,28)(24,43)(25,27)(26,31)(32,40)(35,38)(39,44)(41,45)(42,46),
(1,4)(3,8)(5,12)(9,20)(10,21)(11,22)(13,29)(14,30)(15,28)(23,33)(24,41)(25,
40)(26,42)(27,32)(31,46)(43,45), (1,5)(3,9)(4,12)(7,19)(8,20)(10,23)(11,
26)(13,28)(14,31)(15,29)(17,35)(18,37)(21,33)(22,42)(24,40)(25,41)(27,
45)(30,46)(32,43)(36,38), (2,3)(4,13)(5,14)(6,10)(7,11)(8,16)(9,18)(12,
27)(15,32)(17,25)(19,40)(20,36)(21,34)(22,35)(23,38)(24,39)(26,44)(28,
30)(31,43)(33,37)(41,47)(42,48), (2,6)(3,10)(7,17)(8,21)(9,23)(11,25)(16,
34)(18,38)(19,35)(20,33)(22,40)(24,42)(26,41)(36,37)(39,48)(44,47),
(2,7)(3,11)(5,15)(6,17)(8,22)(9,24)(10,25)(12,28)(14,32)(16,35)(18,39)(19,
34)(20,41)(21,40)(23,42)(26,33)(27,30)(36,47)(37,44)(38,48) ]