Skip to content

Instantly share code, notes, and snippets.

@diracdeltafunk
Created June 3, 2021 05:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save diracdeltafunk/d886b9ea31d1f61b19d8ca77bbda4696 to your computer and use it in GitHub Desktop.
Save diracdeltafunk/d886b9ea31d1f61b19d8ca77bbda4696 to your computer and use it in GitHub Desktop.
Checks that the total number of h-fixed points is |C(h)| times the number of G-classes in the inverse image of {h}
CheckClaim := function (G, N) # Checks if the claim holds for a given normal subgroup N in a given finite group G
local f, H, A, ActionHonA, NumFixedPoints, C, NumConjClassesIntersecting, h;
# Print("\nChecking\nG = ", G, "\nN = ", N, "\n...\n");
f := NaturalHomomorphismByNormalSubgroup(G, N); # G → H ≅ G/N
H := Image(f); # ≅ G/N
# NOTE: H = img(f) does *not* consist of cosets, it has some other internal representation!
# This is why we need to hang on to the actual map f, to keep track of things.
A := Orbits(N, G, OnPoints); # N-conjugacy classes of G
ActionHonA := function (a, h) # The action of H = G/N on A
local h0, a0;
h0 := PreImagesRepresentative(f, h); # Pick an element of the coset corresponding to h ∈ H
a0 := a[1]; # Pick an element of the orbit a ∈ A
return Orbit(N, a0^h0, OnPoints); # Take the N-conjugacy class of (a0 conjugated by h0)
end;
NumFixedPoints := function (h) # Directly counts fixed points of the action of h ∈ H
local count, a;
count := 0;
for a in A do
if IsEqualSet(ActionHonA(a, h), a) then
count := count+1;
fi;
od;
return count;
end;
C := ConjugacyClasses(G);
NumConjClassesIntersecting := function (h) # Directly counts the number of conjugacy classes of G
# which are sent to the conjugacy class of h ∈ H
# NOTE: A conjugacy class X in G is sent to the conjugacy class of aN iff X ∩ aN ≠ ∅,
# hence the name of this function.
local count, coset, c;
count := 0;
coset := PreImages(f, h);
for c in C do
if Intersection(c, coset) <> [] then
count := count+1;
fi;
od;
return count;
end;
# Now we're ready to check the claim.
for h in H do
if Size(Centralizer(H,h)) * NumConjClassesIntersecting(h) <> NumFixedPoints(h) then
# Print("FAILURE!\nOn coset ", PreImagesRepresentative(f, h), "N\n", Size(Centralizer(H,h)), " * ", NumConjClassesIntersecting(h), " != ", NumFixedPoints(h));
return false;
fi;
od;
return true;
end;
# Let's check the claim for all quotients of all groups of small orders!
bound := 255;;
for n in [1..bound] do
gs := AllSmallGroups(n);
for G in gs do
for N in NormalSubgroups(G) do
if not CheckClaim(G,N) then
Print("Failure on G = ", G, " N = ", N, "\n");
fi;
od;
od;
Print("Checked groups of order ", n, "\n");
od;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment