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

Quelle  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( [ 12 ],
>            i -> Symmetrizations( d, [ dec[i].irreducibles[1] ], 2 ) );;
gap> good:= Filtered( [ 12 ],
>             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 ], [ 12 ], [ 1 .. 41 ] ]
gap> SizesConjugacyClasses( d ){ nsg[2] };
131 ]
gap> OrdersClassRepresentatives( d ){ nsg[2] };
12 ]

##
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{ [ 21 ] };
>        fi;
>      fi;
>    od;
>    end;;

##
gap> pos:= Positions( OrdersClassRepresentatives( d ), 15 );
2224 ]
gap> f:= Field( List( Irr( d ), x -> x[ pos[1] ] ) );
NF(15,[ 1248 ])
gap> Sqrt( -15 ) in f;
true
gap> pos:= Positions( orders, 15 );
2526 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( -15 ) );
gap> pos:= Positions( OrdersClassRepresentatives( d ), 30 );
2325 ]
gap> f:= Field( List( Irr( d ), x -> x[ pos[1] ] ) );
NF(15,[ 1248 ])
gap> pos:= Positions( orders, 30 );
4041 ]
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 );
4748 ]
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 );
444546 ]
gap> parrottnames{ pos };
[ "r1f1", "s1f1", "(s1f1)^-1" ]
gap> setGaloisInfo( powermaps, [ 4546 ], orders, primes, Sqrt( -3 ) );
gap> indcyc:= InducedCyclic( th, [ 45 ], "all" );;    
gap> ForAll( indcyc, x -> IsInt( ScalarProduct( th, x, x ) ) );
true
gap> setGaloisInfo( powermaps, [ 4546 ], orders, primes, Sqrt( -1 ) );
gap> indcyc:= InducedCyclic( th, [ 45 ], "all" );;
gap> ForAll( indcyc, x -> IsInt( ScalarProduct( th, x, x ) ) );
false
gap> setGaloisInfo( powermaps, [ 4546 ], orders, primes, Sqrt( -3 ) );

##
gap> List( [ "wc1", "(wc1)^-1" ], x -> Position( parrottnames, x ) );
3435 ]
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, [ 3435 ], 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, [ 3435 ], orders, primes, good[1] );

##
gap> parrottnames{ [ 19203233 ] };
[ "r1c2", "(r1c2)^-1", "us1c2", "(us1c2)^-1" ]
gap> fus:= InitFusion( d, th );;
gap> pos:= Positions( OrdersClassRepresentatives( d ), 12 );
121516 ]
gap> fus{ pos };
[ [ 19202122 ], [ 1920 ], [ 1920 ] ]
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, [ 1920 ], orders, primes, Sqrt( -3 ) );
gap> setGaloisInfo( powermaps, [ 3233 ], orders, primes, Sqrt( -3 ) );

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

##
gap> fus:= InitFusion( d, th );
1226, [ 67 ], [ 67 ], 13, [ 1314 ], [ 1314 ], 59
  [ 19202122 ], 310, [ 1920 ], [ 1920 ], [ 910 ], 
  [ 32333435 ], [ 32333435 ], 818, [ 2526 ], [ 4041 ], 
  [ 2526 ], [ 4041 ], 12242439311224243931, [ 4243 ], 
  [ 4243 ], [ 4243 ], [ 4243 ], [ 4243 ], [ 4243 ] ]
gap> Positions( OrdersClassRepresentatives( d ), 31 );
363738394041 ]
gap> fus[36];
4243 ]
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( () ) );
[ [ 12267613141359223101920103332818
      254026411224243931122424393142434242
      4343 ], 
  [ 12267713141459223101920103332818
      254026411224243931122424393142434242
      4343 ] ]

##
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( [ 2345 ],
>              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 );
848 ]

##
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,  216 ],
>     [ 3411,  2 ],
>     [ 3511,  3 ],
>     ];;

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

##
gap> pos:= Union( Positions( orders, 6 ), Positions( orders, 12 ) );
91011212223 ]
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, [ 24212 ] );
gap> Add( powinfo, [ 25213 ] );
gap> Add( powinfo, [ 26212 ] );
gap> Add( powinfo, [ 27213 ] );
gap> Add( powinfo, [ 39226 ] );
gap> Add( powinfo, [ 40227 ] );
gap> Add( powinfo, [ 55232 ] );
gap> Add( powinfo, [ 56233 ] );
gap> Add( powinfo, [ 55325 ] );
gap> Add( powinfo, [ 56324 ] );
gap> Add( powinfo, [ 32313 ] );
gap> Add( powinfo, [ 33312 ] );

##
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 );
1213 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );
gap> setGaloisInfo( powermaps, [ 2425 ], orders, primes, x );
gap> setGaloisInfo( powermaps, [ 2627 ], orders, primes, x );
gap> pos:= Positions( orders, 21 );
3233 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );
gap> pos:= Positions( orders, 28 );
3940 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );
gap> pos:= Positions( orders, 35 );
4849 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );
gap> pos:= Positions( orders, 42 );
5556 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, x );

##
gap> powermaps[5]{ [ 4849 ] }:= [ 1312 ];;

##
gap> pos:= Positions( orders, 33 );
4647 ]
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 );
6162 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( 33 ) );
gap> powermaps[2]{ pos }:= [ 4647 ];;

##
gap> pos:= Positions( orders, 20 );
3031 ]
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 );
6061 ]
gap> flds:= List( pos, i -> Field( List( Irr( u ), x -> x[i] ) ) );
[ NF(5,[ 14 ]), NF(5,[ 14 ]) ]
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 );
5354 ]
gap> setGaloisInfo( powermaps, pos, orders, primes, Sqrt( 5 ) );
gap> powermaps[2]{ pos }:= [ 3130 ];;

##
gap> x:= EC( 31 );;
gap> classes:= [ 43 .. 45 ];;
gap> vals:= List( [ 1525 ], 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( [ 124 ], 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( [ 1636 ], 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 );
212223353738 ]
gap> orders{ pos };
121212222424 ]

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

##
gap> powermaps[2]{ [ 212223 ] }:= [ [ 910 ], [ 910 ], 11 ];;

##
gap> powermaps[2]{ [ 3738 ] }:= [ 2222 ];;

##
gap> poss:= [];;
gap> for cand in [ [ 99 ], [ 910 ], [ 109 ] ] do
>   powermaps[2]{ [ 2122 ] }:= cand;
>   fus:= InitFusion( u, j4 );
>   TestConsistencyMaps( ComputedPowerMaps( u ), fus, powermaps );
>   indcyc:= InducedCyclic( j4, [ 2122 ], "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;
000 ]
gap> powermaps[2]{ [ 2122 ] }:= [ 1010 ];;

##
gap> pos:= Positions( orders, 24 );
3738 ]
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, [ 23 ], 2, [ 23 ], [ 23 ], [ 23 ], [ 23 ], 445, [ 56 ], 
  [ 56 ], 7, [ 56 ], [ 567 ], [ 567 ], [ 567 ], [ 567 ], 
  [ 567 ], [ 567 ], [ 567 ], [ 567 ], 89, [ 91011 ], 
  [ 91011 ], [ 91011 ], [ 91011 ], [ 91011 ], [ 91011 ], 
  [ 91011 ], [ 1213 ], [ 1213 ], 1516, [ 141516 ], 
  [ 141516 ], [ 141516 ], [ 141516 ], 17, [ 1718 ], [ 1718 ], 
  [ 1718 ], [ 1920 ], [ 2122 ], [ 2122 ], [ 212223 ], 
  [ 212223 ], [ 212223 ], [ 212223 ], [ 212223 ], 
  [ 212223 ], [ 2627 ], [ 2627 ], [ 24252627 ], 
  [ 24252627 ], 282829, [ 3031 ], [ 3031 ], [ 3233 ], 
  [ 3233 ], [ 3435 ], 3636, [ 3738 ], [ 3738 ], [ 3940 ], 
  [ 3940 ], 4242 ]
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), 
  ( 56)(15,16)(21,22)(30,31)(42,43)(49,50)(51,52) ] )
gap> fus{ [ 606167686970 ] };
[ [ 3031 ], [ 3031 ], [ 3738 ], [ 3738 ], [ 3940 ], [ 3940 ] ]
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;
2222222222222222222222222
  2222222 ]
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 ) );
222222223 ]
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 );
[ [ 111213 ], [ 161718 ], [ 394041 ], [ 434445 ], 
  [ 464748 ], [ 646566 ], [ 676869 ], [ 757677 ], 
  [ 787980 ], [ 888990 ], [ 919293 ], [ 949596 ], 
  [ 114115116 ], [ 117118119 ] ]

##
gap> tfust2:= PossibleClassFusions( t, t2 );;
gap> poss:= Set( List( tfust2, l -> Filtered( InverseMap( l ), IsList ) ) );
[ [ [ 1112 ], [ 1617 ], [ 3940 ], [ 4344 ], [ 4647 ], [ 5556 ], 
      [ 6162 ], [ 6465 ], [ 6768 ], [ 7576 ], [ 7879 ], [ 8889 ], 
      [ 9192 ], [ 9495 ], [ 99100 ], [ 103104 ], [ 109110 ], 
      [ 114115 ], [ 117118 ], [ 123124 ], [ 125126 ] ], 
  [ [ 1113 ], [ 1618 ], [ 3941 ], [ 4345 ], [ 4648 ], [ 5556 ], 
      [ 6162 ], [ 6466 ], [ 6769 ], [ 7577 ], [ 7880 ], [ 8890 ], 
      [ 9193 ], [ 9496 ], [ 99100 ], [ 103104 ], [ 109110 ], 
      [ 114116 ], [ 117119 ], [ 123124 ], [ 125126 ] ], 
  [ [ 1213 ], [ 1718 ], [ 4041 ], [ 4445 ], [ 4748 ], [ 5556 ], 
      [ 6162 ], [ 6566 ], [ 6869 ], [ 7677 ], [ 7980 ], [ 8990 ], 
      [ 9293 ], [ 9596 ], [ 99100 ], [ 103104 ], [ 109110 ], 
      [ 115116 ], [ 118119 ], [ 123124 ], [ 125126 ] ] ]
gap> orbsbeta:= poss[3];;

##
gap> orders:= OrdersClassRepresentatives( t );;
gap> mustsplit:= PositionsProperty( orders, IsOddInt );
1567233334515255568386879798103104107
  108123124125126 ]

##
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];
111213 ]
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;
123567811151623242526272830313233
  34515253545556596364677073757883848586
  87979899100101102103104105106107108109110117
  120121122123124125126 ]
gap> mustnotsplit;
491213141718202122294445474849586869
  7172798081829293118119 ]

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

##
gap> open:= Difference( m3fust, Union( mustsplit, mustnotsplit ) );
193536394346509194111112114 ]

##
gap> orders{ open };
48888881616242424 ]
gap> PowerMap( t, 3 ){ [ 111112114 ] };
353639 ]
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] * [ 22 ] );
>          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];
1936394346509194111112114 ]
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 ) );
1037384041425760616265668889909596113
  115116 ]
gap> 2t:= tableHead( t, mustsplit, [], [] );;
gap> NrConjugacyClasses( 2t );
202
gap> 2m3fus2t:= runOneTest( m3, 2m3, t, 2t, m3fust, testcharsm3, defined );
1355781012161814182323222526312329
  31323334364440384247404446495155537171
  5762586367716875768078828484999291103
  1071111071119997109111110121115125126127131
  129135133144145140140148150156158166166170168
  18117618217818918519319124667911131619
  15192424222625312430313233353745413943
  48414546505256547272576359626872677577
  8179838585100939110410811210811210098109
  112110122116125126128132130136134145144141141
  149151157159167167171169182177181179190186194
  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 );
[ [ 145781210121824262931343743474039
      465249445051556362687578808083848688
      1039999108117119113122109112115127127132
      135140140152154157158167170172174181182194
      236791311131923253031353642484138
      465150454952566263677579818182858789
      104100100107118120114121109111116128128131
      136141141153155156159166171173175182181193 ], 
  [ 145781210121824262931343743474039
      465249445051556263687578808083848688
      1039999108117119113122109112115127127132
      135140140152154157158167170172174182181194
      236791311131923253031353642484138
      465150454952566362677579818182858789
      104100100107118120114121109111116128128131
      136141141153155156159166171173175181182193 ] ]
gap> poss2m7fus2t:= possfus;;
gap> UniteSet( defined, Set( m7fust ) );
gap> possind2m7:= List( poss2m7fus2t,
>        map -> Set( InducedClassFunctionsByFusionMap( 2m7, 2t,
>                        testcharsm7, map ) ) );;
gap> List( possind2m7, Length );
6363 ]
gap> Length( Intersection( possind2m7 ) );
39

