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


Quelle  derivedcat.gi   Sprache: unbekannt

 
# projective and injective complexes -- property and printing

###################################################
##
#P IsProjectiveComplex( <C> )
##
## Returns if <C> is a finite complex
## with only projective objects. If <C> is infinite,
## it is not checked whether the complex actually 
## consists of projectives.
##
InstallMethod( IsProjectiveComplex,
               [ IsQPAComplex ],
               function( C )

    local i, obj;

    if( IsInt(UpperBound(C)) and IsInt(LowerBound(C)) ) then
        for i in [LowerBound(C)..UpperBound(C)] do
            obj := ObjectOfComplex(C,i);
            if( not IsProjectiveModule(obj) ) then
                return false;
            fi;
        od;
        return true;
    fi;
    return false;
end);

###################################################
##
#P IsInjectiveComplex( <C> )
##
## Returns if <C> is a finite complex
## with only injective objects. If <C> is infinite,
## it is not checked whether the complex actually 
## consists of injectives.
##
InstallMethod( IsInjectiveComplex,
               [ IsQPAComplex ],
               function( C )
    local i, obj;

    if( IsInt(UpperBound(C)) and IsInt(LowerBound(C)) ) then
        for i in [LowerBound(C)..UpperBound(C)] do
            obj := ObjectOfComplex(C,i);
            if( not IsInjectiveModule(obj) ) then
                return false;
            fi;
        od;
        return true;
    fi;
    return false;
end);

# print methods

###################################################
##
#O PrintObj( <C> )
##
## For a projective complex <C>
## Prints a projective complex such that the objects
## are displayed as "Pi" for the correct vertex i
##
## value 1: ensures that a complex which is both 
## projective and injective should be printed as projective.
InstallMethod( PrintObj,
               "for a projective complex",
               [ IsProjectiveComplex ],
               1,
               function( C )

    local list, start, stop, l, t, symbol, finitetest, upperlimit, x;
    
    # check if C is finite or not
    if (IsInt(UpperBound(C))) then
        finitetest := true;
        start := UpperBound(C);
        stop := LowerBound(C);
    else
        finitetest := false;
        start := HighestKnownDegree(C);
        stop := LowerBound(C);
    fi;
        
    symbol := "P";

    if finitetest then
        list := Reversed(DescriptionOfFiniteProjComplex(C));
    else
        list := [stop..start];
        list := Reversed(List( list, x ->
                               DescriptionOfProjComplexInDegree(C,x) ));
    fi;

    # do the printing
    if (not finitetest) then
        Print("--- ->");
    else
        Print("0 ->");
    fi;
    for l in list do
        if (not IsEmpty(l)) then
            Print(" ",start,": ");
            for t in [1..Length(l)] do
                if (t = 1) then
                    Print(symbol,l[t]);
                else
                    Print(" + ",symbol,l[t]);
                fi;
            od;
            Print(" ->");
            start := start - 1;
        fi;
    od;
    Print(" 0");

end);

###################################################
##
#O PrintObj( <C> )
##
## For an injective complex <C>
## Prints an injective complex such that the objects
## are displayed as "Ii" for the correct vertex i
##
## value 0: ensures that a complex which is both 
## projective and injective should be printed as projective.
InstallMethod( PrintObj,
               "for an injective complex",
               [ IsInjectiveComplex ],
               0,
               function( C )

    local list, start, stop, l, t, symbol, finitetest, upperlimit, x;
    # check if C is finite or not
    if (IsInt(UpperBound(C))) then
        finitetest := true;
        start := UpperBound(C);
        stop := LowerBound(C);
    else
        finitetest := false;
        start := HighestKnownDegree(C);
        stop := LowerBound(C);
    fi;
        
    symbol := "I";

    if finitetest then
        list := Reversed(DescriptionOfFiniteInjComplex(C));
    else
        list := [stop..start];
        list := Reversed(List( list, x ->
                               DescriptionOfInjComplexInDegree(C,x) ));
    fi;

    # do the printing
    if (not finitetest) then
        Print("--- ->");
    else
        Print("0 ->");
    fi;
    for l in list do
        if (not IsEmpty(l)) then
            Print(" ",start,": ");
            for t in [1..Length(l)] do
                if (t = 1) then
                    Print(symbol,l[t]);
                else
                    Print(" + ",symbol,l[t]);
                fi;
            od;
            Print(" ->");
            start := start - 1;
        fi;
    od;
    Print(" 0");

end);


# projective resolution of a complex

