diff --git a/lib/ctblmono.gd b/lib/ctblmono.gd
index fb6cee51c9..210f94bf52 100644
--- a/lib/ctblmono.gd
+++ b/lib/ctblmono.gd
@@ -545,7 +545,9 @@ DeclareProperty( "IsMonomialNumber", IsPosInt );
## whether the irreducible character chi or the group G,
## respectively, is monomial.
## Here cheap
means in particular that no computations of character
-## tables are involved.
+## tables are involved,
+## and it is not checked whether chi is a character and
+## irreducible.
## The return value is a record with components
##
## isMonomial
@@ -572,7 +574,7 @@ DeclareProperty( "IsMonomialNumber", IsPosInt );
## it is linear, or if its codegree is a prime power,
## or if its group knows to be monomial,
## or if the factor group modulo the kernel can be proved to be monomial by
-## .
+## .
##
## TestMonomialQuick( Irr( S4 )[3] );
@@ -699,9 +701,9 @@ TestMonomialUseLattice := 1000;
##
##
##
-## A character of the group G is called subnormally monomial
-## (SM for short) if it is induced from a linear character of a subnormal
-## subgroup of G.
+## An irreducible character of the group G is called
+## subnormally monomial (SM for short) if it is induced
+## from a linear character of a subnormal subgroup of G.
## A group G is called SM if all its irreducible characters are SM.
##
## returns
diff --git a/lib/ctblmono.gi b/lib/ctblmono.gi
index a94acce9a5..09844eeab5 100644
--- a/lib/ctblmono.gi
+++ b/lib/ctblmono.gi
@@ -146,7 +146,7 @@ InstallMethod( Delta,
##
#M IsBergerCondition( ) . . . . . . . . . . . . . . . for a character
##
-InstallOtherMethod( IsBergerCondition,
+InstallMethod( IsBergerCondition,
"for a class function",
[ IsClassFunction ],
function( chi )
@@ -292,6 +292,8 @@ InstallMethod( IsBergerCondition,
##
#F TestHomogeneous( , )
##
+## This works also for reducible .
+##
InstallGlobalFunction( TestHomogeneous, function( chi, N )
local t, # character table of `G'
@@ -314,6 +316,11 @@ InstallGlobalFunction( TestHomogeneous, function( chi, N )
N );
fi;
+ if Length( cl ) = 1 then
+ return rec( isHomogeneous := true,
+ comment := "restriction to trivial subgroup" );
+ fi;
+
t:= UnderlyingCharacterTable( chi );
classes:= SizesConjugacyClasses( t );
norm:= Sum( cl, c -> classes[c] * values[c]
@@ -357,6 +364,10 @@ end );
##
#M TestQuasiPrimitive( ) . . . . . . . . . . . . . . . for a character
##
+## This works also for reducible .
+## Note that a representation affording maps the centre of
+## to scalar matrices.
+##
InstallMethod( TestQuasiPrimitive,
"for a character",
[ IsCharacter ],
@@ -366,7 +377,6 @@ InstallMethod( TestQuasiPrimitive,
t, # character table of `chi'
nsg, # list of normal subgroups of `t'
cen, # centre of `chi'
- allhomog, # are all restrictions up to now homogeneous?
j, # loop over normal subgroups
testhom, # test of homogeneous restriction
test; # result record
@@ -379,10 +389,8 @@ InstallMethod( TestQuasiPrimitive,
# Linear characters are primitive.
if values[1] = 1 then
-
test:= rec( isQuasiPrimitive := true,
comment := "linear character" );
-
else
t:= UnderlyingCharacterTable( chi );
@@ -412,31 +420,21 @@ InstallMethod( TestQuasiPrimitive,
nsg:= ClassPositionsOfNormalSubgroups( t );
nsg:= Filtered( nsg, x -> IsSubsetSet( x, cen ) );
- allhomog:= true;
- j:= 1;
-
- while allhomog and j <= Length( nsg ) do
+ test:= rec( isQuasiPrimitive := true,
+ comment := "all restrictions checked" );
- testhom:= TestHomogeneous( chi, nsg[j] );
+ for j in nsg do
+ testhom:= TestHomogeneous( chi, j );
if not testhom.isHomogeneous then
# nonhomogeneous restriction found
- allhomog:= false;
test:= rec( isQuasiPrimitive := false,
comment := testhom.comment,
character := testhom.character );
-
+ break;
fi;
-
- j:= j+1;
-
od;
- if allhomog then
- test:= rec( isQuasiPrimitive := true,
- comment := "all restrictions checked" );
- fi;
-
fi;
Info( InfoMonomial, 1,
@@ -460,14 +458,18 @@ InstallMethod( IsQuasiPrimitive,
##
#M IsPrimitiveCharacter( ) . . . . . . . . . . . . . . for a character
##
+## Quasi-primitive irreducible characters of solvable groups are primitive,
+## see for example [Isa76, Thm. 11.33].
+##
InstallMethod( IsPrimitiveCharacter,
"for a class function",
[ IsClassFunction ],
function( chi )
- if not IsSolvableGroup( UnderlyingGroup( chi ) ) then
+ if not ( IsIrreducibleCharacter( chi ) and
+ IsSolvableGroup( UnderlyingGroup( chi ) ) ) then
TryNextMethod();
fi;
- return IsCharacter( chi ) and TestQuasiPrimitive( chi ).isQuasiPrimitive;
+ return TestQuasiPrimitive( chi ).isQuasiPrimitive;
end );
@@ -747,7 +749,7 @@ InstallMethod( TestSubnormallyMonomial,
##
#M TestSubnormallyMonomial( ) . . . . . . . . . . . . for a character
##
-InstallOtherMethod( TestSubnormallyMonomial,
+InstallMethod( TestSubnormallyMonomial,
"for a character",
[ IsClassFunction ],
function( chi )
@@ -917,7 +919,7 @@ InstallMethod( IsSubnormallyMonomial,
[ IsGroup ],
G -> TestSubnormallyMonomial( G ).isSubnormallyMonomial );
-InstallOtherMethod( IsSubnormallyMonomial,
+InstallMethod( IsSubnormallyMonomial,
"for a character",
[ IsClassFunction ],
chi -> TestSubnormallyMonomial( chi ).isSubnormallyMonomial );
@@ -1013,6 +1015,8 @@ InstallMethod( IsMonomialNumber,
##
#M TestMonomialQuick( ) . . . . . . . . . . . . . . . for a character
##
+## We assume that is an irreducible character.
+##
InstallMethod( TestMonomialQuick,
"for a character",
[ IsClassFunction ],
@@ -1048,8 +1052,20 @@ InstallMethod( TestMonomialQuick,
return rec( isMonomial := true,
comment := "linear character" );
- elif TestMonomialQuick( UnderlyingGroup( chi ) ).isMonomial = true then
-#T ?
+ fi;
+
+ G:= UnderlyingGroup( chi );
+
+ if Size( G ) mod DegreeOfCharacter( chi ) <> 0 then
+ Info( InfoMonomial, 1,
+ "TestMonomialQuick returns with `false'" );
+ return rec( isMonomial := false,
+ comment := "degree does not divide group order" );
+ fi;
+
+ # The following criteria are applicable only to irreducible characters.
+ # We do *not* check here that 'chi' is really an irreducible character.
+ if TestMonomialQuick( G ).isMonomial = true then
# The whole group is known to be monomial.
Info( InfoMonomial, 1,
@@ -1059,7 +1075,6 @@ InstallMethod( TestMonomialQuick,
fi;
- G := UnderlyingGroup( chi );
chi := ValuesOfClassFunction( chi );
# Replace `G' by the factor group modulo the kernel.
@@ -1073,7 +1088,6 @@ InstallMethod( TestMonomialQuick,
# Inspect the codegree.
codegree := factsize / chi[1];
-
if IsPrimePowerInt( codegree ) then
# If the codegree is a prime power then the character is monomial,
@@ -1110,7 +1124,7 @@ InstallMethod( TestMonomialQuick,
if factsize / hall = chi[1] then
- # The character is induced from a {\em linear} character
+ # The character is induced from a *linear* character
# of the $\pi$ Hall group.
Info( InfoMonomial, 1,
"TestMonomialQuick returns with `true'" );
@@ -1119,7 +1133,7 @@ InstallMethod( TestMonomialQuick,
elif IsMonomialNumber( hall ) then
- # The {\em order} of this Hall subgroup is monomial.
+ # The *order* of this Hall subgroup is monomial.
Info( InfoMonomial, 1,
"TestMonomialQuick returns with `true'" );
return rec( isMonomial := true,
@@ -1132,29 +1146,22 @@ InstallMethod( TestMonomialQuick,
# Inspect the factor group modulo the kernel.
if 1 < Length( ker ) then
- if IsSolvableGroup( G ) and IsMonomialNumber( factsize ) then
-
- # The order of the kernel factor group is monomial.
- # (For faithful characters this check has been done already.)
- Info( InfoMonomial, 1,
- "TestMonomialQuick returns with `true'" );
- return rec( isMonomial := true,
- comment := "size of kernel factor is monomial" );
+ # For solvable 'G', checking 'factsize' for monomiality does not
+ # help here because the divisor 'hall' has been checked above.
- elif IsSubsetSet( ker, ClassPositionsOfSupersolvableResiduum(t) ) then
+ if IsSubsetSet( ker, ClassPositionsOfSupersolvableResiduum(t) ) then
# The factor group modulo the kernel is supersolvable.
Info( InfoMonomial, 1,
"TestMonomialQuick returns with `true'" );
return rec( isMonomial:= true,
comment:= "kernel factor group is supersolvable" );
-#T Is there more one can do without computing the factor group?
fi;
grouptest:= TestMonomialQuick( FactorGroupNormalSubgroupClasses(
OrdinaryCharacterTable( G ), ker ) );
-#T This can help ??
+#T This is not cheap!
if grouptest.isMonomial = true then
Info( InfoMonomial, 1,
@@ -1190,7 +1197,7 @@ InstallMethod( TestMonomialQuick,
## (Compute the Sylow subgroups of the supersolvable residuum,
## and check whether they are abelian.)
##
-InstallOtherMethod( TestMonomialQuick,
+InstallMethod( TestMonomialQuick,
"for a group",
[ IsGroup ],
function( G )
@@ -1273,11 +1280,18 @@ InstallOtherMethod( TestMonomialQuick,
#M TestMonomial( ) . . . . . . . . . . . . . . . . . . for a character
#M TestMonomial( , ) . . . for a character, and a Boolean
##
-## Called with a character as argument, `TestMonomialQuick( )'
-## is inspected first. If this did not decide the question, we test all
-## those normal subgroups of $G$ to that restricts nonhomogeneously
-## whether the interesting character of the inertia subgroup is monomial.
+## Called with an irreducible character as argument,
+## `TestMonomialQuick( )' is inspected first;
+## if this did not decide the question,
+## we test all those normal subgroups of $G$ to which restricts
+## nonhomogeneously whether the interesting character of the
+## inertia subgroup is monomial.
## (If is quasiprimitive then it is nonmonomial.)
+## If is not irreducible, these tests are not applicable.
+##
+## If is `true' or if the group of has order at most
+## `TestMonomialUseLattice' then the subgroup lattice is used
+## to decide the question if necessary.
##
BindGlobal( "TestMonomialFromLattice", function( chi )
local G, H, source;
@@ -1286,7 +1300,7 @@ BindGlobal( "TestMonomialFromLattice", function( chi )
# Loop over representatives of the conjugacy classes of subgroups.
for H in List( ConjugacyClassesSubgroups( G ), Representative ) do
- if Index( G, H ) = chi[1] then
+ if IndexNC( G, H ) = chi[1] then
source:= First( LinearCharacters( H ), lambda -> lambda^G = chi );
if source <> fail then
return source;
@@ -1330,38 +1344,38 @@ InstallMethod( TestMonomial,
Info( InfoMonomial, 1, "TestMonomial called" );
- # Start wirth elementary tests for monomiality.
- test:= TestMonomialQuick( chi );
+ # Start with elementary tests for monomiality.
+ if HasIsMonomialCharacter( chi ) then
+ # The character knows about being monomial.
+ test:= rec( isMonomial := IsMonomialCharacter( chi ),
+ comment := "was already stored" );
+ elif IsIrreducibleCharacter( chi ) then
+ test:= TestMonomialQuick( chi );
+ elif DegreeOfCharacter( chi ) = 1 then
+ # Linear characters are monomial.
+ test:= rec( isMonomial := true,
+ comment := "linear character" );
+ elif Size( UnderlyingGroup( chi ) ) mod DegreeOfCharacter( chi ) <> 0 then
+ test:= rec( isMonomial := false,
+ comment := "degree does not divide group order" );
+ else
+ test:= rec( isMonomial:= "?" );
+ fi;
if test.isMonomial = "?" then
G:= UnderlyingGroup( chi );
if not IsSolvableGroup( G ) then
-
- # Use the subgroup lattice or give up.
- if uselattice or Size( G ) <= TestMonomialUseLattice then
-
- test:= TestMonomialFromLattice( chi );
- if test = fail then
- test:= rec( isMonomial := false,
- comment := "lattice checked" );
- else
- test:= rec( isMonomial := true,
- comment := "induced from \'character\'",
- character := test );
- fi;
-
- else
-
- # We do not know whether is monomial.
- Info( InfoMonomial, 1,
- "TestMonomial: nonsolvable group" );
- test:= rec( isMonomial:= "?",
- comment:= "no criterion for nonsolvable group" );
-
- fi;
-
+ Info( InfoMonomial, 1,
+ "TestMonomial: nonsolvable group" );
+ test:= rec( isMonomial := "?",
+ comment := "no criterion for nonsolvable group" );
+ elif not IsIrreducibleCharacter( chi ) then
+ Info( InfoMonomial, 1,
+ "TestMonomial: reducible character" );
+ test:= rec( isMonomial := "?",
+ comment := "no criterion for reducible character" );
else
# Loop over all normal subgroups of `G' to that restricts
@@ -1410,6 +1424,7 @@ InstallMethod( TestMonomial,
test:= rec( isMonomial := true,
comment := "induced from monomial subgroup",
subgroup := T );
+#T example?
else
@@ -1464,29 +1479,25 @@ InstallMethod( TestMonomial,
# We have tried all suitable normal subgroups and always got
# back that the character of the inertia subgroup was
# (possibly) nonmonomial.
- if uselattice or Size( G ) <= TestMonomialUseLattice then
-
- # Use explicit computations with the subgroup lattice,
- test:= TestMonomialFromLattice( chi );
- if test = fail then
- test:= rec( isMonomial := false,
- comment := "lattice checked" );
- else
- test:= rec( isMonomial := true,
- comment := "induced from \'character\'",
- character := test );
- fi;
-
- else
+ test:= rec( isMonomial:= "?",
+ comment:= "all inertia subgroups checked, no result" );
- # We cannot decide whether is monomial.
- test:= rec( isMonomial:= "?",
- comment:= "all inertia subgroups checked, no result" );
+ fi;
- fi;
+ fi;
+ if test.isMonomial = "?" and
+ ( uselattice or Size( G ) <= TestMonomialUseLattice ) then
+ # Use explicit computations with the subgroup lattice,
+ test:= TestMonomialFromLattice( chi );
+ if test = fail then
+ test:= rec( isMonomial := false,
+ comment := "lattice checked" );
+ else
+ test:= rec( isMonomial := true,
+ comment := "induced from \'character\'",
+ character := test );
fi;
-
fi;
fi;
@@ -1503,17 +1514,15 @@ InstallMethod( TestMonomial,
#M TestMonomial( ) . . . . . . . . . . . . . . . . . . . . . for a group
#M TestMonomial( , ) . . . . . . for a group, and a Boolean
##
-## Called with a group the program checks whether all representatives
+## Called with a group , the program checks whether all representatives
## of character orbits are monomial.
##
-#T used e.g. by `Irr' for supersolvable groups, function `IrrConlon'!
-##
-InstallOtherMethod( TestMonomial,
+InstallMethod( TestMonomial,
"for a group",
[ IsGroup ],
G -> TestMonomial( G, false ) );
-InstallOtherMethod( TestMonomial,
+InstallMethod( TestMonomial,
"for a group, and a Boolean",
[ IsGroup, IsBool ],
function( G, uselattice )
@@ -1549,11 +1558,12 @@ InstallOtherMethod( TestMonomial,
found:= false;
j:= 2;
poss:= [];
- while ( not found ) and j <= Length( orbits ) do
+ while j <= Length( orbits ) do
psi:= orbits[j];
testmon:= TestMonomial( psi, uselattice ).isMonomial;
if testmon = false then
found:= true;
+ break;
elif testmon = "?" then
Add( poss, psi );
fi;
@@ -1886,7 +1896,7 @@ InstallMethod( TestRelativelySM,
[ IsClassFunction ],
TestRelativelySMFun );
-InstallOtherMethod( TestRelativelySM,
+InstallMethod( TestRelativelySM,
"for a group",
[ IsGroup ],
TestRelativelySMFun );
@@ -2579,6 +2589,8 @@ InstallGlobalFunction( MinimalNonmonomialGroup, function( p, factsize )
K:= PolycyclicFactorGroup( K, rels );
ConvertToStringRep( name );
SetName( K, name );
+ SetIsMinimalNonmonomial( K, true );
+
return K;
end );
diff --git a/tst/testinstall/ctblmono.tst b/tst/testinstall/ctblmono.tst
index 063748546a..984a095b15 100644
--- a/tst/testinstall/ctblmono.tst
+++ b/tst/testinstall/ctblmono.tst
@@ -7,8 +7,12 @@
#Y Copyright (C) 1998, Lehrstuhl D für Mathematik, RWTH Aachen, Germany
##
gap> START_TEST("ctblmono.tst");
+
+##
gap> S4:= SymmetricGroup( 4 );; SetName( S4, "S4");
gap> Sl23:= SL( 2, 3 );;
+
+##
gap> Alpha( Sl23 );
[ 1, 3, 3 ]
gap> Alpha( S4 );
@@ -25,9 +29,11 @@ gap> List( Irr( Sl23 ), IsBergerCondition );
[ true, true, true, false, false, false, true ]
gap> List( Irr( Sl23 ), Degree );
[ 1, 1, 1, 2, 2, 2, 3 ]
-gap> n:= DerivedSubgroup( Sl23 );;
+
+##
gap> chi:= Irr( Sl23 )[7];
Character( CharacterTable( SL(2,3) ), [ 3, 0, 0, 3, 0, 0, -1 ] )
+gap> n:= DerivedSubgroup( Sl23 );;
gap> test:= TestHomogeneous( chi, n );;
gap> test.isHomogeneous; test.comment; test.multiplicity;
false
@@ -39,6 +45,8 @@ gap> cln:= ClassPositionsOfNormalSubgroup( CharacterTable( Sl23 ), n );
[ 1, 4, 7 ]
gap> TestHomogeneous( chi, cln );
rec( comment := "restricts irreducibly", isHomogeneous := true )
+
+##
gap> chi:= Irr( Sl23 )[4];;
gap> TestQuasiPrimitive( chi );
rec( comment := "all restrictions checked", isQuasiPrimitive := true )
@@ -51,6 +59,8 @@ gap> IsPrimitive( Irr( Sl23 )[4] );
true
gap> IsPrimitive( Irr( Sl23 )[7] );
false
+
+##
gap> List( Irr( Sl23 ), IsInducedFromNormalSubgroup );
[ false, false, false, false, false, false, true ]
gap> List( Irr( S4 ){ [ 1, 3, 4 ] },
@@ -61,18 +71,216 @@ gap> List( Irr( S4 ){ [ 1, 3, 4 ] },
comment := "induced from component '.character'", isInduced := true ),
rec( comment := "all maximal normal subgroups checked", isInduced := false
) ]
-gap> TestMonomial( S4 );
-rec( comment := "abelian by supersolvable group", isMonomial := true )
-gap> TestMonomial( Sl23 );
-rec( comment := "list Delta( G ) contains entry > 1", isMonomial := false )
-gap> Filtered( [ 1 .. 111 ], x -> not IsMonomial( x ) );
-[ 24, 48, 72, 96, 108 ]
-gap> TestMonomialQuick( Irr( S4 )[3] );
+
+##
+gap> Filtered( [ 1 .. 200 ], i -> not IsMonomial( i ) );
+[ 24, 48, 72, 96, 108, 120, 144, 160, 168, 192 ]
+
+##
+gap> irr:= Irr( SymmetricGroup( 4 ) );;
+gap> SetIsMonomialCharacter( irr[1], true );
+gap> TestMonomialQuick( irr[1] );
+rec( comment := "was already stored", isMonomial := true )
+gap> TestMonomial( irr[1] );
+rec( comment := "was already stored", isMonomial := true )
+gap> IsMonomial( irr[1] );
+true
+gap> TestMonomialQuick( irr[5] );
+rec( comment := "linear character", isMonomial := true )
+gap> TestMonomial( irr[5] );
+rec( comment := "linear character", isMonomial := true )
+gap> IsMonomial( irr[5] );
+true
+gap> TestMonomial( 5 * irr[1] );
+rec( comment := "degree does not divide group order", isMonomial := false )
+gap> IsMonomial( 5 * irr[5] );
+false
+gap> TestMonomialQuick( irr[2] );
+rec( comment := "whole group is monomial", isMonomial := true )
+gap> TestMonomial( irr[2] );
rec( comment := "whole group is monomial", isMonomial := true )
+gap> IsMonomial( irr[2] );
+true
+gap> irr:= Irr( SL(2,3) );;
+gap> chi:= First( irr, x -> x[1] = 3 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "codegree is prime power", isMonomial := true )
+gap> TestMonomial( chi );
+rec( comment := "codegree is prime power", isMonomial := true )
+gap> IsMonomial( chi );
+true
+gap> irr:= Irr( SmallGroup( 120, 15 ) );;
+gap> chi:= First( irr, x -> x[1] = 3 and
+> Length( ClassPositionsOfKernel( x ) ) = 2 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "degree is index of Hall subgroup", isMonomial := true )
+gap> TestMonomial( chi );
+rec( comment := "degree is index of Hall subgroup", isMonomial := true )
+gap> IsMonomial( chi );
+true
+gap> irr:= Irr( SmallGroup( 240, 109 ) );;
+gap> chi:= First( irr, x -> x[1] = 6 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "induced from monomial Hall subgroup", isMonomial := true )
+gap> TestMonomial( chi );
+rec( comment := "induced from monomial Hall subgroup", isMonomial := true )
+gap> IsMonomial( chi );
+true
+gap> g:= DirectProduct( AlternatingGroup(5), SymmetricGroup(3),
+> SymmetricGroup(3) );;
+gap> chi:= First( Irr( g ), x -> x[1] = 2 and
+> Length( ClassPositionsOfKernel( x ) ) = 10 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "kernel factor group is supersolvable", isMonomial := true )
+gap> TestMonomial( chi );
+rec( comment := "kernel factor group is supersolvable", isMonomial := true )
+gap> IsMonomial( chi );
+true
+gap> irr:= Irr( SmallGroup( 144, 31 ) );;
+gap> chi:= First( irr, x -> x[1] = 6 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "kernel factor group is monomial", isMonomial := true )
+gap> TestMonomial( chi );
+rec( comment := "kernel factor group is monomial", isMonomial := true )
+gap> IsMonomial( chi );
+true
+gap> irr:= Irr( SL(2,3) );;
+gap> chi:= First( irr, x -> x[1] = 2 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "no decision by cheap tests", isMonomial := "?" )
+gap> TestMonomial( chi );
+rec( comment := "quasiprimitive character", isMonomial := false )
+gap> IsMonomial( chi );
+false
+gap> irr:= Irr( AlternatingGroup( 5 ) );;
+gap> chi:= First( irr, x -> x[1] = 5 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "no decision by cheap tests", isMonomial := "?" )
+gap> TestMonomial( chi ).comment;
+"induced from 'character'"
+gap> IsMonomial( chi );
+true
+gap> TestMonomialUseLattice_Orig:= TestMonomialUseLattice;;
+gap> TestMonomialUseLattice:= 20;;
+gap> chi:= First( irr, x -> x[1] = 4 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "no decision by cheap tests", isMonomial := "?" )
+gap> TestMonomial( chi ).comment;
+"no criterion for nonsolvable group"
+gap> TestMonomial( chi, true ).comment;
+"lattice checked"
+gap> IsMonomial( chi );
+false
+gap> irr:= Irr( SmallGroup( 96, 204 ) );;
+gap> chi:= First( irr, x -> x[1] = 4 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "no decision by cheap tests", isMonomial := "?" )
+gap> TestMonomial( chi ).comment;
+"induced from 'character'"
+gap> IsMonomial( chi );
+true
+gap> chi:= First( Irr( SmallGroup( 144, 31 ) ), x -> x[1] = 4 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "no decision by cheap tests", isMonomial := "?" )
+gap> TestMonomial( chi ).comment;
+"all inertia subgroups checked, no result"
+gap> TestMonomial( chi, true ).comment;
+"induced from 'character'"
+gap> IsMonomial( chi );
+true
+gap> chi:= 0 * [ 1 .. NrConjugacyClasses( S4 ) ];;
+gap> chi[1]:= Size( S4 );;
+gap> chi:= ClassFunction( S4, chi );;
+gap> TestMonomial( chi ).comment;
+"no criterion for reducible character"
+gap> TestMonomial( chi, true ).comment;
+"induced from 'character'"
+gap> IsMonomial( chi );
+true
+gap> TestMonomialUseLattice:= TestMonomialUseLattice_Orig;;
+gap> chi:= First( Irr( SmallGroup( 48, 28 ) ), x -> x[1] = 4 );;
+gap> TestMonomialQuick( chi );
+rec( comment := "no decision by cheap tests", isMonomial := "?" )
+gap> TestMonomial( chi ).comment;
+"induced from 'character'"
+gap> IsMonomial( chi );
+true
+
+##
gap> TestMonomialQuick( S4 );
rec( comment := "abelian by supersolvable group", isMonomial := true )
+gap> TestMonomial( S4 );
+rec( comment := "abelian by supersolvable group", isMonomial := true )
+gap> IsMonomial( S4 );
+true
gap> TestMonomialQuick( Sl23 );
rec( comment := "no decision by cheap tests", isMonomial := "?" )
+gap> TestMonomial( Sl23 );
+rec( comment := "list Delta( G ) contains entry > 1", isMonomial := false )
+gap> IsMonomial( Sl23 );
+false
+gap> g:= SmallGroup( 96, 204 );;
+gap> TestMonomialQuick( g );
+rec( comment := "no decision by cheap tests", isMonomial := "?" )
+gap> TestMonomial( g );
+rec( comment := "all characters checked", isMonomial := true )
+gap> IsMonomial( g );
+true
+gap> TestMonomialUseLattice_Orig:= TestMonomialUseLattice;;
+gap> TestMonomialUseLattice:= 50;;
+gap> test:= TestMonomial( SmallGroup( 96, 190 ) );;
+gap> test.isMonomial; test.comment;
+"?"
+"(possibly) nonmon. characters found"
+gap> test:= TestMonomial( SmallGroup( 96, 190 ), true );;
+gap> test.isMonomial; test.comment;
+false
+"nonmonomial character found"
+gap> TestMonomialUseLattice:= TestMonomialUseLattice_Orig;;
+gap> g:= SmallGroup( 16, 3 );;
+gap> TestMonomialQuick( g ); # implication
+rec( comment := "was already stored", isMonomial := true )
+gap> TestMonomial( g );
+rec( comment := "was already stored", isMonomial := true )
+gap> IsMonomial( g );
+true
+gap> g:= AlternatingGroup( 5 );;
+gap> TestMonomialQuick( g );
+rec( comment := "non-solvable group", isMonomial := false )
+gap> TestMonomial( g );
+rec( comment := "non-solvable group", isMonomial := false )
+gap> IsMonomial( g );
+false
+gap> g:= SmallGroup( 56, 10 );;
+gap> TestMonomialQuick( g );
+rec( comment := "group order is monomial", isMonomial := true )
+gap> TestMonomial( g );
+rec( comment := "group order is monomial", isMonomial := true )
+gap> IsMonomial( g );
+true
+gap> g:= SmallGroup( 24, 10 );;
+gap> TestMonomialQuick( g );
+rec( comment := "nilpotent group", isMonomial := true )
+gap> TestMonomial( g );
+rec( comment := "nilpotent group", isMonomial := true )
+gap> IsMonomial( g );
+true
+gap> g:= SmallGroup( 24, 4 );;
+gap> TestMonomialQuick( g );
+rec( comment := "supersolvable group", isMonomial := true )
+gap> TestMonomial( g );
+rec( comment := "supersolvable group", isMonomial := true )
+gap> IsMonomial( g );
+true
+gap> g:= SmallGroup( 324, 160 );;
+gap> TestMonomialQuick( g );
+rec( comment := "Sylow abelian by supersolvable group", isMonomial := true )
+gap> TestMonomial( g );
+rec( comment := "Sylow abelian by supersolvable group", isMonomial := true )
+gap> IsMonomial( g );
+true
+
+##
gap> TestSubnormallyMonomial( S4 );
rec( character := Character( CharacterTable( S4 ), [ 3, -1, -1, 0, 1 ] ),
comment := "found non-SM character", isSubnormallyMonomial := false )
@@ -83,27 +291,52 @@ gap> TestSubnormallyMonomial( DerivedSubgroup( S4 ) );
rec( comment := "all irreducibles checked", isSubnormallyMonomial := true )
gap> IsSubnormallyMonomial( DerivedSubgroup( S4 ) );
true
+
+##
gap> TestRelativelySM( DerivedSubgroup( S4 ) );
rec( comment := "normal subgroups are abelian or have nilpotent factor group",
isRelativelySM := true )
-gap> IsMinimalNonmonomial( Sl23 );
-true
-gap> IsMinimalNonmonomial( S4 );
-false
-gap> MinimalNonmonomialGroup( 2, 3 ); # the group SL(2,3)
+
+##
+gap> g1:= MinimalNonmonomialGroup( 2, 3 ); # the group SL(2,3)
2^(1+2):3
-gap> MinimalNonmonomialGroup( 3, 4 );
+gap> g2:= MinimalNonmonomialGroup( 3, 4 );
3^(1+2):4
-gap> MinimalNonmonomialGroup( 5, 8 );
+gap> g3:= MinimalNonmonomialGroup( 5, 8 );
5^(1+2):Q8
-gap> MinimalNonmonomialGroup( 13, 12 );
+gap> g4:= MinimalNonmonomialGroup( 13, 12 );
13^(1+2):2.D6
-gap> MinimalNonmonomialGroup( 1, 14 );
+gap> g5:= MinimalNonmonomialGroup( 1, 14 );
2^(1+6):D14
-gap> MinimalNonmonomialGroup( 2, 14 );
+gap> g6:= MinimalNonmonomialGroup( 2, 14 );
(2^(1+6)Y4):D14
+gap> MinimalNonmonomialGroup( 3, 3 );
+fail
+gap> MinimalNonmonomialGroup( 2, 4 );
+fail
+gap> MinimalNonmonomialGroup( 2, 8 );
+fail
+gap> MinimalNonmonomialGroup( 1, 10 );
+fail
+gap> MinimalNonmonomialGroup( 5, 9 );
+fail
+
+##
+gap> IsMinimalNonmonomial( Sl23 );
+true
+gap> for g in [ g1, g2, g3, g4, g5, g6 ] do
+> # Make sure that the value is not yet stored.
+> if not IsMinimalNonmonomial( Group( GeneratorsOfGroup( g ) ) ) then
+> Error( "wrong result of IsMinimalNonmonomial" );
+> fi;
+> od;
+gap> IsMinimalNonmonomial( S4 );
+false
+
+##
gap> STOP_TEST( "ctblmono.tst", 1);
#############################################################################
##
#E
+