##
gap> 2s:= 2m7;
CharacterTable( "C2xFi22" )
gap> open:= Difference( m8fust, Union( mustsplit, mustnotsplit ) );
4065115 ]
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 );
[ [ 1234567891213101112132023242729
      303134353637424347484041383946515249
      504445495051525556646469757578798081
      80818283848586878889105101101101107108
      116115120119113114123109111112117118127128
      127128131132135136142142153152155154156157
      158159166167170171173172175174183183193194 ] ]
gap> 2m8fus2t:= possfus[1];;
gap> UniteSet( defined, m8fust );
gap> ind2m8:= InducedClassFunctionsByFusionMap( 2m8, 2t, testcharsm8,
>                 2m8fus2t );;

##
gap> Filtered( orbsbeta, l -> Intersection( l, [ 4065115 ] ) <> [] );
[ [ 4041 ], [ 6566 ], [ 115116 ] ]
gap> UniteSet( mustnotsplit, [ 4166116 ] );
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 );
[ [ 1234567891213101112132123242829
      303134353637424347484041383946515249
      504445495051525556656570757578798081
      80818283848586878889106102102102107108
      116115118117113114124109111112119120127128
      127128131132135136143143153152155154156157
      158159166167170171173172175174184184193194 ] ]
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 );
[ [ 123465567789101112131620141520
      202423242322272727313123242930313233
      343536374544414038394243484740414445
      464650495251555653547373735757646458
      596464697369757677808178798283858484
      85101101929391105108107112111108107112111
      1011019798109109111112110123117118125126
      127128131132130129135136133134146146146146
      142142148149150151156157159158167166167166
      170171168169183183177176183183178179189190
      187187194193192191 ] ]
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 );
[ [ 123465567789101112131621141521
      212423242322282828313123242930313233
      343536374544414038394243484740414445
      464650495251555653547474745757656558
      596565707470757677808178798283858484
      85102102929391106108107112111108107112111
      1021029798109109111112110124119120125126
      127128131132130129135136133134147147147147
      143143148149150151156157159158167166167166
      170171168169184184177176184184178179189190
      188188194193192191 ] ]
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 ) ) );
[ [ 103757606162113 ], [ 103757606162113 ] ]
gap> possnotsplit:= List( [ 12 ], i -> ShallowCopy( mustnotsplit ) );;
gap> for i in [ 12 ] 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 );
[ [ 491012131417182021222935374041444547
      484957586061626566686971727980818292
      939596113115116118119 ] ]
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( [ 12 ], i -> ShallowCopy( mustnotsplit ) );;
gap> for i in [ 12 ] 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 );
[ [ 491012131417182021222935374041424445
      474849575860616265666869717279808182
      92939596113115116118119 ] ]
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 ) );
[ [ [ 13557108881012161417232223312933
          3434383636364444444040364942423840
          4247404447474651535857606675767878
          7878828484868892909097949490111111
          1119291941071071131079596111110109129
          133133133135133135135148150153155153155
          158164166168178176180180191191191193195
          1971971951992012466711999111316
          1517242224313033353539373737454545
          4141375043433941434841454848465254
          5957606675777979797983858587899390
          9098949490112112112939194108108114108
          9596112110109130134134134136134136136149
          151152154152154159165167169179177180180
          192192192194196198198196200202 ] ], 
  [ [ 13557108881012161417232223312933
          3434383636364444444040364942423840
          4247404447474651535857606675767878
          7878828484868892909097949490111111
          1119291941071071131079596111110109129
          133133133135133135135148150155153155153
          158164166168178176180180191191191193195
          1971971951992012466711999111316
          1517242224313033353539373737454545
          4141375043433941434841454848465254
          5957606675777979797983858587899390
          9098949490112112112939194108108114108
          9596112110109130134134134136134136136149
          151154152154152159165167169179177180180
          192192192194196198198196200202 ] ] ]
gap> List( possfus, Length );
11 ]
gap> poss2m10fus2t:= Concatenation( possfus );;
gap> Set( possm10fust[1] ) = Set( possm10fust[2] );
true
gap> UniteSet( defined, possm10fust[1] );

##
gap> possind2m10:= List( poss2m10fus2t,
>        map -> Set( InducedClassFunctionsByFusionMap( 2m10, 2t,
>                        testcharsm10, map ) ) );;
gap> possind2m10[1] = possind2m10[2];
true
gap> ind2m10:= possind2m10[1];;

##
gap> fus:= List( possu12fust, map -> initialFusion( 2u12, 2t,
>                 GetFusionMap( 2u12, u12 ), GetFusionMap( 2t, t ),
>                 map, defined ) );;
gap> ind:= Concatenation( ind2m3, ind2m4, ind2m5,
>              Intersection( possind2m7 ), ind2m8, ind2m9, ind2m10 );;
gap> possfus:= List( fus, map -> FusionsAllowedByRestrictions( 2u12, 2t,
>                  testcharsu12, ind, map, parametersFABR ) );
[ [ [ 1234567891213101116171819202123
          2431343542434243363747484041383944
          4549505556606263646578797879808182
          8386878889919190909596103104105106
          107108135136153152155154893637404146
          1011891213909499100101102107108109
          1351363637363738394041444542434748
          5152170171180181182183184787978798081
          19319419519619719890909293949499100101
          1021111121331341531521551548936374041
          461011891213909499100101102107108109
          1351363637363738394041444542434748
          5152170171180181182183184787978798081
          19319419519619719890909293949499100101
          102111112133134153152155154 ] ], 
  [ [ 1234567891213101116171819202123
          2431343542434243363747484041383944
          4549505556606263646578797879808182
          8386878889919190909596103104105106
          107108135136155154153152893637404146
          1011891213909499100101102107108109
          1351363637363738394041444542434748
          5152170171180181182183184787978798081
          19319419519619719890909293949499100101
          1021111121331341551541531528936374041
          461011891213909499100101102107108109
          1351363637363738394041444542434748
          5152170171180181182183184787978798081
          19319419519619719890909293949499100101
          102111112133134155154153152 ] ] ]
gap> List( possfus, Length );
11 ]
gap> poss2u12fus2t:= Concatenation( possfus );;
gap> Set( possu12fust[1] ) = Set( possu12fust[2] );
true
gap> UniteSet( defined, possu12fust[1] );

##
gap> possind2u12:= List( poss2u12fus2t,
>        map -> Set( InducedClassFunctionsByFusionMap( 2u12, 2t,
>                        testcharsu12, map ) ) );;
gap> possind2u12[1] = possind2u12[2];
true
gap> ind2u12:= possind2u12[1];;

##
gap> posssplit:= Difference( [ 1 .. Length( orders ) ],
>                            Union( mustsplit, mustnotsplit ) );
38888990 ]
gap> NrConjugacyClasses( t );
126
gap> NrConjugacyClasses( 2t );
202

##
gap> ForAll( ind2u12,
>        chi -> ForAll( possind2m7[1],
>                   psi -> IsInt( ScalarProduct( 2t, chi, psi ) ) ) );
false

##
gap> 2m7fus2t:= poss2m7fus2t[2];;
gap> ind2m7:= possind2m7[2];;

##
gap> nothit:= Difference( [ 1 .. Length( orders ) ],
>                 Flat( [ m3fust, m4fust, m5fust, m7fust, m8fust, m9fust,
>                         possm10fust, possu12fust ] ) );
38888990103104 ]
gap> orders{ nothit };
81616161919 ]

##
gap> for p in [ 2 .. Maximum( OrdersClassRepresentatives( 2t ) ) ] do
>      if IsPrimeInt( p ) then
>        PowerMap( t, p );
>        pow:= InitPowerMap( 2t, p );
>        comp:= CompositionMaps( InverseMap( GetFusionMap( 2t, t ) ),
>                   CompositionMaps( PowerMap( t, p ),
>                      GetFusionMap( 2t, t ) ) );
>        MeetMaps( pow, comp );
>        ComputedPowerMaps( 2t )[p]:= pow;
>      fi;
>    od;

##
gap> pos:= Positions( OrdersClassRepresentatives( 2t ), 38 );
161163 ]
gap> indcyc:= Filtered( InducedCyclic( 2t, pos, "all" ),
>                       chi -> chi[1] = - chi[2] );;

##
gap> pow:= ComputedPowerMaps( 2t )[5];;
gap> comp:= CompositionMaps( CompositionMaps( 2m3fus2t, PowerMap( 2m3, 5 ) ),
>                            InverseMap( 2m3fus2t ) );;
gap> MeetMaps( pow, comp );
true
gap> comp:= CompositionMaps( CompositionMaps( 2m7fus2t, PowerMap( 2m7, 5 ) ),
>                            InverseMap( 2m7fus2t ) );;
gap> MeetMaps( pow, comp );
true
gap> fus:= Parametrized( poss2m10fus2t );;
gap> comp:= CompositionMaps( CompositionMaps( fus, PowerMap( 2m10, 5 ) ),
>                            InverseMap( fus ) );;
gap> MeetMaps( pow, comp );
true
gap> ForAll( pow, IsInt );
true
gap> Intersection( PowerMap( t, 5 ), posssplit ) = posssplit;
true
gap> ForAll( posssplit, i -> Positions( PowerMap( t, 5 ), i ) = [ i ] );
true
gap> ind:= Concatenation(
>              [ ind2m3, ind2m4, ind2m5, ind2m7, ind2m8, ind2m9 ] );;
gap> minus:= List( ind, chi -> MinusCharacter( chi, pow, 5 ) );;
gap> ind:= Concatenation(
>              [ ind2m3, ind2m4, ind2m5, minus, ind2m7, ind2m8, ind2m9,
>                ind2u12, ind2m10, indcyc ] );;

##
gap> lll:= LLL( 2t, ind );;
gap> Length( lll.irreducibles );
2
gap> irr:= Set( lll.irreducibles );;
gap> red:= Reduced( 2t, irr, lll.remainders );;
gap> lll:= LLL( 2t, red.remainders );;
gap> Length( lll.irreducibles );
2
gap> UniteSet( irr, lll.irreducibles );
gap> red:= Reduced( 2t, irr, lll.remainders );;
gap> lll:= LLL( 2t, red.remainders );;
gap> Sum( lll.norms );
772
gap> lll:= LLL( 2t, lll.remainders, "sort" );;
gap> Sum( lll.norms );
729
gap> Length( lll.irreducibles );
0
gap> red:= Reduced( 2t, irr, lll.remainders );;
gap> lll:= LLL( 2t, red.remainders );;
gap> Sum( lll.norms );
710

##
gap> Length( lll.norms );
72
gap> gram:= MatScalarProducts( 2t, lll.remainders, lll.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, 72 + 4 );;
gap> Length( emb.solutions );
1
gap> Length( emb.solutions[1] );
72

##
gap> dec:= Decreased( 2t, lll.remainders,
>                     emb.vectors{ emb.solutions[1] } );;
gap> Length( dec.irreducibles );
72
gap> UniteSet( irr, dec.irreducibles );
gap> factchars:= RestrictedClassFunctions( Irr( t ), 2t );;
gap> irr:= Concatenation( factchars, irr );;
gap> DimensionsMat( irr );
202202 ]

##
gap> Size( 2t ) = Sum( List( irr, chi -> chi[1]^2 ) );
true
gap> SetIrr( 2t, List( irr, x -> Character( 2t, x ) ) );

##
gap> for p in [ 2 .. Maximum( OrdersClassRepresentatives( 2t ) ) ] do
>      if IsPrimeInt( p ) then
>        poss:= PossiblePowerMaps( 2t, p,
>                   rec( powermap:= ComputedPowerMaps( 2t )[p] ) );
>        if Length( poss ) <> 1 then
>          Error( "problem with ", Ordinal( p ), " power map" );
>        fi;
>        ComputedPowerMaps( 2t )[p]:= poss[1];
>      fi;
>    od;
gap> lib:= CharacterTable( "2.2E6(2)" );;
gap> tr:= TransformingPermutationsCharacterTables( lib, 2t );;
gap> IsRecord( tr );
true

##
gap> tr.columns;
(25,26)(62,63)(67,68)(121,122)(144,145)(152,153)(154,155)(172,173)(174,
175)(181,182)

