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


Quelle  pathalgtensor.gi   Sprache: unbekannt

 
# GAP Implementation
# $Id: patensor.gi,v 1.5 2012/04/13 08:12:39 kristink Exp $

DeclareRepresentation(
        "IsQuiverProductDecompositionRep",
        IsComponentObjectRep and IsAttributeStoringRep,
        [ "factors", "lookup_table", "name_composer" ] );


InstallMethod( QuiverProduct,
        "for two quivers",
        ReturnTrue,
        [ IsQuiver, IsQuiver ],
        function( q1, q2 )

    local vertex_lists, vertex_names,
          arrow_lists, arrow_names, arrow_defs,
          lookup_table, make_name, make_arrow_def,
          i,
          product, decomposition;

    make_name := function( factors )
        return Concatenation( String( factors[ 1 ] ), "_", String( factors[ 2 ] ) );
    end;
    make_arrow_def := function( factors )
        return [ make_name( List( factors, SourceOfPath ) ),
                 make_name( List( factors, TargetOfPath ) ),
                 make_name( factors ) ];
    end;

    vertex_lists := Cartesian( VerticesOfQuiver( q1 ), VerticesOfQuiver( q2 ) );
    vertex_names := List( vertex_lists, make_name );

    arrow_lists := Concatenation( Cartesian( VerticesOfQuiver( q1 ), ArrowsOfQuiver( q2 ) ),
                                  Cartesian( ArrowsOfQuiver( q1 ), VerticesOfQuiver( q2 ) ) );
    arrow_names := List( arrow_lists, make_name );
    arrow_defs := List( arrow_lists, make_arrow_def );

    lookup_table := rec( );
    for i in [ 1 .. Length( vertex_lists ) ] do
        lookup_table.( vertex_names[ i ] ) := vertex_lists[ i ];
    od;
    for i in [ 1 .. Length( arrow_lists ) ] do
        lookup_table.( arrow_names[ i ] ) := arrow_lists[ i ];
    od;

    decomposition := Objectify( NewType( ListsFamily,
                                         IsQuiverProductDecomposition and IsQuiverProductDecompositionRep ),
                                rec( factors := [ q1, q2 ],
                                     lookup_table := lookup_table,
                                     name_composer := make_name ) );
    SetLength( decomposition, 2 );
    SetIsFinite( decomposition, true );

    product := Quiver( vertex_names, arrow_defs );
    SetQuiverProductDecomposition( product, decomposition );

    return product;

end );

InstallMethod( IsBound\[\], "for quiver product decomposition and positive integer",
               [ IsQuiverProductDecomposition, IsPosInt ],
function( dec, i )
  return i <= Length( dec );
end );

InstallMethod( ViewObj, "for quiver product decomposition",
               [ IsQuiverProductDecomposition ],
               NICE_FLAGS + 1,
function( dec )
  Print( "<quiver product decomposition>" );
end );

InstallMethod( PrintObj, "for quiver product decomposition",
               [ IsQuiverProductDecomposition ],
               NICE_FLAGS + 1,
function( dec )
  Print( "<quiver product decomposition>" );
end );

InstallMethod( Display, "for quiver product decomposition",
               [ IsQuiverProductDecomposition ],
function( dec )
  Print( "<quiver product decomposition>" );
end );


InstallMethod( WalkOfPathOrVertex,
        "for a path",
        [ IsPath ],
        WalkOfPath );
InstallMethod( WalkOfPathOrVertex,
        "for a vertex",
        [ IsQuiverVertex ],
        function( v ) return [ v ]; end );


InstallMethod( ReversePath,
        "for a path",
        [ IsPath ],
        function( path )
    return Product( Reversed( WalkOfPath( path ) ) );
end );


InstallMethod( IncludeInProductQuiver,
        "for list and quiver with product decomposition",
        ReturnTrue,
        [ IsDenseList, IsQuiver and HasQuiverProductDecomposition ],
        function( factors, q )

    local dec, make_name, walks, join, product_walk;

    dec := QuiverProductDecomposition( q );
    make_name := dec!.name_composer;
    
    walks := List( factors, WalkOfPathOrVertex );
    join := [ TargetOfPath( factors[ 1 ] ),
              SourceOfPath( factors[ 2 ] ) ];
    
    product_walk :=
      List( Concatenation( Cartesian( walks[ 1 ], [ join[ 2 ] ] ),
                           Cartesian( [ join[ 1 ] ], walks[ 2 ] ) ),
            function( pair ) return q.( make_name( pair ) ); end);

    return Product( product_walk );
end );


