Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/spinsym/gap/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 1.9.2019 mit Größe 32 kB image not shown  

SSL young.gi   Sprache: unbekannt

 
#############################################################################
##
##  young.gi                  The SpinSym Package                 Lukas Maas
##
##  Character tables of maximal Young subgroups of 2.Sym(n) and 2.Alt(n)
##  Copyright (C) 2012 Lukas Maas
##
#############################################################################

## @Thomas:
## CharacterTable( "DoubleCoverMaximalYoungSubgroup", k, l )
## CharacterTable( "DoubleCoverMaximalYoungSubgroupSymmetric", k, l )
## CharacterTable( "DoubleCoverMaximalYoungSubgroupAlternatingSymmetric", k, l )
## CharacterTable( "DoubleCoverMaximalYoungSubgroupSymmetricAlternating", k, l )
## CharacterTable( "DoubleCoverMaximalYoungSubgroupAlternating", k, l )

#############################################################################

## returns true if the preimage of the conjugacy class
## of type <clpar> = [ pi, tau ] in Alt(k) x Alt(l)
## splits into a union of two distinct classes in
## 2.(Alt(k) x Alt(l)), false otherwise.

BindGlobal( "SPINSYM_YNG_IsSplitAA", function( clpar )
  local c1, c2;
  c1:= Filtered( Flat( clpar[1] ), IsInt );
  c2:= Filtered( Flat( clpar[2] ), IsInt );
  return ( SPINSYM_IsAPO( c1 ) or SPINSYM_IsAPD( c1 ) )
     and ( SPINSYM_IsAPO( c2 ) or SPINSYM_IsAPD( c2 ) );
  end );


## returns true if the preimage of the conjugacy class
## of type <clpar> = [ pi, tau ] in Alt(k) x Sym(l)
## splits into a union of two distinct classes in
## 2.(Alt(k) x Sym(l)), false otherwise.

BindGlobal( "SPINSYM_YNG_IsSplitAS", function( clpar )
  local c1;
  c1:= Filtered( Flat( clpar[1] ), IsInt );
  # clpar[1] might contain '+' or '-'
  return ( SPINSYM_IsAPO( c1 ) or SPINSYM_IsAPD( c1 ) )
     and ( SPINSYM_IsAPO( clpar[2] ) or
            ( SPINSYM_IsAPD( clpar[2] ) and
              SignPartition( clpar[2] ) = -1 ) );
  end );


## returns true if the preimage of the conjugacy class
## of type <clpar> = [ pi, tau ] in Sym(k) x Alt(l)
## splits into a union of two distinct classes in
## 2.(Sym(k) x Alt(l)), false otherwise.

BindGlobal( "SPINSYM_YNG_IsSplitSA", function( clpar )
  local c2;
  c2:= Filtered( Flat( clpar[2] ), IsInt );
  # clpar[2] might contain '+' or '-'
  return ( SPINSYM_IsAPO( c2 ) or SPINSYM_IsAPD( c2 ) )
     and ( SPINSYM_IsAPO( clpar[1] ) or
            ( SPINSYM_IsAPD( clpar[1] ) and
              SignPartition( clpar[1] ) = -1 ) );
  end );


## returns true if the preimage of the conjugacy class
## of type <clpar> = [ pi, tau ] in Sym(k) x Sym(l)
## splits into a union of two distinct classes in
## 2.(Sym(k) x Sym(l)), false otherwise.

BindGlobal( "SPINSYM_YNG_IsSplitSS", function( clpar )
  local sgn1, sgn2;

  if SPINSYM_IsAPO( clpar[1] ) and SPINSYM_IsAPO( clpar[2] ) then
    return true;
  elif SPINSYM_IsAPD( clpar[1] ) and SPINSYM_IsAPD( clpar[2] ) then
    sgn1:= SignPartition( clpar[1] );
    sgn2:= SignPartition( clpar[2] );
    return Set( [sgn1,sgn2] ) = [-1,1];
  else
    return false;
  fi;

  end );


## just a wrapping function

BindGlobal( "SPINSYM_YNG_IsSplit", function( clpar, type )
  if type = "AA" then
    return SPINSYM_YNG_IsSplitAA( clpar );
  elif type = "AS" then
    return SPINSYM_YNG_IsSplitAS( clpar );
  elif type = "SA" then
    return SPINSYM_YNG_IsSplitSA( clpar );
  else
    return SPINSYM_YNG_IsSplitSS( clpar );
  fi;
  end );


## SPINSYM_YNG_OrderOfProductOfDisjointSchurLifts( cl1, cl2, o1, o2 )
##   cl1 : partition of k
##   cl2 : partition of l
##   o1  : order of first standard representative t1 of type cl1
##   o2  : order of first standard representative t2 of type cl2
## returns the order of the element t1*t2 in 2.(Sym(k) x Sym(l))

