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 17 kB image not shown  

Quelle  fus.gi   Sprache: unbekannt

 
#############################################################################
##
##  fus.gi                  The SpinSym Package                 Lukas Maas
##
##  Class fusion maps between some subgroups of 2.Sym(n)
##  Copyright (C) 2012 Lukas Maas
##
#############################################################################

## SOURCE ................ DEST ................ FUNCTION
## 2.Alt(n) .............. 2.Sym(n) ............ SpinSymClassFusion2Ain2S
## 2.Sym(k) .............. 2.Sym(n) ............ SpinSymClassFusion2Sin2S
## 2.Alt(k) .............. 2.Alt(n) ............ SpinSymClassFusion2Ain2A
## 2.Sym(n-2) ............ 2.Alt(n) ............ SpinSymClassFusion2Sin2A
## 2.(Sym(k) x Sym(l)) ... 2.Sym(k+l) .......... SpinSymClassFusion2SSin2S
## 2.(Sym(k) x Alt(l)) ... 2.(Sym(k) x Sym(l)) . SpinSymClassFusion2SAin2SS
## 2.(Alt(k) x Sym(l)) ... 2.(Sym(k) x Sym(l)) . SpinSymClassFusion2ASin2SS
## 2.(Alt(k) x Alt(l)) ... 2.(Sym(k) x Alt(l)) . SpinSymClassFusion2AAin2SA
## 2.(Alt(k) x Alt(l)) ... 2.(Alt(k) x Sym(l)) . SpinSymClassFusion2AAin2AS
## 2.(Alt(k) x Alt(l)) ... 2.Alt(k+l) .......... SpinSymClassFusion2AAin2A

## for m=n,k,l we denote:
## Sym(m) .... Sm
## Alt(m) .... Am
## 2.Sym(m) .. 2Sm
## 2.Alt(m) .. 2Sm

#############################################################################
## HELPER FUNCTIONS

## SPINSYM_IsAPD( <tau> ) ....... { All Parts Distinct }
## INPUT .... a list <tau> of integers
## OUTPUT ... true iff <tau> has pairwise distinct entries

BindGlobal( "SPINSYM_IsAPD", function( tau )

  return Length( Set( tau ) ) = Length( tau );

end );


## SPINSYM_IsAPO( <tau> ) ......... { All Parts Odd }
## INPUT .... a list <tau> of integers
## OUTPUT ... true iff all entries of <tau> are odd

BindGlobal( "SPINSYM_IsAPO", function( tau )

  return ForAll( tau, IsOddInt );

end );


#############################################################################
## USER FUNCTIONS

## SpinSymClassFusion2Ain2S( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.Alt(n)
## .......... class parameters <cclY> of 2.Sym(n)
## see \cite{Maas2011}*{(5.4.1)}

InstallGlobalFunction( SpinSymClassFusion2Ain2S, function( cclX, cclY )
  local fus, x, y, z;

  fus:= [];
  for x in cclX do
    if '+' in x[2] or '-' in x[2] then
      y:= x[2][1];
    else
      y:= x[2];
    fi;
    if SPINSYM_IsAPO( y ) and SPINSYM_IsAPD( y ) then
      ## y in O(n)\cap D^+(n):
      ## +\- split classes of corresponding type (1\2) fuse in 2.Sym(n)
      z:= [ x[1], y ];
    elif SPINSYM_IsAPO(y) then
      ## y in O(n) but not in D^+(n):
      ## there is a class in 2.Sym(n) of corresponding type (1\2)
      z:= [ x[1], y ];
    else
      ## y in D^+(n) but not in O(n), or y is not in O(n)\cup D(n):
      ## either the classes of type 1 and 2 fuse in 2.Sym(n),
      ## or there is only one class of type 1 in both 2.Alt(n) and 2.Sym(n)
      z:= [ 1, y ];
    fi;
    Add( fus, Position( cclY, z ) );
  od;
  return fus;

end );