InstallMethod( ProjectFromProductQuiver,
        "for positive int and path",
        ReturnTrue,
        [ IsPosInt, IsPath ],
        function( index, path )

    local quiver, dec, project_arrow_or_vertex, walk;

    quiver := FamilyObj( path )!.quiver;
    dec := QuiverProductDecomposition( quiver );

    project_arrow_or_vertex := function( p )
        return dec!.lookup_table.( String( p ) )[ index ];
    end;

    walk := WalkOfPathOrVertex( path );
    return Product( List( walk, project_arrow_or_vertex ) );

end );


InstallMethod( \[\],
        "for quiver product decomposition",
        ReturnTrue,
        [ IsQuiverProductDecomposition, IsPosInt ],
        function( dec, index )
    return dec!.factors[ index ];
end );


InstallMethod( IncludeInPathAlgebra,
        "for path and path algebra",
        ReturnTrue,
        [ IsPath, IsQuiverAlgebra ],
        function( path, pa )
    local walk;

    walk := WalkOfPathOrVertex( path );
    return Product( List( walk, function( p ) return pa.( String( p ) ); end ) );
end );


InstallMethod( VerticesOfPathAlgebra,
        "for (quotient of) path algebra",
        [ IsQuiverAlgebra ],
        function( pa )
    return List( VerticesOfQuiver( QuiverOfPathAlgebra( pa ) ),
                 function( v ) return IncludeInPathAlgebra( v, pa ); end );
end );


InstallGlobalFunction( PathAlgebraElementTerms,
        function( elem )

    local terms, tip, tip_monom, tip_coeff, rest;

    terms := [ ];

    rest := elem;
    while true do # TODO should be while not IsZero( rest ), but that doesn't work
        tip := Tip( rest );
        tip_monom := TipMonomial( rest );
        tip_coeff := TipCoefficient( rest );
        if IsZero( tip_coeff ) then
            break;
        fi;
        rest := rest - tip;
        terms[ Length(terms) + 1 ] := rec( monom := tip_monom,
                                           coeff := tip_coeff );
    od;

    return terms;
end );


InstallMethod( SimpleTensor,
        "for list and path algebra",
        ReturnTrue,
        [ IsDenseList, IsQuiverAlgebra ],
        function( factors, pa )

    local parts, pairs, inc_paths, inc_terms;

    if IsZero( factors[ 1 ] ) or IsZero( factors[ 2 ] ) then
       return Zero( pa );
    fi;
    inc_paths :=
      function( paths )
        return IncludeInPathAlgebra( IncludeInProductQuiver( paths, QuiverOfPathAlgebra( pa ) ),
                                     pa );
    end;

    inc_terms :=
      function( terms )
        return terms[ 1 ].coeff * terms[ 2 ].coeff
               * inc_paths( [ terms[ 1 ].monom, terms[ 2 ].monom ] );
    end;

    parts := List( factors, PathAlgebraElementTerms );
    pairs := Cartesian( parts );
    return Sum( pairs, inc_terms );
end );

InstallMethod( TensorProductOfAlgebras,
        "for two path algebras",
        ReturnTrue,
        [ IsQuiverAlgebra, IsQuiverAlgebra ],
        function( pa1, pa2 )
    return TensorProductOfPathAlgebras( [ pa1, pa2 ] );
end );


