Rank of Unit Group of Burnside Ring: Improving the Function

The resulting code from Week 4 was very significant. However, it is not ideal due to its inefficiency. I mentioned in the previous post that the inefficiency was caused by the calculation of unnecessary lines. Unfortunately, this cannot be changed by simply improving on the previous code, because the idea of using table of marks and solving for each line does not discriminate between necessary and unnecessary equations. Thus, I decided to give up on previous method of using table of marks and vector space. The goal of Week 5 is to find a new direction to approach this problem.

Ideally, the new method is expected to filter out unnecessary calculations. But what is a necessary and sufficient filter remains the hardest question to answer of this week. The proofs below shed some light on finding the efficient filter.

new direction

From the work above, I found out that instead of looking into all the subgroups, it is only necessary to look into the normalizers of index 2 subgroups. I wrote the function below to achieve this goal in GAP.

Subgroupfunction3:=function(grp)
local cc, mylist, ccn, index2, repre, Subgroups, Normalizers, i, j;
Subgroups:=[];
Normalizers:=[];
mylist:=[];
Subgroups:=List(ConjugacyClassesSubgroups(grp), Representative);
for i in [1..Size(Subgroups)] do
  Normalizers:=Normalizer(grp, Subgroups[i]);
  if \in(2,PrimeDivisors(Size(Normalizers))) then
    ccn:=List(ConjugacyClassesSubgroups(Normalizers),Representative);
    index2:=[];
    for j in [1..Size(ccn)] do
      if Index(Normalizers, ccn[j])=2 then
        if IsSubgroup(ccn[j],Subgroups[i])=true then
          Add(index2,ccn[j]);
        fi;
      fi;
    od;
    if not index2=[] then
      Add(mylist,[Subgroups[i],index2]);
    fi;
  fi;
od;

return mylist;
end;