Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


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.7 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge