print " ";
print "This code finds the orbits of types and their ranks for the transitive permutation groups of degree 20 with even order centers and GAP database index 1106 or 1110.";
print " ";
print "As of Dec. 7, 2008, it includes lines of code that are supposed to speed up the calculation of orbits.";
print " ";
print "As of Dec. 20, 2008, it includes lines of code that show the number of each orbit of each size and rank. It also lists the sizes of orbits of types at the end of each group's analysis.";
print " ";
print "As of Jan. 22, 2009, it separates the groups according to pairs consisting of orbit size and orbit rank.";
print " ";
n:=10;
function OrbitsOfTypes(groupNum)
G:=TransitiveGroup(2*n,groupNum);
S:=SubgroupClasses(G:OrderEqual:=2);
RhoGroups:=[];
L:={@ @};
for i in [1..#S] do
if S[i]`length eq 1 then
Append(~RhoGroups,S[i]`subgroup);
end if;
end for;
if #RhoGroups eq 1 then
print "There is a unique rho for this group.";
print " ";
else
print "There are",#RhoGroups,"rhos for this group.";
print " ";
end if;
TypeSizes:=[];
OrbitSizes:=[];
SizeRankList1:=[];
SizeRankList2:=[];
count:=[];
for r in [1..#RhoGroups] do
print "Information for rho #",r,":";
print " ";
SetsOfTypes:={@ s : s in Orbits(RhoGroups[r]) @}; //makes an enumerated set of the partitions
Types:={@ {@ a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 @} : a1 in SetsOfTypes[1], a2 in SetsOfTypes[2], a3 in SetsOfTypes[3], a4 in SetsOfTypes[4],a5 in SetsOfTypes[5], a6 in SetsOfTypes[6], a7 in SetsOfTypes[7], a8 in SetsOfTypes[8], a9 in SetsOfTypes[9], a10 in SetsOfTypes[10] @};
f:=Action(GSet(G));
O:=[]; // array containing at most 2^n orbits of types
Ob:={@ @}; // set containing distinct orbits of types
orbitSum:=0;
for i in [1..2^n] do
O[i]:={@ Types | @};
end for;
/* Old lines of code
for i in [1..2^n] do
for g in G do
U:={@ @};
for j in [1..n] do
Include(~U,f(Types[i][j],g));
end for;
Sort(~U);
Include(~O[i],U);
end for;
end for;
End of old lines of code
*/
for i in [1..2^n] do
if orbitSum lt 2^n then
for g in G do
U:={@ @};
for j in [1..n] do
Include(~U,f(Types[i][j],g));
end for;
Include(~O[i],U);
end for;
// Calculate sum of sizes of orbits
Include(~Ob,O[i]);
OrbitSizes[r]:=[ #Ob[i] : i in [1..#Ob] ];
Sort(~OrbitSizes[r]);
orbitSum:=&+OrbitSizes[r];
end if;
end for;
SizeRankList2[r]:=[];
count[r]:=[];
for i in [1..#Ob] do
vect:=[];
orbitSize:=#Ob[i];
// print "Orbit #",i,"of size",orbitSize,"is:",Ob[i];
// print " ";
vect[i]:=[];
for j in [1..orbitSize] do
vect[i,j]:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; // must have 2*n zeroes
end for;
for a in [1..orbitSize] do
for b in [1..2*n] do
if b in Ob[i,a] then vect[i,a,b]:=1;
end if;
end for;
end for;
A:=Matrix(vect[i]);
// print "The corresponding matrix is A =",A;
// print "Orbit #",i,"of size",orbitSize,"has rank",Rank(A);
// print " ";
Append( ~SizeRankList2[r], [ orbitSize,Rank(A) ] );
end for;
SizeRankList1[r]:={@ d : d in SizeRankList2[r] @};
Sort(~SizeRankList1[r]);
Sort(~SizeRankList2[r]);
// SizeRankList1[r];
TypeSizes[r]:=[ #Ob[i] : i in [1..#Ob] ];
Sort(~TypeSizes[r]);
// print "Rho #",r,"has the following sizes of orbits of types:",TypeSizes[r];
// print " ";
print "Here is a list of orbit sizes and ranks.";
print " ";
for i in [1..#SizeRankList1[r]] do
count[r,i]:=0;
end for;
for i in [1..#SizeRankList1[r]] do
for j in [1..#SizeRankList2[r]] do
if SizeRankList1[r,i] eq SizeRankList2[r,j] then
count[r,i]+:=1;
end if;
end for;
end for;
// print "The size of SizeRankList1[",r,"] is",#SizeRankList1[r];
// print "The count array looks like",count[r];
for i in [1..#SizeRankList1[r]] do
Include(~L,[SizeRankList1[r,i,1],SizeRankList1[r,i,2],groupNum]);
if count[r,i] gt 1 then
print "There are",count[r,i],"orbits of size",SizeRankList1[r,i,1],"and rank",SizeRankList1[r,i,2];
else
print "There is",count[r,i],"orbit of size",SizeRankList1[r,i,1],"and rank",SizeRankList1[r,i,2];
end if;
end for;
print " ";
end for;
Obts:={@ TypeSizes[i] : i in [1..#RhoGroups] @};
// print "The following array shows the sizes of orbits of types:", Obts;
if #RhoGroups gt 1 then
if #Obts gt 1 then
print "There are",#Obts,"rhos that produce distinct lists of sizes of orbits of types.";
print " ";
rhoCount:=[];
for j in [1..#Obts] do
rhoCount[j]:=[];
end for;
for i in [1..#RhoGroups] do
for j in [1..#Obts] do
if TypeSizes[i] eq Obts[j] then
Append(~rhoCount[j],i);
end if;
end for;
end for;
for j in [1..#Obts] do
if #rhoCount[j] gt 1 then
print "The",#rhoCount[j],"rhos",rhoCount[j],"share this list of sizes of orbits of types:",Obts[j];
print " ";
else
print "Rho #",rhoCount[j],"has this list of sizes of orbits of types:",Obts[j];
print " ";
end if;
end for;
else
print "Each rho produces the same list of sizes of orbits of types.";
end if;
end if;
print "--------------------------------------------------------------------------";
return L;
end function;
ListOfGroups:=[ 1110 ];
/*
for i in [1..NumberOfTransitiveGroups(2*n)] do
G:=TransitiveGroup(2*n,i);
Z:=Center(G);
if IsEven(Order(Z)) then
Append(~ListOfGroups,i);
end if;
end for;
*/
OrbRankList:=[];
for k in ListOfGroups do
print "Here is the information for T",2*n,"N",k,"of order",Order(TransitiveGroup(2*n,k)),"=",FactoredOrder(TransitiveGroup(2*n,k)),":";
OrbRankList[Index(ListOfGroups,k)]:=OrbitsOfTypes(k);
end for;
S:={@ @};
for k in [1..#OrbRankList] do
for i in [1..#OrbRankList[k] ] do
Include(~S,OrbRankList[k,i]);
end for;
end for;
T:=SetToSequence(S);
Sort(~T);
U:={@ T[i,1] : i in [1..#T] @};
V:={@ T[i,2] : i in [1..#T] @};
L:=[];
for i in U do
L[Index(U,i)]:=[];
for j in V do
L[Index(U,i),Index(V,j)]:=[];
for k in [1..#T] do
if T[k,1] eq i and T[k,2] eq j then
Append(~L[Index(U,i),Index(V,j)],T[k,3]);
end if;
end for;
end for;
end for;
for i in U do
for j in V do
if IsDefined(L[Index(U,i),Index(V,j)],1) then
print "The following groups have an orbit of size",i,"and rank",j,":",L[Index(U,i),Index(V,j)];
end if;
end for;
end for;