##
gap> t:= CharacterTable( "2E6(2)" );;
gap> t2:= CharacterTable( "2E6(2).2" );;
gap> 2t:= CharacterTable( "2.2E6(2)" );;
gap> tfust2:= GetFusionMap( t, t2 );;
gap> 2tfust:= GetFusionMap( 2t, t );;
gap> orbsbeta:= Filtered( InverseMap( tfust2 ), IsList );
[ [ 1213 ], [ 1718 ], [ 4041 ], [ 4445 ], [ 4748 ], [ 5556 ], 
  [ 6162 ], [ 6566 ], [ 6869 ], [ 7677 ], [ 7980 ], [ 8990 ], 
  [ 9293 ], [ 9596 ], [ 99100 ], [ 103104 ], [ 109110 ], 
  [ 115116 ], [ 118119 ], [ 123124 ], [ 125126 ] ]
gap> beta:= Product( List( orbsbeta, x -> ( x[1], x[2] ) ) );
(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> aut:= AutomorphismsOfTable( 2t );;
gap> Size( aut );
256
gap> filt:= Filtered( Elements( aut ),
>               x -> OnTuples( 2tfust, beta ) = Permuted( 2tfust, x ) );;
gap> Length( filt );
1
gap> betalift:= filt[1];;

##
gap> 2tfus2t2:= [];;
gap> max:= 0;;
gap> for i in [ 1 .. NrConjugacyClasses( 2t ) ] do
>      img:= i^betalift;
>      if img = i then
>        # no fusion
>        max:= max + 1;
>        2tfus2t2[i]:= max;
>      elif i < img then
>        # fusion of two classes
>        max:= max + 1;
>        2tfus2t2[i]:= max;
>        2tfus2t2[ img ]:= max;
>      fi;
>    od;
gap> max;
174

##
gap> n:= NrConjugacyClasses( 2t );
202
gap> f:= NrMovedPoints( betalift ) / 2;
28
gap> 2 * n - 3 * f;  n - f;  n - 2 * f;
320
174
146

##
gap> NrConjugacyClasses( t2 ) - Maximum( tfust2 );
84
gap> 320 - NrConjugacyClasses( t2 );
131

##
gap> inv:= InverseMap( 2tfust );;
gap> nonsplit:= PositionsProperty( inv, IsInt);;
gap> mustnotsplit:= Set( tfust2{ nonsplit } );
491012131618192027333536383941434451
  52545558606263697071777880829698100 ]
gap> split:= PositionsProperty( inv, IsList );;
gap> mustsplit:= Set( tfust2{ split } );
123567811141517212223242526282930
  31323437404245464748495053565759616465
  66676872737475767981838485868788899091
  929394959799101102103104105 ]
gap> selfCentralizingClassesSplit( t2, mustsplit );
#I  class 172 splits (self-centralizing)
#I  class 180 splits (self-centralizing)
#I  class 181 splits (self-centralizing)
#I  class 182 splits (self-centralizing)
#I  class 183 splits (self-centralizing)
#I  class 184 splits (self-centralizing)
#I  class 185 splits (self-centralizing)
#I  class 188 splits (self-centralizing)
#I  class 189 splits (self-centralizing)

##
gap> c2:= CharacterTable( "C2" );;
gap> s:= CharacterTable( "F4(2)" );;
gap> s2:= c2 * s;;
gap> 2s:= s * c2;;
gap> 2s2:= s2 * c2;;
gap> sfuss2:= GetFusionMap( s, s2 );;
gap> 2sfuss:= GetFusionMap( 2s, s );;
gap> 2s2fuss2:= GetFusionMap( 2s2, s2 );;

##
gap> 2s2alt:= c2 * 2s;;
gap> Irr( 2s2alt ) = Irr( 2s2 );
true
gap> ComputedPowerMaps( 2s2alt ) = ComputedPowerMaps( 2s2 );
true
gap> 2sfus2s2:= GetFusionMap( 2s, 2s2alt );;

##
gap> CompositionMaps( sfuss2, 2sfuss )
>        = CompositionMaps( 2s2fuss2, 2sfus2s2 );
true

##
gap> sfust:= PossibleClassFusions( s, t );;
gap> rep:= RepresentativesFusions( AutomorphismsOfTable( s ),
>              sfust, Group( () ) );;
gap> Length( rep );
3
gap> comp:= List( rep, map -> CompositionMaps( InverseMap( 2tfust ),
>                                 CompositionMaps( map, 2sfuss ) ) );;
gap> poss:= List( comp, map -> PossibleClassFusions( 2s, 2t,
>                                  rec( fusionmap:= map ) ) );;
gap> List( poss, Length );
100 ]
gap> sfust:= rep[1];;
gap> 2sfus2t:= poss[1][1];;
gap> CompositionMaps( sfust, 2sfuss )
>        = CompositionMaps( 2tfust, 2sfus2t );
true

##
gap> comp:= CompositionMaps( CompositionMaps( tfust2, sfust ),
>                            InverseMap( sfuss2 ) );;
gap> poss:= PossibleClassFusions( s2, t2, rec( fusionmap:= comp ) );;
gap> Length(  poss );
1
gap> s2fust2:= poss[1];;
gap> CompositionMaps( tfust2, sfust )
>        = CompositionMaps( s2fust2, sfuss2 );
true

##
gap> splittingClassesWithOddCentralizerIndexSplit( s2, t2, s2fust2,
>        2s2fuss2, mustsplit );
#I  class 106 splits (odd centralizer index)
#I  class 107 splits (odd centralizer index)
#I  class 114 splits (odd centralizer index)
#I  class 115 splits (odd centralizer index)
#I  class 117 splits (odd centralizer index)
#I  class 133 splits (odd centralizer index)
#I  class 116 splits (odd centralizer index)
#I  class 118 splits (odd centralizer index)
#I  class 119 splits (odd centralizer index)
#I  class 148 splits (odd centralizer index)
#I  class 147 splits (odd centralizer index)
#I  class 156 splits (odd centralizer index)
#I  class 155 splits (odd centralizer index)
#I  class 134 splits (odd centralizer index)
#I  class 140 splits (odd centralizer index)
#I  class 143 splits (odd centralizer index)
#I  class 149 splits (odd centralizer index)
#I  class 176 splits (odd centralizer index)
#I  class 175 splits (odd centralizer index)
#I  class 157 splits (odd centralizer index)
#I  class 174 splits (odd centralizer index)
#I  class 177 splits (odd centralizer index)

##
gap> c3:= CharacterTable( "Cyclic", 3 );;
gap> h:= c3 * CharacterTable( "U6(2)" );;
gap> poss:= PossibleClassFusions( h, t );;
gap> cen:= ClassPositionsOfCentre( h );
14793 ]
gap> Set( List( poss, x -> x{ cen } ) );
[ [ 155 ] ]
gap> SizesCentralizers( t )[5] = Size( h );
true

##
gap> h:= CharacterTable( "U6(2)" );;
gap> pos:= PositionsProperty( SizesCentralizers( t2 ),
>                             x -> x mod Size( h ) = 0 );
125 ]
gap> Difference( pos, tfust2 );
[  ]

##
gap> h:= c3 * CharacterTable( "U6(2).2" );;
gap> possfus:= PossibleClassFusions( h, t2 );;
gap> inv:= Positions( OrdersClassRepresentatives( h ), 2 );
2343839 ]
gap> outerinv:= Difference( inv, ClassPositionsOfDerivedSubgroup( h ) );
3839 ]
gap> imgs:= Set( List( possfus, x -> x{ outerinv } ) );
[ [ 106107 ] ]
gap> List( imgs[1], x -> Positions( s2fust2, x ) );
[ [ 9698 ], [ 9799100 ] ]
gap> h:= CharacterTable( "2.U6(2).2" );
CharacterTable( "2.U6(2).2" )
gap> Positions( OrdersClassRepresentatives( h ), 2 );
23456765666768 ]

##
gap> c3:= CharacterTable( "Cyclic", 3 );;
gap> 2u:= c3 * CharacterTable( "2.U6(2)" );;
gap> 2uorders:= OrdersClassRepresentatives( 2u );;
gap> ker:= First( ClassPositionsOfCentre( 2u ), i -> 2uorders[i] = 2 );
2
gap> u:= 2u / [ 1, ker ];;
gap> 2u2:= c3 * CharacterTable( "2.U6(2).2" );;
gap> 2u2orders:= OrdersClassRepresentatives( 2u2 );;
gap> ker:= First( ClassPositionsOfCentre( 2u2 ), i -> 2u2orders[i] = 2 );
2
gap> u2:= 2u2 / [ 1, ker ];;
gap> 2ufusu:= GetFusionMap( 2u, u );;
gap> 2u2fusu2:= GetFusionMap( 2u2, u2 );;
gap> poss:= PossibleClassFusions( 2u, 2u2 );;
gap> rep:= RepresentativesFusions( 2u, poss, Group( () ) );;
gap> Length( rep );
1
gap> 2ufus2u2:= rep[1];;
gap> ufusu2:= CompositionMaps( 2u2fusu2,
>              CompositionMaps( 2ufus2u2, InverseMap( 2ufusu ) ) );;

##
gap> CompositionMaps( ufusu2, 2ufusu )
>        = CompositionMaps( 2u2fusu2, 2ufus2u2 );
true

##
gap> poss:= PossibleClassFusions( 2u, 2t );;
gap> rep:= RepresentativesFusions( 2u, poss, Group( () ) );;
gap> Length( rep );
2
gap> poss2ufus2t:= rep;;
gap> possufust:= List( rep, map -> CompositionMaps( 2tfust,
>        CompositionMaps( map, InverseMap( 2ufusu ) ) ) );;
gap> Length( Set( possufust ) );
2

##
gap> comp1:= CompositionMaps(
>                CompositionMaps( tfust2, possufust[1] ),
>                    InverseMap( ufusu2 ) );;
gap> poss1:= PossibleClassFusions( u2, t2, rec( fusionmap:= comp1 ) );;
gap> Length( poss1 );
2
gap> comp2:= CompositionMaps(
>                CompositionMaps( tfust2, possufust[2] ),
>                    InverseMap( ufusu2 ) );;
gap> poss2:= PossibleClassFusions( u2, t2, rec( fusionmap:= comp2 ) );;
gap> Length(  poss2 );
2
gap> poss1 = poss2;
true
gap> rep:= RepresentativesFusions( u2, poss1, Group( () ) );;
gap> Length( rep );
1
gap> u2fust2:= rep[1];;

##
gap> splittingClassesWithOddCentralizerIndexSplit( u2, t2, u2fust2,
>        2u2fusu2, mustsplit );
#I  class 135 splits (odd centralizer index)
#I  class 139 splits (odd centralizer index)
#I  class 141 splits (odd centralizer index)
#I  class 161 splits (odd centralizer index)
gap> notSplittingClassesOfSubgroupDoNotSplit( 2u2fusu2, u2fust2,
>        mustnotsplit );
#I  class 120 does not split (as in subgroup)
#I  class 126 does not split (as in subgroup)
#I  class 127 does not split (as in subgroup)
#I  class 150 does not split (as in subgroup)
#I  class 151 does not split (as in subgroup)
#I  class 163 does not split (as in subgroup)
#I  class 164 does not split (as in subgroup)
#I  class 165 does not split (as in subgroup)
#I  class 186 does not split (as in subgroup)
#I  class 187 does not split (as in subgroup)

##
gap> computeContributions2:= function( s2, 2s, t2, 2t, s2fust2, 2sfus2s2,
>                                2sfus2t, tfust2,
>                                characters, bound,
>                                mustsplit, mustnotsplit, proj )
>      local inv, i, known, candidates, r, psi, res;

>      inv:= InverseMap( s2fust2 );

>      repeat
>        for i in Union( mustnotsplit, tfust2 ) do
>          # The induced character is either zero at the preimage of 'i',
>          # and there is no contribution to the norm,
>          # or the preimage of 'i' lies inside the subgroup of index 2.
>          Unbind( inv[i] );
>        od;
>        known:= [ ShallowCopy( mustsplit ), ShallowCopy( mustnotsplit ) ];
>        candidates:= [];
>        for i in [ 1 .. Length( characters ) ] do
>          r:= contributionData( s2, t2, inv, characters[i]{ proj },
>                                mustsplit );
>          if r.size < bound then
>            # Restrict the character to 2.U, and induce it to 2.G.
>            psi:= InducedClassFunctionsByFusionMap( 2s, 2t,
>                      [ characters[i]{ 2sfus2s2 } ], 2sfus2t )[1];
>            r.safepart:= r.safepart + ScalarProduct( 2t, psi, psi ) / 2;
>            Add( candidates, r );
>          fi;
>        od;
>        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, s2fust2, mustsplit, mustnotsplit );
>          oddRootsOfSplittingClassesSplit( t2, mustsplit );
>        od;
>      until known = [ mustsplit, mustnotsplit ];
>    end;;