## SpinSymClassFusion2Sin2S( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.Sym(k)
## .......... class parameters <cclY> of 2.Sym(n) for k<n
## see \cite{Maas2011}*{(5.4.2)}

## RECALL: the 1\2 split classes of 2.Sym(n) are parameterized by O(n)\cup D^-(n).

InstallGlobalFunction( SpinSymClassFusion2Sin2S, function( cclX, cclY )
  local m, fus, x, y, z;

  m:= Sum( cclY[1][2] ) - Sum( cclX[1][2] );
  m:= ListWithIdenticalEntries( m, 1 );
  fus:= [ ];
  for x in cclX do
    y:= Concatenation( x[2], m );
    if SPINSYM_IsAPO( y ) then
      ## x is split in 2.Sym(k) and y is still split in 2.Sym(n)
      z:= [ x[1], y ];
    elif SPINSYM_IsAPD( y ) and SignPartition(y)=-1 then
      ## k=n-1 and no part of x equals 1:
      ## y is split in 2.Sym(n)
      z:= [ x[1], y ];
    else
      z:= [ 1, y ];
    fi;
    Add( fus, Position( cclY, z ) );
  od;
  return fus;

end );


## SpinSymClassFusion2Ain2A( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.Alt(k)
## .......... class parameters <cclY> of 2.Alt(n) for k<n
## see \cite{Maas2011}*{(5.4.3)}

## RECALL: the 1\2 split classes of 2.Alt(n) are parameterized by O(n)\cup D^+(n);
## RECALL: the +\- split classes of Alt(n) are parameterized by O(n)\cap D^+(n).
## If x in O(n)\cap D^+(n), then there are the following four classes in 2.Alt(n):
##  1_x+ = [ 1, [ x, '+' ] ]
##  2_x+ = [ 2, [ x, '+' ] ]
##  1_x- = [ 1, [ x, '-' ] ]
##  2_x- = [ 2, [ x, '-' ] ]

InstallGlobalFunction( SpinSymClassFusion2Ain2A, function( cclX, cclY )
  local filt, m, fus, x, y, z;

  filt:= function(x)
    return Flat(Filtered(x,y->not IsChar(y)));
  end;
  m:= Sum( filt(cclY[1][2]) ) - Sum( filt(cclX[1][2]) );
  m:= ListWithIdenticalEntries( m, 1 );
  fus:= [ ];
  for x in cclX do
    if '+' in x[2] or '-' in x[2] then
      y:= Concatenation( x[2][1], m );
    else
      y:= Concatenation( x[2], m );
    fi;
    if SPINSYM_IsAPO( y ) and SPINSYM_IsAPD( y ) then
      ## k = n-1 and 1 is not a part of x:
      ## then 1\2_x+- of 2.Alt(k) corresponds to 1\2_y+- in 2.Alt(n)
      z:= [ x[1], [ y, x[2][2] ] ];
    elif SPINSYM_IsAPO( y ) or SPINSYM_IsAPD( y ) then
      ## y is a 1\2 split class in 2.Alt(n);
      ## the +\- split classes fuse in 2.Alt(n) in correspondence with their type 1\2
      z:= [ x[1], y ];
    else
      z:= [ 1, y ];
    fi;
    Add( fus, Position( cclY, z ) );
  od;
  return fus;

end );


## SpinSymClassFusion2Sin2A( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.Sym(n-2)
## .......... class parameters <cclY> of 2.Alt(n)
## see \cite{Maas2011}*{(5.4.4)}

InstallGlobalFunction( SpinSymClassFusion2Sin2A, function( cclX, cclY )
  local fus, x, y, z;

  fus:= [];
  for x in cclX do
    y:= x[2];
    if SignPartition( y ) = 1 then
      z:= Concatenation( y, [1,1] );
      if SPINSYM_IsAPO( y ) then
        z:= [ x[1], z ];
      else
        z:= [ 1, z ];
      fi;
    else ## SignPartition( y ) = -1
      z:= Reversed( SortedList( Concatenation( y, [2] ) ) );
      if SPINSYM_IsAPD( y ) and not 2 in y then
        z:= [ x[1], z ];
      else
        z:= [ 1, z ];
      fi;
    fi;
    Add( fus, Position( cclY, z ) );
  od;
  return fus;

end );


