Skip to content

Commit a3d2141

Browse files
committed
WIP: Faster OrbitalGraphs
1 parent f3d2ff6 commit a3d2141

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

Diff for: gap/OrbitalGraphs.gi

+71
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,28 @@ end);
2929
# a version that only gives a representative in the isomorphism class, and
3030
# a version that gives the ones actually used in backtrack?
3131
#
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+
3254
InstallMethod(OrbitalGraphs, "for a permutation group and a homogeneous list",
3355
[IsPermGroup, IsHomogeneousList],
3456
function(G, points)
@@ -113,6 +135,55 @@ function(G, points)
113135
return graphlist;
114136
end);
115137

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+
116187

117188
# Transformation semigroups
118189

0 commit comments

Comments
 (0)