InstallGlobalFunction(
  SPINSYM_YNG_OrderOfProductOfDisjointSchurLifts,
  function( cl1, cl2, o1, o2 )
    local c1, c2, cl, m, i, mo, m4;

    # remove possible '+' or '-' from cl1 and cl2
    c1:= Filtered( Flat( cl1 ), IsInt );
    c2:= Filtered( Flat( cl2 ), IsInt );
    cl:= Concatenation( c1, c2 );
    m:= 1;
    for i in [1..Length(cl)] do
      m:= LcmOp( Integers, m, cl[i] );
    od;
    # now m is the l.c.m. of the orders of images of the
    # Schur lifts of type cl1 and cl2 in Sym(n)

    mo:= [ m mod o1, m mod o2 ];
    if SignPartition(c1) = -1 and SignPartition(c2) = -1 then
    # c1 and c2 are odd
    m4:= m mod 4;
    if m4 in [0,1] then
      if mo = [0,0] or not 0 in mo then
        return m;
      else
        return 2*m;
      fi;
    else # m4 = 2 or 3
      if mo <> [0,0] and 0 in mo then
        return m;
      else
        return 2*m;
      fi;
    fi;
  else
    if mo = [0,0] or not 0 in mo then
      return m;
    else
      return 2*m;
    fi;
  fi;
  end );


## SPINSYM_YNG_HEAD( k, l, type [, CT1, CT2] )
##   k    : an integer greater than 1
##   l    : an integer greater than 1
##   type : a string "AA", "AS", "SA", or "SS"
## returns the 'head' of an ordinary character table of
## 2.(Alt(k) x Alt(l)), 2.(Alt(k) x Sym(l)), 2.(Sym(k) x Alt(l)),
## or 2.(Sym(k) x Sym(l)), respectively, depending on the value
## of type.
## The appropriate ordinary character tables of 2.Alt(k), 2.Alt(l),
## 2.Sym(k), or 2.Sym(l) may be given as optional arguments CT1, CT2.

