sortfunc := function(L1,L2) return Length(L1) < Length(L2); end; # sortfunc LargestPoint := function(G) local Result,L; Result := 0; L := PermGroupOps.MovedPoints(G); if Length(L) > 0 then Result := Maximum(L); fi; return Result; end; # LargestPoint TrivialBase := function(G) local orbitGroup,orbit,coupledElements,head; if not IsBound(G.trivialBase) then G.trivialBase := []; if not IsBound(G.orbits) then G.orbits := Orbits(G,[1..LargestPoint(G)]); Sort(G.orbits,sortfunc); fi; for orbit in [1 .. Length(G.orbits)] do orbitGroup := Operation(G,G.orbits[orbit]); coupledElements := Blocks(orbitGroup,[1..Length(G.orbits[orbit])]); for head in [1..Length(coupledElements)] do Add(G.trivialBase,G.orbits[orbit][coupledElements[head][1]]); od; od; fi; end; # TrivialBase StripBase := function(G,L) local Result,element; Result := []; TrivialBase(G); for element in [1 .. Length(L)] do if L[element] in G.trivialBase then Add(Result,L[element]); fi; od; return Result; end; # StripBase SortByGeneratorsOnOrbits := function(G,L) local i,j,genpoints,list,list2,Result1,Result; genpoints := []; Result := []; Result1 := []; for i in [1..Length(G.generators)] do list := Cycles(G.generators[i], [ SmallestMovedPointPerm(G.generators[i]) .. LargestMovedPointPerm(G.generators[i]) ] ); list2 := []; for j in [1..Length(list)] do if Length(list[j]) > 1 then Add(list2,list[j]); fi; od; list2 := Flat(list2); for j in [1..Length(list2)] do if not list2[j] in Result1 then Add(Result1,list2[j]); fi; od; od; Result1 := StripBase(G,Result1); for i in [1..Length(Result1)] do if Result1[i] in L and not Result1[i] in Result then Add(Result,Result1[i]); fi; od; return Result; end;