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

Quelle  modulespecial.gi   Sprache: unbekannt

 
# GAP Implementation
# $Id: specialreps.gi,v 1.12 2012/05/22 14:54:46 sunnyquiver Exp $

#######################################################################
##
#A  IndecProjectiveModules( <A> )
##
##  This function constructs all the indecomposable projective modules
##  over a finite dimensional path algebra or quotient of path algebra. 
##  It returns all the indecomposable projective modules as a list of 
##  modules corresponding to the numbering of the vertices. 
##
InstallMethod ( IndecProjectiveModules, 
    "for a finite dimensional quotient of a path algebra",
    [ IsQuiverAlgebra ], 0,
    function( A ) 
    local   Q,  num_vert,  fam,  K,  num_arrows,  vertices,  
            arrows_as_paths,  mat_list,  list_of_min_gen,  
            dimension_vector_list,  p,  P,  B,  length_B,  
            intervals_of_basis,  i,  j,  zero_vertices,  vertices_Q,  
            mat,  a,  partial_mat,  mat_index,  source,  target,  
            source_index,  target_index,  rows,  cols,  arrow,  
            vector,  indec_proj_list;
    #
    #    Testing input
    #   
    if not IsFiniteDimensional(A) then
        Error("the entered algebra is not finite dimensional,\n");
    fi;
    if not IsPathAlgebra(A) and not IsAdmissibleQuotientOfPathAlgebra(A) then 
        TryNextMethod();
    fi;
    Q := QuiverOfPathAlgebra(A);
    num_vert := Length(VerticesOfQuiver(Q));
    fam := ElementsFamily(FamilyObj(A));
    #
    #    Finding vertices and arrows as elements of the algebra  A  for later use. 
    #
    K := LeftActingDomain(A);
    num_arrows := Length(ArrowsOfQuiver(Q)); 
    vertices := List(VerticesOfQuiver(Q), v -> v*One(A));
    arrows_as_paths := List(ArrowsOfQuiver(Q), a -> a*One(A));
    # 
    #
    #
    mat_list := [];
    list_of_min_gen := [];
    dimension_vector_list := [ ];
    for p in [1..num_vert] do
        #
        #   Finding a K-basis for indecomposable projective associated with vertex  p.
        #
        P := RightIdeal(A,[vertices[p]]);
        B := CanonicalBasis(P);
        length_B := Length(B);
        intervals_of_basis := List([1..num_vert], x -> []);
        for i in [1..Length(B)] do
            for j in [1..num_vert] do
                if ( B[i]*vertices[j] <> Zero(A) ) then
                    Add(intervals_of_basis[j],i);
                fi;
            od;
        od;
        Add( dimension_vector_list, List( intervals_of_basis, Length ) );
        #  
        #   Finding where the indecomposable projective has no support.
        #
        zero_vertices := [];
        for i in [1..num_vert] do
            if ( Length(intervals_of_basis[i]) = 0 ) then
                Add(zero_vertices,i);
            fi;
        od;
        vertices_Q := VerticesOfQuiver(Q); 
        # 
        #   Finding the matrices defining the representation
        # 
        mat := [];
        for a in arrows_as_paths do
            partial_mat := [];
            mat_index := Position(arrows_as_paths,a);
            source := SourceOfPath(TipMonomial(a));
            target := TargetOfPath(TipMonomial(a));
            source_index := Position(vertices_Q,source);
            target_index := Position(vertices_Q,target);
            rows := Length(intervals_of_basis[source_index]);
            cols := Length(intervals_of_basis[target_index]);
            arrow := TipMonomial(a);
            if ( rows <> 0 and cols <> 0 ) then
                for i in intervals_of_basis[source_index] do
                    vector := Coefficients(Basis(P), Basis(P)[i]*a){intervals_of_basis[target_index]};
                    Add(partial_mat,vector);
                od;
                Add(mat,[ String( arrow ),partial_mat]);
            fi;
        od;
        Add(mat_list,mat);
        #
        #   Constructing a generator for each indecomposable projective
        #
        for i in [1..Length(intervals_of_basis)] do
            if intervals_of_basis[i] = [] then
                intervals_of_basis[i] := [Zero(K)];
            else 
                for j in [1..Length(intervals_of_basis[i])] do
                    if intervals_of_basis[i][j] > 1 then 
                        intervals_of_basis[i][j] := Zero(K);
                    else
                        intervals_of_basis[i][j] := One(K);
                    fi;
                od;
            fi;
        od;
        Add(list_of_min_gen,intervals_of_basis);
    od;
    #
    #   Construct the indecomposable projectives and set the generating set
    # 
    indec_proj_list := [];
    for i in [1..num_vert] do    
        Add(indec_proj_list,RightModuleOverPathAlgebra( A, dimension_vector_list[ i ], mat_list[ i ] ) );
        list_of_min_gen[i] := PathModuleElem(FamilyObj(Zero(indec_proj_list[i])![1]),list_of_min_gen[i]); 
        list_of_min_gen[i] := Objectify( TypeObj( Zero(indec_proj_list[i]) ), [ list_of_min_gen[i] ] );
        SetMinimalGeneratingSetOfModule(indec_proj_list[i],[list_of_min_gen[i]]);
        SetIsIndecomposableModule(indec_proj_list[i], true);
        SetIsProjectiveModule(indec_proj_list[i], true);
    od;
    
    return indec_proj_list;
end
);