InstallGlobalFunction( SPINSYM_YNG_HEAD,
  function( arg )
  local k, l, type,
        tbl,        # the table head that will be returned
        NAME, name, # identifiers of 2.(X1 x X2) and X1 x X2
        CT1, CT2,   # generic character tables of 2.X1 and 2.X2
        CCL1, ccl1, CCL2, ccl2, CCL,              # class parameters
        CEN1, cen1, CEN2, cen2, CEN,              # sizes of centralizers
        ORD1, ORD2, o1, o2, ORD,                  # orders of class reps
        NR1, nr1, NR2, nr2, NR,                   # counter
        FUS,        # fusion map from 2.(X1 x X2) onto X1 x X2
        ORIGIN, pos1, pos2, split1, split2,
        1ST, 2ND, i, j, cl1, cl2, c, info;

  k:= arg[ 1 ];
  l:= arg[ 2 ];
  type:= arg[ 3 ];

  if type = "AA" then
    NAME:= Concatenation( "2.(Alt(", String(k),
                           ")xAlt(", String(l), "))" );
    name:= Concatenation( "Alt(", String(k),
                          ")xAlt(", String(l), ")" );
    if Length( arg ) = 5 then
      CT1:= arg[ 4 ];
      CT2:= arg[ 5 ];
    else
      CT1:= CharacterTable( "DoubleCoverAlternating", k );
      CT2:= CharacterTable( "DoubleCoverAlternating", l );
    fi;

  elif type = "AS" then

    NAME:= Concatenation( "2.(Alt(", String(k),
                           ")xSym(", String(l), "))" );
    name:= Concatenation( "Alt(", String(k),
                          ")xSym(", String(l), ")" );
    if Length( arg ) = 5 then
      CT1:= arg[ 4 ];
      CT2:= arg[ 5 ];
    else
      CT1:= CharacterTable( "DoubleCoverAlternating", k );
      CT2:= CharacterTable( "DoubleCoverSymmetric", l );
    fi;

  elif type = "SA" then

    NAME:= Concatenation( "2.(Sym(", String(k),
                           ")xAlt(", String(l), "))" );
    name:= Concatenation( "Sym(", String(k),
                        ")xAlt(", String(l), ")" );
    if Length( arg ) = 5 then
      CT1:= arg[ 4 ];
      CT2:= arg[ 5 ];
    else
      CT1:= CharacterTable( "DoubleCoverSymmetric", k );
      CT2:= CharacterTable( "DoubleCoverAlternating", l );
    fi;

  elif type = "SS" then

    NAME:= Concatenation( "2.(Sym(", String(k),
                           ")xSym(", String(l), "))" );
    name:= Concatenation( "Sym(", String(k),
                        ")xSym(", String(l), ")" );
    if Length( arg ) = 5 then
      CT1:= arg[ 4 ];
      CT2:= arg[ 5 ];
    else
      CT1:= CharacterTable( "DoubleCoverSymmetric", k );
      CT2:= CharacterTable( "DoubleCoverSymmetric", l );
    fi;

  fi;

  tbl:= ConvertToCharacterTableNC(
        rec( UnderlyingCharacteristic:= 0 ) );

  SetIdentifier( tbl, NAME );
  SetSize( tbl, Size( CT1 ) * Size( CT2 ) / 2 );

  CCL1:= ClassParameters( CT1 );
  CCL2:= ClassParameters( CT2 );
  NR1:=  NrConjugacyClasses( CT1 );
  NR2:=  NrConjugacyClasses( CT2 );
  CEN1:= SizesCentralizers( CT1 );
  CEN2:= SizesCentralizers( CT2 );
  ORD1:= OrdersClassRepresentatives( CT1 );
  ORD2:= OrdersClassRepresentatives( CT2 );

  # collect data of the factor group X_i from 2.X_i for i=1,2
  cen1:= [];
  ccl1:= [];
  nr1:= 0;
  pos1:= [];
  split1:= [];
  for i in [ 1 .. NR1 ] do
    if CCL1[i][1] = 1 then
      nr1:= nr1 + 1;
      pos1[ nr1 ]:= i;
      ccl1[ nr1 ]:= CCL1[i][2];
      cen1[ nr1 ]:= CEN1[i];
      split1[ nr1 ]:= false;
    else # CCL1[i][1] = 2
      cen1[ nr1 ]:= CEN1[i] / 2;
      split1[ nr1 ]:= true;
    fi;
  od;
  cen2:= [];
  ccl2:= [];
  nr2:= 0;
  pos2:= [];
  split2:= [];
  for i in [ 1 .. NR2 ] do
    if CCL2[i][1] = 1 then
      nr2:= nr2 + 1;
      pos2[ nr2 ]:= i;
      ccl2[ nr2 ]:= CCL2[i][2];
      cen2[ nr2 ]:= CEN2[i];
      split2[ nr2 ]:= false;
    else # CCL2[i][1] = 2
      cen2[ nr2 ]:= CEN2[i] / 2;
      split2[ nr2 ]:= true;
    fi;
  od;

  # classes, centralizers and fusion map
  CCL:= [];
  NR:=  0;
  CEN:= [];
  ORD:= [];
  FUS:= [];
  1ST:= [];
  2ND:= [];
  ORIGIN:= [];
  for i in [ 1 .. nr1 ] do
    for j in [ 1 .. nr2 ] do
      NR:= NR + 1;
      cl1:= ccl1[i];
      cl2:= ccl2[j];
      CCL[ NR ]:= [ 1, [ cl1, cl2 ] ];
      Add( 1ST, NR );
      FUS[ NR ]:= Length( 1ST );
      ORIGIN[ NR ]:= [ i, j ];
      o1:= ORD1[ pos1[i] ];
      o2:= ORD2[ pos2[j] ];
      ORD[ NR ]:= SPINSYM_YNG_OrderOfProductOfDisjointSchurLifts(
                          cl1, cl2, o1, o2 );
      c:= cen1[i] * cen2[j];
      if SPINSYM_YNG_IsSplit( [ cl1, cl2 ], type ) then
        c:= 2 * c;
        CEN[ NR ]:= c;
        FUS[ NR + 1 ]:= FUS[ NR ];
        NR:= NR + 1;
        CCL[ NR ]:= [ 2, [ cl1, cl2 ] ];
        Add( 2ND, NR );
        ORIGIN[ NR ]:= [ i, j ];
        # determine order of (zx)y or x(zy)
        if split1[i] then
          o1:= ORD1[ pos1[i] + 1 ];
          ORD[ NR ]:= SPINSYM_YNG_OrderOfProductOfDisjointSchurLifts(
                              cl1, cl2, o1, o2 );
        elif split2[j] then
          o2:= ORD2[ pos2[j]+1 ];
          ORD[ NR ]:= SPINSYM_YNG_OrderOfProductOfDisjointSchurLifts(
                              cl1, cl2, o1, o2 );
        fi;
      fi;
      CEN[ NR ]:= c;
    od;
  od;

  SetClassParameters( tbl, CCL );
  SetNrConjugacyClasses( tbl, NR );
  SetSizesCentralizers( tbl, CEN );
  SetOrdersClassRepresentatives( tbl, ORD );
  SetComputedClassFusions( tbl,  [ rec( name:= name, map:= FUS ) ] );

  # keep some information on the ingredients
  info:= rec( k:= k,
              l:= l,
              type:= type,
              ORIGIN:= ORIGIN,
              pos1:= pos1,
              pos2:= pos2,
              nr1:=  nr1,
              nr2:=  nr2,
              1ST:=  1ST,
              2ND:=  2ND );

  if type <> "SS" then
    SetSpinSymIngredients( tbl, [ CT1, CT2, info ] );
  else
    SetSpinSymIngredients( tbl, [ CT1, CT2, info,
        CharacterTable( "DoubleCoverAlternating", k ),
        CharacterTable( "DoubleCoverAlternating", l ) ] );
  fi;

  return tbl;
  end );


## SPINSYM_YNG_HEADREG( tbl, p )
##   tbl : an ordinary character table constructed by
##         SpinSymCharacterTableOfMaximalYoungSubgroup
##   p   : an odd rational prime
## returns the head of the p-regular part of tbl

