Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/hap/lib/SimplicialGroups/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 19.6.2025 mit Größe 19 kB image not shown  

Quelle  chainComplexOfSimplicialGroup.gi   Sprache: unbekannt

 
rahmenlose Ansicht.gi DruckansichtUnknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

#############################################################################
#0
#F ChainComplexOfSimplicialGroup
## Input: A simplicial group or a morphism of simplicial groups or 
##    a sequence of morphisms of simplicial groups
## Output: The image of the input under the functor 
##    C: (simplicial groups)->(chain complexes)
##
InstallGlobalFunction(ChainComplexOfSimplicialGroup, function(X)
local 
 AddElement,
 ChainComplexOf_Objpre,
 ChainComplexOf_Obj,
 ChainComplexOf_Morpre,
 ChainComplexOf_Mor,
 ChainComplexOf_Seq;
 
 ######################################################################
 #1
 #F AddElement
 ## Input: A list L=[[m_1,h_1,g_11,...,g_1n],...,[m_k,h_k,g_k1,...,g_kn]]
 ##    and an element x=[m',h',g'_1,...,g'_n]
 ## Output: Add the element x into the list L
 ##
 AddElement:=function(L,x)
 local sx,nx,nL,flag,i,j;

  sx:=StructuralCopy(x);
  nx:=Length(sx); 
  nL:=Length(L);
  for i in [1..nL] do
   flag:=0;
   for j in [2..nx] do
    if L[i][j]<>sx[j] then
       flag:=1;
       break;
    fi;
   od;
   if flag=0 then
    L[i][1]:=L[i][1]+sx[1];
    if L[i][1]=0 then
     Remove(L,i);
    fi;
    return;
   fi;
  od;
  Add(L,sx);
 end;
 ##
 #################### end of AddElement  ##############################
    
 ######################################################################
 #1
 #F ChainComplexOf_Objpre
 ##
 ChainComplexOf_Objpre:=function(N,Maps,Bar,Hap)
 local 
  HapBoundary,Phi,Psi,Equiv,HapDimension,BarMap,
  Dim,BoundChain,ImageBasis,
  i,j,k,n,tmp,t,
  M,m,ii,jj,
  SearchPosition,Dimension,BelowDim,Boundary,
  d0,dm;
  
  #############################################################
  #2
  HapBoundary:= function(i,j,k)  
   return Hap[i+1]!.boundary(j,k);
  end;
  ##
  #############################################################
  #2
  Psi:=function(i,j,w)  
   return Bar[i+1]!.psi(j,w);
  end;
  ##
  #############################################################
  #2
  Phi:=function(i,j,w)  
   return Bar[i+1]!.phi(j,w);
  end;#
  ##
  #############################################################
  #2
  Equiv:=function(i,j,w) 
   return Bar[i+1]!.equiv(j,w);
  end;
  ##
  #############################################################
  #2
  HapDimension:=function(i,j) 
   return Hap[i+1]!.dimension(j);
  end;
  ##
  #############################################################
  
  #############################################################
  #2
  #F BarMap
  ## Input: A position (i,j) and a word w 
  ## Output: The image of w under del_n: B_{i}^j->B_{i-1}^j
  ##
  BarMap:=function(i,j,w) 
  local Rew,sign,ii,jj,x,d,tmp;
  
   if j mod 2 = 0 then
    sign:=1;
   else
    sign:=-1;
   fi;
   Rew:=[];
   for ii in [0..i] do
    d:=Maps(i,ii);
    for x in w do
     tmp:=[sign*x[1]];
     for jj in [1..j] do
      Add(tmp,Image(d,x[jj+1]));
     od;
     AddElement(Rew,tmp);
    od;
    sign:=-sign;
   od;
   return Rew;  
  end;
  ##
  ########## end of BarMap ####################################

        ########## Compute the dimendion of K_n #####################
  Dim:=[];
  for i in [0..N] do
   k:=0;
   for j in [0..i] do;
    k:=k+HapDimension(j,i-j);
   od;
   Dim[i+1]:=k;
  od;
  
  #############################################################
  #2
  Dimension:=function(n)
   return Dim[n+1];
  end;
  ##
  #############################################################
  
  ########### Compute the sum of dimensions under the position(i,j)
  BelowDim:=List([0..N],n->[]);  ###i+1,j+1
  for i in [0..N] do
   for j in [0..N-i] do
    n:=i+j;
    tmp:=0;
    for k in [0..j-1] do
     tmp:=tmp+HapDimension(n-k,k);
    od;
    BelowDim[i+1][j+1]:=tmp;
   od; 
  od;

  ############################################################
  #2
  #F SearchPosition
  ## Input: Numbers n and t 
  ## Output: The position (i,j) and the order of e_t 
  SearchPosition:=function(n,t) 
  local count,j,k; 

   count:=0;
   for j in [0..n] do
    k:=t-count;
    count:=count+HapDimension(n-j,j);
    if t <= count then
     return [n-j,j,k];
     break;
    fi;
   od;
  end;
  ##  
  ########## end of SearchPosition ############################
  
  #############################################################
  #2
  #F d0
  ## Input: A position (i,j) and a basis element e_k
  ## Output: The image of e_k under the map d_0
  ##
  d0:=function(i,j,k) 
  local n,t,beg,Bound,Rew;
  
   n:=i+j;
   if n=0 then
    return [0];
   fi;
   Rew:=List([1..Dimension(n-1)],x->0);   
   if j=0 then 
    return Rew;
   fi;
   beg:=BelowDim[i+1][j];  ##below(i,j-1)
   Bound:=HapBoundary(i,j,k);
   for t in [1..HapDimension(i,j-1)] do
    Rew[beg+t]:=Bound[t];
   od;
  return Rew;
  end;
  ##
  ########## end of d0 ########################################
  
  ########## Compute d_m(e_k) at the postion (i,j) ############
  
  ImageBasis:=[];    
  for i in [1..N] do 
   ImageBasis[i]:=[];              
   for j in [0..N-i]do
    ImageBasis[i][j+1]:=[];
    for m in [1..i] do
     ImageBasis[i][j+1][m]:=[];
    od;
   od;
  od;
  
  ######## Compute ImageBasis[i][j+1][1][k] ################
  for i in [1..N] do
   for j in [0..N-i] do
    for k in [1..HapDimension(i,j)] do
     ImageBasis[i][j+1][1][k]:=BarMap(i,j,Psi(i,j,[[1,k]]));
    od;
   od;
  od; 
  
  ######## Compute for m>1 ###############################
  for i in [2..N]do
   for j in [0..N-i]do
    for m in [2..i] do
     for k in [1..HapDimension(i,j)] do
      tmp:=StructuralCopy(ImageBasis[i][j+1][m-1][k]);
      ImageBasis[i][j+1][m][k]:=BarMap(i-m+1,j+m-1,
        Equiv(i-m+1,j+m-2,tmp));  
     od;
    od;
   od;
  od; 
  
  #############################################################
  #2
  #F dm
  ## Input: A position (i,j) and a basis element e_k
  ## Output: The image of e_k under the map d_m
  ##
  dm:=function(i,j,m,k)  
  local n,t,beg,Rew,Phiw;
   
   n:=i+j;
   if n=0 then
    return [0];
   fi;
   Rew:=List([1..Dimension(n-1)],x->0);   
   if m>i then 
    return Rew;
   fi;
   Phiw:= Phi(i-m,j+(m-1),ImageBasis[i][j+1][m][k]);
   beg:=BelowDim[(i-m)+1][j+(m-1)+1];
   for t in [1..HapDimension(i-m,j+(m-1))] do
    Rew[beg+t]:=Phiw[t];
   od;
   return Rew;
  end;
  ##  
  ########## end of dm ########################################
  
  BoundChain:=List([0..N],x->[]);  
  BoundChain[1][1]:=[0];  
  for n in [1..N] do
   for t in [1..Dimension(n)] do
    M:=SearchPosition(n,t);
    i:=M[1];
    j:=M[2];
    k:=M[3];
    tmp:=d0(i,j,k);
    for m in [1..i] do
     tmp:=tmp+dm(i,j,m,k);  
    od;
   BoundChain[n+1][t]:=tmp;
   od;
  od;
  #############################################################
  #2
  Boundary:=function(n,k)
   return BoundChain[n+1][k];
  end;
  ##
  #############################################################
      
  return Objectify( HapChainComplex, rec(
       boundary:=Boundary,
       dimension:=Dimension,
       properties:= [ [ "length",N],
        [ "type", "chainComplex" ], 
        [ "characteristic",0 ] ] 
      ) );
 end;
 ##
 ############### end of ChainComplexOf_Objpre ##########
 
 ######################################################################
 #1
 #F ChainComplexOf_Obj
 ## Input: A simplicial group G
 ## Output: A chain complex of G
 ##
 ChainComplexOf_Obj:=function(G)
 local N,Maps,Grps,Bar,Hap,Res;
   
  N:=EvaluateProperty(G,"length");
  Maps:=G!.boundariesList;
  Grps:=G!.groupsList;
  Res:=List([0..N],i->ResolutionGenericGroup(Grps(i),N-i));
  Bar:=List([0..N],i->BarComplexEquivalence(Res[i+1]));
  Hap:=List([0..N],i->TensorWithIntegers(Res[i+1]));
  return ChainComplexOf_Objpre(N,Maps,Bar,Hap);
 end;
 ##
 ############### end of ChainComplexOf_Obj ############################
 
 ######################################################################
 #1
 #F ChainComplexOf_Morpre
 ##
 ChainComplexOf_Morpre:=function(N,map,MapsH,BarH,HapH,MapsG,BarG,HapG)
 local 
  PsiH,PhiH,EquivH,HapDimensionH,DimensionH,BarMapH,DimH,
  SearchPosH,ZeroVectorH,ImageBasisH,
  PsiG,PhiG,EquivG,HapDimensionG,DimensionG,BarMapG,DimG,
  SearchPosG,ZeroVectorG,ImgG,Imgs,
  i,j,k,m,n,t,tmp,Tmp,itmp,w,LM,FF,LowDimG,Mapping,
  BarMapHG;
  
  ############### All functions for H #########################
  #############################################################
  #2
  PsiH:=function(i,j,w)  
   return BarH[i+1]!.psi(j,w);
  end;
  ##
  #############################################################
  #2
  PhiH:=function(i,j,w)  
   return BarH[i+1]!.phi(j,w);
  end;
  ##
  #############################################################
  #2
  EquivH:=function(i,j,w) 
   return BarH[i+1]!.equiv(j,w);
  end;
  ##
  #############################################################
  #2
  HapDimensionH:=function(i,j) 
   return HapH[i+1]!.dimension(j);
  end; 
  ##
  #############################################################

  #############################################################
  #2
  #F BarMapH
  ## Input: A position (i,j) and a word w 
  ## Output: The image of w under del_n: BH_{i}^j->BH_{i-1}^j
  ##
  BarMapH:=function(i,j,w) 
  local Rew,sign,ii,jj,x,d,tmp;
  
   if j mod 2 = 0 then
    sign:=1;
   else
    sign:=-1;
   fi;
   Rew:=[];
   for ii in [0..i] do
    d:=MapsH(i,ii);
    for x in w do
     tmp:=[sign*x[1]];
     for jj in [1..j] do
      Add(tmp,Image(d,x[jj+1]));
     od;
     AddElement(Rew,tmp);
    od;
    sign:=-sign;
   od;
   return Rew;  
  end;
  ##
  ########## end of BarMapH ###################################
 
  ########## Compute the dimendion of KH_n ####################
  DimH:=[];
  for i in [0..N] do
   k:=0;
   for j in [0..i] do;
    k:=k+HapDimensionH(j,i-j);
   od;
   DimH[i+1]:=k;
  od;
  #############################################################
  #2
  DimensionH:=function(n)
   return DimH[n+1];
  end;
  ##
  #############################################################
  
  #############################################################
  #2
  #F SearchPosH
  ## Input: Numbers n and t 
  ## Output: The position (i,j) and the order of e_t 
  SearchPosH:=function(n,t)  
  local count,j,k; 
  
   if t>DimensionH(n) then
    return fail;
   fi;
   count:=0;
   for j in [0..n] do
    k:=t-count;
    count:=count+HapDimensionH(n-j,j);
    if t <= count then
     return [n-j,j,k];
     break;
    fi;
   od;
  end;
  ##  
  ########## end of SearchPosition ############################
  
  ############### All functions for G #########################
  #############################################################
  #2
  PsiG:=function(i,j,w)  
   return BarG[i+1]!.psi(j,w);
  end;
  ##
  #############################################################
  #2
  PhiG:=function(i,j,w)  
   return BarG[i+1]!.phi(j,w);
  end;
  ##
  #############################################################
  #2
  EquivG:=function(i,j,w) 
   return BarG[i+1]!.equiv(j,w);
  end;
  ##
  #############################################################
  #2
  HapDimensionG:=function(i,j) 
   return HapG[i+1]!.dimension(j);
  end; 
  ##
  #############################################################

  #############################################################
  #2
  #F BarMapG
  ## Input: A position (i,j) and a word w 
  ## Output: The image of w under del_n: BG_{i}^j->BG_{i-1}^j
  ##
  BarMapG:=function(i,j,w) 
  local Rew,sign,ii,jj,x,d,tmp;
  
   if j mod 2 = 0 then
    sign:=1;
   else
    sign:=-1;
   fi;
   Rew:=[];
   for ii in [0..i] do
    d:=MapsG(i,ii);
    for x in w do
     tmp:=[sign*x[1]];
     for jj in [1..j] do
      Add(tmp,Image(d,x[jj+1]));
     od;
     AddElement(Rew,tmp);
    od;
    sign:=-sign;
   od;
   return Rew;  
  end;
  ##
  ########## end of BarMapG ###################################
  
  ########## Compute the dimendion of KG_n ####################
  DimG:=[];
  for i in [0..N] do
   k:=0;
   for j in [0..i] do;
    k:=k+HapDimensionG(j,i-j);
   od;
   DimG[i+1]:=k;
  od;
  #############################################################
  #2
  DimensionG:=function(n)
   return DimG[n+1];
  end;
  ##
  #############################################################
  
  #############################################################
  #2
  #F SearchPosG
  ## Input: Numbers n and t 
  ## Output: The position (i,j) and the order of e_t 
  SearchPosG:=function(n,t)  
  local count,j,k; 
  
   if t>DimensionG(n) then
    return fail;
   fi;
   count:=0;
   for j in [0..n] do
    k:=t-count;
    count:=count+HapDimensionG(n-j,j);
    if t <= count then
     return [n-j,j,k];
     break;
    fi;
   od;
  end;
  ##  
  ########## end of SearchPosition ############################
  
  #############################################################
  #2
  #F BarMapHG
  ## Input: A position (i,j) and a word w
  ## Output: The image of w under the map_i: BH->BG
  ##
  BarMapHG:=function(i,j,w)  
  local x,f,jj,tmp,Rew;

   f:=map(i);
   Rew:=[];
   for x in w do
    tmp:=[x[1]];
    for jj in [2..j+1] do
       Add(tmp,Image(f,x[jj]));
    od;
    AddElement(Rew,tmp);
   od;
   return Rew;
  end; 
  ##
  ########## end of BarMapHG ##################################
  
  ########## Compute d_m(e_k) at the postion (i,j) in BH ######
  ImageBasisH:=[];    
  for i in [0..N] do 
   ImageBasisH[i+1]:=[];              
   for j in [0..N-i]do
    ImageBasisH[i+1][j+1]:=[];
    for m in [0..i] do
     ImageBasisH[i+1][j+1][m+1]:=[];
    od;
   od;
  od;
  
  ######### Compute for m =1 ##################################
  for i in [0..N] do
   for j in [0..N-i] do
    for m in [0..i] do
     for k in [1..HapDimensionH(i,j)] do
      ImageBasisH[i+1][j+1][m+1][k]:=PsiH(i,j,[[1,k]]);
     od;
    od;
   od;
  od;
  
  ######### Compute for m >1 ##################################
  for i in [1..N]do
   for j in [0..N-i]do
    for m in [1..i] do
     for k in [1..HapDimensionH(i,j)] do
      tmp:=StructuralCopy(ImageBasisH[i+1][j+1][m][k]);
      ImageBasisH[i+1][j+1][m+1][k]:=EquivH(i-m,j+(m-1),
        (BarMapH(i-(m-1),j+(m-1),tmp)));  
     od;
    od;
   od;
  od; 
  
  ########## Compute d_m(e_k) at the postion (i,j) from BH ->BG
  ImgG:=[];    
  for i in [0..N] do 
   ImgG[i+1]:=[];              
   for j in [0..N-i]do
    ImgG[i+1][j+1]:=[];
    for m in [0..i] do
     ImgG[i+1][j+1][m+1]:=[];
    od;
   od;
  od;
  
  for i in [0..N]do
   for j in [0..N-i]do
    for m in [0..i] do
     for k in [1..HapDimensionH(i,j)] do 
     ImgG[i+1][j+1][m+1][k]:=BarMapHG(i-m,j+m,
       ImageBasisH[i+1][j+1][m+1][k]);
     od;
    od;
   od;
  od;  

  Imgs:=[];    
  for i in [0..N] do 
   Imgs[i+1]:=[];              
   for j in [0..N-i]do
    Imgs[i+1][j+1]:=[];
    for m in [0..i] do
     Imgs[i+1][j+1][m+1]:=[];
    od;
   od;
  od;
   
  for i in [0..N]do
   for j in [0..N-i]do
    for k in [1..HapDimensionH(i,j)] do
     Tmp:=List([0..i],m->[]);
     for m in [0..i] do   ##Create Tmp(m,0)
      Tmp[m+1][0+1]:=ImgG[i+1][j+1][m+1][k];
     od;
     for m in [0..i-1] do
      for n in [1..i-m] do
       w:=StructuralCopy(Tmp[m+1][n]); 
       Tmp[m+1][n+1]:=BarMapG(i-(m+(n-1)),j+(m+n),
         EquivG(i-(m+(n-1)),j+(m+(n-1)),w));
      od;
     od;
     for m in [0..i] do
      itmp:=[];
      for n in [0..m] do
       Append(itmp,Tmp[n+1][m-n+1]);
      od;
      Imgs[i+1][j+1][m+1][k]:=PhiG(i-m,j+m,itmp);
     od;
    od;
   od;
  od;  
  
  ########### Compute the sum of dimensions under position(i,j)
  LowDimG:=List([0..N],n->[]);
  for i in [0..N] do
   for j in [0..N-i] do
    n:=i+j;
    tmp:=0;
    for k in [0..j-1] do
     tmp:=tmp+HapDimensionG(n-k,k);
    od;
    LowDimG[i+1][j+1]:=tmp;
   od; 
  od;  
  ####################################
  FF:=List([0..N],n->[]);
  for n in [0..N] do
   for t in [1..DimensionH(n)] do
    LM:=SearchPosH(n,t);
    i:=LM[1];
    j:=LM[2];
    k:=LM[3];  
    Tmp:=List([1..LowDimG[i+1][j+1]],m->0);
    for m in [0..i] do
     Append(Tmp,Imgs[i+1][j+1][m+1][k]);
    od;
    FF[n+1][t]:=Tmp;   
   od;
  od;

  #############################################################
  #2
  #F Mapping
  ##
  Mapping:=function(v,n)
  local Rew,len,k;
   Rew:=List([1..DimensionG(n)],x->0);
   len:=Length(v);
   for k in [1..len] do;
    if v[k] <> 0 then
     Rew:=Rew+v[k]*FF[n+1][k];
    fi;
   od; 
   return Rew;
  end;
  ##
  ########## end of Mapping ###################################
  
 return Mapping;
 end;
 ##
 ############## end of ChainComplexOf_Morpre ##########################
 
 ######################################################################
 #1
 #F ChainComplexOf_Mor
 ## Input: A simplicial map Sf:G->G'
 ## Output: A chain complex of Sf
 ##
 ChainComplexOf_Mor:=function(Sf)
 local 
  map,N,
  H,GrpsH,MapsH,RH,HapH,BarH,
  G,GrpsG,MapsG,RG,HapG,BarG;
  
  H:=Sf!.source;
  G:=Sf!.target;
  map:=Sf!.mapping;
  N:=EvaluateProperty(Sf,"length");

  GrpsH:=H!.groupsList;
  MapsH:=H!.boundariesList;
  RH:=List([0..N],i->ResolutionGenericGroup(GrpsH(i),(N+1)-i));
  HapH:=List([0..N],i->TensorWithIntegers(RH[i+1])); 
  BarH:=List([0..N],i->BarComplexEquivalence(RH[i+1]));
  
  GrpsG:=G!.groupsList;
  MapsG:=G!.boundariesList; 
  RG:=List([0..N],i->ResolutionGenericGroup(GrpsG(i),(N+1)-i));
  HapG:=List([0..N],i->TensorWithIntegers(RG[i+1])); 
  BarG:=List([0..N],i->BarComplexEquivalence(RG[i+1]));
  
  return Objectify( HapChainMap, rec(
     source:=ChainComplexOf_Objpre(N,MapsH,BarH,HapH),
     target:=ChainComplexOf_Objpre(N,MapsG,BarG,HapG),
     mapping:=ChainComplexOf_Morpre(N,map,MapsH,BarH,
        HapH,MapsG,BarG,HapG),
     properties:= [ [ "type", "chainMap" ],
       [ "characteristic",0 ] ] 
     ));
 end;
 ##
 ############### end of ChainComplexOf_Mor ############################
 
 ######################################################################
 #1
 #F ChainComplexOf_Seq
 ## Input: A squence of simplicial maps L
 ## Output: A chain complex of L
 ##
 ChainComplexOf_Seq:=function(L)
 local  
  nL,k,
  LSG,G,N,Grps,Maps,R,Hap,Bar,KG,RewL,map;

  nL:=Length(L);
  LSG:=[];
  for k in [1..nL] do;
   LSG[k]:=L[k]!.source;
  od;
  LSG[nL+1]:=L[nL]!.target;
  Hap:=[];
  Bar:=[];
  Maps:=[];
  KG:=[];
  for k in [1..nL+1] do
   G:=LSG[k];
   N:=EvaluateProperty(G,"length");
   Grps:=G!.groupsList;
   Maps[k]:=G!.boundariesList; 
   R:=List([0..N],i->ResolutionGenericGroup(Grps(i),(N+1)-i));
   Hap[k]:=List([0..N],i->TensorWithIntegers(R[i+1])); 
   Bar[k]:=List([0..N],i->BarComplexEquivalence(R[i+1]));
   KG[k]:=ChainComplexOf_Objpre(N,Maps[k],Bar[k],Hap[k]);
  od;
  
  RewL:=[];
  for k in [1..nL] do
   N:=EvaluateProperty(L[k],"length");
   map:=L[k]!.mapping;
   RewL[k]:=Objectify( HapChainMap, rec(
      source := KG[k],
      target := KG[k+1],
      mapping := ChainComplexOf_Morpre(N,map,Maps[k],
        Bar[k],Hap[k],Maps[k+1],Bar[k+1],Hap[k+1]),
      properties:= [ [ "type", "chainMap" ],
       [ "characteristic",0 ] ] 
     ) );
  od;
  return RewL;
 end;
 ##
 ############## end of ChainComplexOf_Seq #############################

 if IsHapSimplicialGroup(X) then
  return ChainComplexOf_Obj(X);
 fi;

 if IsHapSimplicialGroupMorphism(X) then
  return ChainComplexOf_Mor(X);
 fi;

 if IsList(X) then
  return ChainComplexOf_Seq(X);
 fi;
end);
##
################### end of ChainComplexOfSimplicialGroup ####################

##########################################################
##########################################################
InstallOtherMethod(ChainComplex,
"for simplicial groups",
[IsHapSimplicialGroup],
function(G)
return 
ChainComplexOfSimplicialGroup(G);
end);
##########################################################
##########################################################


[ zur Elbe Produktseite wechseln0.81Quellennavigators  ]