##
gap> ker:= ClassPositionsOfKernel( 2s2fuss2 );;
gap> testchars:= Filtered( Irr( 2s2 ), x -> x[ ker[1] ] <> x[ ker[2] ]  );;
gap> computeContributions2( s2, 2s, t2, 2t, s2fust2, 2sfus2s2, 2sfus2t,
>        tfust2, testchars, 10^7, mustsplit, mustnotsplit,
>        ProjectionMap( 2s2fuss2 ) );
#I  class 109 splits (contribution criterion)
#I  class 136 splits (contribution criterion)
#I  class 158 splits (5th root of 109)
#I  class 173 splits (7th root of 109)
#I  class 110 splits (contribution criterion)
#I  class 108 splits (contribution criterion)
#I  class 137 splits (contribution criterion)
#I  class 159 splits (contribution criterion)
#I  class 138 splits (3rd root of 108)
#I  class 111 splits (contribution criterion)
#I  class 112 splits (contribution criterion)
#I  class 142 splits (3rd root of 111)
#I  class 144 splits (3rd root of 111)
#I  class 145 splits (3rd root of 112)

##
gap> orders:= OrdersClassRepresentatives( t2 );;
gap> invol:= Positions( orders, 2 );;
gap> Difference( invol, s2fust2 );
[  ]

##
gap> open:= Difference( s2fust2, Union( mustsplit, mustnotsplit ) );
113121122123125128129131132146153154162166 ]

##
gap> PowerMap( t2, 3 ){ [ 146162166 ] };
113123121 ]
gap> poss:= Filtered( Combinations( open ),
>               x -> ( not 113 in x or 146 in x ) and
>                    ( not 123 in x or 162 in x ) and
>                    ( not 121 in x or 166 in x ) );;
gap> Length( poss );
6912

##
gap> initialFusion2:= function( 2s2, 2t2,
>                               2s2fuss2, 2t2fust2, s2fust2,
>                               2sfus2s2, 2tfus2t2, 2sfus2t,
>                               defined )
>      local fus, comp, pre, imgs;

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

>      # Use the commutative diagram on the right of the cube.
>      comp:= CompositionMaps( InverseMap( 2t2fust2 ),
>                 CompositionMaps( s2fust2, 2s2fuss2 ) );
>      if not MeetMaps( fus, comp ) then
>        return fail;
>      fi;

>      # Use the commutative diagram on the bottom of the cube.
>      comp:= CompositionMaps( 2tfus2t2,
>                 CompositionMaps( 2sfus2t, InverseMap( 2sfus2s2 ) ) );

>      if not MeetMaps( fus, comp ) then
>        return fail;
>      fi;

>      # Define classes that are not yet defined.
>      defined:= ShallowCopy( defined );
>      for pre in InverseMap( 2s2fuss2 ) do
>        if IsList( pre ) then
>          imgs:= fus{ pre };
>          if imgs[1] = imgs[2] and IsList( imgs[1] )
>             and Intersection( defined, 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, imgs[1] );
>          fi;
>        elif IsList( fus[ pre ] ) then
>          # The class splits in the image but not in the preimage,
>          # something must be wrong.
>          return fail;
>        fi;
>      od;

>      return fus;
>    end;;

##
gap> good:= [];;
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2s2, s2 ) );;
gap> testcharss:= Filtered( Irr( 2s2 ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;
gap> runOneTest2:= function( s2, 2s2, t2, 2t2, s2fust2,
>                            2sfus2s2, 2tfus2t2, 2sfus2t,
>                            testchars, defined )
>      local fus, pos, l, chi;

>      fus:= initialFusion2( 2s2, 2t2,
>                            GetFusionMap( 2s2, s2 ),
>                            GetFusionMap( 2t2, t2 ),
>                            s2fust2,
>                            2sfus2s2, 2tfus2t2, 2sfus2t,
>                            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( 2s2, 2t2, chi,
>               GetFusionMap( 2s2, s2 ), fus ) = false then
>          # This splitting is not possible.
>          return fail;
>        fi;
>      od;
>      return fus;
>    end;;
gap> defined:= [];;
gap> for choice in poss do
>      2t2:= tableHead( t2, Union( mustsplit, choice ), [], [] );
>      fus:= runOneTest2( s2, 2s2, t2, 2t2, s2fust2,
>                   2sfus2s2, 2tfus2t2, 2sfus2t,
>                testcharss, defined );
>      if fus <> fail then
>        Add( good, choice );
>      fi;
>    od;
gap> Length( good );
1

##
gap> choice:= good[1];
113121122123125131146153154162166 ]
gap> UniteSet( mustsplit, choice );
gap> UniteSet( mustnotsplit, Difference( open, choice ) );
gap> oddRootsOfSplittingClassesSplit( t2, mustsplit );
#I  class 168 splits (3rd root of 122)
#I  class 171 splits (3rd root of 131)

##
gap> 2t2:= tableHead( t2, mustsplit, [], [] );;
gap> 2s2fus2t2:= runOneTest2( s2, 2s2, t2, 2t2, s2fust2,
>                       2sfus2s2, 2tfus2t2, 2sfus2t,
>                       testcharss, defined );;
gap> NrConjugacyClasses( 2t2 );
320
gap> defined:= Set( 2s2fus2t2 );;
gap> inds:= Set( InducedClassFunctionsByFusionMap( 2s2, 2t2, testcharss,
>                                                  2s2fus2t2 ) );;

##
gap> poss2u2fus2t2:= List( poss2ufus2t, map ->
>                              initialFusion2( 2u2, 2t2,
>                                  GetFusionMap( 2u2, u2 ),
>                                  GetFusionMap( 2t2, t2 ),
>                                  u2fust2,
>                                  2ufus2u2, 2tfus2t2, map,
>                                  defined ) );;
gap> Length( Set( poss2u2fus2t2 ) );
1
gap> fus:= poss2u2fus2t2[1];;
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2u2, u2 ) );;
gap> testcharsu:= Filtered( Irr( 2u2 ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;
gap> possfus:= FusionsAllowedByRestrictions( 2u2, 2t2, testcharsu,
>                  inds, fus, parametersFABR );;
gap> List( possfus, Indeterminateness );
1616 ]

##
gap> good:= [];;
gap> for map in Set( Concatenation( List( possfus, ContainedMaps ) ) ) do
>      indu:= Set( InducedClassFunctionsByFusionMap( 2u2, 2t2,
>                      testcharsu, map ) );
>      if ForAll( indu, x -> IsInt( ScalarProduct( 2t2, x, x ) ) ) then
>        Add( good, map );
>      fi;
>    od;
gap> Length( good );
2
gap> poss2u2fus2t2:= good;;
gap> indu:= List( good,
>                 map -> Set( InducedClassFunctionsByFusionMap( 2u2, 2t2,
>                                 testcharsu, map ) ) );;
gap> List( indu, Length );
9898 ]
gap> Length( Intersection( indu ) );
34
gap> Set( poss2u2fus2t2[1] ) = Set( poss2u2fus2t2[2] );
true
gap> UniteSet( defined, Set( poss2u2fus2t2[1] ) );

##
gap> 2t2fust2:= GetFusionMap( 2t2, t2 );;
gap> p:= 5;;
gap> pow5:= InitPowerMap( 2t2, p );;
gap> comp:= CompositionMaps( InverseMap( 2t2fust2 ),
>            CompositionMaps( PowerMap( t2, p ), 2t2fust2 ) );;
gap> MeetMaps( pow5, comp );
true
gap> comp:= CompositionMaps( 2tfus2t2,
>            CompositionMaps( PowerMap( 2t, p ),
>                InverseMap( 2tfus2t2 ) ) );;
gap> MeetMaps( pow5, comp );
true
gap> comp:= CompositionMaps( 2s2fus2t2,
>            CompositionMaps( PowerMap( 2s2, p ),
>                InverseMap( 2s2fus2t2 ) ) );;
gap> MeetMaps( pow5, comp );
true
gap> para:= Parametrized( poss2u2fus2t2 );;
gap> comp:= CompositionMaps( para,
>            CompositionMaps( PowerMap( 2u2, p ),
>                InverseMap( para ) ) );;
gap> MeetMaps( pow5, comp );
true
gap> Indeterminateness( pow5 );
4096

##
gap> ambig:= PositionsProperty( pow5, IsList );
283284287288307308309310317318319320 ]
gap> ambig:= Filtered( ambig,
>                i -> OrdersClassRepresentatives( 2t2 )[i] mod 5 = 0 );
309310319320 ]
gap> Intersection( ambig, defined );
[  ]
gap> pow5{ ambig };
[ [ 204205 ], [ 204205 ], [ 227228 ], [ 227228 ] ]
gap> pow5{ ambig }:= [ 204205227228 ];;
gap> UniteSet( defined, ambig );

##
gap> p:= 3;;
gap> pow3:= InitPowerMap( 2t2, p );;
gap> comp:= CompositionMaps( InverseMap( 2t2fust2 ),
>            CompositionMaps( PowerMap( t2, p ), 2t2fust2 ) );;
gap> MeetMaps( pow3, comp );
true
gap> comp:= CompositionMaps( 2tfus2t2,
>            CompositionMaps( PowerMap( 2t, p ),
>                InverseMap( 2tfus2t2 ) ) );;
gap> MeetMaps( pow3, comp );
true
gap> comp:= CompositionMaps( 2s2fus2t2,
>            CompositionMaps( PowerMap( 2s2, p ),
>                InverseMap( 2s2fus2t2 ) ) );;
gap> MeetMaps( pow3, comp );
true
gap> para:= Parametrized( poss2u2fus2t2 );;
gap> comp:= CompositionMaps( para,
>            CompositionMaps( PowerMap( 2u2, p ),
>                InverseMap( para ) ) );;
gap> MeetMaps( pow3, comp );
true
gap> Indeterminateness( pow3 );
65536
gap> CommutativeDiagram( pow3, pow5, pow5, pow3 );
rec( imp1 := [ 309310319320 ], imp2 := [  ], imp3 := [  ], imp4 := [  ] 
 )
gap> Indeterminateness( pow3 );
4096
gap> ambig:= PositionsProperty( pow3, IsList );
239240273274283284287288307308317318 ]
gap> ambig:=  Difference( ambig, defined );
283284287288307308317318 ]
gap> pow3{ ambig };
[ [ 206207 ], [ 206207 ], [ 218219 ], [ 218219 ], [ 231232 ], 
  [ 231232 ], [ 317318 ], [ 317318 ] ]
gap> pow3{ [ 283284287288307308 ] }:=
>              [ 206207218219231232 ];;
gap> CommutativeDiagram( pow3, pow5, pow5, pow3 );
rec( imp1 := [  ], imp2 := [  ], imp3 := [ 283284287288307308 ], 
  imp4 := [  ] )

##
gap> poss3:= [];;
gap> for possindu in indu do
>      testchars:= Concatenation( inds, possindu );
>      Add( poss3, PowerMapsAllowedBySymmetrizations( 2t2, testchars,
>                      testchars, StructuralCopy( pow3 ), p,
>                      parametersFABR ) );
>    od;
gap> List( poss3, Length );
11 ]
gap> poss3:= List( poss3, l -> l[1] );;
gap> List( poss3, Indeterminateness );
44 ]

##
gap> p:= 2;;
gap> pow2:= InitPowerMap( 2t2, p );;
gap> comp:= CompositionMaps( InverseMap( 2t2fust2 ),
>               CompositionMaps( PowerMap( t2, p ), 2t2fust2 ) );;
gap> MeetMaps( pow2, comp );
true
gap> comp:= CompositionMaps( 2tfus2t2,
>               CompositionMaps( PowerMap( 2t, p ),
>                   InverseMap( 2tfus2t2 ) ) );;
gap> MeetMaps( pow2, comp );
true
gap> comp:= CompositionMaps( 2s2fus2t2,
>               CompositionMaps( PowerMap( 2s2, p ),
>                   InverseMap( 2s2fus2t2 ) ) );;
gap> MeetMaps( pow2, comp );
true
gap> para:= Parametrized( poss2u2fus2t2 );;
gap> comp:= CompositionMaps( para,
>               CompositionMaps( PowerMap( 2u2, p ),
>                   InverseMap( para ) ) );;
gap> MeetMaps( pow2, comp );
true
gap> Indeterminateness( pow2 );
131072
gap> CommutativeDiagram( pow3, pow2, pow2, pow3 );
rec( imp1 := [  ], imp2 := [  ], 
  imp3 := [ 283284287288307308319320 ], imp4 := [  ] )
gap> Indeterminateness( pow2 );
512
gap> CommutativeDiagram( pow5, pow2, pow2, pow5 );
rec( imp1 := [  ], imp2 := [  ], imp3 := [ 309310 ], imp4 := [  ] )
gap> Indeterminateness( pow2 );
128

##
gap> indt:= Set( InducedClassFunctionsByFusionMap( 2t, 2t2,
>               Filtered( Irr( 2t ), x -> x[1] <> x[2] ), 2tfus2t2 ) );;
gap> irr:= Filtered( indt, x -> ScalarProduct( 2t2, x, x ) = 1 );;
gap> Length( irr ); 
7

##
gap> red:= Reduced( 2t2, irr, Concatenation( indt, inds ) );;
gap> Length( red.irreducibles );
0
gap> lll:= LLL( 2t2, red.remainders, 99/100 );;
gap> Length( lll.irreducibles );
4
gap> UniteSet( irr, lll.irreducibles );
gap> Length( irr ); 
11
gap> missing:= NrConjugacyClasses( 2t2 ) - NrConjugacyClasses( t2 )
>                  - Length( irr );
120
gap> redindu:= List( indu, l -> ReducedCharacters( 2t2, irr, l ) );;
gap> List( redindu, r -> r.irreducibles );
[ [  ], [  ] ]
gap> redindu:= List( redindu, r -> r.remainders );;

##
gap> inducand:= redindu[1];;
gap> testchars:= Concatenation( irr, red.remainders, inducand );;
gap> minus5:= List( testchars, x -> MinusCharacter( x, pow5, 5 ) );;
gap> minus3:= List( testchars, x -> MinusCharacter( x, poss3[1], 3 ) );;
gap> minus:= Reduced( 2t2, irr, Concatenation( minus5, minus3 ) );;
gap> Length( minus.irreducibles );
0
gap> lll2:= LLL( 2t2, Concatenation( lll.remainders, inducand,
>                         minus.remainders ), 99/100 );;
gap> Length( lll2.irreducibles );
0
gap> Length( lll2.norms );
119
gap> gram:= MatScalarProducts( 2t2, lll2.remainders, lll2.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, missing );;
gap> Length( emb.solutions );
1
gap> dec:= Decreased( 2t2, lll2.remainders, emb.vectors{ emb.solutions[1] } );;
gap> Length( dec.irreducibles );
118
gap> Length( dec.remainders );
1

##
gap> redt:= Reduced( 2t2, Concatenation( irr, dec.irreducibles ), indt );;
gap> Length( redt.remainders );
1
gap> redt.remainders[1] in indt;
true

##
gap> split:= Union( Filtered( InverseMap( 2t2fust2 ), IsList ) );;
gap> Filtered( split, i -> ForAll( Concatenation( irr, dec.irreducibles ),
>                                  x -> x[i] = 0 ) );
317318 ]
gap> Positions( OrdersClassRepresentatives( 2t2 ), 56 );
317318 ]
gap> SizesCentralizers( 2t2 )[317];
112

##
gap> factirr:= List( Irr( t2 ), x -> x{ 2t2fust2 } );;
gap> poss2:= PowerMapsAllowedBySymmetrizations( 2t2, factirr,
>                dec.irreducibles, StructuralCopy( pow2 ), 2,
>                parametersFABR );;
gap> Length( poss2 );
1
gap> Indeterminateness( poss2[1] );
1
gap> cand:= ShallowCopy( redt.remainders[1] / 2 );;
gap> cand{ [ 317318 ] }:= [ 1, -1 ] * ( 2 * Sqrt(-7) );;
gap> minus2:= MinusCharacter( cand, poss2[1], 2 );;
gap> ForAll( Flat( MatScalarProducts( 2t2, factirr, [ minus2 ] ) ), IsInt );
false
gap> cand{ [ 317318 ] }:= [ 1, -1 ] * ( 2 * Sqrt(7) );;
gap> minus2:= MinusCharacter( cand, poss2[1], 2 );;
gap> ForAll( Flat( MatScalarProducts( 2t2, factirr, [ minus2 ] ) ), IsInt );
true

##
gap> cand2:= ShallowCopy( cand );;
gap> cand2{ [ 317318 ] }:= [ -11 ] * ( 2 * Sqrt(7) );;
gap> SetIrr( 2t2, Concatenation( factirr, irr, dec.irreducibles,
>                     [ cand, cand2 ] ) );
gap> for p in [ 2 .. Maximum( OrdersClassRepresentatives( 2t2 ) ) ] do
>      if IsPrimeInt( p ) then
>        if p = 2 then
>          poss:= PossiblePowerMaps( 2t2, p,
>                     rec( powermap:= poss2[1] ) );
>        elif p = 3 then
>          poss:= PossiblePowerMaps( 2t2, p,
>                     rec( powermap:= StructuralCopy( pow3 ) ) );
>        elif p = 5 then
>          poss:= PossiblePowerMaps( 2t2, p,
>                     rec( powermap:= StructuralCopy( pow5 ) ) );
>        else
>          poss:= PossiblePowerMaps( 2t2, p );
>        fi;
>        if Length( poss ) <> 1 then
>          Error( "not expected" );
>        fi;
>        ComputedPowerMaps( 2t2 )[p]:= poss[1];
>      fi;
>    od;
gap> lib:= CharacterTable( "2.2E6(2).2" );;
gap> tr:= TransformingPermutationsCharacterTables( lib, 2t2 );;
gap> tr.columns;
(177,178)(179,180)(183,184)(185,186)(189,190)(195,196)(199,200)(201,202)(204,
205)(206,207)(208,209)(218,219)(223,224)(225,226)(227,228)(231,232)(233,
234)(235,236)(241,242)(243,244)(245,246)(247,248)(253,254)(258,259)(260,
261)(266,267)(268,269)(273,274)(275,276)(280,281)(283,284)(287,288)(293,
294)(299,300)(307,308)(309,310)

##
gap> 2t2:= tableHead( t2, mustsplit, [], [] );;
gap> inducand:= redindu[2];;
gap> testchars:= Concatenation( irr, red.remainders, inducand );;
gap> minus5:= List( testchars, x -> MinusCharacter( x, pow5, 5 ) );;
gap> minus3:= List( testchars, x -> MinusCharacter( x, poss3[2], 3 ) );;
gap> minus:= Reduced( 2t2, irr, Concatenation( minus5, minus3 ) );;
gap> Length( minus.irreducibles );
0
gap> lll2:= LLL( 2t2, Concatenation( lll.remainders, inducand,
>                         minus.remainders ), 99/100 );;
gap> Length( lll2.irreducibles );
0
gap> Length( lll2.norms );
119
gap> gram:= MatScalarProducts( 2t2, lll2.remainders, lll2.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, missing );;
gap> Length( emb.solutions );
1
gap> dec:= Decreased( 2t2, lll2.remainders, emb.vectors{ emb.solutions[1] } );;
gap> Length( dec.irreducibles );
118
gap> Length( dec.remainders );
1
gap> redt:= Reduced( 2t2, Concatenation( irr, dec.irreducibles ), indt );;
gap> Length( redt.remainders );
1
gap> redt.remainders[1] in indt;
true
gap> poss2:= PowerMapsAllowedBySymmetrizations( 2t2, factirr,
>                dec.irreducibles, StructuralCopy( pow2 ), 2,
>                parametersFABR );;
gap> Length( poss2 );
1
gap> Indeterminateness( poss2[1] );
1
gap> cand:= ShallowCopy( redt.remainders[1] / 2 );;
gap> cand{ [ 317318 ] }:= [ 1, -1 ] * ( 2 * Sqrt(-7) );;
gap> minus2:= MinusCharacter( cand, poss2[1], 2 );;
gap> ForAll( Flat( MatScalarProducts( 2t2, factirr, [ minus2 ] ) ), IsInt );
false
gap> cand{ [ 317318 ] }:= [ 1, -1 ] * ( 2 * Sqrt(7) );;
gap> minus2:= MinusCharacter( cand, poss2[1], 2 );;
gap> ForAll( Flat( MatScalarProducts( 2t2, factirr, [ minus2 ] ) ), IsInt );
true
gap> cand2:= ShallowCopy( cand );;
gap> cand2{ [ 317318 ] }:= [ -11 ] * ( 2 * Sqrt(7) );;
gap> SetIrr( 2t2, Concatenation( factirr, irr, dec.irreducibles,
>                     [ cand, cand2 ] ) );
gap> for p in [ 2 .. Maximum( OrdersClassRepresentatives( 2t2 ) ) ] do
>      if IsPrimeInt( p ) then
>        if p = 2 then
>          poss:= PossiblePowerMaps( 2t2, p,
>                     rec( powermap:= poss2 ) );
>        elif p = 3 then
>          poss:= PossiblePowerMaps( 2t2, p,
>                     rec( powermap:= StructuralCopy( pow3 ) ) );
>        elif p = 5 then
>          poss:= PossiblePowerMaps( 2t2, p,
>                     rec( powermap:= StructuralCopy( pow5 ) ) );
>        else
>          poss:= PossiblePowerMaps( 2t2, p );
>        fi;
>        if Length( poss ) <> 1 then
>          Error( "not expected" );
>        fi;
>        ComputedPowerMaps( 2t2 )[p]:= poss[1];
>      fi;
>    od;
gap> tr:= TransformingPermutationsCharacterTables( lib, 2t2 );;
gap> tr.columns;
(177,178)(179,180)(183,184)(185,186)(189,190)(195,196)(199,200)(201,202)(204,
205)(206,207)(208,209)(218,219)(223,224)(225,226)(227,228)(231,232)(233,
234)(235,236)(239,240)(241,242)(243,244)(245,246)(247,248)(253,254)(258,
259)(260,261)(266,267)(268,269)(275,276)(280,281)(283,284)(287,288)(293,
294)(299,300)(307,308)(309,310)

##
gap> t:= CharacterTable( "B" );;
gap> s:= CharacterTable( "2.2E6(2).2" );;
gap> 2s:= CharacterTable( "2^2.2E6(2).2" );;
gap> 2sfuss:= GetFusionMap( 2s, s );;

##
gap> fus:= PossibleClassFusions( s, t );;
gap> Length( fus );
16
gap> n:= NrConjugacyClasses( 2s );;
gap> indperm:= pi -> PermList( CompositionMaps( 2sfuss,
>        CompositionMaps( ListPerm( pi, n ), InverseMap( 2sfuss ) ) ) );;
gap> ind:= Group( List( GeneratorsOfGroup( AutomorphismsOfTable( 2s ) ),
>                       indperm ) );;
gap> Size( ind );
16
gap> rep:= RepresentativesFusions( ind, fus, Group( () ) );;
gap> Length( rep );
2

##
gap> List( rep, map -> map{ ClassPositionsOfCentre( s ) } );
[ [ 12 ], [ 12 ] ]
gap> List( rep, map -> Positions( map, 2 ) );
[ [ 24175 ], [ 24176 ] ]
gap> pos:= List( [ 175176 ], i -> Positions( 2sfuss, i ) );
[ [ 251 ], [ 252 ] ]
gap> OrdersClassRepresentatives( 2s ){ [ 251252 ] };
24 ]
gap> sfust:= rep[1];;

##
gap> orders:= OrdersClassRepresentatives( t );;
gap> mustsplit:= PositionsProperty( orders, IsOddInt );
1671819314647547581829198109112113128
  131145146151155160172173177 ]