InstallGlobalFunction( SPINSYM_YNG_HEADREG,
  function( tbl, p )
  local CT1, CT2, info, AT1, AT2,
        modtbl, fus, ccl, i;

  CT1:= SpinSymIngredients( tbl )[ 1 ] mod p;
  CT2:= SpinSymIngredients( tbl )[ 2 ] mod p;
  info:= ShallowCopy( SpinSymIngredients( tbl )[ 3 ] );
  if info.type = "SS" then
    AT1:= SpinSymIngredients( tbl )[ 4 ] mod p;
    AT2:= SpinSymIngredients( tbl )[ 5 ] mod p;
  else AT1:= false; AT2:= false; fi;
  if CT1 = fail or CT2 = fail
  or AT1 = fail or AT2 = fail then
    Error( "missing Brauer tables; " );
    return fail;
  fi;

  modtbl:= ConvertToCharacterTableNC(
            rec( UnderlyingCharacteristic:= p,
                 OrdinaryCharacterTable:= tbl ) );
  SetSize( modtbl, Size( tbl ) );

  fus:= Filtered( [ 1 .. NrConjugacyClasses( tbl ) ],
        i-> OrdersClassRepresentatives( tbl )[i] mod p <> 0 );

  StoreFusion( modtbl, fus, tbl );

  Unbind( info.ORIGIN );
  info.pos1:= Positions( List( ClassParameters( CT1 ),
                                x-> x[1] ), 1 );
  info.pos2:= Positions( List( ClassParameters( CT2 ),
                                x-> x[1] ), 1 );
  info.nr1:= Length( info.pos1 );
  info.nr2:= Length( info.pos2 );

  ccl:= ClassParameters( tbl ){ fus };
  SetClassParameters( modtbl, ccl );
  info.1ST:= [ ];
  info.2ND:= [ ];
  for i in [ 1 .. NrConjugacyClasses( modtbl ) ] do
    if ccl[ i ][ 1 ] = 1 then
      Add( info.1ST, i );
    else
      Add( info.2ND, i );
    fi;
  od;

  if info.type <> "SS" then
    SetSpinSymIngredients( modtbl, [ CT1, CT2, info ] );
  else
    SetSpinSymIngredients( modtbl, [ CT1, CT2, info, AT1, AT2 ] );
  fi;

  return modtbl;
  end );


## SPINSYM_YNG_POWERMAPS( tbl )
##   tbl : the character table head returned by
##         SPINSYM_YNG_HEAD( k, l, type )
## computes the p-powermaps for all primes p <= k+l
## and sets the attribute ComputedPowerMaps( tbl )

InstallGlobalFunction( SPINSYM_YNG_POWERMAPS,
  function( tbl )
  local POW1, POW2, info, k, l, pprimepowermap,
        res, CLPAR, signs, pow, p, powk, powl,
        cl, cl1, cl2, pos, i, c, d, j1, j2;

  if not HasSpinSymIngredients( tbl ) then
    Error( "the ingredients of <tbl> must be known; " );
    return;
  fi;

  # shortcuts
  POW1:= ComputedPowerMaps( SpinSymIngredients( tbl )[1] );
  POW2:= ComputedPowerMaps( SpinSymIngredients( tbl )[2] );
  info:= SpinSymIngredients( tbl )[3];
  k:= info.k;
  l:= info.l;

  pprimepowermap:= function( irr, p )
  # returns the p-powermap when p is
  # coprime to the group order
    local n, trans1, trans2, perm;
    n:= Length(irr);
    trans1:= List( [1..n], i-> irr{[1..n]}[i] );
    trans2:= GaloisCyc( trans1, p );
    perm:= PermListList( trans2, trans1 );
    return Permuted( [1..n], perm );
  end;

  res:= function( cl, clpar )
  # returns the position of the Sym-class parameter
  # cl in a list of Alt-class parameters
    if SPINSYM_IsAPO( cl ) and SPINSYM_IsAPD( cl ) then
      # cl splits in Alt()
      return Position( clpar, [ 1, [ cl, '+' ] ] );
    else
      return Position( clpar, [ 1, cl ] );
    fi;
  end;

  CLPAR:= ClassParameters( tbl );
  signs:= List( CLPAR,
          x-> [ SignPartition(Filtered( Flat( x[2][1] ), IsInt )),
                SignPartition(Filtered( Flat( x[2][2] ), IsInt )) ] );
  pow:= [];
  for p in Set( FactorsInt( Size( tbl ) ) ) do

    if p > k then
      POW1[ p ]:= pprimepowermap( Irr( SpinSymIngredients( tbl )[1] ), p );
    fi;
    if p > l then
      POW2[ p ]:= pprimepowermap( Irr( SpinSymIngredients( tbl )[2] ), p );
    fi;

    pow[ p ]:= [ ];
    powk:= POW1[ p ];
    powl:= POW2[ p ];

    for i in [ 1 .. NrConjugacyClasses( tbl ) ] do
      cl:= CLPAR[i];
      if cl[1] = 1 or p = 2 then
        c:= 1;
      else
        c:= -1;
      fi;
      if signs[i][1] = -1 and signs[i][2] = -1
        and ( p = 2 or p mod 4 = 3 ) then
        c:= -c;
      fi;
      j1:= powk[ info.pos1[ info.ORIGIN[i][1] ] ];
      j2:= powl[ info.pos2[ info.ORIGIN[i][2] ] ];
      cl1:= ClassParameters( SpinSymIngredients( tbl )[1] )[j1];
      cl2:= ClassParameters( SpinSymIngredients( tbl )[2] )[j2];
      if cl1[1] <> cl2[1] then
        c:= -c;
      fi;
      if info.type <> "SS" then
        pos:= fail;
        if c = -1 then
          pos:= Position( CLPAR, [ 2, [ cl1[2], cl2[2] ] ] );
        fi;
        if c = 1 or pos = fail then
          pos:= Position( CLPAR, [ 1, [ cl1[2], cl2[2] ] ] );
        fi;
        Add( pow[p], pos );
      else # SS
        signs[i][1]:= SignPartition( cl1[2] );
        signs[i][2]:= SignPartition( cl2[2] );
        if signs[i][1] = -1 and signs[i][2] = 1 then
          # find cl2 in 2.Alt(l) = SpinSymIngredients( tbl )[5]
          pos:= res( cl2[2], ClassParameters( SpinSymIngredients( tbl )[5] ) );
          pos:= PowerMap( SpinSymIngredients( tbl )[5], p )[ pos ];
          d:= ClassParameters( SpinSymIngredients( tbl )[5] )[ pos ];
          if d[1] = 2 then
            c:= -c;
          fi;
          if '-' in d[2] then
            c:= -c;
          fi;
        elif signs[i][1] = 1 and signs[i][2] = -1 then
          # find cl1 in 2.Alt(k) = SpinSymIngredients( tbl )[4]
          pos:= res( cl1[2], ClassParameters( SpinSymIngredients( tbl )[4] ) );
          pos:= PowerMap( SpinSymIngredients( tbl )[4], p )[ pos ];
          d:= ClassParameters( SpinSymIngredients( tbl )[4] )[ pos ];
          if d[1] = 2 then
            c:= -c;
          fi;
          if '-' in d[2] then
            c:= -c;
          fi;
        fi;
        pos:= fail;
        if c = -1 then
          pos:= Position( CLPAR, [ 2, [ cl1[2], cl2[2] ] ] );
        fi;
        if c = 1 or pos = fail then
          pos:= Position( CLPAR, [ 1, [ cl1[2], cl2[2] ] ] );
        fi;
        pow[ p ][ i ]:= pos;
      fi;
    od;
  od;

  SetComputedPowerMaps( tbl, pow );

  end );