#####################################################################
#
# Helene Bjørshol proved in her bachelor thesis at IMF, NTNU, spring
# 2021 that a Groebner basis of the tensor product of two quiver
# algebras, are given by the Groebner basis elements induced from 
# each factor of the tensor product in addition to all the 
# commutativity relations  
#     ( a x o(b) ) * ( t(a) x b ) - ( o(a) x b ) * ( a x t(b) )
# for all arrows a and b from the first and the second factor of the
# tensor product.  This results in a huge speed up of the function
# compared to the previous implementation.
#
InstallGlobalFunction( TensorProductOfPathAlgebras,
        function( PAs )

    local   field,  Qs,  product_q,  product_pa,  inc_q,  inc_pa,  
            make_comm_rel,  paths,  comm_rels,  get_relators,  
            get_groebner_basis,  orig_rels,  induced_rels,  
            tensor_rels,  orig_grbs,  induced_grb,  tensor_grb,  I,  
            product_pa_grb,  tensor_product;

    field := LeftActingDomain( PAs[ 1 ] );
    if field <> LeftActingDomain( PAs[ 2 ] ) then
        Error( "path algebras must be over the same field" );
    fi;

    # Construct the product quiver and its path algebra:
    Qs := List( PAs, QuiverOfPathAlgebra );
    product_q := QuiverProduct( Qs[ 1 ], Qs[ 2 ] );
    product_pa := PathAlgebra( field, product_q );

    # Inclusion functions for product quiver and path algebra:
    inc_q := function( p )
        return IncludeInProductQuiver( p, product_q );
    end;
    inc_pa := function( p )
        return IncludeInPathAlgebra( p, product_pa );
    end;

    # Function for creating the commutativity relation of a
    # given pair [a,b] where a is an arrow in the first quiver
    # and b an arrow in the second:
    make_comm_rel :=
      function( arrows )
        local paths;
        paths := [ inc_q( [ arrows[ 1 ], SourceOfPath( arrows[ 2 ] ) ] ) *
                   inc_q( [ TargetOfPath( arrows[ 1 ] ), arrows[ 2 ] ] ),
                   inc_q( [ SourceOfPath( arrows[ 1 ] ), arrows[ 2 ] ] ) *
                   inc_q( [ arrows[ 1 ], TargetOfPath( arrows[ 2 ] ) ] ) ];
        return inc_pa( paths[ 1 ] ) - inc_pa( paths[ 2 ] );
    end;

    # Create all the commutativity relations:
    comm_rels := List( Cartesian( ArrowsOfQuiver( Qs[ 1 ] ),
                                  ArrowsOfQuiver( Qs[ 2 ] ) ),
                       make_comm_rel );

    # Function for finding the relations of a quotient of a path
    # algebra (or the empty list if the algebra is not a quotient):
    get_relators :=
      function( pa )
        if IsQuotientOfPathAlgebra( pa ) then
            return RelatorsOfFpAlgebra( pa );
        else
            return [ ];
        fi;
    end;
    get_groebner_basis := function( C )
        local fam;
        
        if IsQuotientOfPathAlgebra( C ) then
            fam := ElementsFamily( FamilyObj( C ) );
            return GroebnerBasisOfIdeal( fam!.ideal );
        else
            return [ ];
        fi;
    end;
    
    # The relations of the two original path algebras:
    orig_rels := List( PAs, get_relators );
    
    # The original relations included into the product quiver:
    induced_rels := List( Concatenation( Cartesian( orig_rels[ 1 ], VerticesOfPathAlgebra( PAs[ 2 ] ) ),
                                         Cartesian( VerticesOfPathAlgebra( PAs[ 1 ] ), orig_rels[ 2 ] ) ),
                          function( factors ) return SimpleTensor( factors, product_pa ); end );

    # All the relations for the tensor product:
    tensor_rels := Concatenation( comm_rels, induced_rels );
    
    # The Groebner basis of the two original path algebras:
    orig_grbs := List( PAs, get_groebner_basis );
    
    # The original Groebner bases included into the product quiver:
    induced_grb := List( Concatenation( Cartesian( orig_grbs[ 1 ], VerticesOfPathAlgebra( PAs[ 2 ] ) ),
                                         Cartesian( VerticesOfPathAlgebra( PAs[ 1 ] ), orig_grbs[ 2 ] ) ),
                          function( factors ) return SimpleTensor( factors, product_pa ); end );
                          
    # All the Groebner basis elements for the tensor product:
    tensor_grb := Concatenation( induced_grb, comm_rels );
    
    I := Ideal( product_pa, tensor_rels );
    product_pa_grb := GroebnerBasis( I, tensor_grb );
    tensor_product := product_pa / I;
    SetTensorProductDecomposition( tensor_product, PAs );

    return tensor_product;
end );