###################################################
##
#O ProjectiveResolutionOfComplex( <C> )
##
## for a complex C in D^b(mod A) where mod A
## may have infinite global dimension.
##
## The result is a new complex C' (possibly of the
## infinite type), which is quasi-isomorphic to C. 
## C' is an element of the homotopty category K^(b)(P).
##
InstallMethod( ProjectiveResolutionOfComplex,
               [ IsQPAComplex ],
               function( C )

    local cat, dList, tList, t1, PB1, PC1, pos, ker, h, PB, PC, lastKernel, i,
          PCompl, j, tempCompl, projres, isos, reducedModules, v, d, u, diffs,
          pospart, newpart, negpart, newdiffs;

    # if C is projective, return C itself:
    if IsProjectiveComplex(C) then
        return C;
    fi;


    cat := CatOfComplex(C);
    i := LowerBound(C);
    # where the loop should stop
    if(IsInt(UpperBound(C))) then
        j := UpperBound(C) - LowerBound(C) + 1;
    else
        j := HighestKnownDegree(C)-LowerBound(C)+1;
    fi;
    dList := [];
    tList := [];

    # special case for stalk complexes
    if (LengthOfComplex(C) = 1) then
        PCompl := ProjectiveResolution(ObjectOfComplex(C,i));
        PCompl := BrutalTruncationBelow(PCompl, 0);
        PCompl := ShiftUnsigned(PCompl, -i);
        SetIsProjectiveComplex(PCompl,true);
        return PCompl;
    fi;

    # do the first position
    t1 := ProjectiveCover(ObjectOfComplex(C,i));
    Append(tList, [t1]);
    PB1 := PullBack(DifferentialOfComplex(C,i+1) , t1);
    PC1 := ProjectiveCover(Source(PB1[1]));
    Append(dList, [PC1*PB1[1]]);
    Append(tList, [PC1*PB1[2]]);

    # check if the first differential is an isomorphism
    isos := CheckForIsomorphism(dList[1]);
    while not(IsEmpty(isos)) do
        reducedModules := [DirectSumMinusSummands(Source(dList[1]),[isos[3]]),
                           DirectSumMinusSummands(Range(dList[1]),[isos[4]])];
        v := ReduceDifferential(dList[1],isos,[Source(reducedModules[1][1]),
                                                  Source(reducedModules[2][1])]);
        tList[2] := ReduceTMap(tList[2],dList[1],isos, reducedModules[1][1]);
        tList[1] := ReducePreviousTMap(tList[1],reducedModules[2][1]);
        dList[1] := v;
        isos := CheckForIsomorphism(dList[1]);
    od;

    # build the rest of the complex, until we get zero
    for pos in [1..j] do
        ker := KernelInclusion(dList[pos]);
        h := ker*tList[pos+1];

        # note: the following check shouldn't really be in this
        # method, but is needed due to the fact that DirectSumOfQPAModules
        # can't handle zero objects.
        if(IsZero(DimensionVector(Source(ker))) and 
           IsZero(DimensionVector(ObjectOfComplex(C,pos+1+i)))) then
            PCompl := FiniteComplex(cat, i+1, dList);
            SetIsProjectiveComplex(PCompl, true);
            return PCompl;
        fi;

        PB := PullBack(DifferentialOfComplex(C,pos+1+i), h);
        PC := ProjectiveCover(Source(PB[1]));

        # if we did get zero: return a finite complex
        if(IsZero(DimensionVector(Source(PC)))) then
            PCompl := FiniteComplex(cat, i+1, dList);
            SetIsProjectiveComplex(PCompl, true);
            return PCompl;
        fi;

        Append(dList, [PC*PB[1]*ker]);
        Append(tList, [PC*PB[2]]);
        
        # check if the newly created differential includes isomorphisms
        isos := CheckForIsomorphism(dList[pos + 1]);
        while not(IsEmpty(isos)) do
            reducedModules := [DirectSumMinusSummands(Source(dList[pos+1]),[isos[3]]),
                               DirectSumMinusSummands(Range(dList[pos+1]),[isos[4]])];
            v := ReduceDifferential(dList[pos+1],isos,[Source(reducedModules[1][1]),
                                                          Source(reducedModules[2][1])]);
            tList[pos+2] := ReduceTMap(tList[pos+2],dList[pos+1],isos, reducedModules[1][1]);
            tList[pos+1] := ReducePreviousTMap(tList[pos+1],reducedModules[2][1]);
            dList[pos+1] := v;
            dList[pos] := ReducePreviousDifferential(dList[pos],reducedModules[2][1]);
            isos := CheckForIsomorphism(dList[pos + 1]);
        od;

    od;
    # return an infinite complex, where the part following the above
    # is the projective resolution of the kernel of the last differential.

    tempCompl := FiniteComplex(cat, i+1, dList);
    tempCompl := SyzygyTruncation(tempCompl, j+1+i);
    projres := ProjectiveResolution(ObjectOfComplex(tempCompl, j+2+i));
    PCompl := YonedaProduct(projres, tempCompl);

    # take care of isos in the "overlap differential" (note: checks for only 
    # one iso here … possible bug)
    isos := CheckForIsomorphism(DifferentialOfComplex(PCompl, pos+2+i));
    if( not IsEmpty(isos)) then
        d := DifferentialOfComplex(PCompl, pos+2+i);
        reducedModules := [DirectSumMinusSummands(Source(d),[isos[3]]),
                           DirectSumMinusSummands(Range(d),[isos[4]])];
        v := ReduceDifferential(d,isos,[Source(reducedModules[1][1]),
                                           Source(reducedModules[2][1])]);
        u := ReducePreviousDifferential(DifferentialOfComplex(PCompl, pos+1+i),
                                        reducedModules[2][1]);
        # edit the "overlap differential" and the previous, make new complex
        diffs := DifferentialsOfComplex(PCompl);
        pospart := PositivePartFrom( diffs, pos+3+i);
        newpart := FiniteInfList( pos+1+i, [u,v]);;
        negpart := NegativePartFrom( diffs, pos + i);
        newdiffs := InfConcatenation(pospart, newpart, negpart);
        PCompl := ComplexByDifferentialList(cat, newdiffs);
    fi;
    SetIsProjectiveComplex(PCompl, true);
    return PCompl;
end);