## SPINSYM_YNG_TSR( tbl, IRR1, IRR2, CHPAR1, CHPAR2, c, d )
##   tbl    : the character table head returned by
##            SPINSYM_YNG_HEAD( k, l, type, CT1, CT2 )
##   IRR1   : subset of (spin) characters of Irr( CT1 )
##   IRR2   : subset of (spin) characters of Irr( CT2 )
##   CHPAR1 : character parameters for the elements of IRR1
##   CHPAR2 : character parameters for the elements of IRR2
##   c      : -1 if spin characters are handled, otherwise 1
##   d      :  2 if spin characters are handled, otherwise 1
## returns a record with components IRR and CHPAR
## containing irreducible (spin) characters of tbl and their
## parameters, respectively

InstallGlobalFunction( SPINSYM_YNG_TSR,
  function( tbl, IRR1, IRR2, CHPAR1, CHPAR2, c, d )
    # c = 1 (for non-spin chars) or -1 (for spin chars)
    # and d = 1 or 2, respectively
    local info, IRR, CHPAR, 1ST, 2ND, pos1, pos2, pos, T,
          i1, i2, phi, psi, chi, nr, j1, j2;

    info:= SpinSymIngredients( tbl )[3];

    # irreducible characters and their parameters
    IRR:= [];
    CHPAR:= [];
    1ST:=  info.1ST;
    2ND:=  info.2ND;
    pos1:= info.pos1;
    pos2:= info.pos2;
    pos:= List( 2ND, i-> i-1 );
    T:= []; # information on the inertia subgroups (for type SS only)

    for i1 in [ 1 .. Length( IRR1 ) ] do
      for i2 in [ 1 .. Length( IRR2 ) ] do
        phi:= IRR1[ i1 ];
        psi:= IRR2[ i2 ];
        chi:= [ ];
        nr:= 0;
        for j1 in pos1 do
          for j2 in pos2 do
            nr:= nr+1;
            chi[ 1ST[ nr ] ]:= phi[ j1 ] * psi[ j2 ];
          od;
        od;
        chi{ 2ND }:= c * chi{ pos };
        Add( IRR, Character( tbl, chi ) );
        Add( CHPAR, [ d, [ CHPAR1[ i1 ][ 2 ], CHPAR2[ i2 ][ 2 ] ] ] );
        if info.type = "AAspinonly" then
          Add( T, [ '+' in CHPAR1[ i1 ][ 2 ] or '-' in CHPAR1[ i1 ][ 2 ],
                    '+' in CHPAR2[ i2 ][ 2 ] or '-' in CHPAR2[ i2 ][ 2 ] ] );
        fi;
      od;
    od;

    if info.type = "AAspinonly" then
      info.T:= T; # remember T for the construction of type SS
    fi;
    return rec( IRR:= IRR, CHPAR:= CHPAR );

  end );


## SPINSYM_YNG_IND( tbl )
##   tbl    : the character table head returned by
##            SPINSYM_YNG_HEAD( k, l, "SS" )
## returns a record with components IRR and CHPAR
## containing irreducible spin characters of tbl and
## their parameters, respectively

