GAP

Main Branches

Downloads  Installation  Overview  Data Libraries  Packages  Documentation  Contacts  FAQ  GAP 3 
This is a page on GAP 3, which is still available, but no longer supported. The present version is GAP 4  (See  Status of GAP 3).

Constructing Co3 in GAP 3

See also the corresponding GAP 4 page.


This is an extended version of the last example in the paper "Construction of Co3. An example of the use of an integrated system for Computational Group Theory", Groups St Andrews 1997 in Bath, by Alexander Hulpke and Steve Linton.

The original example page provides links to a GAP 3 version and to an early GAP 4 version. The present page contains just a GAP 3 version. The associated GAP 3 input file is also available.


  gap> x:=Indeterminate(GF(2));
  X(GF(2))
  gap> x.name:="x";;
  gap> f:=x^23-1;
  Z(2)^0*(x^23 + 1)
  gap> Factors(f);
  [ Z(2)^0*(x + 1), Z(2)^0*(x^11 + x^10 + x^6 + x^5 + x^4 + x^2 + 1), 
    Z(2)^0*(x^11 + x^9 + x^7 + x^6 + x^5 + x + 1) ]
  gap> f:=First(Factors(f),i->Degree(i)>1);
  Z(2)^0*(x^11 + x^10 + x^6 + x^5 + x^4 + x^2 + 1)
  gap> RequirePackage("guava");
  
                ___________                   |                  
               /            \           /   --+--  Version 1.3   
              /      |    | |\\        //|    |                  
             |    _  |    | | \\      // |                        
             |     \ |    | |--\\    //--|     Jasper Cramwinckel  
              \     ||    | |   \\  //   |     Erik Roijackers     
               \___/  \___/ |    \\//    |     Reinald Baart       
                                               Eric Minkes       
  gap> cod:=GeneratorPolCode(f,23,GF(2));
  a cyclic [23,12,1..7]3 code defined by generator polynomial over GF(2)
  gap> IsPerfectCode(cod);
  true
  gap> ext:=ExtendedCode(cod);
  a linear [24,12,8]4 extended code
  gap> WeightDistribution(ext);
  [ 1, 0, 0, 0, 0, 0, 0, 0, 759, 0, 0, 0, 2576, 0, 0, 0, 759, 0, 0, 0, 0, 0, 0, 
    0, 1 ]
  gap> m24:=AutomorphismGroup(ext); m24.name:="m24";
  Group( ( 1, 2)( 6,15,24,18)( 7,14,12,19)( 9,17,16,20)(10,21,23,22)(11,13), 
  ( 2, 3)( 6,10)( 7,24)( 9,17)(11,13)(12,18)(14,21)(15,23), ( 3, 4)( 7,19)
  (10,22)(11,13)(12,14)(15,18)(17,20)(21,23), ( 4, 5)( 6,23,21,16)( 7, 9,20,10)
  (11,13)(12,15,17,19)(14,22,18,24), ( 5, 9,11,17)( 6,19,24,21)( 7,23)
  ( 8,20,13,16)(10,12)(14,15,22,18), ( 5, 8)( 7,23)( 9,16)(10,12)(11,13)(14,22)
  (17,20)(19,21), ( 6,10,19)( 7,14,18)( 8,11,13)( 9,17,16)(12,21,24)(15,23,22), 
  ( 6,19)( 7, 9)(10,20)(12,16)(14,24)(15,21)(17,23)(18,22), ( 6, 7)( 9,19)
  (10,15)(12,24)(14,16)(17,22)(18,23)(20,21), ( 6,18)( 7,23)( 9,17)(10,12)
  (14,21)(15,24)(16,20)(19,22), ( 6,15)( 7,10)( 9,20)(12,23)(14,22)(16,17)
  (18,24)(19,21) )
  "m24"
  gap> Size(m24);
  244823040
  gap> Transitivity(m24,[1..24]);
  5
  gap> m22a:=Stabilizer(m24,[23,24],OnSets);
  Subgroup( m24, [ ( 1, 2)( 5,14)( 6,18)( 7,12)( 8,19)( 9,20)(11,21)(13,22), 
    ( 1, 3)( 4,13, 7,21)( 5,14)( 6, 9,22,11)( 8,16,15,19)(10,18,12,20), 
    ( 4,13)( 6,19)( 7,21)( 8,11)( 9,15)(10,20)(12,18)(16,22), 
    ( 3, 4,14,22)( 5,16,17,13)( 6, 7)( 8,15,11,10)( 9,12,20,18)(19,21), 
    ( 3,17)( 4,16)( 5,14)( 6, 7)( 8,11)(12,18)(13,22)(19,21), 
    ( 4,22,16)( 5,17,14)( 6, 8,10)( 7,11,15)( 9,19,12)(18,20,21), 
    ( 4,21)( 6,16)( 7,13)( 8, 9)(10,18)(11,15)(12,20)(19,22), 
    ( 4,11)( 6,10)( 7, 9)( 8,13)(12,22)(15,21)(16,18)(19,20), 
    ( 4,22)( 6, 7)( 8,18)( 9,10)(11,12)(13,16)(15,20)(19,21), 
    ( 2,14, 5, 3)( 4, 7, 9,10)( 6,22,12,11)( 8,16,20,21)(15,18)(23,24) ] )
  gap> Size(m22a);
  887040
  gap> m22a:=Operation(m22a,[1..22]);m22a.name:="m22a";;
  Group( ( 1, 2)( 5,14)( 6,18)( 7,12)( 8,19)( 9,20)(11,21)(13,22), ( 1, 3)
  ( 4,13, 7,21)( 5,14)( 6, 9,22,11)( 8,16,15,19)(10,18,12,20), ( 4,13)( 6,19)
  ( 7,21)( 8,11)( 9,15)(10,20)(12,18)(16,22), ( 3, 4,14,22)( 5,16,17,13)( 6, 7)
  ( 8,15,11,10)( 9,12,20,18)(19,21), ( 3,17)( 4,16)( 5,14)( 6, 7)( 8,11)(12,18)
  (13,22)(19,21), ( 4,22,16)( 5,17,14)( 6, 8,10)( 7,11,15)( 9,19,12)(18,20,21), 
  ( 4,21)( 6,16)( 7,13)( 8, 9)(10,18)(11,15)(12,20)(19,22), ( 4,11)( 6,10)
  ( 7, 9)( 8,13)(12,22)(15,21)(16,18)(19,20), ( 4,22)( 6, 7)( 8,18)( 9,10)
  (11,12)(13,16)(15,20)(19,21), ( 2,14, 5, 3)( 4, 7, 9,10)( 6,22,12,11)
  ( 8,16,20,21)(15,18) )
  gap> Size(m22a);
  887040
  gap> s:=SylowSubgroup(m22a,2);;
  gap> a:=AgGroup(s);
  Group( g1, g2, g3, g4, g5, g6, g7, g8 )
  gap> n:=Filtered(NormalSubgroups(a),i->Size(i)=16
  >         and IsElementaryAbelian(i));
  [ Subgroup( Group( g1, g2, g3, g4, g5, g6, g7, g8 ), [ g4, g5*g6, g7, g8 ] ), 
    Subgroup( Group( g1, g2, g3, g4, g5, g6, g7, g8 ), 
      [ g1*g7, g2*g3*g7, g5*g6, g8 ] ), Subgroup( Group( g1, g2, g3, g4, g5, 
      g6, g7, g8 ), [ g2*g3, g5*g6, g7, g8 ] ), 
    Subgroup( Group( g1, g2, g3, g4, g5, g6, g7, g8 ), [ g4*g7, g5, g6, g8 ] ), 
    Subgroup( Group( g1, g2, g3, g4, g5, g6, g7, g8 ), 
      [ g4*g7, g5*g7, g6*g7, g8 ] ) ]
  gap> n:=List(n,i->Image(a.bijection,i));;
  gap> e:=Filtered(n,i->IsRegular(i,PermGroupOps.MovedPoints(i)));;
  gap> Length(e);
  1
  gap> e:=e[1];;
  gap> h:=Normalizer(m22a,e);;
  gap> mop:=Operation(m22a,RightCosets(m22a,h),OnRight);;
  gap> DegreeOperation(mop,[1..100]);
  77
  gap> ophom:=OperationHomomorphism(m22a,mop);;
  gap> dp:=DirectProduct(m22a,mop);;
  gap> emb1:=Embedding(m22a,dp,1);;
  gap> emb2:=Embedding(mop,dp,2);;
  gap> diag:=List(m22a.generators,
  >            i->Image(emb1,i)*Image(emb2,Image(ophom,i)));;
  gap> diag:=Group(diag,());;
  gap> diag.name:="M22.2-99";
  "M22.2-99"
  gap> RequirePackage("grape");
  
  Loading  GRAPE 2.31  (GRaph Algorithms using PErmutation groups),
  by L.H.Soicher@qmw.ac.uk.
  
  gap> gamma:=NullGraph(diag,100);
  rec(
    isGraph := true,
    order := 100,
    group := M22.2-99,
    schreierVector := [ -1, 1, 2, 4, 1, 7, 10, 8, 8, 4, 8, 8, 2, 10, 2, 5, 5, 
        8, 7, 10, 7, 4, -2, 10, 6, 6, 1, 10, 8, 2, 1, 4, 4, 10, 10, 1, 4, 2, 4, 
        5, 4, 4, 1, 8, 2, 7, 4, 4, 8, 4, 2, 10, 10, 2, 3, 10, 6, 9, 10, 10, 4, 
        4, 2, 4, 5, 5, 2, 10, 4, 6, 3, 9, 2, 5, 2, 5, 2, 5, 1, 1, 6, 4, 7, 9, 
        8, 4, 3, 3, 6, 3, 5, 10, 5, 2, 2, 8, 10, 2, 4, -3 ],
    adjacencies := [ [  ], [  ], [  ] ],
    representatives := [ 1, 23, 100 ],
    isSimple := true )
  gap> AddEdgeOrbit(gamma,[1,100]);AddEdgeOrbit(gamma,[100,1]);
  gap> hexad:=First(Orbits(h,[1..22]),i->Length(i)=6);
  [ 2, 8, 17, 15, 22, 6 ]
  gap> for i in hexad do AddEdgeOrbit(gamma,[i,23]);
  > AddEdgeOrbit(gamma,[23,i]); od;
  gap> Adjacency(gamma,23);
  [ 2, 6, 8, 15, 17, 22 ]
  gap> stab:=Stabilizer(diag,23);;
  gap> orbs:=Orbits(stab,[24..99]);;
  gap> orbreps:=List(orbs,i->i[1]);
  [ 24, 39 ]
  gap> Intersection(hexad,Adjacency(gamma,24));
  [ 15, 17 ]
  gap> Intersection(hexad,Adjacency(gamma,39));
  [  ]
  gap> AddEdgeOrbit(gamma,[23,39]); AddEdgeOrbit(gamma,[39,23]);
  gap> IsSimpleGraph(gamma);
  true
  gap> Adjacency(gamma,23);
  [ 2, 6, 8, 15, 17, 22, 39, 42, 46, 49, 52, 56, 63, 68, 70, 76, 80, 81, 86, 
    90, 93, 94 ]
  gap> IsDistanceRegular(gamma);
  true
  gap> aug:=AutGroupGraph(gamma);;
  gap> Size(aug);
  88704000
  gap> DisplayCompositionSeries(aug);
  <G> (3 gens, size 88704000)
   | Z(2)
  <S> (2 gens, size 44352000)
   | HS
  <1> (0 gens)
  gap> hs:=DerivedSubgroup(aug);;
  gap> ct:=CharTable("U3(5)");;ct2:=CharTable("U3(5).2");;
  gap> cths:=CharTable("hs");;
  gap> ct.orders;ct2.orders;cths.orders;
  [ 1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 7, 8, 8, 10 ]
  [ 1, 2, 3, 4, 5, 5, 5, 6, 7, 8, 10, 2, 4, 6, 8, 10, 12, 20, 20 ]
  [ 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 8, 10, 10, 11, 11, 12, 15, 20, 
    20 ]
  gap> repeat e1:=Random(hs);until OrderPerm(e1)=12;
  gap> e2:=e1^6;;
  gap> ct2.classes[2];
  525
  gap> cths.orders[21];
  12
  gap> cths.powermap[3][cths.powermap[2][21]];
  2
  gap> cths.classes[2];
  5775
  gap> cnt:=0;;repeat u:=Subgroup(aug,[e1,e2^Random(hs)]);cnt:=cnt+1;
  > until Index(hs,u)=176;cnt;
  26
  gap> hsop:=Operation(hs,CanonicalRightTransversal(hs,u),
  > OnCanonicalCosetElements(hs,u));;
  gap> IsPrimitive(hsop,[1..176]);
  true
  gap> ophom:=OperationHomomorphism(hs,hsop);;
  gap> dp:=DirectProduct(hs,hsop);;
  gap> emb1:=Embedding(hs,dp,1);;
  gap> emb2:=Embedding(hsop,dp,2);;
  gap> diag:=List(hs.generators,i->Image(emb1,i)*Image(emb2,Image(ophom,i)));;
  gap> diag:=Group(diag,());;diag.name:="hs-276";;
  gap> adj:=Adjacency(gamma,1);
  [ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 
    98, 99, 100 ]
  gap> t:=Stabilizer(diag,[1,adj[1]],OnSets);;
  gap> cnt:=0;;repeat s:=Subgroup(diag,[Random(t),Random(t)]);cnt:=cnt+1;
  > until Size(s)=Size(t);cnt;t:=s;;
  1
  gap> aus:=t.operations.AutomorphismGroup(t);;
  gap> Size(aus);
  241920
  gap> inner:=Subgroup(aus,aus.innerAutomorphisms);;
  gap> Index(aus,inner);
  6
  gap> rt:=RightTransversal(aus,inner);;
  gap> automs:=Filtered(rt,i->i^2 in inner and not i in inner);;
  gap> Length(automs);
  3
  gap> List(automs,i->Order(aus,i));
  [ 2, 2, 2 ]
  gap> ot:=Orbits(t,[1..276]);;
  gap> List(ot,Length);
  [ 2, 56, 42, 56, 120 ]
  gap> PermutationByAutomorphism := function(grp,aut,dom)
  > local op,oh,p,s,sim,simp,rt,rtim,extelm,l1,l2;
  >   # We compute the action on the given domain and transfer the
  >   # automorphism to this permutation action
  >   op:=Operation(grp,dom);
  >   oh:=OperationHomomorphism(grp,op);
  >   aut:=GroupHomomorphismByImages(op,op,op.generators,List(op.generators,
  >          i->Image(oh,Image(aut,PreImagesRepresentative(oh,i)))));
  >   aut.isMapping:=true; # just to save time (otherwise GAP will test that
  >                  # it is indeed a homomorphism, but we know this already)
  > 
  >   # compute stabilizer and images
  >   s:=Stabilizer(op,1);
  >   sim:=Image(aut,s);
  > 
  >   # is the image a stabilizer? It is if it has an orbit of length 1
  >   simp:=Filtered(Orbits(sim,[1..Length(dom)]),i->Length(i)=1);
  >   if Length(simp)=0 then
  >     return false; # it cannot be induced by a permutation action
  >   fi;
  > 
  >   # the permutation can be obtained by the induced action on the right
  >   # cosets.
  >   simp:=simp[1][1]; #image base point
  >   rt:=RightTransversal(op,s);
  >   rtim:=List(rt,i->Image(aut,i));
  >   l1:=List(rt,i->1^i);l2:=List(rtim,i->simp^i);
  > 
  >   # we got the images, make a permutation from them.
  >   if Length(Orbits(grp,dom))=1 then
  >     extelm:=MappingPermListList(l1,l2);
  >   else
  >     # if we have two orbits, we have to ensure they get swapped
  >     extelm:=MappingPermListList(Concatenation(l1,l2),Concatenation(l2,l1));
  >   fi;
  > 
  >   # test whether the computed element indeed fulfills the specifictions
  >   # (This is a safety test only)
  >   if ForAny(op.generators,i->i^extelm<>i^aut) then
  >     Error("something went wrong");
  >   fi;
  > 
  >   # finally move the points acted on to the original domain.
  >   return extelm^MappingPermListList([1..Length(dom)],dom);
  > end;
  function ( grp, aut, dom ) ... end
  gap> 
  gap> lo:=First(ot,i->Length(i)=120);;
  gap> automs:=Filtered(automs,i->PermutationByAutomorphism(t,i,lo)<>false);;
  gap> Length(automs);
  1
  gap> autom:=automs[1];;
  gap> pos:=Filtered([1..Length(ot)],i->Length(ot[i])=56);
  [ 2, 4 ]
  gap> perms:=List(ot{Difference([1..5],pos)},
  >              i->PermutationByAutomorphism(t,autom,i));;
  gap> element:=Product(perms)*PermutationByAutomorphism(t,
  >                            autom,Concatenation(ot{pos}));;
  gap> ot[1];
  [ 1, 79 ]
  gap> 1^element;
  1
  gap> element:=element*(1,79);;
  gap> co3:=Group(Concatenation(diag.generators,[element]),());;
  gap> Size(co3);
  495766656000
  gap> DisplayCompositionSeries(co3);
  <G> (3 gens, size 495766656000)
   | Co(3)
  <1> (0 gens)
  gap> quit;

Alexander Hulpke
Department of Mathematics
Colorado State University
Weber Building
Fort Collins, CO 80523
USA
email: hulpke@math.colostate.edu