###################################################
##
#O CheckForIsomorphism( <d> )
##
## for a map <d>, typically a differential, between
## two modules (+Pi) and (+Qj), each Pi and Qj indec 
## (but not necessarily non-iso) projective.
##
## Checks if the _same_ indec projective, say P, 
## appears as a direct summand in both (+Pi) and (+Qj).
## This can possibly happen for more than one summand,
## but as soon as one is found, it is returned.
##
## Returns a list consisting of
##  - the (described above) map from P --> P
##  - the vertex number associated to P (an integer)
##  - the position of P in (+Pi) (an integer)
##  - the position of Pi in (+Qj) (an integer)
##
InstallMethod( CheckForIsomorphism,
               [ IsPathAlgebraMatModuleHomomorphism ],
               function( d )

    local descr1, descr2, mutualIndecs, posList1, posList2, i,
          allMaps, inclusions, projections, j, k, u, u2,
          identities;

    descr1 := DescriptionOfProjectiveModule(Source(d));
    descr2 := DescriptionOfProjectiveModule(Range(d));
    
    # check if there are common indec projectives (+Pi) and (+Qj)
    mutualIndecs := Intersection(descr1,descr2);
    if(IsEmpty(mutualIndecs)) then
        return [];
    fi;
    # find the positions of those in the modules:
    posList1 := List(mutualIndecs, i -> Positions(descr1, i));
    posList2 := List(mutualIndecs, i -> Positions(descr2, i));

    # find all maps between isomorphic direct summands of (+Pi) and (+Qj)
    allMaps := FindAllMapComponents(d);

    identities := [];
    for i in [1..Length(mutualIndecs)] do
        for j in [1..Length(posList1[i])] do
            for k in [1..Length(posList2[i])] do
                u2 := allMaps[posList1[i][j]][posList2[i][k]];
                if IsIsomorphism(u2) then
                    return [u2,mutualIndecs[i],posList1[i][j],posList2[i][k]];
                fi;
            od;
        od;
    od;
    identities := Filtered(identities, i -> IsIsomorphism(i[1]));

    return identities;
end);

###################################################
##
#O ReduceDifferential( <d>, <list>, <reducedModules> )
##
## for a differential <d> between two modules (+Pi) 
## and (+Qj), each Pi and Qj indec (but not neces-
## sarily non-iso) projective, a list <list> which is 
## output from CheckForIsomorphism(d) and a list 
## <reducedModules> consisting of (+Pi~) and (+Qj~).
##
## Returns: a differential (+Pi~) --> (+Qj~) which 
## is reduced with respect to the map in <list>.
##
InstallMethod( ReduceDifferential,
               [ IsPathAlgebraMatModuleHomomorphism, IsList, IsList ],
               function( d, list, reducedModules )
    local n, m, allMaps, newMaps, map, leftMap, rightMap, inverse, A,
          newAllMaps;
    allMaps := FindAllMapComponents(d);
    n := Length(allMaps);
    m := Length(allMaps[1]);
    A := RightActingAlgebra(Source(d));

    # check for zero: if the new modules are zero, return zero map.
    if (IsZero(DimensionVector(reducedModules[2]))) then
        return ZeroMapping(reducedModules[1],reducedModules[2]);
    elif(IsZero(DimensionVector(reducedModules[1]))) then
        return ZeroMapping(reducedModules[1],reducedModules[2]);
    fi;

    # create the new maps: first, remove row j
    newMaps := Concatenation(allMaps{[1..(list[3]-1)]},
                             allMaps{[(list[3]+1)..n]});
    # second, remove column i
    newMaps := List(newMaps, map -> Concatenation(map{[1..(list[4]-1)]},
                                                  map{[(list[4]+1)..m]}));
    

    # compute the maps that is to be subtracted from newMaps
    leftMap := List(allMaps, map -> map{[list[4]]});
    Remove(leftMap,list[3]);
    rightMap := [Concatenation(allMaps[list[3]]{[1..(list[4]-1)]},
                              allMaps[list[3]]{[(list[4]+1)..m]})];
    inverse := InverseOfIsomorphism(allMaps[list[3]][list[4]]);

    # compute all map components for the new differential
    newAllMaps := newMaps - leftMap*inverse*rightMap;

    return DirectSumProjections(reducedModules[1])*newAllMaps*
           DirectSumInclusions(reducedModules[2]);
end);

###################################################
##
#O ReducePreviousDifferential( <d>, <inclusion> )
##
## for a differential <d> between two modules (+Qj) 
## and (+Rk), each Qj and Rk indec (but not neces-
## sarily non-iso) projective, and a map <inclusion> which 
## is the inclusion of the new source (+Qj~) into
## (+Qj).
## 
## Returns the reduced differential of <d>.
##
InstallMethod( ReducePreviousDifferential,
               [ IsPathAlgebraMatModuleHomomorphism,
                 IsPathAlgebraMatModuleHomomorphism ],
               function( d, inclusion )
    return inclusion*d;

end);

