Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/ctbllib/tst/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 22.4.2025 mit Größe 134 kB image not shown  

SSL ctblatlas.tst   Sprache: unbekannt

 
Spracherkennung für: .tst vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

# This file was created from xpl/ctblatlas.xpl, do not edit!
#############################################################################
##
#W  ctblatlas.tst             GAP applications              Thomas Breuer
##
##  In order to run the tests, one starts GAP from the `tst` subdirectory
##  of the `pkg/ctbllib` directory, and calls `Test( "ctblatlas.tst" );`.
##
gap> START_TEST( "ctblatlas.tst" );

##
gap> LoadPackage( "ctbllib", false );
true

##
gap> lib:= CharacterTable( "Th" );;
gap> parrottnames:= [
>      "1A", "z", "c2", "c3", "c1", "r1", "v", "b", "zc1", "zc2",
>      "zc3", "a", "us1", "w", "f1", "f3", "f2", "zb",
>      "r1c2", "(r1c2)^-1", "r1c3", "vc1", "l", "za",
>      "c1b", "(c1b)^-1", "zf1", "zf2", "19A", "vb", "c2a2",
>      "us1c2", "(us1c2)^-1", "wc1", "(wc1)^-1",
>      "f4", "f5", "(f5)^-1", "r1a", "zbc1", "(zbc1)^-1",
>      "31A", "31B", "r1f1", "s1f1", "(s1f1)^-1",
>      "c2l", "(c2l)^-1" ];;
gap> orders:= OrdersClassRepresentatives( lib );;
gap> centralizers:= SizesCentralizers( lib );;
gap> descr:= TransposedMat( [ parrottnames, orders, centralizers ] );;
gap> for entry in descr do
>      Print( String( entry[1], -12 ),
>             String( entry[2], 2 ), "  ",
>             StringPP( entry[3] ), "\n" );
>    od;
1A           1  2^15*3^10*5^3*7^2*13*19*31
z            2  2^15*3^4*5*7
c2           3  2^6*3^7*7*13
c3           3  2^3*3^10
c1           3  2^4*3^7*5
r1           4  2^11*3^3*7
v            4  2^9*3*5
b            5  2^3*3*5^3
zc1          6  2^4*3^3*5
zc2          6  2^6*3^3
zc3          6  2^3*3^4
a            7  2^3*3*7^2
us1          8  2^7*3
w            8  2^5*3
f1           9  2^3*3^6
f3           9  3^6
f2           9  2*3^4
zb          10  2^3*3*5
r1c2        12  2^5*3^2
(r1c2)^-1   12  2^5*3^2
r1c3        12  2^2*3^3
vc1         12  2^3*3
l           13  3*13
za          14  2^3*7
c1b         15  2*3*5
(c1b)^-1    15  2*3*5
zf1         18  2^3*3^2
zf2         18  2*3^2
19A         19  19
vb          20  2^2*5
c2a2        21  3*7
us1c2       24  2^3*3
(us1c2)^-1  24  2^3*3
wc1         24  2^3*3
(wc1)^-1    24  2^3*3
f4          27  3^3
f5          27  3^3
(f5)^-1     27  3^3
r1a         28  2^2*7
zbc1        30  2*3*5
(zbc1)^-1   30  2*3*5
31A         31  31
31B         31  31
r1f1        36  2^2*3^2
s1f1        36  2^2*3^2
(s1f1)^-1   36  2^2*3^2
c2l         39  3*13
(c2l)^-1    39  3*13

##
gap> th:= rec( UnderlyingCharacteristic:= 0,
>              OrdersClassRepresentatives:= orders,
>              SizesCentralizers:= centralizers,
>              Size:= centralizers[1] );;
gap> ConvertToCharacterTableNC( th );;

##
gap> g:= AtlasGroup( "2^5.L5(2)" );;
gap> bl:= Blocks( g, MovedPoints( g ) );;
gap> Length( bl[1] );
2
gap> acthom:= ActionHomomorphism( g, bl, OnSets );;
gap> img:= Image( acthom );;
gap> Size( g ) / Size( img );
32
gap> sm:= SmallerDegreePermutationRepresentation( img );;
gap> NrMovedPoints( Image( sm ) );
31
gap> f:= CharacterTable( Image( sm ) );;
gap> d:= CharacterTable( g );;
gap> fus:= List( ConjugacyClasses( d ),
>            c -> PositionProperty( ConjugacyClasses( f ),
>                   cc -> ( Representative( c )^acthom )^sm in cc ) );;
gap> infl:= List( Irr( f ), x -> x{ fus } );;

##
gap> indcyc:= InducedCyclic( d, [ 2 .. NrConjugacyClasses( d ) ], "all" );;
gap> nat:= NaturalCharacter( g );;
gap> red:= ReducedOrdinary( d, infl, Concatenation( indcyc, [ nat ] ) );;
gap> Length( red.irreducibles );
1
gap> faithirr:= ShallowCopy( red.irreducibles );;
gap> ten:= Set( Tensored( infl, faithirr ) );;
gap> ten:= Reduced( d, faithirr, ten );;
gap> lll:= LLL( d, Concatenation( red.remainders, ten.remainders ) );;
gap> Length( lll.irreducibles );
5
gap> Append( faithirr, lll.irreducibles );

##
gap> sym2:= Symmetrizations( d, faithirr, 2 );;
gap> sym3:= Symmetrizations( d, faithirr, 3 );;
gap> irr:= Concatenation( infl, faithirr );;
gap> sym:= Reduced( d, irr, Concatenation( sym2, sym3 ) );;
gap> lll:= LLL( d, Concatenation( lll.remainders, sym.remainders ) );;
gap> Length( lll.irreducibles );
4
gap> Append( irr, lll.irreducibles );

##
gap> gram:= MatScalarProducts( d, lll.remainders, lll.remainders );;
gap> emb:= OrthogonalEmbeddings( gram );;                           
gap> Length( emb.solutions );
3
gap> dec:= List( emb.solutions,
>                x -> Decreased( d, lll.remainders, emb.vectors{ x } ) );;
gap> dec:= Filtered( dec, x -> x <> fail );;
gap> Length( dec );
2

##
gap> sym:= List( [ 1, 2 ],
>            i -> Symmetrizations( d, [ dec[i].irreducibles[1] ], 2 ) );;
gap> good:= Filtered( [ 1, 2 ],
>             i -> ForAll( dec[i].irreducibles,
>                    x -> IsInt( ScalarProduct( d, sym[i][1], x ) ) ) );;
gap> Length( good );
1
gap> SetIrr( d, Concatenation( irr, dec[ good[1] ].irreducibles ) );

##
gap> nsg:= ClassPositionsOfNormalSubgroups( d );
[ [ 1 ], [ 1, 2 ], [ 1 .. 41 ] ]
gap> SizesConjugacyClasses( d ){ nsg[2] };
[ 1, 31 ]
gap> OrdersClassRepresentatives( d ){ nsg[2] };
[ 1, 2 ]

##
gap> f:= d / nsg[2];;
gap> PossibleClassFusions( f, d );
[  ]

##
gap> n:= PCore( g, 2 );
<permutation group with 5 generators>
gap> Size( n );
32
gap> IsomorphismGroups( g / n, GL(5,2) ) = fail;
false

##
gap> libsub:= CharacterTable( "2^5.L5(2)" );;
gap> IsRecord( TransformingPermutationsCharacterTables( d, libsub ) );
true
gap> d:= libsub;;

##
gap> powinfo:= [
>     [ "zc3", 2, "c3" ],     # c3 commutes with z
>     [ "zf2", 2, "f2" ],     # f2 commutes with z
>     [ "r1c3", 2, "zc3" ],   # r1 commutes with c3
>     [ "vc1", 2, "zc1" ],    # v squares to z and commutes with c1
>     [ "wc1", 2, "vc1" ],    # w squares to v and commutes with c1
>     [ "(wc1)^-1", 2, "vc1" ],
>     [ "us1c2", 2, "r1c2" ], # us1 squares to r1
>     [ "(us1c2)^-1", 2, "(r1c2)^-1" ],
>     [ "us1", 2, "r1" ],     # (5.1)
>     [ "w", 2, "v" ],        # (5.1)
>     [ "zbc1", 2, "c1b" ],
>     [ "(zbc1)^-1", 2, "(c1b)^-1" ],
>     [ "f1", 3, "c3" ],
>     [ "f2", 3, "c3" ],
>     [ "f3", 3, "c3" ],
>     [ "vc1", 3, "v" ],      # v commutes with c1
>     [ "zf1", 3, "zc3" ],
>     [ "zf2", 3, "zc3" ],
>     [ "us1c2", 3, "us1" ],
>     [ "(us1c2)^-1", 3, "us1" ],
>     [ "wc1", 3, "w" ],
>     [ "(wc1)^-1", 3, "w" ],
>     [ "f4", 3, "f3" ],
>     [ "f5", 3, "f3" ],
>     [ "(f5)^-1", 3, "f3" ],
>     [ "r1f1", 3, "r1c3" ],
>     [ "s1f1", 3, "r1c3" ],
>     [ "(s1f1)^-1", 3, "r1c3" ],
>     ];;

##
gap> maxorder:= Maximum( OrdersClassRepresentatives( th ) );
39
gap> primes:= Filtered( [ 1 .. maxorder ], IsPrimeInt );;

##
gap> for p in primes do
>      if 36 mod p <> 0 then
>        Add( powinfo, [ "r1f1", p, "r1f1" ] );
>      fi;
>      if 27 mod p <> 0 then
>        Add( powinfo, [ "f4", p, "f4" ] );
>      fi;
>    od;

##
gap> powermaps:= [];;
gap> for p in primes do
>      powermaps[p]:= InitPowerMap( th, p );
>    od;
gap> for entry in powinfo do
>      p:= entry[2];
>      pow:= powermaps[p];
>      src:= Position( parrottnames, entry[1] );
>      trg:= Position( parrottnames, entry[3] );
>      if IsInt( pow[ src ] ) then
>        if pow[ src ] <> trg then
>          Error( "contradiction!" );
>        fi;
>      elif not trg in pow[ src ] then
>        Error( "contradiction!" );
>      else
>        pow[ src ]:= trg;
>      fi;
>    od;
gap> SetComputedPowerMaps( th, powermaps );

##
gap> setGaloisInfo:= function( powermaps, classes, orders, primes, x )
>    local ord, p;
>    ord:= orders[ classes[1] ];
>    for p in primes do
>      if ord mod p <> 0 then
>        if GaloisCyc( x, p ) = x then
>          powermaps[p]{ classes }:= classes;
>        else
>          powermaps[p]{ classes }:= classes{ [ 2, 1 ] };
>        fi;
>      fi;
>    od;
>    end;;

