# basic arithmetic
29*(5+(3/17));
# Lists, records (arbitrary nesting)
[[1,2],[3,4]];rec(a:=1,b:=2);
# Pascal-like programming language
f:=function(a) return a^2+a;end;
f(2);f(3);
# list manipulation commands
Filtered(Combinations([1..5],3),i->Sum(i)=9);

x:=Indeterminate(GF(2));x.name:="x";
RecFields(x);
f:=x^23-1;
Factors(f);
f:=First(Factors(f),i->Degree(i)>1);

RequirePackage("guava");
cod:=GeneratorPolCode(f,23,GF(2));
IsPerfectCode(cod);
ext:=ExtendedCode(cod);
WeightDistribution(ext);
m24:=AutomorphismGroup(ext);
Size(m24);
m22a:=Stabilizer(m24,[23,24],OnSets);
m22a:=Operation(m22a,[1..22]);
s:=SylowSubgroup(m22a,2);;
a:=AgGroup(s);
n:=Filtered(NormalSubgroups(a),i->Size(i)=16 and IsElementaryAbelian(i));;
n:=List(n,i->Image(a.bijection,i));
u:=First(n,i->IsRegular(i,PermGroupOps.MovedPoints(i)));
un:=Normalizer(m22a,u);;
# mop:=Operation(m22a,RightCosets(m22a,un),OnRight); quicker:
mop:=Operation(m22a,CanonicalRightTransversal(m22a,un),
	OnCanonicalCosetElements(m22a,un));

ophom:=OperationHomomorphism(m22a,mop);
dp:=DirectProduct(m22a,mop);
emb1:=Embedding(m22a,dp,1);;
emb2:=Embedding(mop,dp,2);;
diag:=List(m22a.generators,i->Image(emb1,i)*Image(emb2,Image(ophom,i)));
diag:=Group(diag,());;
diag.name:="M22.2-diag";

RequirePackage("grape");
gamma:=NullGraph(diag,100);
AddEdgeOrbit(gamma,[1,100]);AddEdgeOrbit(gamma,[100,1]);
hexad:=First(Orbits(un,[1..22]),i->Length(i)=6);
hexad:=Set(hexad);
for i in hexad do AddEdgeOrbit(gamma,[i,23]); AddEdgeOrbit(gamma,[23,i]); od;
# two points in second orbit are joined, if the hexads are disjoint
stab:=Stabilizer(diag,23);
storbrep:=List(Orbits(stab,[23..99]),i->i[1]);
reps:=List(storbrep,i->RepresentativeOperation(diag,23,i));
repi:=List(reps,i->Intersection(hexad,OnSets(hexad,i)));
pos:=First([1..3],i->Length(repi[i])=0);
AddEdgeOrbit(gamma,[23,storbrep[pos]]);AddEdgeOrbit(gamma,[storbrep[pos],23]);
IsSimpleGraph(gamma);
Adjacency(gamma,1);
IsDistanceRegular(gamma);

aug:=AutGroupGraph(gamma);
DisplayCompositionSeries(aug);