###################################################
##
#O ReduceTMap( <t>, <d>, <list>, <incl> )
##
## Similar for <t> as ReduceDifferential is for <d>.
## Input: <t> is the degree i component of the qis
## between C and C', where C' is projective resolution
## of C. <d> is the differential of C' in the same
## degree. <list> is output from CheckForIsomorphism(<d>),
## and <incl> is the inclusion of the reduced version of
## Source(d) into Source(d). 
##
InstallMethod( ReduceTMap,
               [ IsPathAlgebraMatModuleHomomorphism,
                 IsPathAlgebraMatModuleHomomorphism, IsList,
                 IsPathAlgebraMatModuleHomomorphism ],
               function( t, d, list, incl )
    local tQ, tP, newd, inclusions, projections, allMaps, leftMap, inverse, newAllMaps, subtract;
    tQ := incl*t;
    tP := DirectSumInclusions(Source(d))[list[3]]*t;
    newd := incl*d;
    allMaps := FindAllMapComponents(newd);
    leftMap := List(allMaps, map -> map{[list[4]]});
    inverse := InverseOfIsomorphism(FindAllMapComponents(d)[list[3]][list[4]]);
    projections := ShallowCopy(DirectSumProjections(Source(d)));
    Remove(projections,list[3]);
    subtract := incl*projections*leftMap*inverse*tP;
    if IsEmpty(subtract) then
        newAllMaps := tQ;
    else
        newAllMaps := tQ - subtract;
    fi;
    return newAllMaps[1];
end);

###################################################
##
#O ReducePreviousTMap( <t>, <incl> )
##
## Similar for <t> as ReducePreviousDifferential is 
## for <d>. 
##
InstallMethod( ReducePreviousTMap,
               [IsPathAlgebraMatModuleHomomorphism,
                IsPathAlgebraMatModuleHomomorphism],
               function( t, incl)

    return incl*t;
end);


# tau of complex

######################################################
##
#O TauOfComplex( <C> )
##
## <C> is a bounded complex over.
##
## Computes tau of a complex in D^b(mod A), where A has
## finite global dimension.
##
InstallMethod( TauOfComplex,
               [ IsQPAComplex ],
               function( C )
    
    local cat, projVersion, tau, injVersion;

    projVersion := Shift(ProjectiveResolutionOfComplex(C),1);
    injVersion := ProjectiveToInjectiveComplex(projVersion);
    injVersion := CutComplexAbove(injVersion);
    tau := CutComplexAbove(ProjectiveResolutionOfComplex(injVersion));
    SetIsProjectiveComplex(tau,true);
    
    return tau;

end);

######################################################
##
#O ProjectiveToInjectiveComplex( <C> )
##
## <C> is a (possibly finite) complex of projectives.
##
## Applies DHom_{A}(-,A) to <C>. Output is a complex
## of injectives. This is infinite if and only if <C>
## is infinite. If <C> is discovered to be finite, 
## the next method is used.
##
InstallMethod( ProjectiveToInjectiveComplex,
               [ IsQPAComplex ],
               function( PCompl )
    
    local A, cat, start, stop, injectives, inj1, inj2,
          descr1, descr2, i, computeDifferential,
          middle, f, u, mats, injmap, ICompl;

    # check whether PCompl is finite, in which case use below method
    if (IsInt(UpperBound(PCompl))) then
        return ProjectiveToInjectiveFiniteComplex(PCompl);
    fi;

    # find information about the complex
    start := LowerBound(PCompl);
    stop := HighestKnownDegree(PCompl);
    if start = stop then
        stop := stop + 1;
    fi;
    A := RightActingAlgebra(ObjectOfComplex(PCompl, start));
    cat := CatOfRightAlgebraModules(A);
    injectives := IndecInjectiveModules(A);

    # construct the known part of the complex
    middle := [];
    descr1 := DescriptionOfProjComplexInDegree(PCompl, start);
    inj1 := List(descr1, x -> injectives[x]);
    inj1 := DirectSumOfQPAModules(inj1);

    for i in [(start+1)..stop] do
        descr2 := DescriptionOfProjComplexInDegree(PCompl, i);
        if IsEmpty(descr2) then
            break;
        fi;
        # apply DHom_{A}(-,A) to the differentials
        f := DifferentialOfComplex(PCompl, i);
        u := StarOfMapBetweenProjectives(f,descr2,
                                         descr1);
        mats := MatricesOfDualMap(u);
        
        # constructing the correct injectives
        inj2 := List(descr2, x -> injectives[x]);
        inj2 := DirectSumOfQPAModules(inj2);

        # constructing the map between the injectives
        injmap := RightModuleHomOverAlgebra(inj2,inj1,mats);
        Append(middle, [injmap]);

        # updating injectives
        inj1 := inj2;
        descr1 := descr2;
    od;

    # the function finding later differentials ("unknown" part of the complex)
    computeDifferential := function( C,i )
        local rangeobj,descr1,descr2, f, u, mats, inj1, injmap, x;
        rangeobj := ObjectOfComplex(C,i-1);
        descr1 := DescriptionOfProjComplexInDegree(PCompl, i);
        descr2 := DescriptionOfProjComplexInDegree(PCompl, i-1);
        f := DifferentialOfComplex(PCompl, i);
        if IsZero(f) then
            return cat.zeroMap(cat.zeroObj, rangeobj);
        fi;
        u := StarOfMapBetweenProjectives(f, descr1, descr2);
        mats := MatricesOfDualMap(u);
        inj1 := List(descr1, x -> injectives[x]);
        inj1 := DirectSumOfQPAModules(inj1);
        return RightModuleHomOverAlgebra(inj1, rangeobj, mats);
    end;
    ICompl := Complex( cat,
                       start+1,
                       middle,
                       [ "pos", computeDifferential, true ],
                       "zero" );

    SetIsInjectiveComplex(ICompl, true);
    return ICompl;
end);