## SpinSymClassFusion2SSin2S( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.(Sym(k) x Sym(l))
## .......... class parameters <cclY> of 2.Sym(n) for n=k+l
## see \cite{Maas2011}*{(5.4.5)}

InstallGlobalFunction( SpinSymClassFusion2SSin2S, function( cclX, cclY )
  local fus, x, pi, tau, mu, y, pi_o, pi_e, tau_o, tau_e, o, e, s;

  fus:= [];
  for x in cclX do
    pi:=  x[2][1];
    tau:= x[2][2];
    mu:= Reversed( SortedList( Concatenation( pi, tau ) ) );
    if SPINSYM_IsAPO( mu ) then
      y:= [ x[1], mu ];
    elif SPINSYM_IsAPD( mu ) and SignPartition( mu ) = -1 then
      pi_o:= Filtered( pi, k-> k mod 2 = 1 );
      pi_e:= Filtered( pi, k-> k mod 2 = 0 );
      tau_o:= Filtered( tau, k-> k mod 2 = 1 );
      tau_e:= Filtered( tau, k-> k mod 2 = 0 );
      ## number of shuffles (i,j) -> (j,i) with i=j=1 mod 2:
      o:= List( tau_o, i-> Number( pi_o, j-> j<i ) );
      ## number of shuffles (i,j) -> (j,i) with i=j=0 mod 2:
      e:= List( tau_e, i-> Number( pi_e, j-> j<i ) );
      s:= ( Sum(o) + Sum(e) ) mod 2;
      if s = 0 then
        y:= [ x[1], mu ];
      else ## 1\2_x corresponds to 2\1_mu
        y:= [ x[1] mod 2 + 1, mu ];
      fi;
    else ## mu is not in O(n) or D^-(n)
      y:= [ 1, mu ];
    fi;
    Add( fus, Position( cclY, y ) );
  od;
  return fus;

end );


## SpinSymClassFusion2SAin2SS( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.(Sym(k) x Alt(l))
## .......... class parameters <cclY> of 2.(Sym(k) x Sym(l))
## see \cite{Maas2011}*{(5.4.6)}

InstallGlobalFunction( SpinSymClassFusion2SAin2SS, function( cclX, cclY )
  local fus, x, pi, xtau, tau, y;

  fus:= [];
  for x in cclX do
    pi:=   x[2][1];
    xtau:= x[2][2];
    if '+' in xtau or '-' in xtau then
      tau:= xtau[1];
    else
      tau:= xtau;
    fi;
    if SPINSYM_IsAPO( pi ) and SPINSYM_IsAPO( tau ) then
      if not SPINSYM_IsAPD( tau ) then
        ## (pi,tau) is in O(k) x (O(l)\D^+(l))
        y:= [ x[1], [ pi, tau ] ];
      else
        ## (pi,tau) is in O(k) x (O(l)\cap D^+(l))
        if '+' in xtau then
          y:= [ x[1], [ pi, tau ] ];
        else ## '-' in xtau
          y:= [ x[1], [ pi, tau ] ]; ## since pi is even
        fi;
      fi;
    elif SPINSYM_IsAPD( pi ) and SignPartition( pi ) = -1 and SPINSYM_IsAPD( tau ) then
      ## now (pi,tau) is in D(k)^- x D^+(k)
      if not SPINSYM_IsAPO( tau ) then
        y:= [ x[1], [ pi, tau ] ];
      else
        ## (pi,tau) is in D^-(k) x (O(l)\cap D^+(l))
        if '+' in xtau then
          y:= [ x[1], [ pi, tau ] ];
        else ## '-' in xtau
          y:= [ x[1] mod 2 + 1, [ pi, tau ] ]; ## since pi is odd
        fi;
      fi;
    else
      ## (pi,tau) is not split in 2.(Sym(k) x Sym(l))
      y:= [ 1, [ pi, tau ] ];
    fi;
    Add( fus, Position( cclY, y ) );
  od;
  return fus;

end );


## SpinSymClassFusion2ASin2SS( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.(Alt(k) x Sym(l))
## .......... class parameters <cclY> of 2.(Sym(k) x Sym(l))

InstallGlobalFunction( SpinSymClassFusion2ASin2SS, function( cclX, cclY )
  local fus, x, xpi, pi, tau, y;

  fus:= [];
  for x in cclX do
    xpi:= x[2][1];
    tau:= x[2][2];
    if '+' in xpi or '-' in xpi then
      pi:= xpi[1];
    else
      pi:= xpi;
    fi;
    if SPINSYM_IsAPO( pi ) and SPINSYM_IsAPO( tau ) then
      if not SPINSYM_IsAPD( pi ) then
        y:= [ x[1], [ pi, tau ] ];
      else
        if '+' in xpi then
          y:= [ x[1], [ pi, tau ] ];
        else ## '-' in xpi
          y:= [ x[1], [ pi, tau ] ];
        fi;
      fi;
    elif SPINSYM_IsAPD( pi ) and SPINSYM_IsAPD( tau ) and SignPartition( tau ) = -1 then
      if not SPINSYM_IsAPO( pi ) then
        y:= [ x[1], [ pi, tau ] ];
      else
        if '+' in xpi then
          y:= [ x[1], [ pi, tau ] ];
        else ## '-' in xpi
          y:= [ x[1] mod 2 + 1, [ pi, tau ] ];
        fi;
      fi;
    else
      y:= [ 1, [ pi, tau ] ];
    fi;
    Add( fus, Position( cclY, y ) );
  od;
  return fus;

end );


## SpinSymClassFusion2AAin2SA( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.(Alt(k) x Alt(l))
## .......... class parameters <cclY> of 2.(Sym(k) x Alt(l))
## see \cite{Maas2011}*{(5.4.7)}

InstallGlobalFunction( SpinSymClassFusion2AAin2SA, function( cclX, cclY )
  local fus, x, xpi, pi, tau, y, pos;

  fus:= [ ];
  for x in cclX do
    xpi:= x[2][1];
    tau:= x[2][2];
    if '+' in xpi or '-' in xpi then
      pi:= xpi[1];
    else
      pi:= xpi;
    fi;
    y:= [ x[1], [ pi, tau ] ];
    ## 1\2_x corresponds to 1\2_y if there are split classes 1_y and 2_y
    ## otherwise, 1\2_x fuse in 1_y
    pos:= Position( cclY, y );
    if pos = fail then
      y:= [ 1, [ pi, tau ] ];
      pos:= Position( cclY, y );
    fi;
    Add( fus, pos );
  od;
  return fus;

end );


## SpinSymClassFusion2AAin2AS( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.(Alt(k) x Alt(l))
## .......... class parameters <cclY> of 2.(Alt(k) x Sym(l))

InstallGlobalFunction( SpinSymClassFusion2AAin2AS, function( cclX, cclY )
  local fus, x, pi, xtau, tau, y, pos;

  fus:= [ ];
  for x in cclX do
    pi:= x[2][1];
    xtau:= x[2][2];
    if '+' in xtau or '-' in xtau then
      tau:= xtau[1];
    else
      tau:= xtau;
    fi;
    y:= [ x[1], [ pi, tau ] ];
    ## 1\2_x corresponds to 1\2_y if there are split classes 1_y and 2_y
    ## otherwise, 1\2_x fuse in 1_y
    pos:= Position( cclY, y );
    if pos = fail then
      y:= [ 1, [ pi, tau ] ];
      pos:= Position( cclY, y );
    fi;
    Add( fus, pos );
  od;
  return fus;

end );