gap> selfCentralizingClassesSplit( t, mustsplit );
#I  class 158 splits (self-centralizing)
#I  class 159 splits (self-centralizing)
#I  class 165 splits (self-centralizing)
#I  class 169 splits (self-centralizing)
#I  class 170 splits (self-centralizing)
#I  class 171 splits (self-centralizing)
#I  class 176 splits (self-centralizing)
#I  class 182 splits (self-centralizing)
#I  class 183 splits (self-centralizing)
#I  class 184 splits (self-centralizing)
gap> splittingClassesWithOddCentralizerIndexSplit( s, t, sfust,
>        2sfuss, mustsplit );
#I  class 110 splits (odd centralizer index)
#I  class 68 splits (odd centralizer index)
#I  class 73 splits (odd centralizer index)
#I  class 79 splits (odd centralizer index)
#I  class 94 splits (odd centralizer index)
#I  class 136 splits (odd centralizer index)
#I  class 140 splits (odd centralizer index)
gap> mustnotsplit:= [];;
gap> notSplittingClassesOfSubgroupDoNotSplit( 2sfuss, sfust, mustnotsplit );
#I  class 2 does not split (as in subgroup)
#I  class 4 does not split (as in subgroup)
#I  class 5 does not split (as in subgroup)
#I  class 8 does not split (as in subgroup)
#I  class 9 does not split (as in subgroup)
#I  class 10 does not split (as in subgroup)
#I  class 11 does not split (as in subgroup)
#I  class 13 does not split (as in subgroup)
#I  class 14 does not split (as in subgroup)
#I  class 15 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 23 does not split (as in subgroup)
#I  class 24 does not split (as in subgroup)
#I  class 25 does not split (as in subgroup)
#I  class 27 does not split (as in subgroup)
#I  class 29 does not split (as in subgroup)
#I  class 30 does not split (as in subgroup)
#I  class 32 does not split (as in subgroup)
#I  class 33 does not split (as in subgroup)
#I  class 34 does not split (as in subgroup)
#I  class 35 does not split (as in subgroup)
#I  class 36 does not split (as in subgroup)
#I  class 37 does not split (as in subgroup)
#I  class 38 does not split (as in subgroup)
#I  class 39 does not split (as in subgroup)
#I  class 40 does not split (as in subgroup)
#I  class 41 does not split (as in subgroup)
#I  class 44 does not split (as in subgroup)
#I  class 48 does not split (as in subgroup)
#I  class 50 does not split (as in subgroup)
#I  class 52 does not split (as in subgroup)
#I  class 55 does not split (as in subgroup)
#I  class 56 does not split (as in subgroup)
#I  class 57 does not split (as in subgroup)
#I  class 58 does not split (as in subgroup)
#I  class 59 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 63 does not split (as in subgroup)
#I  class 65 does not split (as in subgroup)
#I  class 66 does not split (as in subgroup)
#I  class 67 does not split (as in subgroup)
#I  class 69 does not split (as in subgroup)
#I  class 70 does not split (as in subgroup)
#I  class 71 does not split (as in subgroup)
#I  class 72 does not split (as in subgroup)
#I  class 76 does not split (as in subgroup)
#I  class 77 does not split (as in subgroup)
#I  class 78 does not split (as in subgroup)
#I  class 80 does not split (as in subgroup)
#I  class 83 does not split (as in subgroup)
#I  class 84 does not split (as in subgroup)
#I  class 85 does not split (as in subgroup)
#I  class 86 does not split (as in subgroup)
#I  class 87 does not split (as in subgroup)
#I  class 88 does not split (as in subgroup)
#I  class 92 does not split (as in subgroup)
#I  class 93 does not split (as in subgroup)
#I  class 95 does not split (as in subgroup)
#I  class 97 does not split (as in subgroup)
#I  class 99 does not split (as in subgroup)
#I  class 101 does not split (as in subgroup)
#I  class 102 does not split (as in subgroup)
#I  class 103 does not split (as in subgroup)
#I  class 114 does not split (as in subgroup)
#I  class 115 does not split (as in subgroup)
#I  class 116 does not split (as in subgroup)
#I  class 117 does not split (as in subgroup)
#I  class 118 does not split (as in subgroup)
#I  class 119 does not split (as in subgroup)
#I  class 120 does not split (as in subgroup)
#I  class 122 does not split (as in subgroup)
#I  class 123 does not split (as in subgroup)
#I  class 124 does not split (as in subgroup)
#I  class 126 does not split (as in subgroup)
#I  class 129 does not split (as in subgroup)
#I  class 130 does not split (as in subgroup)
#I  class 132 does not split (as in subgroup)
#I  class 133 does not split (as in subgroup)
#I  class 134 does not split (as in subgroup)
#I  class 135 does not split (as in subgroup)
#I  class 137 does not split (as in subgroup)
#I  class 138 does not split (as in subgroup)
#I  class 139 does not split (as in subgroup)
#I  class 141 does not split (as in subgroup)
#I  class 149 does not split (as in subgroup)
#I  class 150 does not split (as in subgroup)
#I  class 152 does not split (as in subgroup)
#I  class 153 does not split (as in subgroup)
#I  class 154 does not split (as in subgroup)
#I  class 156 does not split (as in subgroup)
#I  class 157 does not split (as in subgroup)
#I  class 161 does not split (as in subgroup)
#I  class 163 does not split (as in subgroup)
#I  class 166 does not split (as in subgroup)
#I  class 167 does not split (as in subgroup)
#I  class 168 does not split (as in subgroup)
#I  class 175 does not split (as in subgroup)
#I  class 178 does not split (as in subgroup)
#I  class 179 does not split (as in subgroup)
#I  class 180 does not split (as in subgroup)
#I  class 181 does not split (as in subgroup)
gap> proj:= Filtered( Irr( 2s ), x -> x[1] <> x[2] );;
gap> projmap:= ProjectionMap( 2sfuss );;
gap> proj:= List( proj, x -> x{ projmap } );;
gap> computeContributions( s, t, sfust, proj, 10^6,
>        mustsplit, mustnotsplit );
#I  class 3 splits (contribution criterion)
#I  class 12 splits (contribution criterion)
#I  class 42 splits (contribution criterion)
#I  class 22 splits (3rd root of 3)
#I  class 26 splits (3rd root of 3)
#I  class 60 splits (3rd root of 12)
#I  class 64 splits (3rd root of 12)
#I  class 125 splits (3rd root of 42)
#I  class 49 splits (5th root of 3)
#I  class 51 splits (5th root of 3)
#I  class 105 splits (5th root of 12)
#I  class 143 splits (5th root of 26)
#I  class 144 splits (5th root of 26)
#I  class 111 splits (11th root of 3)
#I  class 104 does not split (contribution criterion)
#I  class 28 splits (contribution criterion)
#I  class 142 splits (5th root of 28)

##
gap> invol:= Positions( OrdersClassRepresentatives( t ), 2 );
2345 ]
gap> IsSubset( sfust, invol );
true
gap> invols:= List( invol, i -> Positions( sfust, i ) );
[ [ 24175 ], [ 35 ], [ 176177 ], [ 67178 ] ]
gap> preim2s:= List( invols,
>        l -> PositionsProperty( 2sfuss, x -> x in l ) );
[ [ 36251 ], [ 4578 ], [ 252253 ], [ 910254 ] ]
gap> List( preim2s, l -> OrdersClassRepresentatives( 2s ){ l } );
[ [ 222 ], [ 2222 ], [ 44 ], [ 222 ] ]
gap> invmustlift:= [ 4 ];;
gap> invmaylift:= [];;

##
gap> open:= Difference( sfust, Union( mustsplit, mustnotsplit ) );
8990 ]
gap> defined:= [];;
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2s, s ) );
12 ]
gap> testcharss:= Filtered( Irr( 2s ),
>        chi -> not IsSubset( ClassPositionsOfKernel( chi ), ker ) );;
gap> good:= [];;
gap> for choice in Combinations( open ) do
>      2t:= tableHead( t, Union( mustsplit, choice ),
>                      invmustlift, invmaylift ); 
>      fus:= runOneTest( s, 2s, t, 2t, sfust, testcharss, defined );
>      if fus <> fail then
>        Add( good, rec( choice:= choice, table:= 2t, map:= fus ) );
>      fi;
>    od;
gap> List( good, x -> x.choice );
[ [ 89 ], [ 90 ] ]

##
gap> List( good, x -> Indeterminateness( x.map ) );
44 ]
gap> goodfus:= [];;
gap> for map in ContainedMaps( good[1].map ) do
>      2t:= good[1].table;
>      ind:= InducedClassFunctionsByFusionMap( 2s, 2t, testcharss, map );
>      if ForAll( Flat( MatScalarProducts( 2t, ind, ind ) ), IsInt ) then
>        Add( goodfus, map );
>      fi;
>    od;
gap> Length( goodfus );
0
gap> 2t:= good[2].table;;
gap> 2tfust:= GetFusionMap( 2t, t );;
gap> AddSet( mustnotsplit, 89 );
gap> AddSet( mustsplit, 90 );

##
gap> inds:= [];;
gap> for map in ContainedMaps( good[2].map ) do
>      ind:= InducedClassFunctionsByFusionMap( 2s, 2t, testcharss, map );
>      if ForAll( Flat( MatScalarProducts( 2t, ind, ind ) ), IsInt ) then
>        Add( inds, rec( 2tfust:= 2tfust, characters:= ind, map:= map ) );
>      fi;
>    od;
gap> Length( inds );
2

##
gap> p:= 2;;
gap> 2tfust:= GetFusionMap( 2t, t );;
gap> for testinds in inds do
>      pow:= InitPowerMap( 2t, p );
>      Congruences( 2t, testinds.characters, pow, p, false );
>      TransferDiagram( pow, 2tfust, PowerMap( t, p ) );
>      TransferDiagram( PowerMap( 2s, p ), testinds.map, pow );
>      factirr:= List( Irr( t ), x -> x{ 2tfust } );
>      testinds.pow2:= PowerMapsAllowedBySymmetrizations( 2t, factirr,
>                          testinds.characters, pow, p, parametersFABR );
>    od;
gap> List( inds, x -> Length( x.pow2 ) );
10 ]
gap> inds:= inds[1];;

##
gap> Length( Difference( [ 1 .. NrConjugacyClasses( t ) ],
>            Union( mustsplit, mustnotsplit ) ) );
17

##
gap> th:= CharacterTable( "Th" );;
gap> poss:= PossibleClassFusions( th, t );;
gap> Length( poss );
2
gap> rep:= RepresentativesFusions( th, poss, Group( () ) );;
gap> Length( rep );
1
gap> thfust:= rep[1];;
gap> 2th:= CharacterTable( "Cyclic", 2 ) * th;;
gap> 2thfusth:= GetFusionMap( 2th, th );;
gap> splittingClassesWithOddCentralizerIndexSplit( th, t, thfust,
>        2thfusth, mustsplit );
#I  class 96 splits (odd centralizer index)

##
gap> splitFusionAndCharacters:= function( r, t, tosplit_in_t )
>      local 2tfust, inv, tosplit_in_2t, result, shift, j, i, spl;

>      2tfust:= r.2tfust;
>      inv:= InverseMap( 2tfust );
>      tosplit_in_2t:= inv{ tosplit_in_t };
>      if ForAny( inv{ tosplit_in_t }, IsList ) then
>        Error( "the classes in ",
>               Filtered( tosplit_in_t, i -> IsList( inv[i] ) ),
>               " were already split" );
>      elif ForAny( r.characters,
>                   x -> not IsZero( x{ tosplit_in_2t } ) ) then
>        Error( "all characters must vanish on the classes to be split" );
>      fi;

>      # Adjust the characters of '2t'.
>      spl:= Concatenation( [ 1 .. Length( r.characters[1] ) ],
>                           tosplit_in_2t );
>      Sort( spl );
>      result:= rec( characters:= List( r.characters, chi -> chi{ spl } ),
>                    2tfust:= 2tfust{ spl } );

>      if IsBound( r.map ) then
>        if Intersection( tosplit_in_2t, r.map ) <> [] then
>          Error( "the classes to be split must not occur in the subgroup" );
>        fi;

>        # Adjust the fusion from a subgroup to '2t'.
>        Add( tosplit_in_2t, Length( 2tfust ) + 1 );
>        shift:= [];
>        for j in [ 1 .. tosplit_in_2t[1] - 1 ] do
>          shift[j]:= 0;
>        od;
>        for i in [ 1 .. Length( tosplit_in_2t ) - 1 ] do
>          for j in [ tosplit_in_2t[i] .. tosplit_in_2t[ i+1 ] - 1 ] do
>            shift[j]:= i;
>          od;
>        od;
>        result.map:= r.map + shift{ r.map };
>      fi;

>      return result;
> end;;
gap> inds:= splitFusionAndCharacters( inds, t, [ 96 ] );;

##
gap> open:= Difference( thfust, Union( mustsplit, mustnotsplit ) );
4553108127 ]
gap> defined:= Set( sfust );;
gap> ker:= ClassPositionsOfKernel( GetFusionMap( 2th, th ) );
149 ]
gap> testcharsth:= Filtered( Irr( 2th ),
>               x -> not IsSubset( ClassPositionsOfKernel( x ), ker ) );;
gap> good:= [];;
gap> for choice in Combinations( open ) do
>      2t:= tableHead( t, Union( mustsplit, choice ),
>                      invmustlift, invmaylift );
>      fus:= runOneTest( th, 2th, t, 2t, thfust, testcharsth, defined );
>      if fus <> fail then
>        Add( good, rec( choice:= choice, map:= fus, table:= 2t ) );
>      fi;
>    od;
gap> List( good, x -> x.choice );
[ [ 4553127 ], [ 53 ], [ 53127 ] ]

##
gap> UniteSet( mustsplit, [ 53 ] );
gap> UniteSet( mustnotsplit, [ 108 ] );

##
gap> good2:= [];;
gap> for r in good do
>      splitinds:= splitFusionAndCharacters( inds, t, r.choice );
>      2t:= r.table;;
>      fus:= StructuralCopy( r.map );;
>      2tfust:= GetFusionMap( 2t, t );;
>      factirr:= List( Irr( t ), x -> x{ 2tfust } );;
>      possfus:= FusionsAllowedByRestrictions( 2th, 2t, testcharsth,
>                   splitinds.characters, fus, parametersFABR );;
>      for paramap in possfus do
>        for map in ContainedMaps( paramap ) do
>          indth:= Set( InducedClassFunctionsByFusionMap( 2th, 2t,
>                           testcharsth, map ) );
>          if ForAll( Flat( MatScalarProducts( 2t, indth, indth ) ),
>                     IsInt ) and
>             ForAll( Flat( MatScalarProducts( 2t, indth,
>                               splitinds.characters ) ), IsInt ) then
>            # Use the 2-nd power map.
>            ind:= Concatenation( splitinds.characters, indth );
>            pow:= InitPowerMap( 2t, p );
>            if Congruences( 2t, ind, pow, p, false ) = true and
>               TransferDiagram( pow, 2tfust, PowerMap( t, p ) ) <> fail and
>               TransferDiagram( PowerMap( 2th, p ), map, pow ) <> fail and
>               TransferDiagram( PowerMap( 2s, p ), splitinds.map,
>                                pow ) <> fail then
>              poss:= PowerMapsAllowedBySymmetrizations( 2t, factirr, ind,
>                         pow, p, parametersFABR );
>              if Length( poss ) <> 0 then
>                r.pow2:= poss;
>                Add( good2, rec( table:= 2t,
>                                 choice:= r.choice,
>                                 2thfus2t:= map,
>                                 ind:= ind,
>                                 2sfus2t:= splitinds.map ) );
>              fi;
>            fi;
>          fi;
>        od;
>      od;
>    od;
gap> List( good2, x -> x.choice );
[ [ 4553127 ], [ 53 ], [ 53127 ] ]

##
gap> 2t:= good2[2].table;;
gap> 2tfust:= GetFusionMap( 2t, t );;
gap> 2thfus2t:= good2[2].2thfus2t;;
gap> 2sfus2t:= good2[2].2sfus2t;;
gap> ind:= good2[2].ind;;
gap> factirr:= List( Irr( t ), x -> x{ 2tfust } );;

##
gap> nothit_in_t:= Difference( mustsplit, Union( thfust, sfust ) );;
gap> nothit_in_2t:= PositionsProperty( 2tfust, i -> i in nothit_in_t );
6667136137147148149150162163166167186187188
  189217218222223224225226227228229230231234235
  236237242243 ]
gap> orders_2t:= OrdersClassRepresentatives( 2t );;
gap> orders_2t{ nothit_in_2t };
10102020234623462424255030303030404044
  444646464647944794104104551106060 ]

##
gap> powermaps:= ComputedPowerMaps( 2t );;
gap> primes:= Filtered( [ 1 .. Maximum( orders_2t ) ], IsPrimeInt );;
gap> for p in primes do
>      pow:= InitPowerMap( 2t, p );
>      if TransferDiagram( pow, 2tfust, PowerMap( t, p ) ) = fail or
>         TransferDiagram( PowerMap( 2th, p ), 2thfus2t, pow ) = fail or
>         TransferDiagram( PowerMap( 2s, p ), 2sfus2t, pow ) = fail or
>         ConsiderSmallerPowerMaps( 2t, pow, p, false ) <> true or
>         Congruences( 2t, ind, pow, p, false ) <> true then
>        Error( "contradiction" );
>      fi;
>      poss:= PowerMapsAllowedBySymmetrizations( 2t, ind, ind,
>                 pow, p, parametersFABR );
>      if Length( poss ) = 1 then
>        powermaps[p]:= poss[1];
>      else
>        powermaps[p]:= pow;
>      fi;
>    od;

##
gap> known:= Filtered( nothit_in_2t,
>                i -> ForAll( powermaps, map -> IsInt( map[i] ) ) );
147148149150166167228229230231236237 ]

##
gap> List( Difference( nothit_in_2t, known ),
>          i -> Number( powermaps, map -> IsList( map[i] ) ) );
22222525262626262626272726262727272727
  272727 ]
gap> oddprimes:= Difference( primes, [ 2 ] );;
gap> inv:= InverseMap( 2tfust );;
gap> for i in [ 1 .. Length( inv ) ] do
>      if IsList( inv[i] ) then
>        # the classes of g and g*z
>        pair:= inv[i];
>        for p in oddprimes do
>          if powermaps[p]{ pair } = [ pair, pair ] then
>            # the p-th powers of g and g*z are conj. to g or g*z
>            for k in Filtered( oddprimes,
>                               x -> orders_2t[ pair[1] ] mod x = 0 ) do
>              img:= powermaps[k][ pair[1] ];
>              if IsList( img ) then
>                if powermaps[p]{ img } = img then
>                  # the p-th power of g^k is conj. to g^k 
>                  powermaps[p]{ pair }:= pair;
>                elif powermaps[p]{ img } = Reversed( img ) then
>                  # the p-th power of g^k is conj. to g^k*z
>                  powermaps[p]{ pair }:= pair{ [ 21 ] };
>                fi;
>              fi;
>            od;
>          fi;
>        od;
>      fi;
>    od;
gap> List( Difference( nothit_in_2t, known ),
>          i -> Number( powermaps, map -> IsList( map[i] ) ) );
1111111717171727272626181818182727
  22 ]

##
gap> pos:= [ 6667136137 ];;
gap> powermaps[5]{ pos };
[ [ 45 ], [ 45 ], [ 1617 ], [ 1617 ] ]
gap> powermaps[5]{ pos }:= [ 451617 ];;
gap> pos:= [ 162163 ];;
gap> powermaps[3]{ pos };
[ [ 5354 ], [ 5354 ] ]
gap> powermaps[3]{ pos }:= [ 5354 ];;

##
gap> pos:= [ 242243 ];;
gap> powermaps[3]{ pos };
[ [ 136137 ], [ 136137 ] ]
gap> powermaps[5]{ pos };
[ [ 7879 ], [ 7879 ] ]
gap> powermaps[3]{ [ 7879 ] };
1617 ]
gap> powermaps[3]{ pos }:= [ 136137 ];;
gap> powermaps[5]{ pos }:= [ 7879 ];;

##
gap> pos:= Intersection( Difference( nothit_in_2t, known ),
>                        Positions( orders_2t, 46 ) );
224225226227 ]
gap> powermaps[5]{ pos };
[ [ 226227 ], [ 226227 ], [ 224225 ], [ 224225 ] ]
gap> setGaloisInfo( powermaps, [ 224226 ], orders_2t, primes, Sqrt(-23) );
gap> setGaloisInfo( powermaps, [ 225227 ], orders_2t, primes, Sqrt(-23) );

##
gap> powermaps[23]{ pos };                                            
[ [ 45 ], [ 45 ], [ 45 ], [ 45 ] ]
gap> powermaps[23]{ pos }:= [ 4545 ];;
gap> ForAll( List( powermaps, x -> x{ pos } ), IsPositionsList );
true

##
gap> pos:= Intersection( nothit_in_2t, Positions( orders_2t, 30 ) );
186187188189 ]
gap> Field( Flat( List( factirr, x -> x{ pos } ) ) )
>    = Field( Rationals, [ Sqrt( -15 ) ] );
true

##
gap> List( powermaps, x -> x[66] );
[ , 2566,, 4,, 66,,,, 66,, 66,,,, 66,, 66,,,, 66,,,,,, 66,, 66,,,,,, 66,,,, 
  66,, 66,,,, 66,,,,,, 66,,,,,, 66,, 66,,,,,, 66,,,, 66,, 66,,,,,, 66,,,, 66,,
  ,,,, 66,,,,,,,, 66,,,, 66,, 66,,,, 66,, 66 ]
gap> setGaloisInfo( powermaps, [ 186188 ], orders_2t, primes, Sqrt(-15) );
gap> setGaloisInfo( powermaps, [ 187189 ], orders_2t, primes, Sqrt(-15) );
gap> powermaps[3]{ pos };
[ [ 6667 ], [ 6667 ], [ 6667 ], [ 6667 ] ]
gap> powermaps[3]{ pos }:= [ 66676667 ];;
gap> powermaps[5]{ pos };
[ [ 3435 ], [ 3435 ], [ 3435 ], [ 3435 ] ]
gap> powermaps[3]{ [ 3435 ] };
45 ]
gap> powermaps[5]{ [ 6667 ] };
45 ]
gap> powermaps[5]{ pos }:= [ 34353435 ];;
gap> ForAll( List( powermaps, x -> x{ pos } ), IsPositionsList ); #  true
true

##
gap> pos:= Intersection( nothit_in_2t, Positions( orders_2t, 44 ) );
222223 ]
gap> vals:= List( [ 1, -111, -11 ], Sqrt );;
gap> good:= [];;
gap> for val in vals do
>      setGaloisInfo( powermaps, pos, orders_2t, primes, val );
>      indcyc:= InducedCyclic( 2t, pos, "all" );
>      if ForAll( indcyc, x -> IsInt( ScalarProduct( 2t, x, x ) ) ) then
>        minus:= MinusCharacter( indcyc[1], powermaps[2], 2 );
>        if ForAll( List( factirr, x -> ScalarProduct( 2t, x, minus ) ), 
>                   IsInt ) then
>          Add( good, val );
>        fi;
>      fi;
>    od;
gap> good = [ Sqrt( -11 ) ];
true
gap> setGaloisInfo( powermaps, pos, orders_2t, primes, good[1] );

##
gap> pos:= Intersection( nothit_in_2t, Positions( orders_2t, 104 ) );
234235 ]
gap> vals:= List( [ 1, -12, -213, -1326, -26 ], Sqrt );;
gap> good:= [];;
gap> for val in vals do
>      setGaloisInfo( powermaps, pos, orders_2t, primes, val );
>      indcyc:= InducedCyclic( 2t, pos, "all" );
>      if ForAll( indcyc, x -> IsInt( ScalarProduct( 2t, x, x ) ) ) then
>        minus:= MinusCharacter( indcyc[1], powermaps[2], 2 );
>        if ForAll( List( factirr, x -> ScalarProduct( 2t, x, minus ) ), 
>                   IsInt ) then
>          Add( good, val );
>        fi;
>      fi;
>    od;
gap> good = [ Sqrt( -26 ) ];
true
gap> setGaloisInfo( powermaps, pos, orders_2t, primes, good[1] );

##
gap> pos:= Intersection( nothit_in_2t, Positions( orders_2t, 40 ) );
217218 ]

##
gap> powermaps[2]{ pos };
[ [ 136137 ], [ 136137 ] ]
gap> TransferDiagram( powermaps[5], powermaps[2], powermaps[5] );
rec( impbetween := [ 131139217218 ], impinside1 := [  ], 
  impinside2 := [  ] )
gap> IsPositionsList( powermaps[2] );
true

##
gap> vals:= List( [ 1, -12, -25, -510, -10 ], Sqrt );;
gap> good:= [];;
gap> for val in vals do
>      setGaloisInfo( powermaps, pos, orders_2t, primes, val );
>      indcyc:= InducedCyclic( 2t, pos, "all" );
>      if ForAll( indcyc, x -> IsInt( ScalarProduct( 2t, x, x ) ) ) then
>        minus:= MinusCharacter( indcyc[1], powermaps[2], 2 );
>        if ForAll( List( factirr, x -> ScalarProduct( 2t, x, minus ) ),
>                   IsInt ) then
>          Add( good, val );
>        fi;
>      fi;
>    od;
gap> good = [ Sqrt( 5 ), Sqrt( -5 ) ];
true

##
gap> indcyc:= InducedCyclic( 2t, Difference( nothit_in_2t, pos ), "all" );;
gap> indcyc:= Reduced( 2t, factirr, indcyc ).remainders;;
gap> setGaloisInfo( powermaps, pos, orders_2t, primes, Sqrt( 5 ) );
gap> indcyc40r5:= InducedCyclic( 2t, pos, "all" );;
gap> indcyc40r5:= Reduced( 2t, factirr, indcyc40r5 ).remainders;;
gap> testind:= Concatenation( ind, indcyc, indcyc40r5 );;
gap> lll:= LLL( 2t, testind, 99/100 );;
gap> Length( lll.norms );
63
gap> Length( mustsplit );
63
gap> Length( Difference( [ 1 .. NrConjugacyClasses( t ) ],
>            Union( mustsplit, mustnotsplit ) ) );
14
gap> gram:= MatScalarProducts( 2t, lll.remainders, lll.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, 63 + 14 );;
gap> List( emb.solutions, Length );
636363656565 ]
gap> dec:= List( emb.solutions,
>              x -> Decreased( 2t, lll.remainders, emb.vectors{ x } ) );;
gap> Positions( dec, fail );
1236 ]