#######################################################################
##
#O  TensorAlgebraInclusion ( < T, n > )
##
##  Returns the inclusion  A ---> A \otimes B or the inclusion
##  B ---> A \otimes B if n = 1 or n = 2 respectively. 
##  
InstallMethod( TensorAlgebraInclusion, 
    "for a IsQuiverAlgebra",
    [ IsQuiverAlgebra, IS_INT ], 0,
    function( T, n )

    local   decomp,  A,  gens,  inclusion,  images,  f;
    
    if not HasTensorProductDecomposition( T ) then
        Error( "The entered algebra is not a tensor product of two algebras.\n" );
    fi;
    decomp := TensorProductDecomposition( T );
    if n = 1 then
        A := decomp[ 1 ];
    else
        A := decomp[ 2 ];
    fi;
    gens := GeneratorsOfAlgebra( A ); 
    
    inclusion := function( x ) 
        if n = 1 then
            return SimpleTensor( [ x, One( decomp[ 2 ] ) ], T );
        else
            return SimpleTensor( [ One( decomp[ 1 ] ), x ], T );
        fi;
    end;
    images := List( gens, g -> inclusion( g ) ); 
    f := AlgebraHomomorphismByImages( A, T, gens, images ); 
    f!.generators := gens;
    f!.genimages := images;
    
    return f; 
end
  );

InstallMethod( EnvelopingAlgebra,
        "for an algebra",
        [ IsQuiverAlgebra ],
        function( pa )
    local envalg;

    envalg := TensorProductOfAlgebras( OppositeAlgebra( pa ), pa );
    SetIsEnvelopingAlgebra( envalg, true );
    if  HasIsAdmissibleQuotientOfPathAlgebra(pa) and IsAdmissibleQuotientOfPathAlgebra(pa) then
        SetFilterObj(envalg, IsAdmissibleQuotientOfPathAlgebra );
    fi; 
    return envalg;
end );


InstallMethod( IsEnvelopingAlgebra,
               "for an algebra",
               [ IsAlgebra ],
               function( alg )
    return false;
end );

InstallMethod( AlgebraAsModuleOverEnvelopingAlgebra,
        "for an enveloping algebra of a path algebra",
        [ IsQuiverAlgebra ],
        function ( A )
    local   env,  Q,  QxQ,  basis,  basis_vectors,  vertices,  
            vertex_indices,  vector_spaces,  i,  j,  dimension_vector,  
            get_coefficients,  make_map,  arrows,  
            module_specification,  a;

    if not IsFiniteDimensional(A) then
       return fail;
    fi;
    env := EnvelopingAlgebra(A); 

    Q := QuiverOfPathAlgebra( A );
    QxQ := QuiverOfPathAlgebra( env );

    basis := CanonicalBasis( A );
    basis_vectors := BasisVectors( basis );

    vertices := VerticesOfQuiver( Q );
    vertex_indices := [ 1 .. Length( vertices ) ];

    vector_spaces := NullMat( Length( vertices ), Length( vertices ) );
    for i in vertex_indices do
        for j in vertex_indices do
            vector_spaces[ i ][ j ] := PositionsNonzero( vertices[ i ] * basis_vectors * vertices[ j ] );
        od;
    od;
    dimension_vector := List( Concatenation( vector_spaces ), Length );
    
    get_coefficients := function( elem )
        return Coefficients( basis, elem );
    end;

    make_map := function( a )
        local components, source, target, source_i, target_i, source_space, target_space,
              dims, map_on_basis, map_on_basis_coeffs;

        components := [ ProjectFromProductQuiver( 1, a ),
                        ProjectFromProductQuiver( 2, a ) ];

        source := List( components, SourceOfPath );
        target := List( components, TargetOfPath );
        source_i := List( source, VertexIndex );
        target_i := List( target, VertexIndex );
        source_space := vector_spaces[ source_i[ 1 ] ][ source_i[ 2 ] ];
        target_space := vector_spaces[ target_i[ 1 ] ][ target_i[ 2 ] ];

        dims := [ Length( source_space ), Length( target_space ) ];
        if dims[ 1 ] = 0 or dims[ 2 ] = 0 then
            return fail;
        fi;

        map_on_basis := OppositePath( components[ 1 ] ) * basis_vectors{ source_space } * components[ 2 ];
        map_on_basis_coeffs := List( map_on_basis, get_coefficients );
        return map_on_basis_coeffs
               { [ 1 .. Length( map_on_basis_coeffs ) ] }
               { target_space };
    end;

    arrows := ArrowsOfQuiver( QxQ );
    module_specification := [ ];
    for a in arrows do
        if make_map( a ) <> fail then 
            Add( module_specification, [ String( a ), make_map( a ) ] );
        fi;
    od;
    
    return RightModuleOverPathAlgebra( env, dimension_vector, module_specification );

end );

