RTEx := function(endos,delta,d,F,A,B) rt := RightTransversal(A,B); tr := []; for f in endos do Append(~tr,ScalarMatrix(d,Zero(F))); end for; for g in rt do bild := delta(g); bildi := bild^-1; for i:=1 to #tr do tr[i] +:= bildi*endos[i]*bild; end for; // i end for; // g return tr; end function; RelTr := function(endos,M,sgl) // computes the image of the trace map Tr^G_H of M F := BaseRing(M); d := Dimension(M); delta := Representation(M); s := #sgl; while s gt 1 do bilder := RTEx(endos,delta,d,F,sgl[s-1],sgl[s]); endos := []; for phi in bilder do if phi ne ScalarMatrix(d,Zero(F)) then Append(~endos,phi); end if; end for; if endos eq [] then return endos; end if; s -:= 1; end while; return endos; end function; IsProjective := function(M,H,sgl) // tests whether the G-module M is rel. H-proj. // sgl decending chain of subgroups, starting with G d := Dimension(M); basis := Basis(EndomorphismAlgebra(Restriction(M,H))); for i in RelTr(basis,M,Append(sgl,H)) do if Rank(i) eq d then return true; end if; end for; return false; end function; CCReps := function(sub,G) groups := []; for i in sub do H := i`subgroup; need := true; for K in groups do if IsConjugate(G,H,K) then need:=false; break; end if; end for; if need then Append(~groups,H); end if; end for; return groups; end function; function Vx(M,G,H,sgl,min) // actual vertex computation // sgl is a decending chain of subgroups of G, beginning with G if #H gt min then Append(~sgl,H); for K in CCReps(MaximalSubgroups(H),G) do if IsProjective(M,K,sgl) then return Vx(M,G,K,sgl,min); end if; end for; end if; return H; end function; function VxStart(M, H) G := Group(M); ssyl := #SylowSubgroup(H,Characteristic(BaseRing(M))); V := SymmetricGroup(1); checked := []; for U in IndecomposableSummands(Restriction(M,H)) do need := true; for W in checked do if IsIsomorphic(U,W) then need:=false; break; end if; end for; if need then Append(~checked,U); VU := Vx(U,H,H,[],Maximum(#V,ssyl/Gcd(ssyl,Dimension(U)))); if VU eq H then print("The vertex is: "); return H; end if; if #VU gt #V then V:=VU; print("New lower bound: "); print(V); print("\n"); end if; end if; end for; print("The vertex is: "); return V; end function;