##
gap> dec:= Filtered( dec, x -> x <> fail );;
gap> List( dec, r -> Length( r.irreducibles ) );
6161 ]

##
gap> degreesum:= List( dec,
>        r -> Sum( List( r.irreducibles, x -> x[1]^2 ) ) );;
gap> Set( degreesum );
4154780380522839827726467072000000 ]
gap> n:= Size( t ) - degreesum[1];
1100703586363451113472000000

##
gap> red:= List( dec, r -> Reduced( 2t, r.irreducibles, testind ) );;
gap> norm2:= List( red, r -> First( r.remainders,
>                              x -> ScalarProduct( 2t, x, x ) = 2 ) );;
gap> norm2[1] = norm2[2];
true
gap> norm2[1][1] = Sqrt( 2 * n );
true

##
gap> setGaloisInfo( powermaps, pos, orders_2t, primes, Sqrt( -5 ) );
gap> indcyc40i5:= InducedCyclic( 2t, pos, "all" );;
gap> indcyc40i5:= Reduced( 2t, factirr, indcyc40i5 ).remainders;;
gap> testind:= Concatenation( ind, indcyc, indcyc40i5 );;
gap> lll:= LLL( 2t, testind, 99/100 );;
gap> gram:= MatScalarProducts( 2t, lll.remainders, lll.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, 63 + 14 );;
gap> List( emb.solutions, Length );
636363656565 ]
gap> dec:= List( emb.solutions,
>              x -> Decreased( 2t, lll.remainders, emb.vectors{ x } ) );;
gap> Positions( dec, fail );
36 ]
gap> dec:= Filtered( dec, x -> x <> fail );;
gap> List( dec, r -> Length( r.irreducibles ) );
63636161 ]

##
gap> dec1:= dec{ [ 12 ] };;
gap> dec2:= dec{ [ 34 ] };;
gap> degreesum:= List( dec2,
>        r -> Sum( List( r.irreducibles, x -> x[1]^2 ) ) );;
gap> Set( degreesum );
4154780380522839827726467072000000 ]
gap> n:= Size( t ) - degreesum[1];
1100703586363451113472000000
gap> red:= List( dec2, r -> Reduced( 2t, r.irreducibles, testind ) );;
gap> norm2:= List( red, r -> First( r.remainders,
>                              x -> ScalarProduct( 2t, x, x ) = 2 ) );;
gap> Length( Set( norm2 ) );
1
gap> norm2[1][1] = Sqrt( 2 * n );
true

##
gap> HasIrr( 2t );
false
gap> SetIrr( 2t, Concatenation( factirr, dec1[1].irreducibles ) );
gap> lib:= CharacterTable( "2.B" );;
gap> TransformingPermutationsCharacterTables( 2t, lib );
rec( columns := (4,5)(29,30)(34,35)(63,64)(66,67)(122,123)(125,126)(145,
    146)(186,187)(188,189)(224,225)(226,227), 
  group := <permutation group with 17 generators>, 
  rows := (185,213,243,236,191,205,225,229,247,200,232,222,207,216,187,206,
    212,234,194,244,217,202,245,199,238,235,221,192,214,230,201,186,211,227,
    226,208,198,242,218,193,209,220,196,210,241,203,189,224,219,197,204,223,
    240,190,215,195,233)(188,239)(231,246,237) )
gap> ResetFilterObj( 2t, HasIrr );
gap> SetIrr( 2t, Concatenation( factirr, dec1[2].irreducibles ) );
gap> TransformingPermutationsCharacterTables( 2t, lib );
rec( columns := (4,5)(29,30)(34,35)(63,64)(66,67)(122,123)(125,126)(143,
    144)(145,146)(186,187)(188,189)(224,225)(226,227)(244,245), 
  group := <permutation group with 17 generators>, 
  rows := (185,212,234,194,244,217,202,245,199,238,190,215,195,233)(186,211,
    227,226,208,198,242,218,193,209,220,196,210,241,203,189,224,219,197,204,
    223,240,235,221,192,214,230,201)(187,206,213,243,191,205,225,229,247,200,
    232,222,207,216)(188,239)(231,246,237) )

##
gap> good2[3].choice;
53127 ]
gap> pos:= Positions( 2tfust, 127 );
165 ]
gap> 2t:= good2[3].table;;
gap> 2tfust:= GetFusionMap( 2t, t );;
gap> 2thfus2t:= good2[3].2thfus2t;;
gap> 2sfus2t:= good2[3].2sfus2t;;
gap> ind:= good2[3].ind;;
gap> factirr:= List( Irr( t ), x -> x{ 2tfust } );;
gap> UniteSet( mustsplit, good2[3].choice );
gap> spl:= SortedList( Concatenation( [ 1 .. 247 ], pos ) );;
gap> testind:= Concatenation( good2[3].ind,
>        List( Concatenation( indcyc, indcyc40r5 ), x -> x{ spl } ) );;
gap> lll:= LLL( 2t, testind, 99/100 );;
gap> Length( lll.norms );
64
gap> Length( mustsplit );
64
gap> Length( Difference( [ 1 .. NrConjugacyClasses( t ) ],
>            Union( mustsplit, mustnotsplit ) ) );
13
gap> gram:= MatScalarProducts( 2t, lll.remainders, lll.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, 64+13 );;
gap> List( emb.solutions, Length );
64646465656566666667676767676767676769
  6969 ]
gap> dec:= List( emb.solutions,
>            x -> Decreased( 2t, lll.remainders, emb.vectors{ x } ) );;
gap> Positions( dec, fail );
123678916171821 ]
gap> dec:= Filtered( dec, x -> x <> fail );;
gap> List( dec, r -> Length( r.irreducibles ) );
61616361616361616161 ]
gap> degreesum:= List( dec,
>        r -> Sum( List( r.irreducibles, x -> x[1]^2 ) ) );;
gap> degreesumset:= Set( degreesum );
41547803805228398277264670720000004154781481226426191177580544000000 ]
gap> n:= Size( t ) - degreesumset;
11007035863634511134720000000 ]
gap> List( degreesumset, x -> Positions( degreesum, x ) );
[ [ 124578910 ], [ 36 ] ]
gap> dec:= dec{ Positions( degreesum, degreesumset[1] ) };;
gap> red:= List( dec, r -> Reduced( 2t, r.irreducibles, testind ) );;
gap> norm2:= List( red, r -> First( r.remainders,
>                              x -> ScalarProduct( 2t, x, x ) = 2 ) );;
gap> Length( Set( norm2 ) );
1
gap> norm2[1][1] = Sqrt( 2 * n[1] );
true

##
gap> testind:= Concatenation( good2[3].ind,
>        List( Concatenation( indcyc, indcyc40i5 ), x -> x{ spl } ) );;
gap> lll:= LLL( 2t, testind, 99/100 );;
gap> gram:= MatScalarProducts( 2t, lll.remainders, lll.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, 64+13 );;
gap> List( emb.solutions, Length );
64646465656566666667676767676767676769
  6969 ]
gap> dec:= List( emb.solutions,
>            x -> Decreased( 2t, lll.remainders, emb.vectors{ x } ) );;
gap> Positions( dec, fail );
123678916171821 ]
gap> dec:= Filtered( dec, x -> x <> fail );;
gap> List( dec, r -> Length( r.irreducibles ) );
61616361616361616161 ]
gap> degreesum:= List( dec,
>        r -> Sum( List( r.irreducibles, x -> x[1]^2 ) ) );;
gap> degreesumset:= Set( degreesum );
41547803805228398277264670720000004154781481226426191177580544000000 ]
gap> n:= Size( t ) - degreesumset;
11007035863634511134720000000 ]
gap> List( degreesumset, x -> Positions( degreesum, x ) );
[ [ 124578910 ], [ 36 ] ]
gap> dec:= dec{ Positions( degreesum, degreesumset[1] ) };;
gap> red:= List( dec, r -> Reduced( 2t, r.irreducibles, testind ) );;
gap> norm2:= List( red, r -> First( r.remainders,
>                              x -> ScalarProduct( 2t, x, x ) = 2 ) );;
gap> Length( Set( norm2 ) );
1
gap> norm2[1][1] = Sqrt( 2 * n[1] );
true

##
gap> good2[1].choice;
4553127 ]
gap> 2tfust:= GetFusionMap( good2[2].table, t );;
gap> pos:= Union( Positions( 2tfust, 45 ), Positions( 2tfust, 127 ) );
57165 ]
gap> 2t:= good2[1].table;;
gap> 2tfust:= GetFusionMap( 2t, t );;
gap> 2thfus2t:= good2[1].2thfus2t;;
gap> 2sfus2t:= good2[1].2sfus2t;;
gap> ind:= good2[1].ind;;
gap> factirr:= List( Irr( t ), x -> x{ 2tfust } );;
gap> UniteSet( mustsplit, good2[1].choice );
gap> spl:= SortedList( Concatenation( [ 1 .. 247 ], pos ) );;
gap> testind:= Concatenation( good2[1].ind,
>        List( Concatenation( indcyc, indcyc40r5 ), x -> x{ spl } ) );;
gap> lll:= LLL( 2t, testind, 99/100 );;
gap> Length( lll.norms );
65
gap> Length( mustsplit );
65
gap> Length( Difference( [ 1 .. NrConjugacyClasses( t ) ],
>            Union( mustsplit, mustnotsplit ) ) );
12
gap> gram:= MatScalarProducts( 2t, lll.remainders, lll.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, 65+12 );;
gap> List( emb.solutions, Length );
66666666666666666667676767676767676767
  67676767676767676868686969696969696969
  69696969696969696969717171 ]
gap> dec:= List( emb.solutions,
>            x -> Decreased( 2t, lll.remainders, emb.vectors{ x } ) );;
gap> Positions( dec, fail );
123456789121314152425262728293033
  3435364546474851 ]
gap> dec:= Filtered( dec, x -> x <> fail );;
gap> List( dec, r -> Length( r.irreducibles ) );
63636361616163616161636363616161636161
  616161 ]
gap> degreesum:= List( dec,
>        r -> Sum( List( r.irreducibles, x -> x[1]^2 ) ) );;
gap> degreesumset:= Set( degreesum );
41547803805228398277264670720000004154781481226426191177580544000000 ]
gap> Size( t ) - degreesumset;
11007035863634511134720000000 ]
gap> Positions( degreesum, degreesumset[2] );
123711121317 ]
gap> dec:= dec{ Positions( degreesum, degreesumset[1] ) };;
gap> red:= List( dec, r -> Reduced( 2t, r.irreducibles, testind ) );;
gap> norm2:= List( red, r -> First( r.remainders,
>                              x -> ScalarProduct( 2t, x, x ) = 2 ) );;
gap> Length( Set( norm2 ) );
1
gap> norm2[1][1];
0

##
gap> testind:= Concatenation( good2[1].ind,
>        List( Concatenation( indcyc, indcyc40i5 ), x -> x{ spl } ) );;
gap> lll:= LLL( 2t, testind, 99/100 );;
gap> gram:= MatScalarProducts( 2t, lll.remainders, lll.remainders );;
gap> emb:= OrthogonalEmbeddings( gram, 65+12 );;
gap> List( emb.solutions, Length );
66666666666666666667676767676767676767
  67676767676767676868686969696969696969
  69696969696969696969717171 ]
gap> dec:= List( emb.solutions,
>            x -> Decreased( 2t, lll.remainders, emb.vectors{ x } ) );;
gap> Positions( dec, fail );
123456789121314152425262728293033
  3435364546474851 ]
gap> dec:= Filtered( dec, x -> x <> fail );;
gap> List( dec, r -> Length( r.irreducibles ) );
63636361616163616161636363616161636161
  616161 ]
gap> degreesum:= List( dec,
>        r -> Sum( List( r.irreducibles, x -> x[1]^2 ) ) );;
gap> degreesumset:= Set( degreesum );
41547803805228398277264670720000004154781481226426191177580544000000 ]
gap> Size( t ) - degreesumset;
11007035863634511134720000000 ]
gap> Positions( degreesum, degreesumset[2] );
123711121317 ]
gap> dec:= dec{ Positions( degreesum, degreesumset[1] ) };;
gap> red:= List( dec, r -> Reduced( 2t, r.irreducibles, testind ) );;
gap> norm2:= List( red, r -> First( r.remainders,
>                              x -> ScalarProduct( 2t, x, x ) = 2 ) );;
gap> Length( Set( norm2 ) );
1
gap> norm2[1][1];
0

##
gap> STOP_TEST( "ctblatlas.tst" );

#############################################################################
##
#E


[zur Elbe Produktseite wechseln0.194QuellennavigatorsAnalyse erneut starten2026-06-17]