#######################################################################
##
#O  DualOfAlgebraAsModuleOverEnvelopingAlgebra( <A> )
##
##  Checks if the entered algebra is finite dimensional and returns 
##  false otherwise. When the algebra is finite dimensional, then it 
##  returns the dual of the algebra as module over the enveloping algebra
##  of  A. 
## 
InstallMethod( DualOfAlgebraAsModuleOverEnvelopingAlgebra, 
    "for an algebra",
    [ IsQuiverAlgebra ], 0,
    function( A )
    
    local Aenv, M, DM, mats, op_name, de_op_name, vertices, arrows, 
          new_vertices, new_arrows, stringvertices, stringarrows, 
          vertex_positions, arrow_positions, newdimvector, newmats, 
          matrices, a, arrowentry;
    
    if not IsFiniteDimensional(A) then
        return fail;
    fi;
    #
    # By now we know that the algebra is finite dimensional.
    #
    Aenv := EnvelopingAlgebra(A);
    M    := AlgebraAsModuleOverEnvelopingAlgebra(A);
    DM   := DualOfModule(M);
    #
    #   Finding DM as a module over Aenv.
    #
    mats := MatricesOfPathAlgebraModule(DM);
    op_name := OppositeQuiverNameMap(QuiverOfPathAlgebra(A));        
    de_op_name := OppositeQuiverNameMap(OppositeQuiver(QuiverOfPathAlgebra(A)));
    vertices := VerticesOfQuiver(QuiverOfPathAlgebra(Aenv));
    arrows := ArrowsOfQuiver(QuiverOfPathAlgebra(Aenv));
    new_vertices := List(vertices, x -> Concatenation(op_name(String(ProjectFromProductQuiver(2,x))),"_",de_op_name(String(ProjectFromProductQuiver(1,x)))));
    new_arrows := List(arrows, x -> Concatenation(op_name(String(ProjectFromProductQuiver(2,x))),"_",de_op_name(String(ProjectFromProductQuiver(1,x)))));
    stringvertices := List(vertices, x -> String(x));
    stringarrows := List(arrows, x -> String(x));
    #
    #   Finding the permutation of the vertices and the arrows.
    #
    vertex_positions := List(new_vertices, x -> Position(stringvertices, x));
    arrow_positions := List(new_arrows, x -> Position(stringarrows, x));
    #
    #   Finding the new dimension vector and the matrices of  DM  as a module over Aenv.
    #
    newdimvector := List([1..Length(vertices)], x -> DimensionVector(DM)[vertex_positions[x]]);
    newmats := List([1..Length(mats)], x -> mats[arrow_positions[x]]);
    #
    #   Creating the input for construction  DM  as a module over Aenv.
    #
    matrices := [];
    for a in arrows do
        if newdimvector[Position(vertices,SourceOfPath(a))] <> 0 and 
           newdimvector[Position(vertices,TargetOfPath(a))] <> 0 then 
            arrowentry := [[],[]];
            arrowentry[1] := String(a);
            arrowentry[2] := newmats[Position(arrows,a)];
            Add(matrices, arrowentry);
        fi;
    od;
    
    return RightModuleOverPathAlgebra(Aenv, newdimvector, matrices);
end
  );

################################################################
# Attribute TrivialExtensionOfQuiverAlgebraLevel quiver algebras
# is created so that one is avoiding naming problems when taking
# iterated trivial extensions of a quiver algebra.  This is due
# to a bug reported by Rene Marczinzik.
# If this attribute is not set, then the level is 0.  The
# trivial extension of such an algebra, will have level 1, and 
# so on.
#
InstallMethod( TrivialExtensionOfQuiverAlgebraLevel,
  "for quiveralgebras",
  true,
  [ IsQuiverAlgebra ], 0,
  function( A );

    if not HasTrivialExtensionOfQuiverAlgebraLevel( A ) then
        return 0;
    else
        return TrivialExtensionOfQuiverAlgebraLevel( A );
    fi;
end );