######################################################
##
#O ProjectiveToInjectiveFiniteComplex( <C> )
##
## <C> is a finite complex of projectives.
##
## Applies DHom_{A}(-,A) to <C>. Output is a finite complex
## of injectives. Note that the previous (and more general)
## method checks for infinity, so there is no need for
## explicitly calling this method.
##
InstallMethod( ProjectiveToInjectiveFiniteComplex,
               [ IsQPAComplex ],
               function( PCompl )

    local A, cat, start, stop, descr, maplist, i, f, u, mats, x, inj1,
          inj2, injmap, injectives, ICompl;
    start := LowerBound(PCompl);
    stop := UpperBound(PCompl);

    A := RightActingAlgebra(ObjectOfComplex(PCompl,start));
    cat := CatOfRightAlgebraModules(A);
    injectives := IndecInjectiveModules(A);

    # get a description of which projectives are in the complex
    descr := DescriptionOfFiniteProjComplex(PCompl);
    maplist := [];

    # note: need special case for when PCompl is stalk complex!
    if (LengthOfComplex(PCompl) = 1) then
        ICompl := StalkComplex(cat, injectives[descr[1][1]], start);
        SetIsInjectiveComplex(ICompl, true);
        return ICompl;
    fi;
    
    # the first injective
    inj1 := List(descr[1], x -> injectives[x]);
    inj1 := DirectSumOfQPAModules(inj1);


    for i in [(start+1)..stop] do
#        Print("ser nå på avbildningen i grad ", i , ".\n");
        f := DifferentialOfComplex(PCompl, i);
        u := StarOfMapBetweenProjectives(f,descr[i+1-start],descr[i-start]);
        mats := MatricesOfDualMap(u);
        
        # constructing the correct injectives
        inj2 := List(descr[i+1-start], x -> injectives[x]);
        inj2 := DirectSumOfQPAModules(inj2);

        # constructing the map between the injectives
        injmap := RightModuleHomOverAlgebra(inj2,inj1,mats);
        Append(maplist, [injmap]);

        # updating injectives
        inj1 := inj2;
    od;
    ICompl := FiniteComplex(cat, start+1, maplist);
    SetIsInjectiveComplex(ICompl, true);
    return ICompl;

end);

######################################################
##
#O StarOfMapBetweenProjectives( <f>, <list_i>, <list_j> )
##
## <f> is a map between two projective modules (+Pi) and (+Qj),
## where <list_i> and <list_j> give the indecomposable 
## summands of (+Pi) and (+Qj) (in terms of vertices of the quiver).
##
## Output is a map between the corresponding projectives
## in the opposite algebra, that is, Hom_{A}(-,A) is applied.
##
## This function is supposed to be used only when called
## from the "ProjectiveToInjectiveComplex"-methods. It cannot,
## for instance, handle zero maps.
##
InstallMethod( StarOfMapBetweenProjectives,
               [ IsPathAlgebraMatModuleHomomorphism, IsList, IsList ],
               function( f, list_i, list_j )
    local maplist, u, j, i, map, source, projections, range,
          inclusions, outermaplist;
      
    maplist := [];
    map := 0;
    if(not Length(list_i) > 1 ) then
        # P module indec
        map := StarOfMapBetweenIndecProjectives(f, list_i[1], list_j);
    else
        # P module not indec
        map := StarOfMapBetweenDecompProjectives(f, list_i, list_j);
    fi;
    return map; 
end);

