> < ^ Date: Mon, 09 Dec 2002 12:59:11 +0100 (MET)
> < ^ From: Bettina Eick <beick@tu-bs.de >
> < ^ Subject: Re: Computing minimal normal subgroups of a small group

Dear GAP Forum, dear Bill,

I would like to computing the lists of minimal normal subgroups of a
(small) group.

I think that the following idea should be faster than computing all normal
subgroups and then finding the minimal ones:

A minimal normal subgroup N is G-generated (that is, generated as a
G-normal subgroup) by each non-trivial element of N. Hence one can loop
over all non-trivial elements g of G and compute the subgroup G-generated
by g to get a list containing all minimal normal subgroups. Since N is a
union of conjugacy classes, it is sufficient to consider conjugacy class
representatives g only. Since N contains an element of prime order, it is
sufficient to consider elements g of prime order only.

- compute the conjugacy classes of elements of your group
- for each class do:
if the representative has prime order then
add the subgroup G-generated by this representative
- discard the non-minimal subgroups in the resulting list.

This is not implemented in GAP, but it is very easy to implement it.
I include a possible implementation below. Since I have written this
very quickly, it is likely that it can still be improved.

Best wishes,
             Bettina

AddToSubgroupList := function( nt, U )
local i, N;

# check if U is minimal in nt
for N in nt do if IsSubgroup(U, N) then return nt; fi; od;

# check that nt remains minimal
for i in [1..Length(nt)] do
    if IsSubgroup(nt[i], U) then nt[i] := false; fi;
od;
nt := Filtered( nt, x -> not IsBool(x) );
    # add U and return
    Add(nt, U); return nt;
end;

MinimalNormalSubgroups := function(G)
    local cl, nt, c, U;
    cl := ConjugacyClasses(G);
    nt := [];
    for c in cl do
        if IsPrime(Order(Representative(c))) then
            U  := Subgroup( G, [Representative(c)] );
            U  := NormalClosure( G, U );
            nt := AddToSubgroupList( nt, U );
        fi;
    od;
    return nt;
end;

> < [top]