#######################################################################
##
#O  TrivialExtensionOfQuiverAlgebra( <A> )
##
##  Constructs the trivial extension  T(A)  of the algebra  A, that is,  
##  T(A) = A + D(A) by finding the quiver and relations of  T(A). 
## 
InstallMethod( TrivialExtensionOfQuiverAlgebra, 
    "for an algebra",
    [ IsQuiverAlgebra ], 0,
    function( A )
    
    local   arrow_add_string,  Q,  vertices,  arrows,  new_vertices,  
            new_arrows,  DA,  TopOfDAProjection,  B,  temp,  
            de_op_name,  additional_arrows,  i,  t,  Q_TE,  te_arrows,  
            string_te_arrows,  K,  KQ_TE,  relations,  new_relations,  
            r,  coeffandelem,  n,  temprel,  templist,  num_arrows,  
            V,  nontipsofradA,  nontipsofradAinKQ_TE,  W,  VWV,  
            Jpower,  AA,  BAA,  te_arrow_rep,  Qarrows,  
            Qarrows_labels,  Q_TE_to_Q,  KQ,  matrix,  setofvectors,  
            b,  occurring_arrows,  positions,  initialterm,  
            terminalterm,  Aenv,  fam,  prod,  add_arrows_labels,  
            solutions,  tempBAA,  Solutions,  TA;
    
    if not IsFiniteDimensional(A) then
        return fail;
    fi;
    arrow_add_string := String( TrivialExtensionOfQuiverAlgebraLevel( A ) + 1 );
    Q := QuiverOfPathAlgebra(A);
    vertices := VerticesOfQuiver(Q);
    arrows := ArrowsOfQuiver(Q);
    #
    # The vertices in the trivial extension are the "old" ones.
    #
    new_vertices := List(vertices, v -> String(v));
    #
    # Old arrows from the original quiver.
    #
    new_arrows := List(arrows, a -> [String(SourceOfPath(a)),String(TargetOfPath(a)),String(a)]);
    #
    # Finding the "new" arrows, te_arrows.
    #
    DA := DualOfAlgebraAsModuleOverEnvelopingAlgebra(A);
    TopOfDAProjection := TopOfModuleProjection(DA);
    B := BasisVectors(Basis(Range(TopOfDAProjection)));
    temp := Flat(List(B, b -> SupportModuleElement(b))); 
    temp := List(temp, t -> CoefficientsAndMagmaElements(t![1])[1]);
    de_op_name := OppositeQuiverNameMap(OppositeQuiver(QuiverOfPathAlgebra(A))); 
    temp := List(temp, t -> [de_op_name(String(ProjectFromProductQuiver(1,t))), String(ProjectFromProductQuiver(2,t))]);
    additional_arrows := [];
    i := 0;
    for t in temp do
        i := i + 1;
        Add(additional_arrows, [t[1],t[2],Concatenation("te_a",arrow_add_string,"_",String(Position(temp,t)),"_",String(i))]);
    od;
    Append(new_arrows, additional_arrows);
    Q_TE := Quiver(new_vertices, new_arrows);
    te_arrows := ArrowsOfQuiver(Q_TE);
    string_te_arrows := List(te_arrows, a -> String(a));
    K := LeftActingDomain(A);
    KQ_TE := PathAlgebra(K,Q_TE);
    #
    # The new relations 
    #
    relations := [];
    if not IsPathAlgebra(A) then 
        relations := RelatorsOfFpAlgebra(A);
    fi;
    #
    # Transferring the relations from  A  to  T(A).
    #
    new_relations := [];
    for r in relations do
        coeffandelem := CoefficientsAndMagmaElements(r);
        n := Length(coeffandelem)/2;
        temprel := Zero(KQ_TE);
        for i in [1..n] do
            templist := List(WalkOfPath(coeffandelem[2*i-1]), w -> te_arrows[Position(string_te_arrows, String(w))]);
            temprel := temprel + coeffandelem[2*i]*One(KQ_TE)*Product(templist);  
        od;
        Add(new_relations, temprel); 
    od;
    #
    # The products te_arrows * <paths in Qarrows> * te_arrows are zero. 
    # First adding te_arrows * te_arrows.
    #
    num_arrows := NumberOfArrows(Q);    
    V := Subspace(KQ_TE, List(ArrowsOfQuiver(Q_TE){[num_arrows + 1..NumberOfArrows(Q_TE)]}, x -> One(KQ_TE)*x));
    Append(new_relations, BasisVectors(Basis(ProductSpace(V,V))));
    #
    # Now adding te_arrows * <non-trival paths in Qarrows> * te_arrows.
    #
    if IsPathAlgebra(A) then 
        nontipsofradA := BasisVectors(Basis(A)){[NumberOfVertices(Q) + 1..Dimension(A)]};
    else
        nontipsofradA := List(BasisVectors(Basis(A)){[NumberOfVertices(Q) + 1..Dimension(A)]}, x -> x![1]);
    fi;
    #
    # Transferring the nontips of rad A from  A  to  T(A).
    #
    nontipsofradAinKQ_TE := [];
    for r in nontipsofradA do
        coeffandelem := CoefficientsAndMagmaElements(r);
        n := Length(coeffandelem)/2;
        temprel := Zero(KQ_TE);
        for i in [1..n] do
            templist := List(WalkOfPath(coeffandelem[2*i-1]), w -> te_arrows[Position(string_te_arrows, String(w))]);
            temprel := temprel + coeffandelem[2*i]*One(KQ_TE)*Product(templist);  
        od;
        Add(nontipsofradAinKQ_TE, temprel); 
    od;
    W := Subspace(KQ_TE, nontipsofradAinKQ_TE);
    W := ProductSpace(W,V);
    VWV := ProductSpace(V,W);
    Append(new_relations, BasisVectors(Basis(VWV)));
    #
    # Factoring out LoewyLength(A) + 2 power of the arrow ideal in KQ_TE, and 
    # calling it  AA, this is done so that we can find the remaining relations.
    #
    Jpower := NthPowerOfArrowIdeal(KQ_TE, LoewyLength(A) + 2);
    temprel := ShallowCopy(new_relations);
    Append(temprel,Jpower);
    AA := KQ_TE/temprel;
    BAA := BasisVectors(Basis(AA));
    
    te_arrow_rep := List(B, b -> PreImagesRepresentative(TopOfDAProjection, b));
    Qarrows := ArrowsOfQuiver(Q_TE){[1..num_arrows]};
    Qarrows := Flat(List(Qarrows, a -> WalkOfPath(a))); 
    #
    # Finding the relations involving the te_arrows.
    #
    Qarrows_labels := List(arrows, a -> String(a));
    Q_TE_to_Q := function( a );
        return arrows[Position(Qarrows_labels, String(a))];
    end;
    
    KQ := OriginalPathAlgebra(A);
    matrix := []; 
    setofvectors := [];
    for b in BAA{[Length(vertices) + 1..Length(BAA)]} do
        if IsPathAlgebra(AA) then 
            temp := CoefficientsAndMagmaElements(b);
        else 
            temp := CoefficientsAndMagmaElements(b![1]);
        fi;
        occurring_arrows := WalkOfPath(temp[1]);
        positions := PositionsProperty(occurring_arrows, x -> not x in Qarrows);
        if Length(positions) = 1 then
            Add(setofvectors, Position(BAA, b)); 
            initialterm := One(KQ);
            if positions[1] > 1 then 
                temp := List(occurring_arrows{[1..positions[1] - 1]}, a -> Q_TE_to_Q(a));
                initialterm := initialterm*Product(temp);
            fi;
            terminalterm := One(KQ);
            if positions[1] < Length(occurring_arrows) then
                temp := List(occurring_arrows{[positions[1] + 1..Length(occurring_arrows)]}, a -> Q_TE_to_Q(a));                
                terminalterm := terminalterm*Product(temp);
            fi;
            Add(matrix, [initialterm, occurring_arrows[positions[1]], terminalterm]);
        fi;
    od;
    setofvectors := Set(setofvectors);
    Aenv := RightActingAlgebra(DA);
    fam := ElementsFamily(FamilyObj(A)); 
    if IsPathAlgebra(A) then
        prod := List(matrix, m -> [OppositePathAlgebraElement(m[1]), m[2], m[3]]); 
    else
        prod := List(matrix, m -> [OppositePathAlgebraElement(ElementOfQuotientOfPathAlgebra(fam, m[1]*One(KQ), true)), m[2], ElementOfQuotientOfPathAlgebra(fam, m[3]*One(KQ), true)]); 
    fi;
    add_arrows_labels := List(additional_arrows, a -> a[3]);
    prod := List(prod, m -> te_arrow_rep[Position(add_arrows_labels,String(m[2]))]^SimpleTensor([m[1],m[3]], Aenv));
    matrix := List(prod, x -> Flat(x![1]![1]));
    solutions := NullspaceMat(matrix);
    tempBAA := BAA{setofvectors};
    tempBAA := List(tempBAA, t -> t![1]);
    #
    # Getting the relations involving the arrows  te_arrows
    #
    Solutions := List(solutions, s -> LinearCombination(tempBAA, s));
    
    Append(new_relations, Solutions); 
    TA := KQ_TE/new_relations;
    SetTrivialExtensionOfQuiverAlgebraLevel( TA, TrivialExtensionOfQuiverAlgebraLevel( A ) + 1 );
    
    return TA;
end
  );