######################################################
##
#O StarOfMapBetweenIndecProjectives( <f>, <i>, <j_list> )
##
## <f> is a map between two projective modules Pi and +(Qj),
## where Pi is indecomposable and <j_list> gives the indecom-
## posable summands of +(Qj) (in terms of vertices of the 
## quiver).
##
## Output is a map between the corresponding projectives
## in the opposite algebra, that is, Hom_{A}(-,A) is applied.
##
## This function is supposed to be used only when called
## from the "StarOfMapBetweenProjectives"-method. It cannot,
## for instance, handle zero maps.
##
InstallMethod( StarOfMapBetweenIndecProjectives,
                    [ IsPathAlgebraMatModuleHomomorphism, IsInt, IsList ],
                    function( f, i, j_list )

    local A, BP, e_i, elem, BasisOfVertex, eleminalg,
          A_op, P_op, a_op, e_i_op, e_i_op_a_op, s, u,
          vertices, jvertice, support,
          u_list, source, projections,
   summands, summand, k;
    
    # finding the algebra and the indec projectives
    A := RightActingAlgebra(Source(f));
    BP := BasisOfProjectives(A);
 
    # the opposite algebra
    A_op := OppositeAlgebra(A);
    P_op := IndecProjectiveModules(A_op);
   
    u_list := [];
    
    # in case Range(f) is not a direct sum:
    if not IsDirectSumOfModules(Range(f)) then
        summands := [f];
    else
        summands := f*DirectSumProjections(Range(f));
    fi;

    for k in [1..Length(j_list)] do
        if(IsZero(summands[k])) then
            Append(u_list,[ZeroMapping(P_op[j_list[k]],P_op[i])]);
        else

        # constructing f(e_i) as an element in the path algebra
            e_i := MinimalGeneratingSetOfModule(Source(summands[k]))[1];
            elem := ImageElm(summands[k], e_i);
            BasisOfVertex := BP[j_list[k]][i];
            eleminalg := LinearCombination(BasisOfVertex, elem![1]![1][i]);
            a_op := OppositePathAlgebraElement(eleminalg);
    
        # aop as element in the module
            e_i_op :=  Filtered(MinimalGeneratingSetOfModule(P_op[i]),
                                m -> not(IsZero(m![1]![1][i])))[1];
            e_i_op_a_op := e_i_op^a_op;
         # the map Qj* --> Pi*
            vertices := VerticesOfPathAlgebra(A_op);
            jvertice := vertices[j_list[k]]; #?
            support := e_i_op_a_op^jvertice;
            
        # zero maps must also be included
            if (IsZero(support)) then
                u := ZeroMapping(P_op[j_list[k]],P_op[i]);
            else
                u := HomFromProjective(support, P_op[i]);
            fi;
            Append(u_list, [u]);
        fi;
    od;
    source := List(u_list, u -> Source(u));
    source := DirectSumOfQPAModules(source);
    projections := DirectSumProjections(source);
    return projections*u_list;

end);

######################################################
##
#O StarOfMapBetweenDecompProjectives( <f>, <i_list>, <j_list> )
##
## <f> is a map between two projective modules (+Pi) and (+Qj),
## where <i_list> and <j_list> give the indecomposable summands
## of (+Pi) and (+Qj) (in terms of vertices of the quiver).
##
## Output is a map between the corresponding projectives
## in the opposite algebra, that is, Hom_{A}(-,A) is applied.
##
## This function is supposed to be used only when called
## from the "StarOfMapBetweenProjectives"-method. It cannot,
## for instance, handle zero maps.
##
InstallMethod( StarOfMapBetweenDecompProjectives,
                    [ IsPathAlgebraMatModuleHomomorphism, IsList, IsList ],
                    function( f, i_list, j_list )

    local maplist, i, range, m, inclusions, i_inclusions, A, BP, A_op, P_op, g, summands,
          k, u_list, e_i, elem, BasisOfVertex, eleminalg, a_op, e_i_op, e_i_op_a_op,
          vertices, jvertices, j, supportList, s, u, source, projections;

    maplist := [];
    i_inclusions := DirectSumInclusions(Source(f));

    for i in [1..Length(i_list)] do
        g := i_inclusions[i]*f;
        Append(maplist, [StarOfMapBetweenIndecProjectives(g, i_list[i], j_list)]);

    od;

    # cheating to get same source of the maps:
    if (Length(maplist) > 1) then
        for j in [2..Length(maplist)] do
            maplist[j] := DirectSumProjections(Source(maplist[1]))*
                          DirectSumInclusions(Source(maplist[j]))*maplist[j];
       od;
    fi;

    range := List(maplist, m-> Range(m));
    range := DirectSumOfQPAModules(range);
    inclusions := DirectSumInclusions(range);
    return maplist*inclusions;

end);

# various methods for describing proj/inj complexes
# and printing them

###################################################
##
#O DescriptionOfProjectiveModule( <M> )
##
## <M> is a projective module, either indecomposable
## (M = Pi for some vertex i) or a direct sum (+Pi) 
## of indecomposable projectives.
##
## Returns a list with the vertex numbers of the
## indecomposable direct summands of <M>.
##
InstallMethod( DescriptionOfProjectiveModule,
               [ IsPathAlgebraMatModule ],
               function( M )

    local list, comp, incls, incl;

    list := [];
    
    if IsZero(DimensionVector(M)) then
        return list;
    fi;

    if(not IsDirectSumOfModules(M)) then
        comp := CompareWithIndecProjective(M);
        Append(list, [comp]);
    else
        incls := DirectSumInclusions(M);
        for incl in incls do
            comp := CompareWithIndecProjective(Source(incl));
            Append(list, [comp]);
        od;
    fi;
    return list;
end);



###################################################
##
#O DescriptionOfProjComplexInDegree( <C>,<i> )
##
## <C> is a complex consisting only of projectives,
## and i is an integer.
##
## Returns a list with the vertex numbers of the
## projectives in degree <i> of <C>.
##
InstallMethod( DescriptionOfProjComplexInDegree,
               [ IsQPAComplex, IsInt ],
               function( C, i )
    return DescriptionOfProjOrInjComplexInDegree(C, i, true);
end);