## SpinSymClassFusion2AAin2A( <cclX>, <cclY> )
## INPUT .... class parameters <cclX> of 2.(Alt(k) x Alt(l))
## .......... class parameters <cclY> of 2.Alt(n) for n=k+l
## see \cite{Maas2011}*{(5.4.8)}

## RECALL: the 1\2 split classes of 2.Alt(n) are parameterized by O(n)\cup D^+(n);
## RECALL: the +\- split classes of Alt(n) are parameterized by O(n)\cap D^+(n).

InstallGlobalFunction( SpinSymClassFusion2AAin2A, function( cclX, cclY )
  local splittype, fus, x, xpi, xtau, pi, tau, sgnpi, sgntau,
        mu, y, pi_o, pi_e, tau_e, o, e, f, type;

  splittype:= function( tau )
    if SPINSYM_IsAPO( tau ) and SPINSYM_IsAPD( tau ) then
      return [ tau, '+' ];
    else
      return tau;
    fi;
  end;

  fus:= [];
  for x in cclX do
    xpi:= x[2][1];
    xtau:= x[2][2];
    if '+' in xpi or '-' in xpi then
      pi:= xpi[1];
      sgnpi:= xpi[2];
    else
      pi:= xpi;
      sgnpi:= '+';
    fi;
    if '+' in xtau or '-' in xtau then
      tau:= xtau[1];
      sgntau:= xtau[2];
    else
      tau:= xtau;
      sgntau:= '+';
    fi;
    mu:= Reversed( SortedList( Concatenation( pi, tau ) ) );

    if not SPINSYM_IsAPO( mu ) and not SPINSYM_IsAPD( mu ) then

      y:= [ 1, mu ];

    else

      pi_o:= Filtered( pi, t-> t mod 2 = 1 );
      pi_e:= Filtered( pi, t-> t mod 2 = 0 );
      tau_e:= Filtered( tau, t-> t mod 2 = 0 );
      e:= Sum( List( tau_e, i-> Number( pi, j-> j<i ) ) );
      o:= Sum( List( tau, i-> Number( pi_o, j-> j<i ) ) );
      f:= Length( pi_e ) + Length( tau_e );
      type:= Set( [ sgnpi, sgntau ] ); ## "+-", "+", or "-"
      if x[1] = 2 then
        e:= e+1; ## second class
      fi;

      if type = "+" or type = "-" then

        if o mod 2 = 0 then
          y:= [ e, splittype(mu)  ];
        elif f > 0 then ## o is odd
          y:= [ e+f-1, mu ];
        elif not SPINSYM_IsAPD(mu) then ## o is odd and f=0
          y:= [ e, mu ];
        else
          y:= [ e, [ mu, '-' ] ];
        fi;

      else # type = "+-"

        if o mod 2 = 1 then
          y:= [ e, splittype( mu ) ];
        elif f > 0 then ## o is even
          y:= [ e+f-1, mu ];
        elif not SPINSYM_IsAPD(mu) then ## o is even and f=0
          y:= [ e, mu  ];
        else
          y:= [ e, [ mu, '-' ] ];
        fi;

      fi;

      ## y[1]=1 if the exponent of z in even, y[2]=2 otherwise
      y:= [ y[1] mod 2 + 1, y[2] ];

    fi;
    Add( fus, Position( cclY, y ) );
  od;
  return fus;

end );


#############################################################################
## MAIN USER FUNCTION
## SpinSymClassFusion( <X>, <Y> )
## INPUT .... (ordinary or modular) 'generic' character table <X> of SOURCE
## .......... (ordinary or modular) 'generic' character table <Y> of DEST
## .......... where the possible pairs of SOURCE and DEST are
## .......... ...............................................
## .......... SOURCE ................ DEST ..................
## .......... 2.Alt(n) .............. 2.Sym(n)
## .......... 2.Sym(k) .............. 2.Sym(n)
## .......... 2.Alt(k) .............. 2.Alt(n)
## .......... 2.Sym(n-2) ............ 2.Alt(n)
## .......... 2.(Sym(k) x Sym(l)) ... 2.Sym(k+l)
## .......... 2.(Sym(k) x Alt(l)) ... 2.(Sym(k) x Sym(l))
## .......... 2.(Alt(k) x Sym(l)) ... 2.(Sym(k) x Sym(l))
## .......... 2.(Alt(k) x Alt(l)) ... 2.(Sym(k) x Alt(l))
## .......... 2.(Alt(k) x Alt(l)) ... 2.(Alt(k) x Sym(l))
## .......... 2.(Alt(k) x Alt(l)) ... 2.Alt(k+l)