InstallGlobalFunction( SPINSYM_YNG_IND,
  function( tbl )
  local AA, AS, SA, FUS, fus, T,
        rAS, rSA, inn, out, pos1,
        IRR, CHPAR, c, d, irr,
        i, j1, j2, j, pos;

  AA:= SpinSymIngredients( tbl )[ 6 ];
  AS:= SpinSymIngredients( tbl )[ 7 ];
  SA:= SpinSymIngredients( tbl )[ 8 ];

  # fusion maps
  FUS:= SpinSymClassFusion2AAin2AS(
              ClassParameters( AA ), ClassParameters( AS ) );
  StoreFusion( AA, FUS, AS );
  # restrict spin characters of AS to AA
  rAS:= Irr( AS ){ [ 1 .. Length( Irr( AS ) ) ] }{ FUS };

  fus:= SpinSymClassFusion2AAin2SA(
              ClassParameters( AA ), ClassParameters( SA ) );
  StoreFusion( AA, fus, SA );
  # restrict spin characters of SA to AA
  rSA:= Irr( SA ){ [ 1 .. Length( Irr( SA ) ) ] }{ fus };

  FUS:= SpinSymClassFusion2ASin2SS(
              ClassParameters( AS ), ClassParameters( tbl ) );
  StoreFusion( AS, FUS, tbl );
  FUS:= SpinSymClassFusion2SAin2SS(
              ClassParameters( SA ), ClassParameters( tbl ) );
  StoreFusion( SA, FUS, tbl );
  FUS:= CompositionMaps( FUS, fus );
  StoreFusion( AA, FUS, tbl );

  T:= SpinSymIngredients( AA )[ 3 ].T;
  # now T[i] = [ true, true ]   means that T(chi)/AA = 1, i.e. T(chi)=AA
  # now T[i] = [ true, false ]  means that T(chi)/AA = <t2>, i.e. T(chi)=AS
  # now T[i] = [ false, true ]  means that T(chi)/AA = <t1>, i.e. T(chi)=SA
  # now T[i] = [ false, false ] means that T(chi)/AA = <t1> x <t2>

  inn:=  [];  # positions of inner classes, i.e. classes of AA in SS
  out:=  [];  # positions of outer classes, i.e. classes of SS \ AA
  pos1:= [];
  IRR:=  [];
  CHPAR:=[];

  for i in [ 1 .. NrConjugacyClasses( tbl ) ] do
    c:= ClassParameters( tbl )[ i ][ 2 ];
    if SignPartition( c[ 1 ] ) = 1 and SignPartition( c[ 2 ] ) = 1 then
      Add( inn, i );
      Add( pos1, Position( FUS, i ) );
    else
      Add( out, i );
    fi;
  od;
  irr:= Irr( AA );

  for i in [ 1 .. Length( T ) ] do
    j1:= T[ i ][ 1 ];
    j2:= T[ i ][ 2 ];
    if j1 and j2 then
      c:= InducedClassFunction( irr[ i ], tbl );
      if not c in IRR then
        Add( IRR, Character( tbl, c ) );
        d:= CharacterParameters( AA )[ i ];
        Add( CHPAR, [ 2, [ [ d[2][1][1], "+-" ], [ d[2][2][1], "+-" ] ] ] );
      fi;
    elif j1 and not j2 then
      pos:= Positions( rAS, irr[ i ] );
      for j in pos do
        c:= InducedClassFunction( Irr( AS )[ j ], tbl );
        if not c in IRR then
          Add( IRR, Character( tbl, c ) );
          d:= CharacterParameters( AS )[ j ];
          Add( CHPAR, [ 2, [ d[2][1][1], d[2][2] ] ] );
        fi;
      od;
    elif not j1 and j2 then
      pos:= Positions( rSA, irr[ i ] );
      for j in pos do
        c:= InducedClassFunction( Irr( SA )[ j ], tbl );
        if not c in IRR then
          Add( IRR, Character( tbl, c ) );
          d:= CharacterParameters( SA )[ j ];
          Add( CHPAR, [ 2, [ d[2][1], d[2][2][1] ] ]  );
        fi;
      od;
    else
      # chi=irr[i]^SS vanishes outside AA and its restriction
      # to AA is 2*phi=2*irr[i]
      c:= irr[ i ];
      d:= [];
      for j in out do
        d[ j ]:= 0;
      od;
      for j in [ 1 .. Length( inn ) ] do
        d[ inn[ j ] ]:= 2 * c[ pos1[ j ] ];
      od;
      c:= Character( tbl, d );
      if not c in IRR then
        Add( IRR, Character( tbl, c ) );
        d:= CharacterParameters( AA )[ i ];
        Add( CHPAR, [ 2, [ d[2][1], d[2][2] ] ]  );
      fi;
    fi;
  od;

  return rec( IRR:= IRR, CHPAR:= CHPAR );
  end );


## SPINSYM_YNG_IRR( tbl )
## constructs and stores the full set of irreducible
## characters of tbl and the corresponding parameters

InstallGlobalFunction( SPINSYM_YNG_IRR, function( tbl )
  local info, IRR, CHPAR, IRR1, IRR2,
        CHPAR1, CHPAR2, R, NR1, NR2,
        p, ordtbl, AA, AS, SA;

  info:= SpinSymIngredients( tbl )[ 3 ];
  IRR:= [];
  CHPAR:= [];
  if not IsSubset( info.type, "spinonly" ) then

    # get all irreducible (Brauer) characters
    IRR1:= Irr( SpinSymIngredients( tbl )[1] ){ [ 1 .. info.nr1 ] };
    IRR2:= Irr( SpinSymIngredients( tbl )[2] ){ [ 1 .. info.nr2 ] };
    CHPAR1:= CharacterParameters( SpinSymIngredients( tbl )[1] ){ [ 1 .. info.nr1 ] };
    CHPAR2:= CharacterParameters( SpinSymIngredients( tbl )[2] ){ [ 1 .. info.nr2 ] };
    R:= SPINSYM_YNG_TSR( tbl, IRR1, IRR2, CHPAR1, CHPAR2, 1, 1 );
    Append( IRR, R.IRR );
    Append( CHPAR, R.CHPAR );
    # now IRR contains all non-spin irreducibles

  fi;

  if info.type{[1,2]} <> "SS" then

    # construct spin-characters (for type AA, AS, or SA)
    NR1:= NrConjugacyClasses( SpinSymIngredients( tbl )[1] );
    NR2:= NrConjugacyClasses( SpinSymIngredients( tbl )[2] );
    IRR1:= Irr( SpinSymIngredients( tbl )[1] ){ [ info.nr1 + 1 .. NR1 ] };
    IRR2:= Irr( SpinSymIngredients( tbl )[2] ){ [ info.nr2 + 1 .. NR2 ] };
    CHPAR1:= CharacterParameters( SpinSymIngredients( tbl )[1] ){ [ info.nr1 + 1 .. NR1 ] };
    CHPAR2:= CharacterParameters( SpinSymIngredients( tbl )[2] ){ [ info.nr2 + 1 .. NR2 ] };
    R:= SPINSYM_YNG_TSR( tbl, IRR1, IRR2, CHPAR1, CHPAR2, -1, 2 );
    Append( IRR, R.IRR );
    Append( CHPAR, R.CHPAR );
    # now IRR contains all spin irreducibles

  else # type SS

    # construct spin-characters of 2.(Sym(k)xSym(l))

    p:= UnderlyingCharacteristic( tbl );

    # we need some more ingredients:
    #   partial character tables of type AA, AS, SA
    #   (without power maps, spin chars only)
    if p = 0 then
      AA:= SPINSYM_YNG_HEAD( info.k, info.l, "AA" );
      AS:= SPINSYM_YNG_HEAD( info.k, info.l, "AS",
            SpinSymIngredients( AA )[1],      # 2.Alt(k)
            SpinSymIngredients( tbl )[2] );   # 2.Sym(l)
      SA:= SPINSYM_YNG_HEAD( info.k, info.l, "SA",
            SpinSymIngredients( tbl )[1],       # 2.Sym(k)
            SpinSymIngredients( AA )[2] );      # 2.Alt(l)
    else

      ordtbl:= OrdinaryCharacterTable( tbl );
      AA:= SPINSYM_YNG_HEADREG( SpinSymIngredients( ordtbl )[ 6 ], p );
      AS:= SPINSYM_YNG_HEADREG( SpinSymIngredients( ordtbl )[ 7 ], p );
      SA:= SPINSYM_YNG_HEADREG( SpinSymIngredients( ordtbl )[ 8 ], p );

    fi;

    SpinSymIngredients( AA )[ 3 ].type:= "AAspinonly";
    SPINSYM_YNG_IRR( AA );

    SpinSymIngredients( AS )[ 3 ].type:= "ASspinonly";
    SPINSYM_YNG_IRR( AS );

    SpinSymIngredients( SA )[ 3 ].type:= "SAspinonly";
    SPINSYM_YNG_IRR( SA );

    SpinSymIngredients( tbl )[ 6 ]:= AA;
    SpinSymIngredients( tbl )[ 7 ]:= AS;
    SpinSymIngredients( tbl )[ 8 ]:= SA;

    # now we are ready to construct the spin chars via
    # inducing up to SS from AA (possibly along AS or SA)

    R:= SPINSYM_YNG_IND( tbl );
    Append( IRR, R.IRR );
    Append( CHPAR, R.CHPAR );

  fi;

  SetIrr( tbl, IRR );
  SetCharacterParameters( tbl, CHPAR );
  return tbl;

  end );


## SpinSymCharacterTableOfMaximalYoungSubgroup( k, l, type )
##   k    : an integer greater than 1
##   l    : an integer greater than 1
##   type : a string "Alternating",
##                   "AlternatingSymmetric",
##                   "SymmetricAlternating", or
##                   "Symmetric"
## returns an ordinary character table of
## 2.(Alt(k) x Alt(l)), 2.(Alt(k) x Sym(l)), 2.(Sym(k) x Alt(l)),
## or 2.(Sym(k) x Sym(l)), respectively, depending on the value
## of type.

InstallGlobalFunction(
  SpinSymCharacterTableOfMaximalYoungSubgroup,
  function( k, l, type )
    local tbl, ty;

      if not IsInt(k) or not IsInt(l) or k < 2 or l < 2 then
        Error( "both <k> and <l> must be integers greater than 1; " );
      fi;

      if type = "Alternating" then
        ty:= "AA";
      elif type = "AlternatingSymmetric" then
        ty:= "AS";
      elif type = "SymmetricAlternating" then
        ty:=  "SA";
      elif type = "Symmetric" then
        ty:= "SS";
      else
        Error( "<type> must be \"Alternating\", \"AlternatingSymmetric\",\
               \"SymmetricAlternating\", or \"Symmetric\"; " );
        return fail;
      fi;

      tbl:= SPINSYM_YNG_HEAD( k, l, ty );
      SPINSYM_YNG_POWERMAPS( tbl );
      SPINSYM_YNG_IRR( tbl );
      SetFilterObj( tbl, IsSpinSymTable );
      return tbl;

    end );