##
gap> pos:= Positions( OrdersClassRepresentatives( d ), 15 );
[ 22, 24 ]
gap> f:= Field( List( Irr( d ), x -> x[ pos[1] ] ) );
NF(15,[ 1, 2, 4, 8 ])
gap> Sqrt( -15 ) in f;
true
gap> pos:= Positions( orders, 15 );
[ 25, 26 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( -15 ) );
gap> pos:= Positions( OrdersClassRepresentatives( d ), 30 );
[ 23, 25 ]
gap> f:= Field( List( Irr( d ), x -> x[ pos[1] ] ) );
NF(15,[ 1, 2, 4, 8 ])
gap> pos:= Positions( orders, 30 );
[ 40, 41 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( -15 ) );

##
gap> setGaloisInfo( powermaps,
>        List( [ "f5", "(f5)^-1" ], x -> Position( parrottnames, x ) ),
>        orders, primes, Sqrt( -3 ) );
gap> setGaloisInfo( powermaps, Positions( orders, 31 ), orders, primes,
>                   Sqrt( -31 ) );

##
gap> pos:= Positions( orders, 39 );
[ 47, 48 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( -3 ) );
gap> indcyc:= InducedCyclic( th, [ pos[1] ], "all" );;
gap> ForAll( indcyc, x -> IsInt( ScalarProduct( th, x, x ) ) );
false
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( -39 ) );
gap> indcyc:= InducedCyclic( th, [ pos[1] ], "all" );;
gap> ForAll( indcyc, x -> IsInt( ScalarProduct( th, x, x ) ) );
true

##
gap> pos:= Positions( orders, 36 );
[ 44, 45, 46 ]
gap> parrottnames{ pos };
[ "r1f1", "s1f1", "(s1f1)^-1" ]
gap> setGaloisInfo( powermaps, [ 45, 46 ], orders, primes, Sqrt( -3 ) );
gap> indcyc:= InducedCyclic( th, [ 45 ], "all" );;    
gap> ForAll( indcyc, x -> IsInt( ScalarProduct( th, x, x ) ) );
true
gap> setGaloisInfo( powermaps, [ 45, 46 ], orders, primes, Sqrt( -1 ) );
gap> indcyc:= InducedCyclic( th, [ 45 ], "all" );;
gap> ForAll( indcyc, x -> IsInt( ScalarProduct( th, x, x ) ) );
false
gap> setGaloisInfo( powermaps, [ 45, 46 ], orders, primes, Sqrt( -3 ) );

##
gap> List( [ "wc1", "(wc1)^-1" ], x -> Position( parrottnames, x ) );
[ 34, 35 ]
gap> vals:= [ Sqrt( -3 ), Sqrt( -1 ), Sqrt( -2 ), Sqrt( -6 ) ];
[ E(3)-E(3)^2, E(4), E(8)+E(8)^3, E(24)+E(24)^11-E(24)^17-E(24)^19 ]
gap> good:= [];;
gap> for val in vals do
>      setGaloisInfo( powermaps, [ 34, 35 ], orders, primes, val );
>      indcyc:= InducedCyclic( th, [ 34 ], "all" );
>      if ForAll( indcyc, x -> IsInt( ScalarProduct( th, x, x ) ) ) then
>        Add( good, val );
>      fi;
>    od;
gap> good;
[ E(24)+E(24)^11-E(24)^17-E(24)^19 ]
gap> setGaloisInfo( powermaps, [ 34, 35 ], orders, primes, good[1] );

##
gap> parrottnames{ [ 19, 20, 32, 33 ] };
[ "r1c2", "(r1c2)^-1", "us1c2", "(us1c2)^-1" ]
gap> fus:= InitFusion( d, th );;
gap> pos:= Positions( OrdersClassRepresentatives( d ), 12 );
[ 12, 15, 16 ]
gap> fus{ pos };
[ [ 19, 20, 21, 22 ], [ 19, 20 ], [ 19, 20 ] ]
gap> List( pos, x -> Field( List( Irr( d ), chi -> chi[x] ) ) );
[ Rationals, CF(3), CF(3) ]
gap> Sqrt( -3 ) in CF(3);
true
gap> setGaloisInfo( powermaps, [ 19, 20 ], orders, primes, Sqrt( -3 ) );
gap> setGaloisInfo( powermaps, [ 32, 33 ], orders, primes, Sqrt( -3 ) );

##
gap> indcyc:= InducedCyclic( th, [ 2 .. NrConjugacyClasses( th ) ], "all" );;

##
gap> fus:= InitFusion( d, th );
[ 1, 2, 2, 6, [ 6, 7 ], [ 6, 7 ], 13, [ 13, 14 ], [ 13, 14 ], 5, 9, 
  [ 19, 20, 21, 22 ], 3, 10, [ 19, 20 ], [ 19, 20 ], [ 9, 10 ], 
  [ 32, 33, 34, 35 ], [ 32, 33, 34, 35 ], 8, 18, [ 25, 26 ], [ 40, 41 ], 
  [ 25, 26 ], [ 40, 41 ], 12, 24, 24, 39, 31, 12, 24, 24, 39, 31, [ 42, 43 ], 
  [ 42, 43 ], [ 42, 43 ], [ 42, 43 ], [ 42, 43 ], [ 42, 43 ] ]
gap> Positions( OrdersClassRepresentatives( d ), 31 );
[ 36, 37, 38, 39, 40, 41 ]
gap> fus[36];
[ 42, 43 ]
gap> fus[36]:= 42;;
gap> TestConsistencyMaps( ComputedPowerMaps( d ), fus,
>        ComputedPowerMaps( th ) );
true
gap> possfus:= FusionsAllowedByRestrictions( d, th, Irr( d ), indcyc, fus,
>      rec( maxlen:= 10, minamb:= 1, maxamb:= 10^6, quick:= false,
>           contained:= ContainedPossibleCharacters ) );;
gap> possfus:= RepresentativesFusions( d, possfus, Group( () ) );
[ [ 1, 2, 2, 6, 7, 6, 13, 14, 13, 5, 9, 22, 3, 10, 19, 20, 10, 33, 32, 8, 18, 
      25, 40, 26, 41, 12, 24, 24, 39, 31, 12, 24, 24, 39, 31, 42, 43, 42, 42, 
      43, 43 ], 
  [ 1, 2, 2, 6, 7, 7, 13, 14, 14, 5, 9, 22, 3, 10, 19, 20, 10, 33, 32, 8, 18, 
      25, 40, 26, 41, 12, 24, 24, 39, 31, 12, 24, 24, 39, 31, 42, 43, 42, 42, 
      43, 43 ] ]

##
gap> indd:= InducedClassFunctionsByFusionMap( d, th, Irr( d ), possfus[1] );;
gap> ForAll( indd, x -> IsInt( ScalarProduct( th, x, x ) ) );
false
gap> indd:= InducedClassFunctionsByFusionMap( d, th, Irr( d ), possfus[2] );;
gap> ForAll( indd, x -> IsInt( ScalarProduct( th, x, x ) ) );
true

##
gap> irr:= [ TrivialCharacter( th ) ];;
gap> red:= ReducedOrdinary( th, irr, Concatenation( indcyc, indd ) );;
gap> lll:= LLL( th, red.remainders );;
gap> Length( lll.irreducibles );
4
gap> Append( irr, lll.irreducibles );

##
gap> sym:= Concatenation( List( [ 2, 3, 4, 5 ],
>              p -> Symmetrizations( th, irr, p ) ) );;
gap> sym:= ReducedOrdinary( th, irr, sym );;
gap> ten:= Set( Tensored( irr, irr ) );;
gap> ten:= ReducedOrdinary( th, irr, ten );;
gap> lll:= LLL( th, Concatenation( lll.remainders, sym.remainders,
>                               ten.remainders ) );;
gap> Length( lll.irreducibles );
3
gap> Append( irr, lll.irreducibles );
gap> DimensionsMat( irr );
[ 8, 48 ]

##
gap> indcyc:= ReducedOrdinary( th, irr, indcyc );;
gap> indd:= ReducedOrdinary( th, irr, indd );;
gap> sym:= ReducedOrdinary( th, irr, sym.remainders );;
gap> ten:= ReducedOrdinary( th, irr, ten.remainders );;
gap> lll:= LLL( th, Concatenation( indcyc.remainders, indd.remainders,
>                       sym.remainders, ten.remainders ) );;
gap> gram:= MatScalarProducts( th, lll.remainders, lll.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, 40 );;
gap> Length( emb.solutions );
4

##
gap> dec:= List( emb.solutions,
>                x -> Decreased( th, lll.remainders, emb.vectors{ x } ) );;
gap> dec:= Filtered( dec, x -> x <> fail );;
gap> Length( dec );
2

##
gap> SetIrr( th, List( Concatenation( irr, dec[1].irreducibles ),
>                      x -> Character( th, x ) ) );
gap> IsRecord( TransformingPermutationsCharacterTables( th, lib ) );
true

##
gap> ResetFilterObj( th, HasIrr );
gap> SetIrr( th, List( Concatenation( irr, dec[2].irreducibles ),
>                      x -> Character( th, x ) ) );
gap> IsRecord( TransformingPermutationsCharacterTables( th, lib ) );
true

##
gap> lib:= CharacterTable( "J4" );;
gap> pos:= [ 1 .. NrConjugacyClasses( lib ) ];;
gap> orders:= OrdersClassRepresentatives( lib );;
gap> centralizers:= SizesCentralizers( lib );;
gap> descr:= TransposedMat( [ pos, orders, centralizers ] );;
gap> for entry in descr do
>      Print( String( entry[1], 2 ), "  ",
>             String( entry[2], 2 ), "  ",
>             StringPP( entry[3] ), "\n" );
>    od;
 1   1  2^21*3^3*5*7*11^3*23*29*31*37*43
 2   2  2^21*3^3*5*7*11
 3   2  2^19*3^2*5*7*11
 4   3  2^8*3^3*5*7*11
 5   4  2^15*3*5*11
 6   4  2^15*3
 7   4  2^11*3*7
 8   5  2^6*3*5*7
 9   6  2^8*3^3*5*7*11
10   6  2^8*3^2
11   6  2^8*3^2
12   7  2^3*3*5*7
13   7  2^3*3*5*7
14   8  2^8*5
15   8  2^8*3
16   8  2^9
17  10  2^6*3*5
18  10  2^4*5
19  11  2^3*3*11^3
20  11  2*11^2
21  12  2^6*3
22  12  2^6*3
23  12  2^4*3
24  14  2^2*3*7
25  14  2^2*3*7
26  14  2^3*7
27  14  2^3*7
28  15  2*3*5
29  16  2^5
30  20  2^5*5
31  20  2^5*5
32  21  2*3*7
33  21  2*3*7
34  22  2^3*3*11
35  22  2*11
36  23  23
37  24  2^4*3
38  24  2^4*3
39  28  2^2*7
40  28  2^2*7
41  29  29
42  30  2*3*5
43  31  31
44  31  31
45  31  31
46  33  2*3*11
47  33  2*3*11
48  35  5*7
49  35  5*7
50  37  37
51  37  37
52  37  37
53  40  2^3*5
54  40  2^3*5
55  42  2*3*7
56  42  2*3*7
57  43  43
58  43  43
59  43  43
60  44  2^2*11
61  66  2*3*11
62  66  2*3*11