#######################################################################
##
#A  IndecInjectiveModules( <A> )
##
##  This function constructs all the indecomposable injective modules
##  over a finite dimensional path algebra or quotient of path algebra. 
##  It returns all the indecomposable injective modules as a list of 
##  modules corresponding to the numbering of the vertices. 
##
InstallMethod ( IndecInjectiveModules, 
    "for a finite dimensional quotient of a path algebra",
    [ IsQuiverAlgebra ], 0,
    function( A )
        local A_op, P_op; 

        A_op := OppositeAlgebra(A);
        P_op := IndecProjectiveModules(A_op);
        
        return List(P_op, x -> DualOfModule(x));
    end
);
    
#######################################################################
##
#A  SimpleModules( <A> )
##
##  This function constructs all the simple modules over a finite 
##  dimensional path algebra or quotient of path algebra. It returns 
##  all the simple modules as a list of modules corresponding to the 
##  numbering of the vertices. 
##
InstallMethod ( SimpleModules, 
    "for a finite dimensional quotient of a path algebra",
    [ IsQuiverAlgebra ], 0,
    function( A )

    local KQ, num_vert, simple_rep, zero, v, temp, s;
#
    if not IsFiniteDimensional(A) then
        Error("argument entered is not a finite dimensional algebra,\n");
    fi;
    if ( not IsPathAlgebra(A) ) and ( not IsAdmissibleQuotientOfPathAlgebra(A) ) then
        Error("argument entered is not a quotient of a path algebra by an admissible ideal,\n");
    fi;
    KQ := OriginalPathAlgebra(A); 
    num_vert := NumberOfVertices(QuiverOfPathAlgebra(A));
    simple_rep := [];
    zero := List([1..num_vert], x -> 0);
    for v in [1..num_vert] do
     temp := ShallowCopy(zero);
        temp[v] := 1; 
        Add(simple_rep,RightModuleOverPathAlgebra(A,temp,[]));
    od;
    for s in simple_rep do
        SetIsSimpleQPAModule(s, true);
    od;
    return simple_rep;
end
);

#######################################################################
##
#A  ZeroModule( <A> )
##
##  This function constructs the zero module over a path algebra or 
##  quotient of path algebra. 
##
InstallMethod ( ZeroModule, 
    "for a finite dimensional quotient of a path algebra",
    [ IsQuiverAlgebra ], 0,
    function( A )

    local KQ, num_vert, zero;

    KQ := OriginalPathAlgebra(A); 
    num_vert := NumberOfVertices(QuiverOfPathAlgebra(A));
    zero := List([1..num_vert], x -> 0);

    return RightModuleOverPathAlgebra(A,zero,[]);
end
);