#############################################################################
##
##  taken from Thomas' ctadmin.tbi -- just a hack for the mod-2 case in order
##  to deal with character parameters
##  obsolete if Thomas agrees to add the part that is marked by #LM below
##  to the original function
##
#F  SPINSYM_BrauerTableFromLibrary( <ordtbl>, <prime> )
##
InstallGlobalFunction( SPINSYM_BrauerTableFromLibrary, function( ordtbl, prime )
    local op, orders, nccl, entry, fusion, facttbl, mfacttbl, reg;

      op:= ClassPositionsOfPCore( ordtbl, prime );
      orders:= OrdersClassRepresentatives( ordtbl );
      nccl:= NrConjugacyClasses( ordtbl );
      for entry in ComputedClassFusions( ordtbl ) do
        fusion:= entry.map;
        if Filtered( [ 1 .. nccl ], i -> fusion[i] = 1 ) = op then

          # We found the ordinary factor for which the Brauer characters
          # are equal to the ones we need.
          facttbl:= CharacterTableFromLibrary( entry.name );
          if facttbl = fail then
            return fail;
          fi;
          mfacttbl:= BrauerTable( facttbl, prime );
          if mfacttbl = fail then
            return fail;
          fi;

          # Now we set up a *new* Brauer table since the ordinary table
          # as well as the blocks information for the factor group is
          # different from the one for the extension.
          reg:= CharacterTableRegular( ordtbl, prime );

          # Set the irreducibles.
          # Note that the ordering of classes is in general *not* the same,
          # so we must translate with the help of fusion maps.
          fusion:= CompositionMaps(
                    InverseMap( GetFusionMap( mfacttbl, facttbl ) ),
                    CompositionMaps( GetFusionMap( ordtbl, facttbl ),
                                     GetFusionMap( reg, ordtbl ) ) );
          SetIrr( reg, List( Irr( mfacttbl ),
              chi -> Character( reg,
                  ValuesOfClassFunction( chi ){ fusion } ) ) );

          # Set known attribute values that can be copied from `mfacttbl'.
          if HasAutomorphismsOfTable( mfacttbl ) then
            SetAutomorphismsOfTable( reg, AutomorphismsOfTable( mfacttbl )
                ^ Inverse( PermList( fusion ) ) );
          fi;
          if HasInfoText( mfacttbl ) then
            SetInfoText( reg, InfoText( mfacttbl ) );
          fi;
          if HasComputedIndicators( mfacttbl ) then
            SetComputedIndicators( reg, ComputedIndicators( mfacttbl ) );
          fi;

       #LM starts here
          if HasCharacterParameters( mfacttbl ) then
            SetCharacterParameters( reg, CharacterParameters( mfacttbl ) );
          fi;
       #LM ends here

          # Return the table.
          return reg;

        fi;
      od;

  end );


#############################################################################


## SpinSymBrauerTableOfMaximalYoungSubgroup( ordtbl, p )
##   ordtbl : an ordinary character table constructed by
##            SpinSymCharacterTableOfMaximalYoungSubgroup
##   p      : a rational prime
## returns the p-modular character table of ordtbl

InstallGlobalFunction(
  SpinSymBrauerTableOfMaximalYoungSubgroup,
  function( ordtbl, p )
    local modtbl, ct1, ct2, ct;

      if not IsPrimeInt( p ) then
        Error( "<p> must be a rational prime; " );
      fi;
      if not ( IsSpinSymTable( ordtbl ) and
               IsOrdinaryTable( ordtbl ) ) then
        Error( "<ordtbl> must be constructed by the function \
        SpinSymCharacterTableOfMaximalYoungSubgroup(); " );
      fi;

      # CTblLib construction for p = 2
      if p = 2 then
        modtbl:= CharacterTableRegular( ordtbl, p );
        SetClassParameters( modtbl,
           ClassParameters( ordtbl ){ GetFusionMap( modtbl, ordtbl ) } );
        ##ct1:= SpinSymIngredients( ordtbl )[ 1 ] mod p;
        ##ct2:= SpinSymIngredients( ordtbl )[ 2 ] mod p;
        ## remove the following two lines and uncomment the previous ones
        ## as soon as the hack SPINSYM_BrauerTableFromLibrary disappears
        ct1:= SPINSYM_BrauerTableFromLibrary( SpinSymIngredients( ordtbl )[ 1 ], p);
        ct2:= SPINSYM_BrauerTableFromLibrary( SpinSymIngredients( ordtbl )[ 2 ], p);

        if ct1 = fail or ct2 = fail then
          return fail;
        else
          ct:= CharacterTableDirectProduct( ct1, ct2 );
          SetIrr( modtbl, Irr( ct ) );
          SetCharacterParameters( modtbl,
            Cartesian( CharacterParameters( ct1 ),
                       CharacterParameters( ct2 ) ) );
          return modtbl;
        fi;
      fi;

      # for p > 2 use the SpinSym construction
      if not HasSpinSymIngredients( ordtbl ) then
        Error( "missing ingredients of <ordtbl>; " );
      fi;

      modtbl:= SPINSYM_YNG_HEADREG( ordtbl, p );
      SPINSYM_YNG_IRR( modtbl );

      Unbind( modtbl!.SpinSymIngredients );

      return modtbl;
    end );


## access the Brauer table via the `mod'-operator

InstallMethod( BrauerTableOp,
  Concatenation( "for an ordinary character table created by ",
                  "SpinSymCharacterTableOfMaximalYoungSubgroup() and a positive ",
                "rational prime") ,
  [ IsSpinSymTable, IsPosInt ],
  function( ordtbl, p )

    return SpinSymBrauerTableOfMaximalYoungSubgroup( ordtbl, p );

  end );

[ Verzeichnis aufwärts0.69unsichere Verbindung  Übersetzung europäischer Sprachen durch Browser  ]