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;