#######################################################################
##
#O  BasisOfProjectives(<A>)
##
##  Given a finite dimensional qoutient of a path algebra  <A>, this 
##  function finds in the basis of each indecomposable projective 
##  in terms of paths (nontips of the ideal  I defining  A).
##
InstallMethod ( BasisOfProjectives, 
    "for a finite dimensional quotient of a path algebra",
    [ IsQuotientOfPathAlgebra ], 0,
    function( A )

    local Q, num_vert, fam, vertices, basis_of_projs, 
          v, basis_of_proj, P, B, i, j;
#
#    Testing input if finite dimensional.
#       
   fam := ElementsFamily(FamilyObj(A));
   if HasGroebnerBasisOfIdeal(fam!.ideal) and 
          AdmitsFinitelyManyNontips(GroebnerBasisOfIdeal(fam!.ideal)) then 
#
      Q := QuiverOfPathAlgebra(OriginalPathAlgebra(A));
      num_vert := NumberOfVertices(Q); 
      vertices := List(VerticesOfQuiver(Q), x -> x*One(A));
      basis_of_projs := [];
      for v in vertices do
         basis_of_proj := List([1..num_vert], x -> []);
         P := RightIdeal(A,[v]);
         B := CanonicalBasis(P);
         for i in [1..Length(B)] do
            for j in [1..num_vert] do
               if ( B[i]*vertices[j] <> Zero(A) ) then
                   Add(basis_of_proj[j],B[i]);
               fi;
            od;
         od;
         Add(basis_of_projs,basis_of_proj);
      od;
      return basis_of_projs;
   else
      Print("Need to have a finite dimensional quotient of a path algebra as argument.\n");
      return fail;      
   fi;
end
);

#######################################################################
##
#O  BasisOfProjectives(<A>)
##
##  Given a finite dimensional path algebra  <A>, this function finds 
##  in the basis of each indecomposable projective in terms of paths.
##
InstallOtherMethod ( BasisOfProjectives, 
   "for a finite dimensional quotient of a path algebra",
   [ IsPathAlgebra ], 0,
   function( A )
   
   local Q, num_vert, fam, vertices, basis_of_projs, 
          v, basis_of_proj, P, B, i, j;
#
#  Testing input if finite dimensional.
#       
   Q := QuiverOfPathAlgebra(A); 
   num_vert := NumberOfVertices(Q);
   if not IsAcyclicQuiver(Q)  then
      Print("Need to have a finite dimensional path algebra as argument.\n");
      return fail;
   else
      vertices := List(VerticesOfQuiver(Q), x -> x*One(A));
      basis_of_projs := [];
      for v in vertices do
         basis_of_proj := List([1..num_vert], x -> []);
         P := RightIdeal(A,[v]);
         B := CanonicalBasis(P);
         for i in [1..Length(B)] do
            for j in [1..num_vert] do
               if ( B[i]*vertices[j] <> Zero(A) ) then
                  Add(basis_of_proj[j],B[i]);
               fi;
            od;
         od;
         Add(basis_of_projs,basis_of_proj);
      od;
   fi;
  
   return basis_of_projs;
end
);

#######################################################################
##
#O  ElementInIndecProjective( <A>, <m>, <s> )
##
##  Given an admissible quotient A of a path algebra, an element
##  m  in the s-th indecomposable projective module  v_sA  over A, this 
##  function computes the element  m  in the module  v_sA  as a preimage 
##  in the ideal  v_sR. 
##
InstallMethod ( ElementInIndecProjective, 
    "for a fin. dim. quotient of a path algebra, an element in an indec. projective module over this algebra and a positive integer",
    true,
    [ IsQuotientOfPathAlgebra, IsAlgebraModuleElement, IS_INT ], 
    0,
    function( A, m, s )

    local   B, i, elem;
        
    if not IsAdmissibleQuotientOfPathAlgebra( A ) then
        Error("The entered algebra is not a finite dimensional algebra,\n");    
    fi;
        
    B := ShallowCopy( BasisOfProjectives( A )[ s ] );
    for i in [ 1..Length( B ) ] do
        if Length( B[ i ] ) = 0 then 
            B[ i ] := Zero( OriginalPathAlgebra( A ) );
        else
            B[ i ] := List( B[ i ], x -> x![ 1 ] );
        fi;
    od;
    B := Flat( B );
    elem := Flat( ExtRepOfObj( ExtRepOfObj( m ) ) );
    
    return LinearCombination( B, elem );
end 
);