###################################################
##
#O DescriptionOfInjComplexInDegree( <C>,<i> )
##
## <C> is a complex consisting only of injectives,
## and i is an integer.
##
## Returns a list with the vertex numbers of the
## injectives in degree <i> of <C>.
##
InstallMethod( DescriptionOfInjComplexInDegree,
               [ IsQPAComplex, IsInt ],
               function( C, i )
    return DescriptionOfProjOrInjComplexInDegree(C, i, false);
end);

###################################################
##
#O DescriptionOfProjOrInjComplexInDegree( <C>,<i>,<test> )
##
## <C> is a complex consisting only of projectives OR
## only of injectives, and <i> is an integer.
##
## <test> is a boolean, with values interpreted as
##     <test> = true  <->  C consists of projectives
##     <test> = false <->  C consists of injectives
##
## Returns a list with the vertex numbers of the
## projectives or injectives in degree <i> of <C>.
##
InstallMethod( DescriptionOfProjOrInjComplexInDegree,
               [ IsQPAComplex, IsInt, IsBool ],
               function( C, i, test )
    local obj,comp, list, incls, incl;
    
    obj := ObjectOfComplex(C, i);

    if test then
        return DescriptionOfProjectiveModule(obj);
    else    
        list := [];
        
        if IsZero(DimensionVector(obj)) then
            return list;
        fi;

        if(not IsDirectSumOfModules(obj)) then
            comp := CompareWithIndecInjective(obj);
            Append(list, [comp]);
        else
            incls := DirectSumInclusions(obj);
            for incl in incls do
                comp := CompareWithIndecInjective(Source(incl));
                Append(list, [comp]);
            od;
        fi;
        return list;
    fi;
end);

######################################################
##
#O DescriptionOfFiniteProjComplex( <C> )
##
## <C> is a finite complex consisting only of 
## projectives.
##
## Returns a list of lists, one list for each degree
## of <C>, containing the vertex numbers of the
## projectives in this degree.
##
InstallMethod( DescriptionOfFiniteProjComplex,
               [ IsQPAComplex ],
               function( C )
    return DescriptionOfFiniteProjOrInjComplex(C,true);
end);

######################################################
##
#O DescriptionOfFiniteInjComplex( <C> )
##
## <C> is a finite complex consisting only of 
## injectives.
##
## Returns a list of lists, one list for each degree
## of <C>, containing the vertex numbers of the
## injectives in this degree.
##
InstallMethod( DescriptionOfFiniteInjComplex,
               [ IsQPAComplex ],
               function( C )
    return DescriptionOfFiniteProjOrInjComplex(C,false);
end);

###################################################
##
#O DescriptionOfFiniteProjOrInjComplex( <C>,<test> )
##
## <C> is a complex consisting only of projectives OR
## only of injectives.
##
## <test> is a boolean, with values interpreted as
##     <test> = true  <->  C consists of projectives
##     <test> = false <->  C consists of injectives
##
## Returns a list of lists, one list for each degree
## of <C>, containing the vertex numbers of the
## projectives/injectives in this degree.
##
InstallMethod( DescriptionOfFiniteProjOrInjComplex,
               [ IsQPAComplex, IsBool ],
               function( C, test )

    local i,obj,comp, incls, incl, list, templist, start, stop;
    
    start := LowerBound(C);
    stop := UpperBound(C);
    list := [];
    
    if(not(IsInt(UpperBound(C)))) then
        Error("complex entered is not finite!");
    fi;

    for i in [start..stop] do
        templist := DescriptionOfProjOrInjComplexInDegree(C, i, test);
        Append(list, [templist]);
    od;

    return list;
end);

######################################################
##
#O CompareWithIndecProjective( <M> )
##
## <M> is a indecomposable projective module.
##
## Returns the number of the vertex <M> belongs to.
##
InstallMethod( CompareWithIndecProjective,
               [ IsPathAlgebraMatModule ],
               function( M )

    local A, projlist, i;

    #first find the algebra of which M is a module
    A := RightActingAlgebra(M);
    
    projlist := IndecProjectiveModules(A);

    for i in [1..Length(projlist)] do
        if(DimensionVector(M) = DimensionVector(projlist[i])) then
            return i;
        fi;
    od;

    return false;
end);

######################################################
##
#O CompareWithIndecInjective( <M> )
##
## <M> is a indecomposable injective module.
##
## Returns the number of the vertex <M> belongs to.
##
InstallMethod( CompareWithIndecInjective,
               [ IsPathAlgebraMatModule ],
               function( M )

    local A, injlist, i;

    #first find the algebra of which M is a module
    A := RightActingAlgebra(M);
    
    injlist := IndecInjectiveModules(A);

    for i in [1..Length(injlist)] do
        if(DimensionVector(M) = DimensionVector(injlist[i])) then
            return i;
        fi;
    od;

    return false;

end);

# other methods used, not directly connected to the topic
# but not good for general use