#######################################################################
##
#A  EnvelopingAlgebraHomomorphism( <f> )
##
##  Given an algebra homomorphism, this constructs corresponding algebra
##  homomorphism between the enveloping algebras.
## 
InstallMethod( EnvelopingAlgebraHomomorphism, 
    "for an algebra",
    [ IsAlgebraHomomorphism ], 0,
    function( f )
    
    local   A,  Aop,  Aenv,  B,  Benv,  fop,  gensAenv,  
            coeffgensAenv,  firstcoordinates,  secondcoordinates,  
            coeffisients,  n,  images,  g;
    
    A := Source( f );
    Aop := OppositeAlgebra( A );
    Aenv := EnvelopingAlgebra( A );
    B := Range( f );
    Benv := EnvelopingAlgebra( B );
    fop := OppositeAlgebraHomomorphism( f );
    gensAenv := GeneratorsOfAlgebraWithOne( Aenv );
    coeffgensAenv := List( gensAenv, g -> CoefficientsAndMagmaElements( g![ 1 ] ) );
    
    firstcoordinates := List( coeffgensAenv, m -> ProjectFromProductQuiver( 1, m[ 1 ] ) );
    secondcoordinates := List( coeffgensAenv, m -> ProjectFromProductQuiver( 2, m[ 1 ] ) );
    coeffisients := List( coeffgensAenv, m -> m[ 2 ] );
    firstcoordinates := List( firstcoordinates, m -> ImageElm( fop, One( Aop ) * m ) );
    secondcoordinates := List( secondcoordinates, m -> ImageElm( f, One( A ) * m ) );
    n := Length( coeffgensAenv );    
    images := List( [ 1..n ], i -> coeffisients[ i ] * SimpleTensor( [ firstcoordinates[ i ], secondcoordinates[ i ] ] , Benv ) );
    
    g := AlgebraHomomorphismByImages( Aenv, Benv, gensAenv, images );
    g!.generators := gensAenv;
    g!.genimages := images;
    
    return g;
end
  );

#######################################################################
##
#O  TrivialExtensionOfQuiverAlgebraProjection( <A> )
##
##  Constructs the natural algebra projection form trivial extension  
##  T(A)  to  A.
## 
InstallMethod( TrivialExtensionOfQuiverAlgebraProjection, 
    "for an algebra",
    [ IsQuiverAlgebra ], 0,
    function( A )
    
    local   TA,  gensTA,  gensA,  newarrows,  i,  f;
    
    if not IsFiniteDimensional( A ) then
        return fail;
    fi;
    TA := TrivialExtensionOfQuiverAlgebra( A );
    gensTA := GeneratorsOfAlgebraWithOne( TA );
    gensA := ShallowCopy( GeneratorsOfAlgebraWithOne( A ) );
    newarrows := Length( gensTA ) - Length( gensA );
    for i in [ 1..newarrows ] do
        Add( gensA, Zero( A ) );
    od;
    f := AlgebraHomomorphismByImages( TA, A, gensTA, gensA );
    f!.generators := gensTA;
    f!.genimages := gensA;
    
    return f;
end
  );

[ Dauer der Verarbeitung: 0.24 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