#######################################################################
##
#O  ElementInIndecProjective( <A>, <m>, <s> )
##
##  Given a finite dimension path algebra A, an element m  in the s-th 
##  indecomposable projective module  v_sA  over A, this function 
##  computes the element  m  in the module  v_sA  as a preimage in the 
##  ideal  v_sA. 
##
InstallOtherMethod ( ElementInIndecProjective, 
 "for a finite dimensional path algebra, an element in an indec. projective module over this algebra and a positive integer",
    true,
    [ IsPathAlgebra, IsAlgebraModuleElement, IS_INT ], 
    0,
    function( A, m, s )

    local   B, i, elem;
        
    if not IsAcyclicQuiver( QuiverOfPathAlgebra( A ) ) then
        Error("The entered algebra is not a finite dimensional algebra,\n");    
    fi;
        
    B := ShallowCopy( BasisOfProjectives( A )[ s ] );
    for i in [ 1..Length( B ) ] do
        if Length( B[ i ] ) = 0 then 
            B[ i ] := Zero( OriginalPathAlgebra( A ) );
        fi;
    od;
    B := Flat( B );
    elem := Flat( ExtRepOfObj( ExtRepOfObj( m ) ) );
    
    return LinearCombination( B, elem );
end 
);

#######################################################################
##
#O  ElementIn_vA_AsElementInIndecProj( <A>, <m> )
##
##  Given a finite dimension path algebra A, an element m  in  vA  for 
##  for some vertex v, this function computes the element  m  
##  correspond to in the indecomposable projective representation 
##  corresponding to the vertex  v.
##
InstallMethod ( ElementIn_vA_AsElementInIndecProj, 
    "for an element in a quotient of a path algebra",
    true,
    [ IsQuiverAlgebra, IsObject ],
    0,
    function( A, m )
  
  local leftsupport, pos, P, dimP, B, rightsupport, Q, vertices, elem, 
        r, mpart, mtemp, mtip, posmtip;
  
  if not ( m in A ) then 
    Error( "The entered element is not in the given algebra.\n" );
  fi;
  
  if IsZero( m ) then
    Error( "The entered element is zero.\n" );
  fi;
  
  leftsupport := LeftSupportOfQuiverAlgebraElement( A, m );
  if Length( leftsupport ) > 1 then
    Error( "Entered element is not left uniform.\n" );
  fi;

  pos := leftsupport[ 1 ];
  P := IndecProjectiveModules( A )[ pos ];
  dimP := DimensionVector( P );
  B := BasisOfProjectives( A )[ pos ];
  rightsupport := RightSupportOfQuiverAlgebraElement( A, m );

  Q := QuiverOfPathAlgebra( OriginalPathAlgebra( A ) );
  vertices := List( VerticesOfQuiver( Q ), v -> One( A ) * v );

  elem := Zero( P );
  for r in rightsupport do
    mpart := m * vertices[ r ];
    mtemp := mpart;
    while not IsZero( mtemp ) do
      mtip := Tip( mtemp );
      mtemp := mtemp - TipCoefficient( mtip ) * mtip;
      posmtip := Position( B[ r ], mtip );
      elem := elem + TipCoefficient( mtip ) * BasisVectors( Basis( P ) )[ Sum( dimP{ [ 1..r - 1 ] } ) + posmtip ];
    od;
  od;
  
  return elem;
end
);

[ Dauer der Verarbeitung: 0.27 Sekunden  (vorverarbeitet)  ]