##
gap> j4:= rec( UnderlyingCharacteristic:= 0,
>              OrdersClassRepresentatives:= orders,
>              SizesCentralizers:= centralizers,
>              Size:= centralizers[1] );;
gap> ConvertToCharacterTableNC( j4 );;

##
gap> u:= CharacterTable( "J4M1" );
CharacterTable( "mx1j4" )

##
gap> powinfo:= [
>     [  5,  2,  2 ],
>     [  6,  2,  2 ],
>     [  7,  2,  3 ],
>     [ 10,  3,  2 ],
>     [ 11,  3,  3 ],
>     [ 15,  2,  6 ],
>     [ 16,  2,  6 ],
>     [ 17,  5,  2 ],
>     [ 18,  5,  3 ],
>     [ 21,  3,  5 ],
>     [ 22,  3,  6 ],
>     [ 23,  3,  7 ],
>     [ 24,  7,  2 ],
>     [ 25,  7,  2 ],
>     [ 26,  7,  3 ],
>     [ 27,  7,  3 ],
>     [ 29,  2, 16 ],
>     [ 34, 11,  2 ],
>     [ 35, 11,  3 ],
>     ];;

##
gap> maxorder:= Maximum( OrdersClassRepresentatives( j4 ) );
66
gap> primes:= Filtered( [ 1 .. maxorder ], IsPrimeInt );;

##
gap> pos:= Union( Positions( orders, 6 ), Positions( orders, 12 ) );
[ 9, 10, 11, 21, 22, 23 ]
gap> for p in primes do
>      if 6 mod p <> 0 then
>        for i in pos do
>          Add( powinfo, [ i, p, i ] );
>        od;
>      fi;
>    od;

##
gap> Add( powinfo, [ 24, 2, 12 ] );
gap> Add( powinfo, [ 25, 2, 13 ] );
gap> Add( powinfo, [ 26, 2, 12 ] );
gap> Add( powinfo, [ 27, 2, 13 ] );
gap> Add( powinfo, [ 39, 2, 26 ] );
gap> Add( powinfo, [ 40, 2, 27 ] );
gap> Add( powinfo, [ 55, 2, 32 ] );
gap> Add( powinfo, [ 56, 2, 33 ] );
gap> Add( powinfo, [ 55, 3, 25 ] );
gap> Add( powinfo, [ 56, 3, 24 ] );
gap> Add( powinfo, [ 32, 3, 13 ] );
gap> Add( powinfo, [ 33, 3, 12 ] );

##
gap> powermaps:= [];;
gap> for p in primes do
>      powermaps[p]:= InitPowerMap( j4, p );
>    od;
gap> for entry in powinfo do
>      p:= entry[2];
>      pow:= powermaps[p];
>      src:= entry[1];
>      trg:= entry[3];
>      if IsInt( pow[ src ] ) then
>        if pow[ src ] <> trg then
>          Error( "contradiction!" );
>        fi;
>      elif not trg in pow[ src ] then
>        Error( "contradiction!" );
>      else
>        pow[ src ]:= trg;
>      fi;
>    od;
gap> SetComputedPowerMaps( j4, powermaps );

##
gap> x:= Sqrt( -7 );;
gap> pos:= Positions( orders, 7 );
[ 12, 13 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );
gap> setGaloisInfo( powermaps, [ 24, 25 ], orders, primes, x );
gap> setGaloisInfo( powermaps, [ 26, 27 ], orders, primes, x );
gap> pos:= Positions( orders, 21 );
[ 32, 33 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );
gap> pos:= Positions( orders, 28 );
[ 39, 40 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );
gap> pos:= Positions( orders, 35 );
[ 48, 49 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );
gap> pos:= Positions( orders, 42 );
[ 55, 56 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );

##
gap> powermaps[5]{ [ 48, 49 ] }:= [ 13, 12 ];;

##
gap> pos:= Positions( orders, 33 );
[ 46, 47 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, 1 );
gap> ind:= InducedCyclic( j4, [ 46 ], "all" );;
gap> ForAll( ind, x -> IsInt( ScalarProduct( j4, x, x ) ) );
false
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( -3 ) );
gap> ind:= InducedCyclic( j4, [ 46 ], "all" );;
gap> ForAll( ind, x -> IsInt( ScalarProduct( j4, x, x ) ) );
false
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( -11 ) );
gap> ind:= InducedCyclic( j4, [ 46 ], "all" );;
gap> ForAll( ind, x -> IsInt( ScalarProduct( j4, x, x ) ) );
false
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( 33 ) );
gap> ind:= InducedCyclic( j4, [ 46 ], "all" );;
gap> ForAll( ind, x -> IsInt( ScalarProduct( j4, x, x ) ) );
true

##
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( 33 ) );
gap> pos:= Positions( orders, 66 );
[ 61, 62 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( 33 ) );
gap> powermaps[2]{ pos }:= [ 46, 47 ];;

##
gap> pos:= Positions( orders, 20 );
[ 30, 31 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, 1 );
gap> ind:= InducedCyclic( j4, [ 30 ], "all" );;
gap> ForAll( ind, x -> IsInt( ScalarProduct( j4, x, x ) ) );
false
gap> u:= CharacterTable( "J4M1" );
CharacterTable( "mx1j4" )
gap> pos:= Positions( OrdersClassRepresentatives( u ), 20 );
[ 60, 61 ]
gap> flds:= List( pos, i -> Field( List( Irr( u ), x -> x[i] ) ) );
[ NF(5,[ 1, 4 ]), NF(5,[ 1, 4 ]) ]
gap> x:= Sqrt(5);;
gap> ForAll( flds, f -> x in f );
true
gap> setGaloisInfo( powermaps, Positions( orders, 20 ), orders, primes, x );

##
gap> pos:= Positions( orders, 40 );
[ 53, 54 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( 5 ) );
gap> powermaps[2]{ pos }:= [ 31, 30 ];;

##
gap> x:= EC( 31 );;
gap> classes:= [ 43 .. 45 ];;
gap> vals:= List( [ 1, 5, 25 ], k -> GaloisCyc( x, k ) );;
gap> for p in primes do
>   if p mod 31 <> 0 then
>     for i in [ 1 .. 3 ] do
>       powermaps[p][ classes[i] ]:=
>         classes[ Position( vals, GaloisCyc( vals[i], p ) ) ];
>     od;
>   fi;
> od;
gap> x:= EC( 37 );;
gap> classes:= [ 50 .. 52 ];;
gap> vals:= List( [ 1, 2, 4 ], k -> GaloisCyc( x, k ) );;
gap> for p in primes do
>   if p mod 37 <> 0 then
>     for i in [ 1 .. 3 ] do
>       powermaps[p][ classes[i] ]:=
>         classes[ Position( vals, GaloisCyc( vals[i], p ) ) ];
>     od;
>   fi;
> od;
gap> x:= EC( 43 );;
gap> classes:= [ 57 .. 59 ];;
gap> vals:= List( [ 1, 6, 36 ], k -> GaloisCyc( x, k ) );;
gap> for p in primes do
>   if p mod 43 <> 0 then
>     for i in [ 1 .. 3 ] do
>       powermaps[p][ classes[i] ]:=
>         classes[ Position( vals, GaloisCyc( vals[i], p ) ) ];
>     od;
>   fi;
> od;

##
gap> pos:= PositionsProperty( powermaps[2], IsList );
[ 21, 22, 23, 35, 37, 38 ]
gap> orders{ pos };
[ 12, 12, 12, 22, 24, 24 ]

##
gap> powermaps[2]{ [ 34, 35 ] };
[ 19, [ 19, 20 ] ]
gap> powermaps[2][35]:= 20;;

##
gap> powermaps[2]{ [ 21, 22, 23 ] }:= [ [ 9, 10 ], [ 9, 10 ], 11 ];;

##
gap> powermaps[2]{ [ 37, 38 ] }:= [ 22, 22 ];;

##
gap> poss:= [];;
gap> for cand in [ [ 9, 9 ], [ 9, 10 ], [ 10, 9 ] ] do
>   powermaps[2]{ [ 21, 22 ] }:= cand;
>   fus:= InitFusion( u, j4 );
>   TestConsistencyMaps( ComputedPowerMaps( u ), fus, powermaps );
>   indcyc:= InducedCyclic( j4, [ 21, 22 ], "all" );
>   possfus:= FusionsAllowedByRestrictions( u, j4, Irr( u ), indcyc, fus,
>        rec( maxlen:= 10, minamb:= 1, maxamb:= 10^6, quick:= false,
>             contained:= ContainedPossibleCharacters ) );
>   Add( poss, Length( possfus ) );
> od;
gap> poss;
[ 0, 0, 0 ]
gap> powermaps[2]{ [ 21, 22 ] }:= [ 10, 10 ];;

##
gap> pos:= Positions( orders, 24 );
[ 37, 38 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, 1 );
gap> indcyc:= InducedCyclic( j4, pos, "all" );;
gap> ForAll( indcyc, x -> IsInt( ScalarProduct( j4, x, x ) ) );
false

##
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( 3 ) );

##
gap> indcyc:= InducedCyclic( j4, [ 2 .. NrConjugacyClasses( j4 ) ], "all" );;

##
gap> u:= CharacterTable( "J4M1" );
CharacterTable( "mx1j4" )
gap> fus:= InitFusion( u, j4 );
[ 1, [ 2, 3 ], 2, [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], 4, 4, 5, [ 5, 6 ], 
  [ 5, 6 ], 7, [ 5, 6 ], [ 5, 6, 7 ], [ 5, 6, 7 ], [ 5, 6, 7 ], [ 5, 6, 7 ], 
  [ 5, 6, 7 ], [ 5, 6, 7 ], [ 5, 6, 7 ], [ 5, 6, 7 ], 8, 9, [ 9, 10, 11 ], 
  [ 9, 10, 11 ], [ 9, 10, 11 ], [ 9, 10, 11 ], [ 9, 10, 11 ], [ 9, 10, 11 ], 
  [ 9, 10, 11 ], [ 12, 13 ], [ 12, 13 ], 15, 16, [ 14, 15, 16 ], 
  [ 14, 15, 16 ], [ 14, 15, 16 ], [ 14, 15, 16 ], 17, [ 17, 18 ], [ 17, 18 ], 
  [ 17, 18 ], [ 19, 20 ], [ 21, 22 ], [ 21, 22 ], [ 21, 22, 23 ], 
  [ 21, 22, 23 ], [ 21, 22, 23 ], [ 21, 22, 23 ], [ 21, 22, 23 ], 
  [ 21, 22, 23 ], [ 26, 27 ], [ 26, 27 ], [ 24, 25, 26, 27 ], 
  [ 24, 25, 26, 27 ], 28, 28, 29, [ 30, 31 ], [ 30, 31 ], [ 32, 33 ], 
  [ 32, 33 ], [ 34, 35 ], 36, 36, [ 37, 38 ], [ 37, 38 ], [ 39, 40 ], 
  [ 39, 40 ], 42, 42 ]