# moved to modulehom.g?
######################################################
##
#O MultiplyListsOfMaps( <projections>, <matrix>, <inclusions> )
##
## <projections> is a list of m maps, <matrix> is a list of
## m lists of n maps, <inclusions> is a list of n maps. 
## Considering <projections> as a 1xm-matrix, <matrix> as an
## mxn-matrix and and <inclusions> as an nx1-matrix, the 
## matrix product is computed. Naturally, the maps in the 
## matrices must be composable.
##
## Output is a map (not a 1x1-matrix).
##
## Utility method not supposed to be here, but there seemed
## to be no existing GAP method for this.
##
#InstallMethod( MultiplyListsOfMaps,
#                    [ IsList, IsList, IsList ],
#                    function( projections, matrix, inclusions )
#    local sum, list, n, m, i, j;
#
#    n := Length(projections);
#    m := Length(inclusions);
#    list := [1..m];
#    sum := 0;
#
#    for i in [1..m] do
#       list[i] := projections*matrix[i];
#    od;
#
#    sum := list*inclusions;
#    return sum;
#end);

######################################################
##
#O FindAllMapComponents( <inclusions>, <d>, <projections> )
##
## <inclusions> is the direct sum inclusions of a module
## (+Pi), <projections> is the direct sum projections of a
## module (+Qj). <d> is a map (+Pi) ---> (+Qj).
##
## Output is all components of d (all elements in the matrix
## d consists of). Order on resulting set of maps:
##
## [ [P1 --> Q1, P1 --> Q2, ..., P1 --> Qm],
## [P2 --> Q1, ...,P2 --> Qm], ..., [Pn --> Q1, ...,Pn --> Qm] ]
##
InstallMethod( FindAllMapComponents,
               [ IsPathAlgebraMatModuleHomomorphism ],
               function( d )

    local firstPart, n, fullPart, i, inclusions, projections;
    inclusions := DirectSumInclusions(Source(d));
    projections := DirectSumProjections(Range(d));
    firstPart := inclusions*d;
    n := Length(inclusions);
    fullPart := [];
    for i in [1..n] do
        Append(fullPart, [List(projections, f -> firstPart[i]*f)]);
    od;
    return fullPart;

end);

######################################################
##
#O MatricesOfDualMap( <f> )
##
## <f> is a map Pj* --> Pi*, where Pj* and Pi* are
## projective A^{op}-modules.
##
## Returns the matrices for the dual map Df: Ii --> Ij
## (not the map itself!) in A.
##
InstallMethod( MatricesOfDualMap,
               [ IsPathAlgebraMatModuleHomomorphism ],
               function( f )
    local maps, origmaps, x;
    origmaps := f!.maps;
    maps := List(origmaps, x -> TransposedMat(x));
    return maps;
end);



######################################################
##
#O DirectSumMinusSummands( <M>, <list> )
##
## <M> = (+Mi) a direct sum M_1 + M_2 + ... + M_n, not nec. non-iso
## <list> is a list of integers [a1, a2, ... , ar], r <= n
##
## Output:
## let M' = M/(+Mj) where Mj is M_a1 + M_a2 + ... + M_ar
## the output is [inclusion, projection] where inclusion is the canonical
## inclusion M' --> M and projection is the canonical projection M --> M'
## if M' = 0, then a pair of appropriate zero maps is returned.
##
InstallMethod( DirectSumMinusSummands,
               [ IsPathAlgebraMatModule, IsList ],
               function( M, list )
    local inclusions, tempSource, redundantSummand, test, i, complementList,
          newModule, sourceProjections, j, inclusion, projections, rangeInclusions, projection;
    
    inclusions := DirectSumInclusions(M);
    tempSource := List(inclusions, map -> Source(map));

    # keep the redundant summands
    redundantSummand := tempSource{list};

    # remove them from tempSource
    test := function(i)
      if i in list then
     return 0;
  fi;
  return i;
    end;
    complementList := PositionsNonzero(List([1..Length(tempSource)],
            l -> test(l)));
    tempSource := tempSource{complementList};

    if IsEmpty(tempSource) then
        return[ZeroMapping(ZeroModule(RightActingAlgebra(M)),M),
               ZeroMapping(M, ZeroModule(RightActingAlgebra(M)))];
    fi;
    newModule := DirectSumOfQPAModules(tempSource);

    # projections from new module to all dir. summands of the original module
    sourceProjections := DirectSumProjections(newModule);
    j := 1;
    for i in list do
        sourceProjections := Concatenation(sourceProjections{[1..(i-1)]},
                         [ZeroMapping(newModule,redundantSummand[j])],
                         sourceProjections{[(i)..Length(sourceProjections)]});
        j := j + 1;
    od;
    inclusion := sourceProjections*inclusions;

    # doing the same thing for projections
    projections := DirectSumProjections(M);

    rangeInclusions := DirectSumInclusions(newModule);
    j := 1;
    for i in list do
        rangeInclusions := Concatenation(rangeInclusions{[1..(i-1)]},
                         [ZeroMapping(redundantSummand[j],newModule)],
                         rangeInclusions{[(i)..Length(rangeInclusions)]});
        j := j + 1;
    od;
    projection := projections*rangeInclusions;
    return [inclusion,projection];
end);

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