From 2d113029dff8485697404d6f4661476ef34aabf5 Mon Sep 17 00:00:00 2001 From: Ulli Kehrle Date: Wed, 7 Nov 2018 12:36:55 +0100 Subject: Added first draft of the algorithm --- subgroupladder.g | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 subgroupladder.g diff --git a/subgroupladder.g b/subgroupladder.g new file mode 100644 index 0000000..e1235a1 --- /dev/null +++ b/subgroupladder.g @@ -0,0 +1,85 @@ +FindPos := function(list, x) + local n, i; + n := Length(list); + for i in [1..n] do + if x in list[i] then + return i; + fi; + od; +end; + +id := function(x) + return x; +end; + +Subgroupladder := function(G) + local + orb, + i, + k, + n, + pair, + ladder, + directfactors, + mapping, + output, + partition; + + + if (not IsPermGroup(G)) then + ErrorNoReturn("the argument must be a permutation group!\n"); + fi; + + n := LargestMovedPoint(G); + + orb := List(Orbits(G), x -> x); + SortBy(orb, x->-Length(x)); + + output := []; + + partition := List(orb, Length); + mapping := List([1..n], x -> FindPos(orb, x)); + ladder := [[List(partition, id), List(mapping, id)]]; + + + while (Length(partition) <> 1 or partition[1] < n) do + if (Length(partition) = 1 and partition[1] < n) then + mapping[Position(mapping, 0)] := 1; + partition[1] := partition[1] + 1; + Add(ladder, [List(partition, id), List(mapping, id)]); + else + if (partition[2] = 1) then + Remove(partition, 2); + for i in [1..n] do + if (mapping[i]) > 1 then + mapping[i] := mapping[i] - 1; + fi; + od; + partition[1] := partition[1] + 1; + Add(ladder, [List(partition, id), List(mapping, id)]); + else + mapping[Position(mapping, 2)] := Length(partition)+1; + partition[2] := partition[2] - 1; + Add(partition, 1); + Add(ladder, [List(partition, id), List(mapping, id)]); + + mapping[Position(mapping, Length(partition))] := 1; + Remove(partition); + partition[1] := partition[1] + 1; + Add(ladder, [List(partition, id), List(mapping, id)]); + fi; + fi; + od; + + for pair in ladder do + k := Length(pair[1]); + mapping := pair[2]; + directfactors := []; + for i in [1..k] do + Add(directfactors, SymmetricGroup(Filtered([1..n], x -> i = mapping[x]))); + od; + Add(output, DirectProduct(directfactors)); + od; + + return output; +end; -- cgit v1.2.3-24-g4f1b