gap> Print( AutomorphismsOfTable( u ), "\n" );
Group( [ (67,68), (65,66), (60,61), (57,58)(71,72), (57,58)(67,68)(71,72), 
  (57,58)(60,61)(71,72), (32,33)(53,54)(55,56)(62,63)(69,70), 
  ( 5, 6)(15,16)(21,22)(30,31)(42,43)(49,50)(51,52) ] )
gap> fus{ [ 60, 61, 67, 68, 69, 70 ] };
[ [ 30, 31 ], [ 30, 31 ], [ 37, 38 ], [ 37, 38 ], [ 39, 40 ], [ 39, 40 ] ]
gap> fus[60]:= 30;;
gap> fus[67]:= 37;;
gap> fus[69]:= 40;;
gap> TestConsistencyMaps( ComputedPowerMaps( u ), fus,
>        ComputedPowerMaps( j4 ) );
true

##
gap> irr:= [ TrivialCharacter( j4 ) ];;
gap> indcyc:= ReducedOrdinary( j4, irr, indcyc );;
gap> possfus:= FusionsAllowedByRestrictions( u, j4, Irr( u ),
>      indcyc.remainders, fus,
>      rec( maxlen:= 10, minamb:= 1, maxamb:= 10^3, quick:= false,
>           contained:= ContainedPossibleCharacters ) );;
gap> Length( possfus );
1440
gap> reps:= RepresentativesFusions( u, possfus, Group(()) );;
gap> Length( reps );
720

##
gap> reps:= Filtered( reps,
>      map -> ForAll( InducedClassFunctionsByFusionMap( u, j4, Irr(u), map ),
>                     x -> IsPosInt( ScalarProduct( j4, x, x ) ) ) );;
gap> Length( reps );
2
gap> inds:= List( reps,
>      map -> InducedClassFunctionsByFusionMap( u, j4, Irr( u ), map ) );;
gap> ForAll( Flat( MatScalarProducts( j4, inds[1], inds[1] ) ), IsInt );
false
gap> ForAll( Flat( MatScalarProducts( j4, inds[2], inds[2] ) ), IsInt );
true

##
gap> ind:= ReducedOrdinary( j4, irr, inds[2] );;
gap> Length( ind.irreducibles );
0
gap> lll:= LLL( j4, Concatenation( indcyc.remainders, ind.remainders ) );;
gap> Length( lll.irreducibles );
29
gap> Append( irr, lll.irreducibles );

##
gap> lll.norms;
[ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
  2, 2, 2, 2, 2, 2, 2 ]
gap> dn:= DnLatticeIterative( j4, lll.remainders );;
gap> Length( dn.irreducibles );
28
gap> Append( irr, dn.irreducibles );

##
gap> gram:= MatScalarProducts( j4, dn.remainders, dn.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, 4 );;
gap> Length( emb.solutions );
3

##
gap> dec:= List( emb.solutions,
>                x -> Decreased( j4, dn.remainders, emb.vectors{ x } ) );;
gap> dec:= Filtered( dec, x -> x <> fail );;
gap> Length( dec );
2

##
gap> possirr:= List( dec, x -> x.irreducibles );;
gap> chi:= possirr[1][1];;
gap> sym:= Symmetrizations( j4, [ chi ], 2 );;
gap> ForAll( sym, x -> IsInt( ScalarProduct( j4, x, chi ) ) );
false

##
gap> SetIrr( j4, List( Concatenation( irr, possirr[2] ),
>                      x -> Character( j4, x ) ) );
gap> IsRecord( TransformingPermutationsCharacterTables( lib, j4 ) );
true

##
gap> t:= CharacterTable( "2E6(2)" );;
gap> t2:= CharacterTable( "2E6(2).2" );;
gap> aut:= AutomorphismsOfTable( t );;
gap> Factors( Size( aut ) );
[ 2, 2, 2, 2, 2, 2, 2, 2, 3 ]
gap> syl:= SylowSubgroup( aut, 3 );;
gap> IsNormal( aut, syl );
true
gap> orbs:= Orbits( syl, [ 1 .. NrConjugacyClasses( t ) ] );;
gap> orbsalpha:= List( Filtered( orbs, l -> Length( l ) <> 1 ), Set );
[ [ 11, 12, 13 ], [ 16, 17, 18 ], [ 39, 40, 41 ], [ 43, 44, 45 ], 
  [ 46, 47, 48 ], [ 64, 65, 66 ], [ 67, 68, 69 ], [ 75, 76, 77 ], 
  [ 78, 79, 80 ], [ 88, 89, 90 ], [ 91, 92, 93 ], [ 94, 95, 96 ], 
  [ 114, 115, 116 ], [ 117, 118, 119 ] ]

##
gap> tfust2:= PossibleClassFusions( t, t2 );;
gap> poss:= Set( List( tfust2, l -> Filtered( InverseMap( l ), IsList ) ) );
[ [ [ 11, 12 ], [ 16, 17 ], [ 39, 40 ], [ 43, 44 ], [ 46, 47 ], [ 55, 56 ], 
      [ 61, 62 ], [ 64, 65 ], [ 67, 68 ], [ 75, 76 ], [ 78, 79 ], [ 88, 89 ], 
      [ 91, 92 ], [ 94, 95 ], [ 99, 100 ], [ 103, 104 ], [ 109, 110 ], 
      [ 114, 115 ], [ 117, 118 ], [ 123, 124 ], [ 125, 126 ] ], 
  [ [ 11, 13 ], [ 16, 18 ], [ 39, 41 ], [ 43, 45 ], [ 46, 48 ], [ 55, 56 ], 
      [ 61, 62 ], [ 64, 66 ], [ 67, 69 ], [ 75, 77 ], [ 78, 80 ], [ 88, 90 ], 
      [ 91, 93 ], [ 94, 96 ], [ 99, 100 ], [ 103, 104 ], [ 109, 110 ], 
      [ 114, 116 ], [ 117, 119 ], [ 123, 124 ], [ 125, 126 ] ], 
  [ [ 12, 13 ], [ 17, 18 ], [ 40, 41 ], [ 44, 45 ], [ 47, 48 ], [ 55, 56 ], 
      [ 61, 62 ], [ 65, 66 ], [ 68, 69 ], [ 76, 77 ], [ 79, 80 ], [ 89, 90 ], 
      [ 92, 93 ], [ 95, 96 ], [ 99, 100 ], [ 103, 104 ], [ 109, 110 ], 
      [ 115, 116 ], [ 118, 119 ], [ 123, 124 ], [ 125, 126 ] ] ]
gap> orbsbeta:= poss[3];;

##
gap> orders:= OrdersClassRepresentatives( t );;
gap> mustsplit:= PositionsProperty( orders, IsOddInt );
[ 1, 5, 6, 7, 23, 33, 34, 51, 52, 55, 56, 83, 86, 87, 97, 98, 103, 104, 107, 
  108, 123, 124, 125, 126 ]

##
gap> selfCentralizingClassesSplit:= function( t, mustsplit )
>      local centralizers, orders, i;

>      centralizers:= SizesCentralizers( t );
>      orders:= OrdersClassRepresentatives( t );
>      for i in [ 1 .. Length( centralizers ) ] do
>        if centralizers[i] = orders[i] and not i in mustsplit then
>          Print( "#I  class ", i, " splits (self-centralizing)\n" );
>          AddSet( mustsplit, i );
>        fi;
>      od;
>    end;;
gap> selfCentralizingClassesSplit( t, mustsplit );
#I  class 109 splits (self-centralizing)
#I  class 110 splits (self-centralizing)
#I  class 120 splits (self-centralizing)
#I  class 122 splits (self-centralizing)

##
gap> oddRootsOfSplittingClassesSplit:= function( t, mustsplit )
>      local powmaps, found, p, map, i;

>      powmaps:= ComputedPowerMaps( t );
>      repeat
>        found:= false;
>        for p in [ 1 .. Length( powmaps ) ] do
>          if p mod 2 = 1 and IsBound( powmaps[p] ) then
>            map:= powmaps[p];
>            for i in [ 1 .. Length( map ) ] do
>              if map[i] in mustsplit and not i in mustsplit then
>                Print( "#I  class ", i, " splits (",
>                       Ordinal( p ), " root of ", map[i], ")\n" );
>                found:= true;
>                AddSet( mustsplit, i );
>              fi;
>            od;
>          fi;
>        od;
>      until found = false;
>    end;;

##
gap> notSplittingClassesOfSubgroupDoNotSplit:= function( 2sfuss, sfust,
>                                                  mustnotsplit )
>      local new, i;

>      new:= sfust{ PositionsProperty( InverseMap( 2sfuss ), IsInt ) };
>      for i in Set( new ) do
>        if not i in mustnotsplit then
>          Print( "#I  class ", i, " does not split (as in subgroup)\n" );
>        fi;
>      od;
>      UniteSet( mustnotsplit, new );
>    end;;

##
gap> splittingClassesWithOddCentralizerIndexSplit:= function( s, t,
>        sfust, 2sfuss, mustsplit )
>      local inv, scents, tcents, i;

>      inv:= InverseMap( 2sfuss );
>      scents:= SizesCentralizers( s );
>      tcents:= SizesCentralizers( t );
>      for i in [ 1 .. Length( sfust ) ] do
>        if IsList( inv[i] ) and
>           IsOddInt( tcents[ sfust[i] ] / scents[i] ) then
>          if not sfust[i] in mustsplit then
>            Print( "#I  class ", sfust[i],
>                   " splits (odd centralizer index)\n" );
>            AddSet( mustsplit, sfust[i] );
>          fi;
>        fi;
>      od;
>      oddRootsOfSplittingClassesSplit( t, mustsplit );
>    end;;

##
gap> contributionData:= function( s, t, inv, chiprime, mustsplit )
>      local contrib, zeroonlyifnonsplit, safepart, n, tcents,
>            sclasses, i, j, val, choices, signs, cand;