## OUTPUT ... the fusion map fus from SOURCE to DEST as returned by
## .......... SpinSymClassFusionSOURCEinDEST
## .......... the fusion map is stored only if there is no fusion map from
## .......... SOURCE to DEST stored yet

InstallGlobalFunction( SpinSymClassFusion, function( X, Y )
  local idX, idY, S, A, type, cclX, cclY, fus, storedfus;

  idX:= Identifier( X );
  idY:= Identifier( Y );

  S:= Filtered( idX, x-> x = 'S' );
  A:= Filtered( idX, x-> x = 'A' );
  if Length(S) = Length(A) then  ## type 2SA or 2AS
    if Position( idX, 'S' ) < Position( idX, 'A' ) then
      type:= Concatenation( "2", S, A );
    else
      type:= Concatenation( "2", A, S );
    fi;
  else
    type:= Concatenation( "2", S, A );
  fi;
  S:= Filtered( idY, x-> x = 'S' );
  A:= Filtered( idY, x-> x = 'A' );
  if Length(S) = Length(A) then  ## type 2SA or 2AS
    if Position( idY, 'S' ) < Position( idY, 'A' ) then
      type:= Concatenation( type, "fus", "2", S, A );
    else
      type:= Concatenation( type, "fus", "2", A, S );
    fi;
  else
    type:= Concatenation( type, "fus", "2", S, A );
  fi;

  cclX:= ClassParameters( X );
  cclY:= ClassParameters( Y );

  ## call the appropriate SpinSymClassFusionSOURCEinDEST function
  if type="2Afus2S" then
    fus:= SpinSymClassFusion2Ain2S( cclX, cclY );
  elif type="2Sfus2S" then
    fus:= SpinSymClassFusion2Sin2S( cclX, cclY );
  elif type="2Afus2A" then
    fus:= SpinSymClassFusion2Ain2A( cclX, cclY );
  elif type="2Sfus2A" then
    fus:= SpinSymClassFusion2Sin2A( cclX, cclY );
  elif type="2SSfus2S" then
    fus:= SpinSymClassFusion2SSin2S( cclX, cclY );
  elif type="2SAfus2SS" then
    fus:= SpinSymClassFusion2SAin2SS( cclX, cclY );
  elif type="2ASfus2SS" then
    fus:= SpinSymClassFusion2ASin2SS( cclX, cclY );
  elif type="2AAfus2SA" then
    fus:= SpinSymClassFusion2AAin2SA( cclX, cclY );
  elif type="2AAfus2AS" then
    fus:= SpinSymClassFusion2AAin2AS( cclX, cclY );
  elif type="2AAfus2A" then
    fus:= SpinSymClassFusion2AAin2A( cclX, cclY );
  else
    fus:= fail;
  fi;

  ## now store the fusion only if there is no fusion map available
  storedfus:= GetFusionMap( X, Y );
  if storedfus <> fail then
    if storedfus <> fus then
      Print( "#I SpinSymClassFusion: WARNING\n",
      "#I ................... a different fusion map from ", idX, " to ",
      idY, " is stored already\n" );
    fi;
  elif not fail in fus then
    StoreFusion( X, fus, Y );
    Print( "#I SpinSymClassFusion: stored fusion map from ",
           idX, " to ", idY, "\n" );
  else
    return fail;
  fi;
  return fus;

end );

[ Dauer der Verarbeitung: 0.35 Sekunden  (vorverarbeitet)  ]