|
29 | 29 | # a version that only gives a representative in the isomorphism class, and
|
30 | 30 | # a version that gives the ones actually used in backtrack?
|
31 | 31 | #
|
| 32 | +InstallMethod(OrbitalGraphs, |
| 33 | +"for a permutation group and a homogeneous list (super basic)", |
| 34 | +[IsPermGroup, IsHomogeneousList], |
| 35 | +function(G, points) |
| 36 | + local graphs, stab, innerorbits, orb, iorb; |
| 37 | + |
| 38 | + # Commented out lines give the behaviour of the original OrbitalGraphs method |
| 39 | + |
| 40 | + graphs := []; |
| 41 | + for orb in Orbits(G, points) do |
| 42 | + stab := Stabilizer(G, orb[1]); |
| 43 | + innerorbits := Orbits(stab, MovedPoints(stab)); |
| 44 | + #innerorbits := Orbits(stab, Difference(points, [orb[1]])); |
| 45 | + for iorb in innerorbits do |
| 46 | + AddSet(graphs, EdgeOrbitsDigraph(G, [orb[1], iorb[1]])); |
| 47 | + od; |
| 48 | + od; |
| 49 | + return graphs; |
| 50 | +end); |
| 51 | + |
| 52 | +# TODO decide what to do about non-moved points |
| 53 | + |
32 | 54 | InstallMethod(OrbitalGraphs, "for a permutation group and a homogeneous list",
|
33 | 55 | [IsPermGroup, IsHomogeneousList],
|
34 | 56 | function(G, points)
|
@@ -113,6 +135,55 @@ function(G, points)
|
113 | 135 | return graphlist;
|
114 | 136 | end);
|
115 | 137 |
|
| 138 | +InstallMethod(OrbitalGraphs, |
| 139 | +"for a permutation group an a homogeneous list (no stab chain)", |
| 140 | +[IsPermGroup, IsHomogeneousList], |
| 141 | +-1, # TEMPORARY so that it doesn't get called |
| 142 | +function(G, points) |
| 143 | + local n, gens, seen, reps, graphs, root, D, orbit, schreier_gens, b, schreier_gen, innerorbits, a, i, inner; |
| 144 | + |
| 145 | + # FIXME: Currently ignores points |
| 146 | + |
| 147 | + n := LargestMovedPoint(G); |
| 148 | + gens := GeneratorsOfGroup(G); |
| 149 | + seen := BlistList([1 .. n], []); |
| 150 | + reps := []; |
| 151 | + graphs := []; |
| 152 | + |
| 153 | + repeat |
| 154 | + root := First([1 .. n], x -> not seen[x]); |
| 155 | + seen[root] := true; |
| 156 | + reps[root] := (); |
| 157 | + orbit := [root]; |
| 158 | + schreier_gens := []; |
| 159 | + |
| 160 | + # Construct a basic Schreier tree for <root> and Schreier generators for stabiliser of <root> |
| 161 | + for a in orbit do |
| 162 | + for i in [1 .. Length(gens)] do |
| 163 | + b := a ^ gens[i]; |
| 164 | + if not seen[b] then |
| 165 | + reps[b] := reps[a] * gens[i]; |
| 166 | + seen[b] := true; |
| 167 | + Add(orbit, b); |
| 168 | + else |
| 169 | + schreier_gen := reps[a] * gens[i] * reps[b] ^ -1; |
| 170 | + Add(schreier_gens, schreier_gen); |
| 171 | + fi; |
| 172 | + od; |
| 173 | + od; |
| 174 | + |
| 175 | + # Compute the orbits of the stabilizer of <root>, and hence the orbital graphs |
| 176 | + if not IsTrivial(orbit) then |
| 177 | + innerorbits := Orbits(Group(schreier_gens)); |
| 178 | + for inner in innerorbits do |
| 179 | + AddSet(graphs, EdgeOrbitsDigraph(G, [orbit[1], inner[1]])); |
| 180 | + od; |
| 181 | + fi; |
| 182 | + |
| 183 | + until SizeBlist(seen) = n; |
| 184 | + return graphs; |
| 185 | +end); |
| 186 | + |
116 | 187 |
|
117 | 188 | # Individual orbital graphs
|
118 | 189 |
|
|
0 commit comments