>      contrib:= [];
>      zeroonlyifnonsplit:= [];
>      safepart:= 0;
>      n:= 1;
>      tcents:= SizesCentralizers( t );
>      sclasses:= SizesConjugacyClasses( s );
>      for i in [ 1 .. Length( inv ) ] do
>        if IsBound( inv[i] ) then
>          # The subgroup contains elements in the 'i'-th class.
>          if IsInt( inv[i] ) then
>            # Only one class of the subgroup fuses into the 'i'-th class.
>            j:= inv[i];
>            val:= sclasses[j] * chiprime[j];
>            val:= tcents[i] / Size(s)^2 * val * GaloisCyc( val, -1 );
>            if not IsInt( val ) then
>              if i in mustsplit then
>                # The summand is known, add it to 'safepart'.
>                safepart:= safepart + val;
>              else
>                # The class may or may not split.
>                # If it splits then 'val' is the contribution to the norm.
>                contrib[i]:= [ 0, val ];
>                zeroonlyifnonsplit[i]:= true;
>                n:= n * 2;
>              fi;
>            fi;
>          else
>            # Several classes of the subgroup fuse into the 'i'-th class.
>            choices:= List( inv[i], j -> sclasses[j] * chiprime[j] );
>            signs:= Tuples( [ 1, -1 ], Length( choices ) );
>            cand:= signs * choices;
>            cand:= tcents[i] / Size(s)^2 *
>                     Set( List( cand, x -> x * GaloisCyc( x, -1 ) ) );
>            if not ForAll( cand, IsInt ) then
>              if Length( cand ) = 1 then
>                if i in mustsplit then
>                  # We get a contribution to 'safepart'.
>                  safepart:= safepart + cand[1];
>                else
>                  UniteSet( cand, [ 0 ] );
>                  contrib[i]:= cand;
>                  zeroonlyifnonsplit[i]:= true;
>                  n:= n * Length( cand );
>                fi;
>              else
>                if not i in mustsplit then
>                  if not 0 in cand then
>                    UniteSet( cand, [ 0 ] );
>                    zeroonlyifnonsplit[i]:= true;
>                  fi;
>                fi;
>                contrib[i]:= cand;
>                n:= n * Length( cand );
>              fi;
>            fi;
>          fi;
>        fi;
>      od;

>      return rec( safepart:= safepart,
>                  contrib:= contrib,
>                  size:= n,
>                  bound:= Filtered( [ 1 .. Length( contrib ) ],
>                                    x -> IsBound( contrib[x] ) ),
>                  zeroonlyifnonsplit:= zeroonlyifnonsplit,
>                );
>    end;;

##
gap> integralContributions:= function( r )
>      local positions, len, images, number, index, direction, initial,
>            norm, solutions, i;

>      # Initialize the counter and the list of solutions.
>      positions:= r.bound;
>      len:= Length( positions );
>      images:= r.contrib{ positions };
>      number:= List( images, Length );
>      index:= ListWithIdenticalEntries( len, 1 );
>      direction:= ShallowCopy( index );  # 1 means up, -1 means down
>      initial:= List( images, l -> l[1] );
>      norm:= r.safepart + Sum( initial );
>      solutions:= [];
>      if IsInt( norm ) then
>        solutions[1]:= initial;
>      fi;

>      while true do
>        # Increase the counter. (Change only one position in each step.)
>        i:= 1;
>        while i <= len and
>              ( ( index[i] = number[i] and direction[i] = 1 ) or
>                ( index[i] = 1 and direction[i] = -1 ) ) do
>          direction[i]:= - direction[i];
>          i:= i+1;
>        od;

>        if len < i then
>          # We are done.
>          return solutions;
>        fi;

>        # Update at position 'i'.
>        norm:= norm - images[i][ index[i] ];
>        index[i]:= index[i] + direction[i];
>        norm:= norm + images[i][ index[i] ];

>        if IsInt( norm ) then
>          # We have found a solution.
>          Add( solutions,
>               List( [ 1 .. len ], i -> images[i][ index[i] ] ) );
>        fi;
>      od;
>    end;;

##
gap> evaluateContributions:= function( r, res, sfust,
>                                      mustsplit, mustnotsplit )
>      local param, i, c;

>      param:= Parametrized( res );
>      for i in [ 1 .. Length( r.bound ) ] do
>        c:= r.bound[i];
>        if param[i] = 0 then
>          # If contribution zero cannot arise as a sum of values
>          # then the class cannot split.
>          if IsBound( r.zeroonlyifnonsplit[c] ) and
>             r.zeroonlyifnonsplit[c] = true and
>             not c in mustnotsplit then
>            Print( "#I  class ", c,
>                   " does not split (contribution criterion)\n" );
>            if c in mustsplit then
>              Error( "contradiction for class ", c );
>            fi;
>            AddSet( mustnotsplit, c );
>          fi;
>        elif IsRat( param[i] ) then
>          if not c in mustsplit then
>            Print( "#I  class ", c, " splits (contribution criterion)\n" );
>            if c in mustnotsplit then
>              Error( "contradiction for class ", c );
>            fi;
>            AddSet( mustsplit, c );
>          fi;
>        elif IsList( param[i] ) and not 0 in param[i] then
>          # If no zero occurs then the class must split.
>          if not c in mustsplit then
>            Print( "#I  class ", c, " splits (contribution criterion)\n" );
>            if c in mustnotsplit then
>              Error( "contradiction for class ", c );
>            fi;
>            AddSet( mustsplit, c );
>          fi;
>        fi;
>      od;
>    end;;

##
gap> computeContributions:= function( s, t, sfust, classfuns, bound,
>                                     mustsplit, mustnotsplit )
>      local inv, i, known, candidates, r, res;

>      inv:= InverseMap( sfust );

>      repeat
>        for i in mustnotsplit do
>          # The induced character is zero at the preimage of 'i',
>          # there is no contribution to the norm.
>          Unbind( inv[i] );
>        od;
>        known:= [ ShallowCopy( mustsplit ), ShallowCopy( mustnotsplit ) ];
>        candidates:= List( classfuns,
>            chi -> contributionData( s, t, inv, chi, mustsplit ) );
>        candidates:= Filtered( candidates, r -> r.size < bound );
>        SortParallel( List( candidates, r -> r.size ), candidates );
>        for r in candidates do
>          res:= integralContributions( r );
>          if Length( res ) = 0 then
>            Error( "no solution" );
>          fi;
>          evaluateContributions( r, res, sfust, mustsplit, mustnotsplit );
>          oddRootsOfSplittingClassesSplit( t, mustsplit );
>        od;
>      until known = [ mustsplit, mustnotsplit ];
>    end;;

##
gap> s:= CharacterTable( "F4(2)" );;
gap> fus:= PossibleClassFusions( s, t );;
gap> rep:= RepresentativesFusions( s, fus, Group( () ) );;
gap> Length( rep );
3
gap> oneorbit:= orbsalpha[1];
[ 11, 12, 13 ]
gap> List( rep, map -> Intersection( map, oneorbit ) );
[ [ 11 ], [ 12 ], [ 13 ] ]

##
gap> m3:= s;;  m3fust:= rep[1];;
gap> m4:= s;;  m4fust:= rep[2];;
gap> m5:= s;;  m5fust:= rep[3];;

##
gap> 2m3:= CharacterTable( "Cyclic", 2 ) * m3;;
gap> 2m4:= CharacterTable( "2.F4(2)" );;
gap> 2m5:= 2m4;;

##
gap> splittingClassesWithOddCentralizerIndexSplit( m3, t, m3fust,
>        GetFusionMap( 2m3, m3 ), mustsplit );
#I  class 73 splits (odd centralizer index)
#I  class 85 splits (odd centralizer index)
#I  class 101 splits (odd centralizer index)
#I  class 106 splits (odd centralizer index)
gap> splittingClassesWithOddCentralizerIndexSplit( m4, t, m4fust,
>        GetFusionMap( 2m4, m4 ), mustsplit );
gap> splittingClassesWithOddCentralizerIndexSplit( m5, t, m5fust,
>        GetFusionMap( 2m5, m5 ), mustsplit );
gap> mustnotsplit:= [];;
gap> notSplittingClassesOfSubgroupDoNotSplit( GetFusionMap( 2m4, m4 ),
>        m4fust, mustnotsplit );
#I  class 9 does not split (as in subgroup)
#I  class 12 does not split (as in subgroup)
#I  class 14 does not split (as in subgroup)
#I  class 17 does not split (as in subgroup)
#I  class 20 does not split (as in subgroup)
#I  class 21 does not split (as in subgroup)
#I  class 22 does not split (as in subgroup)
#I  class 44 does not split (as in subgroup)
#I  class 47 does not split (as in subgroup)
#I  class 49 does not split (as in subgroup)
#I  class 58 does not split (as in subgroup)
#I  class 68 does not split (as in subgroup)
#I  class 72 does not split (as in subgroup)
#I  class 79 does not split (as in subgroup)
#I  class 81 does not split (as in subgroup)
#I  class 82 does not split (as in subgroup)
#I  class 92 does not split (as in subgroup)
gap> notSplittingClassesOfSubgroupDoNotSplit( GetFusionMap( 2m5, m5 ),
>        m5fust, mustnotsplit );
#I  class 13 does not split (as in subgroup)
#I  class 18 does not split (as in subgroup)
#I  class 45 does not split (as in subgroup)
#I  class 48 does not split (as in subgroup)
#I  class 69 does not split (as in subgroup)
#I  class 80 does not split (as in subgroup)
#I  class 93 does not split (as in subgroup)

##
gap> computeContributions( m3, t, m3fust, Irr( m3 ), 10^7,
>        mustsplit, mustnotsplit );
#I  class 2 splits (contribution criterion)
#I  class 24 splits (3rd root of 2)
#I  class 25 splits (3rd root of 2)
#I  class 27 splits (3rd root of 2)
#I  class 99 splits (3rd root of 27)
#I  class 100 splits (3rd root of 27)
#I  class 53 splits (5th root of 2)
#I  class 8 splits (contribution criterion)
#I  class 63 splits (3rd root of 8)
#I  class 105 splits (5th root of 8)
#I  class 15 splits (contribution criterion)
#I  class 70 splits (3rd root of 15)
#I  class 4 does not split (contribution criterion)
#I  class 16 splits (contribution criterion)
#I  class 78 splits (3rd root of 16)
#I  class 59 splits (contribution criterion)
#I  class 30 splits (contribution criterion)
#I  class 102 splits (3rd root of 30)
#I  class 3 splits (contribution criterion)
#I  class 84 splits (contribution criterion)
#I  class 26 splits (3rd root of 3)
#I  class 28 splits (3rd root of 3)
#I  class 54 splits (5th root of 3)
#I  class 121 splits (5th root of 28)
#I  class 32 splits (contribution criterion)
#I  class 11 splits (contribution criterion)
#I  class 67 splits (contribution criterion)
#I  class 75 splits (contribution criterion)
#I  class 117 splits (contribution criterion)
#I  class 64 splits (3rd root of 11)
#I  class 71 does not split (contribution criterion)
gap> proj:= Filtered( Irr( 2m4 ), x -> x[1] <> x[2] );;
gap> projmap:= ProjectionMap( GetFusionMap( 2m4, m4 ) );;
gap> proj:= List( proj, x -> x{ projmap } );;
gap> computeContributions( m4, t, m4fust, proj, 10^7,
>        mustsplit, mustnotsplit );
#I  class 118 does not split (contribution criterion)
#I  class 31 splits (contribution criterion)
#I  class 29 does not split (contribution criterion)
gap> computeContributions( m5, t, m5fust, proj, 10^7,
>        mustsplit, mustnotsplit );
#I  class 119 does not split (contribution criterion)
gap> mustsplit;
[ 1, 2, 3, 5, 6, 7, 8, 11, 15, 16, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 
  34, 51, 52, 53, 54, 55, 56, 59, 63, 64, 67, 70, 73, 75, 78, 83, 84, 85, 86, 
  87, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 117, 
  120, 121, 122, 123, 124, 125, 126 ]
