This may just be 'one of those things', where a different chosen method ends up being extremely slow.
Basically, CharacteristicSubgroups can be suprisingly small on a tiny group (64 elements, 12 points), if you first call StabChain and FittingSubgroup.
# H is a 64-element subdirect of D_8^3 acting on 12 points with three
# orbits of length 4. CharacteristicSubgroups(H) finishes in ~30 ms
# in a fresh interpreter — but if StabChain(H, base) has been called
# with an explicit base argument and any subsequent call has forced
# FittingSubgroup(H), then CharacteristicSubgroups(H) hangs indefinitely
# (>>5 min on M-class hardware).
#
# This is GAP-only. The two passes below differ in exactly one line.
H := Group([(1,2)(3,4)(5,8,7,6)(9,12)(10,11),
(1,4,3,2)(5,7),
(2,4)(5,6,7,8)(9,10,11,12)]);
# Pass 1 (fast, ~30 ms):
# t := NanosecondsSinceEpoch();
# FittingSubgroup(H);;
# CharacteristicSubgroups(H);;
# Print(QuoInt(NanosecondsSinceEpoch() - t, 1000000), " ms\n");
# Pass 2 (hangs):
StabChain(H, [1, 5, 9]);; # any base argument here; even [5,1,9,6]
# (which equals what GAP picks naturally
# without an argument) triggers it.
FittingSubgroup(H);;
Print("about to call CharacteristicSubgroups; this will not return.\n");
t := NanosecondsSinceEpoch();
cs := CharacteristicSubgroups(H);
Print(QuoInt(NanosecondsSinceEpoch() - t, 1000000), " ms\n");
This may just be 'one of those things', where a different chosen method ends up being extremely slow.
Basically, CharacteristicSubgroups can be suprisingly small on a tiny group (64 elements, 12 points), if you first call
StabChainandFittingSubgroup.