gap> mustnotsplit;
[ 4, 9, 12, 13, 14, 17, 18, 20, 21, 22, 29, 44, 45, 47, 48, 49, 58, 68, 69, 
  71, 72, 79, 80, 81, 82, 92, 93, 118, 119 ]

##
gap> invol:= Positions( orders, 2 );
[ 2, 3, 4 ]
gap> Difference( invol, m3fust );
[  ]

##
gap> open:= Difference( m3fust, Union( mustsplit, mustnotsplit ) );
[ 19, 35, 36, 39, 43, 46, 50, 91, 94, 111, 112, 114 ]

##
gap> orders{ open };
[ 4, 8, 8, 8, 8, 8, 8, 16, 16, 24, 24, 24 ]
gap> PowerMap( t, 3 ){ [ 111, 112, 114 ] };
[ 35, 36, 39 ]
gap> poss:= Filtered( Combinations( open ),
>               x -> ( not 35 in x or 111 in x ) and
>                    ( not 36 in x or 112 in x ) and
>                    ( not 39 in x or 114 in x ) );;
gap> Length( poss );
1728

##
gap> tableHead:= function( t, tosplit, invmustlift, invmaylift )
>      local tcents, orders, splcentralizers, spl, splorders, mustlift,
>            maylift, i, pow, ord;

>      tcents:= SizesCentralizers( t );
>      orders:= OrdersClassRepresentatives( t );
>      splcentralizers:= [];
>      spl:= [];
>      splorders:= [];
>      mustlift:= ShallowCopy( invmustlift );
>      maylift:= ShallowCopy( invmaylift );

>      if invmaylift <> [] or invmustlift <> [] then
>        for i in [ 2 .. NrConjugacyClasses( t ) ] do
>          if orders[i] mod 2 = 0 then
>            pow:= PowerMap( t, orders[i] / 2 )[i];
>            if pow in invmustlift then
>              Add( mustlift, i );
>            elif pow in invmaylift then
>              Add( maylift, i );
>            fi;
>          fi;
>        od;
>      fi;

>      for i in [ 1 .. NrConjugacyClasses( t ) ] do
>        ord:= orders[i];
>        if i in tosplit then
>          Append( spl, [ i, i ] );
>          Append( splcentralizers, tcents[i] * [ 2, 2 ] );
>          if orders[i] mod 2 = 1 then
>            Append( splorders, [ ord, 2 * ord ] );
>          elif i in mustlift then
>            Append( splorders, [ 2 * ord, 2 * ord ] );
>          elif i in maylift then
>            Append( splorders, [ [ ord, 2 * ord ], [ ord, 2 * ord ] ] );
>          else
>            Append( splorders, [ ord, ord ] );
>          fi;
>        else
>          Add( spl, i );
>          Add( splcentralizers, tcents[i] );
>          if i in mustlift then
>            Add( splorders, 2 * ord );
>          elif i in maylift then
>            Add( splorders, [ ord, 2 * ord ] );
>          else
>            Add( splorders, ord );
>          fi;
>        fi;
>      od;

>      return ConvertToCharacterTableNC( rec(
>                 UnderlyingCharacteristic:= 0,
>                 OrdersClassRepresentatives:= splorders,
>                 SizesCentralizers:= splcentralizers,
>                 Size:= splcentralizers[1],
>                 ComputedClassFusions:= [ rec( name:= Identifier( t ),
>                     map:= spl ) ],
>               ) );
>  end;;

##
gap> initialFusion:= function( 2s, 2t, 2sfuss, 2tfust, sfust, defined )
>      local fus, comp, pre, imgs;

>      # Use element orders and centralizer orders.
>      fus:= InitFusion( 2s, 2t );

>      # Use the commutative diagram.
>      comp:= CompositionMaps( InverseMap( 2tfust ),
>                              CompositionMaps( sfust, 2sfuss ) );
>      if MeetMaps( fus, comp ) <> true then
>        return fail;
>      fi;

>      # Define classes that are not yet defined.
>      defined:= ShallowCopy( defined );
>      for pre in InverseMap( 2sfuss ) do
>        if IsList( pre ) then
>          imgs:= fus{ pre };
>          if imgs[1] = imgs[2] and IsList( imgs[1] ) then
>            if Intersection( defined, 2tfust{ imgs[1] } ) = [] then
>              # The classes in preimage and image split, and we may choose.
>              fus[ pre[1] ]:= imgs[1][1];
>              fus[ pre[2] ]:= imgs[1][2];
>              UniteSet( defined, 2tfust{ imgs[1] } );
>            fi;
>          fi;
>        elif IsList( fus[ pre ] ) then
>          # The class splits in the image but not in the preimage,
>          # we should have noticed this earlier.
>          return fail;
>        fi;
>      od;

>      return fus;
>    end;;

##
gap> useInducedClassFunction:= function( 2s, 2t, chi, 2sfuss, 2sfus2t )
>      local localfus, unknown, i, swaps, inv, pair, poss, choices, choice,
>            map, ind, para, new;

>      # Remove indet. in places where the character is zero.
>      localfus:= ShallowCopy( 2sfus2t );
>      unknown:= [];
>      for i in [ 1 .. Length( 2sfus2t ) ] do
>        if IsList( 2sfus2t[i] ) then
>          if chi[i] = 0 then
>            localfus[i]:= localfus[i][1];
>          else
>            Add( unknown, i );
>          fi;
>        fi;
>      od;

>      # Collect the possible swaps.
>      swaps:= [];
>      inv:= InverseMap( 2sfuss );
>      for i in [ 1 .. Length( localfus ) ] do
>        if IsList( localfus[i] ) then
>          pair:= inv[ 2sfuss[i] ];
>          Add( swaps, ( pair[1], pair[2] ) );
>          localfus{ pair }:= localfus[i];
>        fi;
>      od;

>      # Try all possibilities (hopefully not too many).
>      poss:= [];
>      if IsEmpty( swaps ) then
>        choices:= [ [] ];
>      else
>        choices:= IteratorOfCombinations( swaps );
>      fi;
>      for choice in choices do
>        map:= Permuted( localfus, Product( choice, () ) );
>        ind:= InducedClassFunctionsByFusionMap( 2s, 2t, [ chi ], map )[1];
>        if IsInt( ScalarProduct( 2t, ind, ind ) ) then
>          Add( poss, map );
>        fi;
>      od;

>      if poss = [] then
>        return false;
>      fi;

>      para:= Parametrized( poss );
>      new:= Filtered( unknown, i -> IsInt( para[i] ) );
>      if new <> [] then
>        2sfus2t{ new }:= para{ new };
>      fi;

>      return true;
>    end;;

##
gap> good:= [];;
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2m3, m3 ) );;
gap> testcharsm3:= Filtered( Irr( 2m3 ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;
gap> runOneTest:= function( s, 2s, t, 2t, sfust, testchars, defined )
>      local fus, pos, l, chi;
>      fus:= initialFusion( 2s, 2t, GetFusionMap( 2s, s ),
>                           GetFusionMap( 2t, t ), sfust, defined );
>      # Process the irreducible characters,
>      # ordered by increasing indeterminateness.
>      pos:= PositionsProperty( fus, IsList );
>      testchars:= ShallowCopy( testchars );
>      l:= - List( testchars, x -> Number( pos, i -> x[i] = 0 ) );
>      SortParallel( l, testchars );
>      for chi in testchars do
>        if useInducedClassFunction( 2s, 2t, chi, GetFusionMap( 2s, s ),
>                                    fus ) = false then
>          # This splitting is not possible.
>          return fail;
>        fi;
>      od;
>      return fus;
>    end;;
gap> defined:= [];;
gap> for choice in poss do
>      2t:= tableHead( t, Union( mustsplit, choice ), [], [] );
>      fus:= runOneTest( m3, 2m3, t, 2t, m3fust, testcharsm3, defined );
>      if fus <> fail then
>        Add( good, choice );
>      fi;
>    od;
gap> Length( good );
1

##
gap> choice:= good[1];
[ 19, 36, 39, 43, 46, 50, 91, 94, 111, 112, 114 ]
gap> UniteSet( mustsplit, choice );
gap> oddRootsOfSplittingClassesSplit( t, mustsplit );
#I  class 74 splits (3rd root of 19)
#I  class 76 splits (3rd root of 19)
#I  class 77 splits (3rd root of 19)
gap> UniteSet( mustnotsplit, Difference( open, choice ) );
gap> Difference( [ 1 .. Length( orders ) ],
>                Union( mustsplit, mustnotsplit ) );
[ 10, 37, 38, 40, 41, 42, 57, 60, 61, 62, 65, 66, 88, 89, 90, 95, 96, 113, 
  115, 116 ]
gap> 2t:= tableHead( t, mustsplit, [], [] );;
gap> NrConjugacyClasses( 2t );
202
gap> 2m3fus2t:= runOneTest( m3, 2m3, t, 2t, m3fust, testcharsm3, defined );
[ 1, 3, 5, 5, 7, 8, 10, 12, 16, 18, 14, 18, 23, 23, 22, 25, 26, 31, 23, 29, 
  31, 32, 33, 34, 36, 44, 40, 38, 42, 47, 40, 44, 46, 49, 51, 55, 53, 71, 71, 
  57, 62, 58, 63, 67, 71, 68, 75, 76, 80, 78, 82, 84, 84, 99, 92, 91, 103, 
  107, 111, 107, 111, 99, 97, 109, 111, 110, 121, 115, 125, 126, 127, 131, 
  129, 135, 133, 144, 145, 140, 140, 148, 150, 156, 158, 166, 166, 170, 168, 
  181, 176, 182, 178, 189, 185, 193, 191, 2, 4, 6, 6, 7, 9, 11, 13, 16, 19, 
  15, 19, 24, 24, 22, 26, 25, 31, 24, 30, 31, 32, 33, 35, 37, 45, 41, 39, 43, 
  48, 41, 45, 46, 50, 52, 56, 54, 72, 72, 57, 63, 59, 62, 68, 72, 67, 75, 77, 
  81, 79, 83, 85, 85, 100, 93, 91, 104, 108, 112, 108, 112, 100, 98, 109, 
  112, 110, 122, 116, 125, 126, 128, 132, 130, 136, 134, 145, 144, 141, 141, 
  149, 151, 157, 159, 167, 167, 171, 169, 182, 177, 181, 179, 190, 186, 194, 
  192 ]
gap> defined:= Set( m3fust );;

##
gap> ind2m3:= InducedClassFunctionsByFusionMap( 2m3, 2t, testcharsm3,
>                 2m3fus2t );;

##
gap> s:= CharacterTable( "Fi22" );;
gap> fus:= PossibleClassFusions( s, t );;
gap> rep:= RepresentativesFusions( s, fus, Group( () ) );;
gap> Length( rep );
3
gap> List( rep, map -> Intersection( map, oneorbit ) );
[ [ 11 ], [ 12 ], [ 13 ] ]

##
gap> m7:= s;;  m7fust:= rep[1];;
gap> m8:= s;;  m8fust:= rep[2];;
gap> m9:= s;;  m9fust:= rep[3];;

##
gap> open:= Difference( m7fust, Union( mustsplit, mustnotsplit ) );
[  ]
gap> 2s:= CharacterTable( "2.Fi22" );;
gap> initialFusion( 2s, 2t, GetFusionMap( 2s, m7 ),
>        GetFusionMap( 2t, t ), m7fust, defined );
fail

##
gap> 2m7:= CharacterTable( "Cyclic", 2 ) * m7;;

##
gap> parametersFABR:= rec( maxlen:= 10, minamb:= 1, maxamb:= 10^6,
>        quick:= false, contained:= ContainedPossibleCharacters );;

##
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2m7, m7 ) );;
gap> testcharsm7:= Filtered( Irr( 2m7 ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;
gap> fus:= initialFusion( 2m7, 2t, GetFusionMap( 2m7, m7 ),
>              GetFusionMap( 2t, t ), m7fust, defined );;
gap> possfus:= FusionsAllowedByRestrictions( 2m7, 2t, testcharsm7,
>                  ind2m3, fus, parametersFABR );
[ [ 1, 4, 5, 7, 8, 12, 10, 12, 18, 24, 26, 29, 31, 34, 37, 43, 47, 40, 39, 
      46, 52, 49, 44, 50, 51, 55, 63, 62, 68, 75, 78, 80, 80, 83, 84, 86, 88, 
      103, 99, 99, 108, 117, 119, 113, 122, 109, 112, 115, 127, 127, 132, 
      135, 140, 140, 152, 154, 157, 158, 167, 170, 172, 174, 181, 182, 194, 
      2, 3, 6, 7, 9, 13, 11, 13, 19, 23, 25, 30, 31, 35, 36, 42, 48, 41, 38, 
      46, 51, 50, 45, 49, 52, 56, 62, 63, 67, 75, 79, 81, 81, 82, 85, 87, 89, 
      104, 100, 100, 107, 118, 120, 114, 121, 109, 111, 116, 128, 128, 131, 
      136, 141, 141, 153, 155, 156, 159, 166, 171, 173, 175, 182, 181, 193 ], 
  [ 1, 4, 5, 7, 8, 12, 10, 12, 18, 24, 26, 29, 31, 34, 37, 43, 47, 40, 39, 
      46, 52, 49, 44, 50, 51, 55, 62, 63, 68, 75, 78, 80, 80, 83, 84, 86, 88, 
      103, 99, 99, 108, 117, 119, 113, 122, 109, 112, 115, 127, 127, 132, 
      135, 140, 140, 152, 154, 157, 158, 167, 170, 172, 174, 182, 181, 194, 
      2, 3, 6, 7, 9, 13, 11, 13, 19, 23, 25, 30, 31, 35, 36, 42, 48, 41, 38, 
      46, 51, 50, 45, 49, 52, 56, 63, 62, 67, 75, 79, 81, 81, 82, 85, 87, 89, 
      104, 100, 100, 107, 118, 120, 114, 121, 109, 111, 116, 128, 128, 131, 
      136, 141, 141, 153, 155, 156, 159, 166, 171, 173, 175, 181, 182, 193 ] ]
gap> poss2m7fus2t:= possfus;;
gap> UniteSet( defined, Set( m7fust ) );
gap> possind2m7:= List( poss2m7fus2t,
>        map -> Set( InducedClassFunctionsByFusionMap( 2m7, 2t,
>                        testcharsm7, map ) ) );;
gap> List( possind2m7, Length );
[ 63, 63 ]
gap> Length( Intersection( possind2m7 ) );
39

##
gap> 2s:= 2m7;
CharacterTable( "C2xFi22" )
gap> open:= Difference( m8fust, Union( mustsplit, mustnotsplit ) );
[ 40, 65, 115 ]
gap> good:= [];;
gap> for choice in Combinations( open ) do
>      2t:= tableHead( t, Union( mustsplit, choice ), [], [] );
>      fus:= initialFusion( 2s, 2t, GetFusionMap( 2s, m8 ),
>                GetFusionMap( 2t, t ), m8fust, defined );;
>      if FusionsAllowedByRestrictions( 2s, 2t, testcharsm7, ind2m3, fus,
>             parametersFABR ) <> [] then
>        Add( good, choice );
>      fi;
>    od;
gap> good;
[  ]

##
gap> 2m8:= CharacterTable( "2.Fi22" );;

##
gap> notSplittingClassesOfSubgroupDoNotSplit( GetFusionMap( 2m8, m8 ),
> m8fust, mustnotsplit );
#I  class 40 does not split (as in subgroup)
#I  class 65 does not split (as in subgroup)
#I  class 115 does not split (as in subgroup)
gap> 2t:= tableHead( t, mustsplit, [], [] );;

##
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2m8, m8 ) );;
gap> testcharsm8:= Filtered( Irr( 2m8 ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;
gap> fus:= initialFusion( 2m8, 2t, GetFusionMap( 2m8, m8 ),
>        GetFusionMap( 2t, t ), m8fust, defined );;
gap> ind:= Concatenation( ind2m3, Intersection( possind2m7 ) );;
gap> possfus:= FusionsAllowedByRestrictions( 2m8, 2t, testcharsm8, ind,
>        fus, parametersFABR );
[ [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 10, 11, 12, 13, 20, 23, 24, 27, 29, 
      30, 31, 34, 35, 36, 37, 42, 43, 47, 48, 40, 41, 38, 39, 46, 51, 52, 49, 
      50, 44, 45, 49, 50, 51, 52, 55, 56, 64, 64, 69, 75, 75, 78, 79, 80, 81, 
      80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 105, 101, 101, 101, 107, 108, 
      116, 115, 120, 119, 113, 114, 123, 109, 111, 112, 117, 118, 127, 128, 
      127, 128, 131, 132, 135, 136, 142, 142, 153, 152, 155, 154, 156, 157, 
      158, 159, 166, 167, 170, 171, 173, 172, 175, 174, 183, 183, 193, 194 ] ]
gap> 2m8fus2t:= possfus[1];;
gap> UniteSet( defined, m8fust );
gap> ind2m8:= InducedClassFunctionsByFusionMap( 2m8, 2t, testcharsm8,
>                 2m8fus2t );;

##
gap> Filtered( orbsbeta, l -> Intersection( l, [ 40, 65, 115 ] ) <> [] );
[ [ 40, 41 ], [ 65, 66 ], [ 115, 116 ] ]
gap> UniteSet( mustnotsplit, [ 41, 66, 116 ] );
gap> open:= Difference( m9fust, Union( mustsplit, mustnotsplit ) );
[  ]
gap> 2m9:= 2m8;;
gap> testcharsm9:= testcharsm8;;
gap> fus:= initialFusion( 2m9, 2t, GetFusionMap( 2m9, m9 ),
>        GetFusionMap( 2t, t ), m9fust, defined );;
gap> ind:= Concatenation( ind2m3, Intersection( possind2m7 ), ind2m8 );;
gap> possfus:= FusionsAllowedByRestrictions( 2m9, 2t, testcharsm9, ind,
>        fus, parametersFABR );
[ [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 10, 11, 12, 13, 21, 23, 24, 28, 29, 
      30, 31, 34, 35, 36, 37, 42, 43, 47, 48, 40, 41, 38, 39, 46, 51, 52, 49, 
      50, 44, 45, 49, 50, 51, 52, 55, 56, 65, 65, 70, 75, 75, 78, 79, 80, 81, 
      80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 106, 102, 102, 102, 107, 108, 
      116, 115, 118, 117, 113, 114, 124, 109, 111, 112, 119, 120, 127, 128, 
      127, 128, 131, 132, 135, 136, 143, 143, 153, 152, 155, 154, 156, 157, 
      158, 159, 166, 167, 170, 171, 173, 172, 175, 174, 184, 184, 193, 194 ] ]
gap> 2m9fus2t:= possfus[1];;
gap> UniteSet( defined, m9fust );
gap> ind2m9:= InducedClassFunctionsByFusionMap( 2m9, 2t, testcharsm9,
>                 2m9fus2t );;

##
gap> open:= Difference( m4fust, Union( mustsplit, mustnotsplit ) );
[ 95 ]
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2m4, m4 ) );;
gap> testcharsm4:= Filtered( Irr( 2m4 ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;
gap> good:= [];;
gap> for choice in Combinations( open ) do
>      2t:= tableHead( t, Union( mustsplit, choice ), [], [] );
>      fus:= runOneTest( m4, 2m4, t, 2t, m4fust, testcharsm4, [] );
>      if fus <> fail then
>        Add( good, [ choice, 2t ] );
>      fi;
>    od;
gap> List( good, l -> l[1] );
[ [  ] ]
gap> UniteSet( mustnotsplit, open );
gap> 2t:= good[1][2];;
gap> 2tfust:= GetFusionMap( 2t, t );;
gap> fus:= initialFusion( 2m4, 2t, GetFusionMap( 2m4, m4 ),
>                         2tfust, m4fust, defined );;
gap> ind:= Concatenation( ind2m3, Intersection( possind2m7 ), ind2m8,
>                         ind2m9 );;
gap> possfus:= FusionsAllowedByRestrictions( 2m4, 2t, testcharsm4, ind,
>        fus, parametersFABR );
[ [ 1, 2, 3, 4, 6, 5, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 16, 20, 14, 15, 20, 
      20, 24, 23, 24, 23, 22, 27, 27, 27, 31, 31, 23, 24, 29, 30, 31, 32, 33, 
      34, 35, 36, 37, 45, 44, 41, 40, 38, 39, 42, 43, 48, 47, 40, 41, 44, 45, 
      46, 46, 50, 49, 52, 51, 55, 56, 53, 54, 73, 73, 73, 57, 57, 64, 64, 58, 
      59, 64, 64, 69, 73, 69, 75, 76, 77, 80, 81, 78, 79, 82, 83, 85, 84, 84, 
      85, 101, 101, 92, 93, 91, 105, 108, 107, 112, 111, 108, 107, 112, 111, 
      101, 101, 97, 98, 109, 109, 111, 112, 110, 123, 117, 118, 125, 126, 
      127, 128, 131, 132, 130, 129, 135, 136, 133, 134, 146, 146, 146, 146, 
      142, 142, 148, 149, 150, 151, 156, 157, 159, 158, 167, 166, 167, 166, 
      170, 171, 168, 169, 183, 183, 177, 176, 183, 183, 178, 179, 189, 190, 
      187, 187, 194, 193, 192, 191 ] ]
gap> 2m4fus2t:= possfus[1];;
gap> UniteSet( defined, Set( m4fust ) );
gap> ind2m4:= InducedClassFunctionsByFusionMap( 2m4, 2t, testcharsm4,
>                 2m4fus2t );;

##
gap> open:= Difference( m5fust, Union( mustsplit, mustnotsplit ) );
[ 96 ]
gap> UniteSet( mustnotsplit, open );

##
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2m5, m5 ) );;
gap> testcharsm5:= Filtered( Irr( 2m5 ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;
gap> fus:= initialFusion( 2m5, 2t, GetFusionMap( 2m5, m5 ),
>              GetFusionMap( 2t, t ), m5fust, defined );;
gap> ind:= Concatenation( ind2m3, Intersection( possind2m7 ), ind2m8,
>              ind2m9, ind2m4 );;
gap> possfus:= FusionsAllowedByRestrictions( 2m5, 2t, testcharsm5,
>                  ind, fus, parametersFABR );
[ [ 1, 2, 3, 4, 6, 5, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 16, 21, 14, 15, 21, 
      21, 24, 23, 24, 23, 22, 28, 28, 28, 31, 31, 23, 24, 29, 30, 31, 32, 33, 
      34, 35, 36, 37, 45, 44, 41, 40, 38, 39, 42, 43, 48, 47, 40, 41, 44, 45, 
      46, 46, 50, 49, 52, 51, 55, 56, 53, 54, 74, 74, 74, 57, 57, 65, 65, 58, 
      59, 65, 65, 70, 74, 70, 75, 76, 77, 80, 81, 78, 79, 82, 83, 85, 84, 84, 
      85, 102, 102, 92, 93, 91, 106, 108, 107, 112, 111, 108, 107, 112, 111, 
      102, 102, 97, 98, 109, 109, 111, 112, 110, 124, 119, 120, 125, 126, 
      127, 128, 131, 132, 130, 129, 135, 136, 133, 134, 147, 147, 147, 147, 
      143, 143, 148, 149, 150, 151, 156, 157, 159, 158, 167, 166, 167, 166, 
      170, 171, 168, 169, 184, 184, 177, 176, 184, 184, 178, 179, 189, 190, 
      188, 188, 194, 193, 192, 191 ] ]
gap> 2m5fus2t:= possfus[1];;
gap> UniteSet( defined, Set( m5fust ) );
gap> ind2m5:= InducedClassFunctionsByFusionMap( 2m5, 2t, testcharsm5,
>                 2m5fus2t );;

##
gap> s:= CharacterTable( "U6(2)" );;
gap> InitFusion( CharacterTable( "C6" ) * s, 2t );
fail

##
gap> 2s:= CharacterTable( "2.U6(2)" );;
gap> 2u12:= CharacterTable( "C3" ) * 2s;;
gap> orders2u12:= OrdersClassRepresentatives( 2u12 );;
gap> inv:= First( ClassPositionsOfCentre( 2u12 ), 
>                 i -> orders2u12[i] = 2 );;
gap> ker:= [ 1, inv ];;
gap> u12:= 2u12 / ker;;
gap> testcharsu12:= Filtered( Irr( 2u12 ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;

##
gap> fus:= PossibleClassFusions( u12, t );;
gap> rep:= RepresentativesFusions( u12, fus, Group( () ) );;
gap> Length( rep );
2
gap> possu12fust:= rep;;

##
gap> List( possu12fust, map -> Difference( map,
>                         Union( mustsplit, mustnotsplit ) ) );
[ [ 10, 37, 57, 60, 61, 62, 113 ], [ 10, 37, 57, 60, 61, 62, 113 ] ]
gap> possnotsplit:= List( [ 1, 2 ], i -> ShallowCopy( mustnotsplit ) );;
gap> for i in [ 1, 2 ] do
>      notSplittingClassesOfSubgroupDoNotSplit(
>          GetFusionMap( 2u12, u12 ), rep[i], possnotsplit[i] );
>    od;
#I  class 10 does not split (as in subgroup)
#I  class 37 does not split (as in subgroup)
#I  class 57 does not split (as in subgroup)
#I  class 60 does not split (as in subgroup)
#I  class 61 does not split (as in subgroup)
#I  class 62 does not split (as in subgroup)
#I  class 113 does not split (as in subgroup)
#I  class 10 does not split (as in subgroup)
#I  class 37 does not split (as in subgroup)
#I  class 57 does not split (as in subgroup)
#I  class 60 does not split (as in subgroup)
#I  class 61 does not split (as in subgroup)
#I  class 62 does not split (as in subgroup)
#I  class 113 does not split (as in subgroup)
gap> Set( possnotsplit );
[ [ 4, 9, 10, 12, 13, 14, 17, 18, 20, 21, 22, 29, 35, 37, 40, 41, 44, 45, 47, 
      48, 49, 57, 58, 60, 61, 62, 65, 66, 68, 69, 71, 72, 79, 80, 81, 82, 92, 
      93, 95, 96, 113, 115, 116, 118, 119 ] ]
gap> mustnotsplit:= possnotsplit[1];;

##
gap> s:= CharacterTable( "O10-(2)" );;
gap> fus:= PossibleClassFusions( s, t );;
gap> rep:= RepresentativesFusions( s, fus, Group( () ) );;
gap> Length( rep );
2
gap> m10:= s;;  possm10fust:= rep;;

##
gap> 2m10:= CharacterTable( "Cyclic", 2 ) * m10;;

##
gap> List( possm10fust, map -> Difference( map,
>                         Union( mustsplit, mustnotsplit ) ) );
[ [ 42 ], [ 42 ] ]
gap> possnotsplit:= List( [ 1, 2 ], i -> ShallowCopy( mustnotsplit ) );;
gap> for i in [ 1, 2 ] do
>      computeContributions( m10, t, possm10fust[i], Irr( m10 ), 10^7,
>          ShallowCopy( mustsplit ), possnotsplit[i] );
>    od;
#I  class 42 does not split (contribution criterion)
#I  class 42 does not split (contribution criterion)
gap> Set( possnotsplit );
[ [ 4, 9, 10, 12, 13, 14, 17, 18, 20, 21, 22, 29, 35, 37, 40, 41, 42, 44, 45, 
      47, 48, 49, 57, 58, 60, 61, 62, 65, 66, 68, 69, 71, 72, 79, 80, 81, 82, 
      92, 93, 95, 96, 113, 115, 116, 118, 119 ] ]
gap> mustnotsplit:= possnotsplit[1];;

##
gap> fus:= List( rep, map -> initialFusion( 2m10, 2t,
>                 GetFusionMap( 2m10, m10 ), GetFusionMap( 2t, t ),
>                 map, defined ) );;
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2m10, m10 ) );;
gap> testcharsm10:= Filtered( Irr( 2m10 ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;
gap> ind:= Concatenation( ind2m3, ind2m4, ind2m5,
>              Intersection( possind2m7 ), ind2m8, ind2m9 );;
gap> possfus:= List( fus, map -> FusionsAllowedByRestrictions( 2m10, 2t,
>                  testcharsm10, ind, map, parametersFABR ) );
[ [ [ 1, 3, 5, 5, 7, 10, 8, 8, 8, 10, 12, 16, 14, 17, 23, 22, 23, 31, 29, 33, 
          34, 34, 38, 36, 36, 36, 44, 44, 44, 40, 40, 36, 49, 42, 42, 38, 40, 
          42, 47, 40, 44, 47, 47, 46, 51, 53, 58, 57, 60, 66, 75, 76, 78, 78, 
          78, 78, 82, 84, 84, 86, 88, 92, 90, 90, 97, 94, 94, 90, 111, 111, 
          111, 92, 91, 94, 107, 107, 113, 107, 95, 96, 111, 110, 109, 129, 
          133, 133, 133, 135, 133, 135, 135, 148, 150, 153, 155, 153, 155, 
          158, 164, 166, 168, 178, 176, 180, 180, 191, 191, 191, 193, 195, 
          197, 197, 195, 199, 201, 2, 4, 6, 6, 7, 11, 9, 9, 9, 11, 13, 16, 
          15, 17, 24, 22, 24, 31, 30, 33, 35, 35, 39, 37, 37, 37, 45, 45, 45, 
          41, 41, 37, 50, 43, 43, 39, 41, 43, 48, 41, 45, 48, 48, 46, 52, 54, 
          59, 57, 60, 66, 75, 77, 79, 79, 79, 79, 83, 85, 85, 87, 89, 93, 90, 
          90, 98, 94, 94, 90, 112, 112, 112, 93, 91, 94, 108, 108, 114, 108, 
          95, 96, 112, 110, 109, 130, 134, 134, 134, 136, 134, 136, 136, 149, 
          151, 152, 154, 152, 154, 159, 165, 167, 169, 179, 177, 180, 180, 
          192, 192, 192, 194, 196, 198, 198, 196, 200, 202 ] ], 
  [ [ 1, 3, 5, 5, 7, 10, 8, 8, 8, 10, 12, 16, 14, 17, 23, 22, 23, 31, 29, 33, 
          34, 34, 38, 36, 36, 36, 44, 44, 44, 40, 40, 36, 49, 42, 42, 38, 40, 
          42, 47, 40, 44, 47, 47, 46, 51, 53, 58, 57, 60, 66, 75, 76, 78, 78, 
          78, 78, 82, 84, 84, 86, 88, 92, 90, 90, 97, 94, 94, 90, 111, 111, 
          111, 92, 91, 94, 107, 107, 113, 107, 95, 96, 111, 110, 109, 129, 
          133, 133, 133, 135, 133, 135, 135, 148, 150, 155, 153, 155, 153, 
          158, 164, 166, 168, 178, 176, 180, 180, 191, 191, 191, 193, 195, 
          197, 197, 195, 199, 201, 2, 4, 6, 6, 7, 11, 9, 9, 9, 11, 13, 16, 
          15, 17, 24, 22, 24, 31, 30, 33, 35, 35, 39, 37, 37, 37, 45, 45, 45, 
          41, 41, 37, 50, 43, 43, 39, 41, 43, 48, 41, 45, 48, 48, 46, 52, 54, 
--> --------------------

--> maximum size reached

--> --------------------

[ Verzeichnis aufwärts0.79unsichere Verbindung  ]