diff --git a/M2/Macaulay2/m2/matrix2.m2 b/M2/Macaulay2/m2/matrix2.m2 index 01bcad74f35..a51ccbcbf79 100644 --- a/M2/Macaulay2/m2/matrix2.m2 +++ b/M2/Macaulay2/m2/matrix2.m2 @@ -396,6 +396,7 @@ Matrix \\ Matrix := Matrix => (g, f) -> quotient'(f, g) quotient(Matrix, Matrix) := Matrix => opts -> (f, g) -> ( -- given f: A-->C and g: B-->C, then find (f//g): A-->B such that g o (f//g) + r = f if target f != target g then error "quotient: expected maps with the same target"; + if f == 0 then return map(source g, source f, 0); c := runHooks((quotient, Matrix, Matrix), (opts, f, g), Strategy => opts.Strategy); if c =!= null then c else error "quotient: no method implemented for this type of input") @@ -408,11 +409,19 @@ addHook((quotient, Matrix, Matrix), Strategy => Default, MinimalGenerators => opts.MinimalGenerators }; map(source g, source f, homomorphism(homomorphism'(f, opts) // Hom(source f, g, opts))))) --- FIXME: this is still causing unreasonable slow downs, e.g. for (large m) // (scalar) -addHook((quotient, Matrix, Matrix), Strategy => "Reflexive", (opts, f, g) -> if f == 0 or isFreeModule source f then ( - L := source f; -- result may not be well-defined if L is not free +addHook((quotient, Matrix, Matrix), Strategy => "Reflexive", (opts, f, g) -> ( + L := source f; M := target f; N := source g; + -- TODO: should this be a separate strategy? + if not isFreeModule L then return ( + -- result may not be well-defined if L is not free, + -- unless the composition h * syz p is zero + p := coverMap L; + h := quotient(f * p, g, Strategy => "Reflexive"); + -- TODO: does h * gens ker p != 0 suffice? + if h * inducedMap(source p, kernel p) == 0 then map(N, L, h)); + -- if M.?generators then ( M = cokernel presentation M; -- this doesn't change the cover ); diff --git a/M2/Macaulay2/packages/Macaulay2Doc/functions/quotient-remainder-doc.m2 b/M2/Macaulay2/packages/Macaulay2Doc/functions/quotient-remainder-doc.m2 index 1f44bec5d5c..1126dd757e9 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/functions/quotient-remainder-doc.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/functions/quotient-remainder-doc.m2 @@ -152,8 +152,8 @@ Node reduction of @TT "f"@ modulo a Gröbner basis for the image of @TT "dual g"@. See @TO quotient@ for the dual notion. - If the remainder @TT "f - h*g"@ is zero, then the quotient @TT "g\\f"@ - satisfies the equation @TT "f === (g\\f) * g"@. Otherwise, the equation + If the remainder @TT "f - h*g"@ is zero, then the quotient @TT "g\\\\f"@ + satisfies the equation @TT "f === (g\\\\f) * g"@. Otherwise, the equation @TT "h * g + r === f"@ will hold, where @TT "r"@ is the map provided by @TO remainder'@. Example diff --git a/M2/Macaulay2/packages/Macaulay2Doc/ov_system.m2 b/M2/Macaulay2/packages/Macaulay2Doc/ov_system.m2 index 34bd142e82d..d737a7fa59c 100644 --- a/M2/Macaulay2/packages/Macaulay2Doc/ov_system.m2 +++ b/M2/Macaulay2/packages/Macaulay2Doc/ov_system.m2 @@ -1870,7 +1870,12 @@ document { Key => "loadedFiles", PARA { "After each source file is successfully loaded, the full path to the file is stored in the hash table ", TO "loadedFiles", ". It is stored as the value, with the corresponding key being a small integer, consecutively assigned, starting at 0." }, - EXAMPLE "peek loadedFiles"} + EXAMPLE lines /// + loadedFiles#0 + #loadedFiles + ///, + --SeeAlso => { "filesLoaded" }, + } document { Key => "homeDirectory", Headline => "the home directory of the user", diff --git a/M2/Macaulay2/packages/SpectralSequences.m2 b/M2/Macaulay2/packages/SpectralSequences.m2 index 5da4de6ece1..2bbe7231c66 100644 --- a/M2/Macaulay2/packages/SpectralSequences.m2 +++ b/M2/Macaulay2/packages/SpectralSequences.m2 @@ -16,437 +16,299 @@ -- this program. If not, see . -------------------------------------------------------------------------------- newPackage( - "SpectralSequences", --- AuxiliaryFiles => true, - Version => "1.0", - Date => "20 September 2016", - Authors => { - { - Name => "David Berlekamp", - Email => "daffyd@math.berkeley.edu", - HomePage => "http://www.math.berkeley.edu/~daffyd"}, - { - Name => "Adam Boocher", - Email => "boocher@math.utah.edu", - HomePage => "http://www.math.utah.edu/~boocher"}, - { - Name => "Nathan Grieve", - Email => "n.grieve@unb.ca", - HomePage => "http://www.math.unb.ca/~ngrieve"}, - { - Name => "Eloisa Grifo", - Email => "eloisa.grifo@virginia.edu", - HomePage => "http://people.virginia.edu/~er2eq/"}, - { - Name => "Gregory G. Smith", - Email => "ggsmith@mast.queensu.ca", - HomePage => "http://www.mast.queensu.ca/~ggsmith"}, - { - Name => "Thanh Vu", - Email => "vqthanh@math.berkeley.edu", - HomePage => "http://math.berkeley.edu/~thanh"}}, - Headline => "spectral sequences", - Keywords => {"Homological Algebra"}, - PackageImports => {"Truncations"}, - PackageExports => {"SimplicialComplexes", "ChainComplexExtras", "PushForward"} - ) + "SpectralSequences", + Headline => "spectral sequences and filtered complexes", + Keywords => { "Homological Algebra" }, + Version => "1.2", + Date => "9 July 2025", + Authors => { + { + Name => "David Berlekamp", + Email => "daffyd@math.berkeley.edu", + HomePage => "http://www.math.berkeley.edu/~daffyd"}, + { + Name => "Adam Boocher", + Email => "boocher@math.utah.edu", + HomePage => "http://www.math.utah.edu/~boocher"}, + { + Name => "Nathan Grieve", + Email => "n.grieve@unb.ca", + HomePage => "http://www.math.unb.ca/~ngrieve"}, + { + Name => "Eloisa Grifo", + Email => "eloisa.grifo@virginia.edu", + HomePage => "http://people.virginia.edu/~er2eq/"}, + { + Name => "Gregory G. Smith", + Email => "ggsmith@mast.queensu.ca", + HomePage => "http://www.mast.queensu.ca/~ggsmith"}, + { + Name => "Thanh Vu", + Email => "vqthanh@math.berkeley.edu", + HomePage => "http://math.berkeley.edu/~thanh"}}, + PackageExports => {"SimplicialComplexes", "Complexes", "PushForward"}, + AuxiliaryFiles => true, + ) export { - "FilteredComplex", - "filteredComplex", - "SpectralSequence", - "spectralSequence", - "spots", - "SpectralSequencePage", - "spectralSequencePage", - "homologyIsomorphism", - "Shift", - "ReducedHomology", - "SpectralSequencePageMap", - "spectralSequencePageMap", - "connectingMorphism", - "sourcePruningMap", - "targetPruningMap", - "Page", - "PageMap", - "pageMap", - "page" , - "pruningMaps", "edgeComplex", - "filteredHomologyObject", "associatedGradedHomologyObject", "netPage" - } - - -protect inducedMaps - --------------------------------------------------------------------------------- - -hasAttribute = value Core#"private dictionary"#"hasAttribute" -getAttribute = value Core#"private dictionary"#"getAttribute" -ReverseDictionary = value Core#"private dictionary"#"ReverseDictionary" - ------------------------------------------------------- ------------------------------------------------------- + "FilteredComplex", + "filteredComplex", + "SpectralSequence", + "spectralSequence", + "spots", + "SpectralSequencePage", + "spectralSequencePage", + "homologyIsomorphism", + "Shift", + "ReducedHomology", + "SpectralSequencePageMap", + "spectralSequencePageMap", + "connectingMorphism", + "sourcePruningMap", + "targetPruningMap", + "Page", + "PageMap", + "page", + "pruningMaps", + "edgeComplex", + "filteredHomologyObject", + "associatedGradedHomologyObject", + "netPage", + } +importFrom_Core { + "getAttribute", "hasAttribute", "ReverseDictionary", + } -------------------------------------------------------------------------------- -- CODE -------------------------------------------------------------------------------- ------------------------------------------------------------------------------------- --- ChainComplexExtraExtras -- Several people have worked on this portion of the code --------------------------------------------------------------------------------------- +-- TODO: move these to Complexes --- since things are mutable we don't want to cache spots spots = method() +spots Complex := List => C -> sort keys C.module -spots ChainComplex := List => ( - C -> sort select(keys complete C,i -> class i === ZZ)) - -max ChainComplex := K -> max spots K -min ChainComplex := K -> min spots K - -support ChainComplex := List => ( - C -> sort select (spots C, i -> C_i != 0)) - - --- Computes the graded pieces of the total complex of a Hom double complex --- (just as a graded module, so no maps!) -Hom (GradedModule, GradedModule) := GradedModule => opts -> (C, D) -> ( - R := C.ring; if R =!= D.ring then error "expected graded modules over the same ring"; - (c,d) := (spots C, spots D); - pairs := new MutableHashTable; - scan(c, i -> scan(d, j -> ( - k := j-i; - p := if not pairs#?k then pairs#k = new MutableHashTable else pairs#k; - p#(i,j) = 1;))); - scan(keys pairs, k -> pairs#k = sort keys pairs#k); - E := new GradedModule; - E.ring = R; - scan(keys pairs, k-> ( - p := pairs#k; - E#k = directSum(apply(p, v -> v => Hom(C_(v#0), D_(v#1), opts)));)); - E) - - - -isWellDefined ChainComplexMap := Boolean => f -> ( - (F,G):= (source f, target f); - all(drop(spots F,1), i -> G.dd_i * f#i == f#(i-1) * F.dd_i)) - --- Computes the total complex of the Hom double complex of two chain complexes --- This code is different from that in ChainComplexExtras. We need this version --- so that the indices are cached. -Hom (ChainComplex, ChainComplex) := ChainComplex => opts -> (C, D) -> ( - if C.ring =!= D.ring then error "expected chain complexes over the same ring"; - hom := lookup(Hom, GradedModule, GradedModule); - E := chainComplex (hom opts)(C, D); - scan(spots E, i -> if E#?i and E#?(i-1) then E.dd#i = - map(E#(i-1), E#i, - matrix table( - E#(i-1).cache.indices, E#i.cache.indices, - (j,k) -> map(E#(i-1).cache.components#(E#(i-1).cache.indexComponents#j), - (E#i).cache.components#((E#i).cache.indexComponents#k), - if j#0 === k#0 and j#1 === k#1-1 then (-1)^(k#0)*Hom(C_(k#0), D.dd_(k#1), opts) - else if j#0 === k#0 + 1 and j#1 === k#1 then Hom(C.dd_(j#0), D_(k#1), opts) - else 0)))); - E -) - -Hom (ChainComplex, ChainComplexMap) := ChainComplexMap => opts -> (C, f) -> ( - (F, G) := (Hom(C, source f, opts), Hom(C, target f, opts)); - map(G,F, i -> map(G_i,F_i, matrix table( G_i.cache.indices,F_i.cache.indices, - (j,k) -> map(G#i.cache.components#(G#i.cache.indexComponents#j), - F#i.cache.components#(F#i.cache.indexComponents#k), - if j === k then Hom(C_(j#0), f_(j#1), opts) - else 0))))) - -Hom (ChainComplexMap, ChainComplex) := ChainComplexMap => opts -> (f, C) -> ( - (F, G) := (Hom(target f, C, opts), Hom(source f, C, opts)); - map(G,F, i -> map (G_i,F_i, matrix table(G_i.cache.indices,F_i.cache.indices, - (j,k) -> map(G#i.cache.components#(G#i.cache.indexComponents#j), - F#i.cache.components#(F#i.cache.indexComponents#k), - if j === k then Hom(f_(j#0), C_(j#1), opts) - else 0))))) - -ChainComplexMap ** ChainComplex := ChainComplexMap => (f,C) -> ( - (F,G) := ((source f) ** C, (target f) ** C); - map(G,F, i -> map (G_i,F_i, matrix table(G_i.cache.indices,F_i.cache.indices, - (j,k) -> map(G#i.cache.components#(G#i.cache.indexComponents#j), - F#i.cache.components#(F#i.cache.indexComponents#k), - if j === k then f_(j#0) ** C_(j#1) - else 0))))) - -ChainComplex ** ChainComplexMap := ChainComplexMap => (C,f) -> ( - (F,G) := (C ** source f, C ** target f); - map(G,F, i -> map (G_i,F_i, matrix table(G_i.cache.indices,F_i.cache.indices, - (j,k) -> map(G#i.cache.components#(G#i.cache.indexComponents#j), - F#i.cache.components#(F#i.cache.indexComponents#k), - if j === k then C_(j#0) ** f_(j#1) - else 0))))) - --- truncate a chain complex at a given homological degree -truncate(ChainComplex,ZZ):= {} >> o -> (C,q) ->( - if q == 0 then return C - else ( - m := min support C; - n := max support C; - l := length C; - if q < -l or q > l then return image(0*id_C) - else K:=new ChainComplex; - K.ring=C.ring; - if q < 0 then for i from min C + 1 to max C do ( - if i <= n + q then K.dd_i = C.dd_i - else if i-1 > n + q then K.dd_i = inducedMap(0*C_(i-1),0*C_i,C.dd_i) - else K.dd_i = inducedMap(C_(i-1), 0*C_i, C.dd_i) ) - else for i from min C+1 to max C do ( - if i-1 >= q + m then K.dd_i = C.dd_i - else if i < q + m then K.dd_i = inducedMap(0*C_(i-1),0*C_i,C.dd_i) - else K.dd_i = map(0*C_(i-1), C_i, 0*C.dd_i) )); - K) - +support Complex := List => C -> select(spots C, i -> C_i != 0) -- the following relies on the pushFwd method from the package "PushForward.m2" - -pushFwd(RingMap,ChainComplex):=o->(f,C) -> -( pushFwdC := chainComplex(source f); - maps := apply(spots C, i-> (i,pushFwd(f,C.dd_i))); - for i from min C to max C do ( - pushFwdC.dd_(maps#i_0) = maps#i_1 - ); - pushFwdC - ) - - --- New method for tensor that returns the tensor product of a complex via a ring map -tensor(RingMap, ChainComplex) := ChainComplex => {} >> opts -> (f,C) -> ( - k := min C; - D := chainComplex( - if even(k) then apply( - drop(select(keys complete C, - i -> instance(i,ZZ)),1), - j -> f ** C.dd_j) - else apply( - drop(select(keys complete C, - i -> instance(i,ZZ)),1), - j -> (-1) * (f ** C.dd_j))); - D[-k] - ) - - ----------------------------------------------------------------------------------- +pushFwd(RingMap, Complex) := o -> (f, C) -> ( + (lo, hi) := concentration C; + if lo == hi + then complex(pushFwd(f, C_lo, o), Base => lo) + else complex applyValues(C.dd.map, + m -> pushFwd(f, m, o))) + +naiveTruncation(Complex, ZZ) := Complex => (C, n) -> ( + (lo, hi) := concentration C; + if n > 0 then naiveTruncation(C, (lo + n, infinity)) else + if n < 0 then naiveTruncation(C, (-infinity, hi + n)) else C) ------------------------------------------------------------------------------------- -- filtered complexes ------------------------------------------------------------------------------------- + FilteredComplex = new Type of HashTable FilteredComplex.synonym = "filtered chain complex" spots FilteredComplex := List => ( - K -> sort select(keys K, i -> class i === ZZ)) + K -> sort select(keys K, i -> class i === ZZ)) max FilteredComplex := K -> max spots K min FilteredComplex := K -> min spots K support FilteredComplex := List => ( - K -> sort select (spots K, i -> K#i != 0)) - + K -> sort select (spots K, i -> K#i != 0)) FilteredComplex _ InfiniteNumber := -FilteredComplex _ ZZ := ChainComplex => (K,p) -> ( - if K#?p then K#p - else if p < min K then K#(min K) - else if p > max K then K#(max K) - ) +FilteredComplex _ ZZ := Complex => (K,p) -> ( + if K#?p then K#p + else if p < min K then K#(min K) + else if p > max K then K#(max K) + ) FilteredComplex ^ InfiniteNumber := -FilteredComplex ^ ZZ := ChainComplex => (K,p) -> K_(-p) +FilteredComplex ^ ZZ := Complex => (K,p) -> K_(-p) -chainComplex FilteredComplex := ChainComplex => K -> K_infinity +complex FilteredComplex := Complex => {} >> o -> K -> K_infinity -- Returns the inclusion map from the pth subcomplex to the top -inducedMap (FilteredComplex, ZZ) := ChainComplexMap => opts -> (K,p) -> ( - if not K.cache#?inducedMaps then K.cache.inducedMaps = new MutableHashTable; - if not K.cache.inducedMaps#?p then K.cache.inducedMaps#p = inducedMap(K_infinity, K_p); - K.cache.inducedMaps#p) - +protect inducedMaps +inducedMap (FilteredComplex, ZZ) := ComplexMap => opts -> (K,p) -> ( + if not K.cache#?inducedMaps then K.cache.inducedMaps = new MutableHashTable; + if not K.cache.inducedMaps#?p then K.cache.inducedMaps#p = inducedMap(K_infinity, K_p); + K.cache.inducedMaps#p) net FilteredComplex := K -> ( - v := between("", apply(spots K, p -> p | " : " | net K_p)); - if #v === 0 then "0" else stack v) + v := between("", apply(spots K, p -> p | " : " | net K_p)); + if #v === 0 then "0" else stack v) - --- Primitive constructor, takes a list eg {m_n,m_(n-1), ...,m_0} --- defining inclusion maps C=F_(n+1)C > F_(n)C > ... > F_0 C --- of subcomplexes of a chain complex (or simplicial complexes) +-- Primitive constructor, takes a list eg {m_n,m_(n-1), ...,m_0} +-- defining inclusion maps C=F_(n+1)C > F_(n)C > ... > F_0 C +-- of subcomplexes of a chain complex (or simplicial complexes) -- and produces a filtered complex with integer keys the -- corresponding chain complex. -- If F_0C is not zero then by default F_(-1)C is added and is 0. --- THIS IS THE CONVENTION WE WANT BY DEFAULT. SEE +-- THIS IS THE CONVENTION WE WANT BY DEFAULT. SEE -- THE HOPF FIBRATION EXAMPLE. TO GET THE CORRECT INDICES ON THE E2 PAGE -- WE WANT THE ZERO COMPLEX TO HAVE "FILTRATION DEGREE -1". filteredComplex = method(Options => { - Shift => 0, - ReducedHomology => true}) + Shift => 0, + ReducedHomology => true}) filteredComplex(List) := FilteredComplex => opts -> L -> ( - local maps; - local C; - if #L === 0 - then error "expected at least one chain complex map or simplicial complex"; - if all(#L, p -> class L#p === SimplicialComplex) then ( - kk := coefficientRing L#0; - if opts.ReducedHomology == true then ( - C = chainComplex complex L#0; -- By default the ambient simplicial complex is the first element of the list - maps = apply(#L-1, p -> map(C, chainComplex complex L#(p+1), - i -> sub(contract(transpose matrix{faces(i,L#0)}, matrix{faces(i,L#(p+1))}), kk)))) - else (C = truncate(chainComplex complex L#0,1); -- By default the ambient simplicial complex is the first element of the list - maps = apply(#L-1, p -> map(C, truncate(chainComplex complex L#(p+1),1), - i -> sub(contract(transpose matrix{faces(i,L#0)}, matrix{faces(i,L#(p+1))}), kk)))) - ) - else ( - maps = L; - if any(#maps, p -> class maps#p =!= ChainComplexMap) then ( - error "expected sequence of chain complexes"); - C = target maps#0;-- By default the ambient chain complex is target of first map. - if any(#maps, p -> target maps#p != C) then ( - error "expected all map to have the same target")); - Z := image map(C, C, i -> 0*id_(C#i)); -- make zero subcomplex as a subcomplex of ambient complex - P := {}; - myList := {}; - for p from 0 to #maps - 1 do ( - myList = myList | - {#maps - (p+1) -opts.Shift => image maps#p}; - ); - if myList != {} then (P = {(#maps-opts.Shift) => C} | myList) - else P = { - opts.Shift => C} ; - if (last P)#1 != Z then (P = P | {(-1-opts.Shift) => Z}); - return new FilteredComplex from P | {symbol zero => (ring C)^0, symbol cache => new CacheTable}) - + if #L == 0 then error "expected at least one complex map or simplicial complex"; + if not uniform L then error "expected a list of complex maps or simplicial complexes"; + -- + maps := if instance(L#0, SimplicialComplex) then ( + kk := coefficientRing L#0; + if opts.ReducedHomology then ( + -- By default the ambient simplicial complex is the first element of the list + C := complex L#0; + apply(#L-1, p -> map(C, complex L#(p+1), + i -> sub(contract(transpose matrix{faces(i,L#0)}, matrix{faces(i,L#(p+1))}), kk)))) + else ( + -- By default the ambient simplicial complex is the first element of the list + C = complex L#0; + C = naiveTruncation(C, 1); + apply(#L-1, p -> map(C, naiveTruncation(complex L#(p+1), 1), + i -> sub(contract(transpose matrix{faces(i,L#0)}, matrix{faces(i,L#(p+1))}), kk)))) + ) + else if instance(L#0, ComplexMap) then ( + -- By default the ambient chain complex is target of first map. + C = target L#0; + if same apply(L, target) then L + else error "expected all maps to have the same target") + else error "expected a list of complex maps or simplicial complexes"; + -- + Z := image map(C, C, i -> 0*id_(C_i)); -- make zero subcomplex as a subcomplex of ambient complex + P := {}; + myList := {}; + for p from 0 to #maps - 1 do ( + myList = myList | + {#maps - (p+1) -opts.Shift => image maps#p}; + ); + if myList != {} then (P = {(#maps-opts.Shift) => C} | myList) + else P = { - opts.Shift => C} ; + if (last P)#1 != Z then (P = P | {(-1-opts.Shift) => Z}); + return new FilteredComplex from P | {symbol zero => (ring C)^0, symbol cache => new CacheTable}) -------------------------------------------------------------------------------- -- constructing filtered complexes --------------------------------------------- -------------------------------------------------------------------------------- - -- make the filtered complex associated to the "naive truncation of a chain complex" -filteredComplex ChainComplex := FilteredComplex => opts-> C->( complete C; - n := max support C; - m := min support C; - p := length C; - if p > 0 then ( - H := for i from 1 to p list inducedMap(C,truncate(C,-i)); - filteredComplex( H, Shift => - m) ) - else filteredComplex {map(C, image(0 * id_C), id_C)}--{map(C, id_C} -- now the constructor supports the zero chain complex - ) - +filteredComplex Complex := FilteredComplex => opts -> C -> ( + (lo, hi) := concentration C; + if lo == hi + then filteredComplex{ map(C, image(0 * id_C), id_C) } + else filteredComplex(Shift => -lo, + apply(hi-lo, i -> inducedMap(C, naiveTruncation(C, lo, hi-i-1))))) --produce the "x-filtration" of the tensor product complex. -FilteredComplex ** ChainComplex := FilteredComplex => (K,C) -> ( - xTensormodules := (p,q,T)->(apply( (T#q).cache.indices, - i-> if (i#0) <=p then - image (id_(((T#q).cache.components)#(((T#q).cache.indexComponents)#i))) - else image(0* id_(((T#q).cache.components)#(((T#q).cache.indexComponents)#i)))) ); - xTensorComplex := (T,p) ->(K := new ChainComplex; - K.ring = T.ring; - for i from min T to max T do ( - if T#?(i-1) then - K.dd_i = inducedMap( - directSum(xTensormodules(p,i-1,T) - ), - directSum(xTensormodules(p,i,T)),T.dd_i)); - K - ); - supp := support K_infinity; - -- try to handle the boundary cases -- - if supp != {} and #supp > 1 then ( - N := max support K_infinity; - P := min support K_infinity; - T := K_infinity ** C; -filteredComplex(reverse for i from P to (N-1) list - inducedMap(T, xTensorComplex(T,i)), Shift => -P) - ) +xTensormodules := (p,q,T) -> ( + apply(indices T_q, components T_q, + (ind, M) -> if ind#0 <= p + then image id_M + else image(0 * id_M))) + +xTensorComplex := (T,p) ->( + (lo, hi) := concentration T; + if lo == hi + then complex(directSum xTensormodules(p, lo, T), Base => lo) + else complex applyPairs(T.dd.map, + (i,f) -> i => inducedMap(directSum(xTensormodules(p, i-1, T)), directSum(xTensormodules(p, i, T)), f))) + +FilteredComplex ** Complex := FilteredComplex => (K,C) -> ( + supp := support K_infinity; + -- try to handle the boundary cases -- + if supp != {} and #supp > 1 then ( + N := max support K_infinity; + P := min support K_infinity; + T := K_infinity ** C; + filteredComplex(reverse for i from P to (N-1) list + inducedMap(T, xTensorComplex(T,i)), Shift => -P) + ) else ( if #supp == 1 then ( - p := min supp; - t := K_infinity ** C; - filteredComplex( {inducedMap(t, xTensorComplex(t, p))}, Shift => - p + 1) - ) + p := min supp; + t := K_infinity ** C; + filteredComplex( {inducedMap(t, xTensorComplex(t, p))}, Shift => - p + 1) + ) else( tt:= K_infinity ** C; filteredComplex({id_tt}) ) ) - ) + ) --produce the "y-filtration" of the tensor product complex. -ChainComplex ** FilteredComplex := FilteredComplex => (C,K) -> ( - yTensorModules := (p,q,T)->(apply( (T#q).cache.indices, - i-> if (i#1) <=p then image (id_(((T#q).cache.components)#(((T#q).cache.indexComponents)#i))) - else image(0* id_(((T#q).cache.components)#(((T#q).cache.indexComponents)#i)))) ); - yTensorComplex := (T,p) -> (K := new ChainComplex; - K.ring = T.ring; - for i from min T to max T do ( - if T#?(i-1) then - K.dd_i = inducedMap(directSum(yTensorModules(p,i-1,T)), - directSum(yTensorModules(p,i,T)),T.dd_i)); - K - ); - supp := support K_infinity; - -- try to handle the boundary cases -- - if supp != {} and #supp > 1 then ( - N := max support K_infinity; - P := min support K_infinity; - T := C ** K_infinity; -filteredComplex(reverse for i from P to (N-1) list - inducedMap(T, yTensorComplex(T,i)), Shift => -P) - ) +yTensorModules := (p,q,T)->( + apply(indices T_q, components T_q, + (ind, M) -> if ind#1 <= p + then image id_M + else image(0 * id_M))) + +yTensorComplex := (T,p) -> ( + (lo, hi) := concentration T; + if lo == hi + then complex(directSum(yTensorModules(p, lo, T), Base => lo)) + else complex applyPairs(T.dd.map, + (i,f) -> i => inducedMap(directSum(yTensorModules(p, i-1, T)), directSum(yTensorModules(p, i, T)), f))) + +Complex ** FilteredComplex := FilteredComplex => (C,K) -> ( + supp := support K_infinity; + -- try to handle the boundary cases -- + if supp != {} and #supp > 1 then ( + N := max support K_infinity; + P := min support K_infinity; + T := C ** K_infinity; + filteredComplex(reverse for i from P to (N-1) list + inducedMap(T, yTensorComplex(T,i)), Shift => -P) + ) else ( if #supp == 1 then ( - p := min supp; - t := C ** K_infinity; - filteredComplex( {inducedMap(t, yTensorComplex(t, p))}, Shift => - p + 1) - ) + p := min supp; + t := C ** K_infinity; + filteredComplex( {inducedMap(t, yTensorComplex(t, p))}, Shift => - p + 1) + ) else( tt:= C ** K_infinity ; filteredComplex({id_tt}) ) ) - ) + ) -- produce the "x-filtration" of the Hom complex. -xmodules := (n, d, H)->( +xHomModules := (n, d, H)->( -- want components {p,q} = Hom(-p, q) with p + q = d and p <= n - apply( (H#d).cache.indices, - i -> if - (i#0) <= n then - image (id_(((H#d).cache.components)#(((H#d).cache.indexComponents)#i))) - else image(0* id_(((H#d).cache.components)#(((H#d).cache.indexComponents)#i)))) ); - - -xComplex := (T,n) -> - (K := new ChainComplex; - K.ring = T.ring; - for i from min T to max T do ( - if T#?(i-1) then - K.dd_i = inducedMap(directSum(xmodules(n,i-1,T)),directSum(xmodules(n,i,T)),T.dd_i)); - K - ) + apply(indices H_d, components H_d, + (ind, M) -> if -ind#0 <= n + then image id_M + else image(0 * id_M))) + +xHomComplex := (T,n) -> ( + (lo, hi) := concentration T; + if lo == hi + then complex(directSum(xHomModules(n, lo, T), Base => lo)) + else complex applyPairs(T.dd.map, + (i,f) -> i => inducedMap(directSum(xHomModules(n, i-1, T)), directSum(xHomModules(n, i, T)), f))) -- produce the "x-filtration" of the Hom complex. -Hom (FilteredComplex, ChainComplex):= FilteredComplex => opts -> (K, D) -> ( - C := complete D; - supp := support K_infinity; - -- try to handle the boundary cases -- - if supp != {} and #supp > 1 then ( - N := - max support K_infinity; - P := - min support K_infinity; - H := Hom(K_infinity, C, opts); - filteredComplex(reverse for i from N to P - 1 list inducedMap(H, xComplex(H,i)), - Shift => - N) - ) - else ( if #supp == 1 then - ( - p := min supp; - h := Hom(K_infinity, C, opts); - filteredComplex( {inducedMap(h, xComplex(h, p))}, Shift => p + 1 ) +Hom (FilteredComplex, Complex):= FilteredComplex => opts -> (K, C) -> ( + supp := support K_infinity; + -- try to handle the boundary cases -- + if supp != {} and #supp > 1 then ( + N := - max support K_infinity; + P := - min support K_infinity; + H := Hom(K_infinity, C, opts); + filteredComplex(reverse for i from N to P - 1 list inducedMap(H, xHomComplex(H,i)), + Shift => - N) ) + else ( if #supp == 1 then + ( + p := min supp; + h := Hom(K_infinity, C, opts); + filteredComplex( {inducedMap(h, xHomComplex(h, p))}, Shift => p + 1 ) + ) else( hhh := Hom(K_infinity, C, opts); filteredComplex({id_hhh}) @@ -456,89 +318,80 @@ Hom (FilteredComplex, ChainComplex):= FilteredComplex => opts -> (K, D) -> ( -- next are some functions used in the "y-filtration" of the Hom complex. -ymodules := (n, d, H) -> ( +yHomModules := (n, d, H) -> ( -- want components {p,q} = Hom(-p, q) with p + q = d and q <= n - apply( (H#d).cache.indices, - i -> if (i#1) <= n then - image (id_(((H#d).cache.components)#(((H#d).cache.indexComponents)#i))) - else image(0* id_(((H#d).cache.components)#(((H#d).cache.indexComponents)#i)))) - ) - - -yComplex := (T,n) -> - (K := new ChainComplex; - K.ring = T.ring; - for i from min T to max T do ( - if T#?(i-1) then - K.dd_i = inducedMap(directSum(ymodules(n,i-1,T)),directSum(ymodules(n,i,T)),T.dd_i)); - K - ) - -Hom (ChainComplex, FilteredComplex) := FilteredComplex => opts -> (D, K) -> ( - C := complete D; - supp := support K_infinity; - -- try to handle the boundary cases -- - if supp != {} and #supp > 1 then ( - N := max support K_infinity; - P := min support K_infinity; - H := Hom(C, K_infinity, opts); - filteredComplex(reverse for i from P to N - 1 list inducedMap(H, yComplex(H,i)), - Shift => - P) - ) - else ( if #supp == 1 then - ( - p := min supp; - h := Hom(C, K_infinity, opts); - filteredComplex( {inducedMap(h, yComplex(h, p))}, Shift => - p + 1 ) + apply(indices H_d, components H_d, + (ind, M) -> if ind#1 <= n + then image id_M + else image(0 * id_M))) + +yHomComplex := (T,n) -> ( + (lo, hi) := concentration T; + if lo == hi + then complex(directSum(yHomModules(n, lo, T), Base => lo)) + else complex applyPairs(T.dd.map, + (i,f) -> i => inducedMap(directSum(yHomModules(n, i-1, T)), directSum(yHomModules(n, i, T)), f))) + +Hom (Complex, FilteredComplex) := FilteredComplex => opts -> (C, K) -> ( + supp := support K_infinity; + -- try to handle the boundary cases -- + if supp != {} and #supp > 1 then ( + N := max support K_infinity; + P := min support K_infinity; + H := Hom(C, K_infinity, opts); + filteredComplex(reverse for i from P to N - 1 list inducedMap(H, yHomComplex(H,i)), + Shift => - P) ) + else ( if #supp == 1 then + ( + p := min supp; + h := Hom(C, K_infinity, opts); + filteredComplex( {inducedMap(h, yHomComplex(h, p))}, Shift => - p + 1 ) + ) else( hhh := Hom(C, K_infinity, opts); filteredComplex({id_hhh}) ) - ) + ) ) -- I-adic filtration code -- -- the following script allows us to multiply a chain complex by an ideal -Ideal * ChainComplex := ChainComplex => (I,C) -> ( - D := new ChainComplex; - D.ring = C.ring; - apply(drop(spots C, 1), i -> D.dd_i = inducedMap(I * C_(i-1), I * C_i, C.dd_i)); - D - ) - -filteredComplex(Ideal,ChainComplex,ZZ) := FilteredComplex => opts -> (I,C,n) ->( +Ideal * Complex := Complex => (I,C) -> ( + (lo, hi) := concentration C; + if lo == hi + then complex(I * C_lo, Base => lo) + else complex applyValues(C.dd.map, + f -> inducedMap(I * target f, I * source f, f))) + +filteredComplex(Ideal,Complex,ZZ) := FilteredComplex => opts -> (I,C,n) ->( if n < 0 then error "expected a non-negative integer" else - filteredComplex(apply(n, i -> inducedMap(C, I^(i+1) * C)), Shift => n) + filteredComplex(apply(n, i -> inducedMap(C, I^(i+1) * C)), Shift => n) ) ------------------------------------- --- Pages and Sequences -- ------------------------------------- - - -------------------------------------------------------------------------------- --- Pages +-- Pages and Sequences -------------------------------------------------------------------------------- + Page = new Type of MutableHashTable -Page.synonym = "Page" +Page.synonym = "page" + Page.GlobalAssignHook = globalAssignFunction Page.GlobalReleaseHook = globalReleaseFunction -describe Page := E -> net expression E new Page := Page => (cl) -> ( - C := newClass(Page,new MutableHashTable); -- sigh - C.cache = new CacheTable; - b := C.dd = new PageMap; - b.degree = {}; - b.source = b.target = C; - C) -ring Page := C -> C.ring + C := newClass(Page, new MutableHashTable); -- sigh + C.cache = new CacheTable; + b := C.dd = new PageMap; + b.degree = {}; + b.source = b.target = C; + C) + +ring Page := C -> C.ring degree Page := C -> C.dd.degree - netPage = method() netPage(Page,List,List) := (E,mins,maxs) -> ( newmaxQ := maxs#1; @@ -548,40 +401,42 @@ netPage(Page,List,List) := (E,mins,maxs) -> ( P := page E; L := select(keys P, i -> class i === List and P#i !=0); maxQ := max(apply(L, i -> i#1)); - minQ := min(apply(L, i -> i#1)); + minQ := min(apply(L, i -> i#1)); maxP := max(apply(L, i -> i#0)); minP := min(apply(L,i -> i#0)); finalmaxQ := min {newmaxQ,maxQ}; finalminQ := max {newminQ,minQ}; finalmaxP := min {newmaxP,maxP}; - finalminP := max {newminP,minP}; + finalminP := max {newminP,minP}; K := while finalmaxQ >= finalminQ list makeRow(finalmaxP, finalminP, finalmaxQ, P) do (finalmaxQ = finalmaxQ - 1); - -- netList(K, Boxes => false) - netList K + -- netList(K, Boxes => false) + netList K ) +-- printing +describe Page := E -> net expression E net Page := E -> ( L := select(keys E, i -> class i === List and E#i !=0); - maxQ := max(apply(L, i -> i#1)); - minQ := min(apply(L, i -> i#1)); + maxQ := max(apply(L, i -> i#1)); + minQ := min(apply(L, i -> i#1)); maxP := max(apply(L, i -> i#0)); minP := min(apply(L,i -> i#0)); K := while maxQ >= minQ list makeRow(maxP, minP, maxQ, E) do maxQ = maxQ - 1; - -- netList(K, Boxes => false) - netList K + -- netList(K, Boxes => false) + netList K ) makeRow = method() makeRow(ZZ,ZZ,ZZ,Page) := (maxP,minP,q,E)->(L := {}; - apply(minP .. maxP, i-> - if E#?{i,q} then L = append(L, stack(net E#{i,q}, " ", net {i,q})) - else L = append(L, stack(net 0, " ", net {i,q}))); - L) + apply(minP .. maxP, i-> + if E#?{i,q} then L = append(L, stack(net E#{i,q}, " ", net {i,q})) + else L = append(L, stack(net 0, " ", net {i,q}))); + L) Page _ List := (E,L) -> ( if E#?L then E#L else (ring E)^0 ) -spots Page := List => ( +spots Page := List => ( P -> select(keys P, i -> class i === List and all(i, j -> class j === ZZ)) ) @@ -589,7 +444,7 @@ spots Page := List => ( page = method (Options => {Prune => false}) support Page := List => ( - P -> sort select (spots P, i -> P#i != 0)) + P -> sort select (spots P, i -> P#i != 0)) -- at present there are no advanced constructors for page. @@ -598,21 +453,16 @@ support Page := List => ( -- this present method is mainly for testing code. It might have other uses later. -- page(List,List,Page) := Page => opts -> (L,M,E) -> ( - if E.?ring then ( + R := if E.?ring then E.ring else error "page does not have a ring"; minP := L#0; maxP := L#1; minQ := M#0; maxQ := M#1; - -- E := new Page; - -- E.ring = A; - for i from minP to maxP do ( - for j from minQ to maxQ do ( - E#{i,j} = (E.ring)^0; - ) -); -E) else error "page does not have a ring" -) - + -- E := new Page; + -- E.ring = A; + for i from minP to maxP do + for j from minQ to maxQ do E#{i,j} = R^0; + E) -------------------------------------------------------------------------------- -- PageMap @@ -620,176 +470,154 @@ E) else error "page does not have a ring" PageMap = new Type of MutableHashTable PageMap.synonym = "page map" + PageMap.GlobalAssignHook = globalAssignFunction PageMap.GlobalReleaseHook = globalReleaseFunction -describe PageMap := d -> net expression d - - -spots PageMap := List => ( - d -> select(keys d, i -> class i === List and all(i, j -> class j === ZZ)) - ) -support PageMap := List => ( - d -> sort select (spots d, i -> d#i != 0)) +spots PageMap := List => d -> select(keys d, + i -> class i === List and all(i, j -> class j === ZZ)) +support PageMap := List => d -> sort select(spots d, i -> d#i != 0) PageMap _ List := Matrix => (f,i) -> if f#?i then f#i else ( - de := f.degree; - so := (f.source)_i; - ta := (f.target)_(i + de); - map(ta,so,0)) - - + de := f.degree; + so := (f.source)_i; + ta := (f.target)_(i + de); + map(ta,so,0)) +-- printing lineOnTop := (s) -> concatenate(width s : "-") || s +describe PageMap := d -> net expression d net PageMap := f -> ( - v := between("", - apply(spots f, - i -> horizontalJoin( - net (i + f.degree), " : " , net (target f#i), " <--", - lineOnTop net f#i, - "-- ", net source f#i, " : ", net i - ) - ) - ); - stack v -) - --- at present there are no constructors for pageMap - + v := between("", + apply(spots f, + i -> horizontalJoin( + net (i + f.degree), " : " , net (target f#i), " <--", + lineOnTop net f#i, + "-- ", net source f#i, " : ", net i + ) + ) + ); + stack v + ) -------------------------------------------------------------------------------- --- spectral sequences +-- spectral sequences -------------------------------------------------------------------------------- + SpectralSequence = new Type of MutableHashTable SpectralSequence.synonym = "spectral sequence" SpectralSequence.GlobalAssignHook = globalAssignFunction SpectralSequence.GlobalReleaseHook = globalReleaseFunction + +-- printing describe SpectralSequence := E -> net expression E net SpectralSequence := E -> ( - if hasAttribute(E, ReverseDictionary) - then toString getAttribute(E, ReverseDictionary) - else net expression E) + if hasAttribute(E, ReverseDictionary) + then toString getAttribute(E, ReverseDictionary) + else net expression E) expression SpectralSequence := E -> stack( - " .-. ", " (o o) ", " | O \\ Unnamed spectral sequence! ..ooOOOooooOO", - " \\ \\ ", " `~~~` ") - - -spectralSequence = method (Options =>{Prune => false}) + " .-. ", + " (o o) ", + " | O \\ Unnamed spectral sequence! ..ooOOOooooOO", + " \\ \\ ", + " `~~~` ") +spectralSequence = method (Options => { Prune => false }) spectralSequence FilteredComplex := SpectralSequence => opts -> K -> ( - new SpectralSequence from { - symbol filteredComplex => K, - symbol cache => CacheTable, - symbol Prune => opts.Prune} - ) + new SpectralSequence from { + symbol filteredComplex => K, + symbol cache => CacheTable, + symbol Prune => opts.Prune} + ) -SpectralSequence ^ InfiniteNumber:= - SpectralSequence ^ ZZ := SpectralSequencePage => (E,r) -> ( - -- the case that r is an infinite number has been rewritten - -- and also returns a page --- with no maps! - -- this fixes an earlier bug. - if class r === InfiniteNumber then ( - if r < 0 then error "expected an infinite number bigger than zero" - else ( - myList := {}; - K := E.filteredComplex; - s := max K - min K + 1; - H := new Page; - -- again trying to handle the case of the zero complex -- - if min K_(infinity) < infinity and max K_infinity > - infinity then ( - for p from min K to max K do ( - for q from - p + min K_(infinity) to max K_(infinity) do ( - if E.Prune == false then H#{p,q} = epq(K,p,q,s) - else H#{p,q} = prune epq(K,p,q,s) - ); - ); - ); - ) ; - -H -) - else ( - if E#?r then E#r else ( - E#r = spectralSequencePage(E.filteredComplex,r, Prune => E.Prune);); - E#r - ) - ) +-- TODO: also cache E^infinity +SpectralSequence ^ InfiniteNumber := +SpectralSequence ^ ZZ := SpectralSequencePage => (E,r) -> ( + -- the case that r is an infinite number has been rewritten + -- and also returns a page --- with no maps! + -- this fixes an earlier bug. + if class r === InfiniteNumber then ( + if r < 0 then error "expected an infinite number bigger than zero" + else ( + myList := {}; + K := E.filteredComplex; + s := max K - min K + 1; + H := new Page; + -- again trying to handle the case of the zero complex -- + if min K_(infinity) < infinity and max K_infinity > - infinity then ( + for p from min K to max K do ( + for q from -p + min K_(infinity) to max K_(infinity) + 1 do ( + H#{p,q} = if E.Prune then prune epq(K,p,q,s) else epq(K,p,q,s) + ); + ); + ); + ); + H) + else E#r ??= spectralSequencePage(E.filteredComplex,r, Prune => E.Prune) + ) SpectralSequence _ InfiniteNumber := SpectralSequence _ ZZ := SpectralSequencePage => (E,r) -> ( E^r ) -minimalPresentation SpectralSequence := prune SpectralSequence := SpectralSequence => opts -> (E) -> ( - spectralSequence(E.filteredComplex, Prune => true) - ) +minimalPresentation SpectralSequence := prune SpectralSequence := SpectralSequence => opts -> E -> ( + spectralSequence(E.filteredComplex, Prune => true)) ----------------------------------------------------------------------------- +filteredComplex SpectralSequence := FilteredComplex => opts -> E -> E.filteredComplex +complex SpectralSequence := Complex => {} >> opts -> E -> complex E.filteredComplex -------------------------------------------------------------------------------- -- spectral sequence pages -------------------------------------------------------------------------------- + SpectralSequencePage = new Type of Page SpectralSequencePage.synonym = "spectral sequence page" SpectralSequencePage.GlobalAssignHook = globalAssignFunction SpectralSequencePage.GlobalReleaseHook = globalReleaseFunction -describe SpectralSequencePage := E -> net expression E - -spectralSequencePage = method (Options =>{Prune => false}) - -spectralSequencePage(FilteredComplex, ZZ) := SpectralSequencePage => opts -> (K,r) -> ( -new SpectralSequencePage from - {symbol filteredComplex=> K, - symbol Prune => opts.Prune, - symbol number => r, - symbol dd => spectralSequencePageMap(K,r, Prune => opts.Prune), - symbol cache => CacheTable} - ) -minimalPresentation SpectralSequencePage := prune SpectralSequencePage := SpectralSequencePage => opts -> (E) -> ( - spectralSequencePage(E.filteredComplex, E.number, Prune => true) - ) +spectralSequencePage = method(Options => { Prune => false }) +spectralSequencePage(FilteredComplex, ZZ) := SpectralSequencePage => opts -> (K,r) -> ( + new SpectralSequencePage from { + symbol filteredComplex => K, + symbol number => r, + symbol dd => spectralSequencePageMap(K, r, opts), + symbol Prune => opts.Prune, + symbol cache => CacheTable} + ) -SpectralSequencePage _ List := Module => (E,i)-> ( source(E.dd _i) ) - +minimalPresentation SpectralSequencePage := prune SpectralSequencePage := SpectralSequencePage => opts -> E -> ( + spectralSequencePage(E.filteredComplex, E.number, Prune => true)) -SpectralSequencePage ^ List := Module => (E,i)-> (E_(-i)) +SpectralSequencePage _ List := Module => (E, i) -> source(E.dd_i) +SpectralSequencePage ^ List := Module => (E, i) -> E_(-i) -- view the modules on a Spectral Sequence Page. We are referring to these -- as the support of the page. - - - - - -page SpectralSequencePage := Page => opts -> E -> ( - K := E.filteredComplex; - s := E.number; +page SpectralSequencePage := Page => opts -> E -> ( + K := E.filteredComplex; + s := E.number; H := new Page; -- again trying to handle the case of the zero complex -- if min K_(infinity) < infinity and max K_infinity > - infinity then ( - for p from min K to max K do ( - for q from -p + min K_(infinity) to max K_(infinity) do ( --- H#{p,q} = E^s_{p,q} - if E.Prune == false then H#{p,q} = epq(K,p,q,s) - else H#{p,q} = prune epq(K,p,q,s) - ) - ); - ); - H - ) - --- the following two methods are used to view the modules --- on the r th page in grid form. + for p from min K to max K do ( + for q from -p + min K_(infinity) to max K_(infinity) + 1 do ( + -- H#{p,q} = E^s_{p,q} + H#{p,q} = if E.Prune then prune epq(K,p,q,s) else epq(K,p,q,s)) + ); + ); + H) +page Page := Page => opts -> identity + +-- the following two methods are used to view the modules +-- on the r th page in grid form. -- this method is called in net of spectral sequence page. -- it would be good to delete the zero rows. net SpectralSequencePage := E -> (page E) -support SpectralSequencePage := E -> ( - new Page from apply(spots E.dd, i-> i=> source E.dd #i) ) - +support SpectralSequencePage := E -> new Page from apply(spots E.dd, i-> i=> source E.dd #i) ------------------------------------------------------------------------ -- below are the methods which compute the @@ -799,75 +627,72 @@ support SpectralSequencePage := E -> ( -- By default the maximum integer key -- of the filtered complex corresponds to the ambient complex. -- This is used in the formulas below. --- the formulas below are the homological versions of the ones in I.2.4 of Danilov's --- treatment of spectral sequences in Shafarevich's Encyclopedia of --- Math Algebraic Geometry II. --- In any event it is easy enough to prove directly that they satisfy the requirements +-- the formulas below are the homological versions of the ones in I.2.4 of Danilov's +-- treatment of spectral sequences in Shafarevich's Encyclopedia of +-- Math Algebraic Geometry II. +-- In any event it is easy enough to prove directly that they satisfy the requirements -- for a spectral sequence. cycles := (K,p,q,r) -> ( -ker inducedMap((K_infinity)_(p+q-1) / K_(p-r) _ (p+q-1), - K_p _ (p+q), K_(infinity).dd_(p+q), Verify => false)) + ker inducedMap((K_infinity)_(p+q-1) / K_(p-r) _ (p+q-1), + K_p _ (p+q), K_(infinity).dd_(p+q), Verify => false)) boundaries := (K,p,q,r) -> ( - ( image (K_(p+r-1).dd_(p+q+1))) + (K_(p-1) _ (p+q))) + image K_(p+r-1).dd_(p+q+1) + K_(p-1) _ (p+q)) -- compute the pq modules on the rth page epq = method() -epq(FilteredComplex,ZZ,ZZ,ZZ) := (K,p,q,r) -> ( - ((cycles(K,p,q,r) + boundaries(K,p,q,r)) / boundaries(K,p,q,r))) +epq(FilteredComplex, ZZ, ZZ, ZZ) := (K,p,q,r) -> ( + (cycles(K,p,q,r) + boundaries(K,p,q,r)) / boundaries(K,p,q,r)) -- the pq maps on the rth page. epqrMaps = method() -epqrMaps(FilteredComplex,ZZ,ZZ,ZZ) := (K,p,q,r) -> ( - inducedMap(epq(K,p-r,q+r-1,r), epq(K,p,q,r),(K_infinity).dd_(p+q), Verify => false)) - +epqrMaps(FilteredComplex, ZZ, ZZ, ZZ) := (K,p,q,r) -> ( + inducedMap(epq(K, p-r, q+r-1, r), epq(K,p,q,r), (K_infinity).dd_(p+q), Verify => false)) -- prune the pq maps on the rth page. -- -- "sourcePruningMap", -- "targetPruningMap" ---- the following could be replaced by prune d --- except I want to cache the +--- the following could be replaced by prune d --- except I want to cache the -- pruning maps. -- pruneEpqrMaps = method() -pruneEpqrMaps(FilteredComplex,ZZ,ZZ,ZZ) := (K,p,q,r) -> ( - d := epqrMaps(K,p,q,r); - N := minimalPresentation(source d); - M := minimalPresentation(target d); - f := inverse(M.cache.pruningMap)* d * (N.cache.pruningMap); - f.cache #(symbol sourcePruningMap) = N.cache.pruningMap; - f.cache #(symbol targetPruningMap) = M.cache.pruningMap; - f - ) +pruneEpqrMaps(FilteredComplex,ZZ,ZZ,ZZ) := (K,p,q,r) -> ( + d := epqrMaps(K,p,q,r); + N := minimalPresentation(source d); + M := minimalPresentation(target d); + f := inverse(M.cache.pruningMap)* d * (N.cache.pruningMap); + f.cache #(symbol sourcePruningMap) = N.cache.pruningMap; + f.cache #(symbol targetPruningMap) = M.cache.pruningMap; + f) ErMaps = method(Options => {Prune => false}) -ErMaps(FilteredComplex,ZZ,ZZ,ZZ) := Matrix => opts -> (K,p,q,r) -> (if opts.Prune == false then - epqrMaps(K,p,q,r) - else pruneEpqrMaps(K,p,q,r)) +ErMaps(FilteredComplex,ZZ,ZZ,ZZ) := Matrix => opts -> (K,p,q,r) -> ( + if opts.Prune then pruneEpqrMaps(K,p,q,r) else epqrMaps(K,p,q,r)) -- the homology at the pq spot on the rth page. rpqHomology = method() rpqHomology(SpectralSequence,ZZ,ZZ,ZZ) := (E,p,q,r) -> ( - (ker(E^r .dd_{p,q})) / (image(E^r .dd_{p+r,q-r+1}) ) - ) + ker E^r.dd_{p,q} / image E^r.dd_{p+r,q-r+1}) -- the isomorphism of the homology at the pq spot -- on the r-th page and the module on at the pq spot on the r+1-th page. homologyIsomorphism = method() homologyIsomorphism(SpectralSequence,ZZ,ZZ,ZZ) := (E,p,q,r) -> ( - if E.Prune == false then -inducedMap(source (E^(r+1) .dd_{p,q}),rpqHomology(E,p,q,r), id_(E^(r+1) .filteredComplex _infinity _(p+q)), Verify=>false) -- if Verify not set to false can get error when running on M2 1.9 - else - rpqPruneIsomorphism(E,p,q,r) - ) + if E.Prune then rpqPruneIsomorphism(E,p,q,r) + else inducedMap( + source (E^(r+1) .dd_{p,q}), rpqHomology(E,p,q,r), + -- FIXME: if Verify not set to false can get error when running on M2 1.9 + id_(E^(r+1) .filteredComplex _infinity _(p+q)), Verify => false)) rpqPruneIsomorphism = method() -rpqPruneIsomorphism(SpectralSequence,ZZ,ZZ,ZZ) := (E,p,q,r) -> ( +rpqPruneIsomorphism(SpectralSequence,ZZ,ZZ,ZZ) := (E,p,q,r) -> ( M := rpqHomology(E,p,q,r); - f := inducedMap(target (E^(r + 1) .dd_{p,q}) .cache.sourcePruningMap, - M, (E^r .dd_{p,q}).cache.sourcePruningMap, Verify=>false); -- if Verify not set to false can get error when running on M2 1.9 - inverse((E^(r + 1) .dd_{p,q}) .cache.sourcePruningMap) * f - ) + f := inducedMap( + target (E^(r + 1) .dd_{p,q}) .cache.sourcePruningMap, M, + -- FIXME: if Verify not set to false can get error when running on M2 1.9 + (E^r .dd_{p,q}).cache.sourcePruningMap, Verify => false); + inverse((E^(r + 1) .dd_{p,q}) .cache.sourcePruningMap) * f) --- -- Spectral Sequence Page Maps @@ -875,3461 +700,108 @@ rpqPruneIsomorphism(SpectralSequence,ZZ,ZZ,ZZ) := (E,p,q,r) -> ( SpectralSequencePageMap = new Type of PageMap SpectralSequencePageMap.synonym = "spectral sequence page map" -SpectralSequencePageMap.synonym = "spectral sequence page map" SpectralSequencePageMap.GlobalAssignHook = globalAssignFunction SpectralSequencePageMap.GlobalReleaseHook = globalReleaseFunction -describe SpectralSequencePageMap := d -> net expression d - - spectralSequencePageMap = method(Options =>{Prune => false}) -spectralSequencePageMap(FilteredComplex,ZZ) := SpectralSequencePageMap => opts -> - (K,r) -> (myList:={}; - -- try to handle case coming from the zero complex -- - Kmin := min K_infinity; Kmax := max K_(infinity); - if class Kmin < infinity and Kmax > - infinity then ( - for p from min K to max K do ( - for q from -p + min K_(infinity) to max K_(infinity) -p do ( - myList = - append(myList, {p,q} => ErMaps(K,p,q,r, Prune => opts.Prune)) )); ); - new SpectralSequencePageMap from - join (myList, {symbol cache => new CacheTable, - symbol degree => {-r,r-1}, - symbol filteredComplex => K, - symbol Prune => opts.Prune}) - ) - +-- FIXME +spectralSequencePageMap(FilteredComplex,ZZ) := SpectralSequencePageMap => opts -> (K,r) -> ( + myList := {}; + -- try to handle case coming from the zero complex -- + Kmin := min K_infinity; Kmax := max K_(infinity); + if class Kmin < infinity and Kmax > - infinity then ( + for p from min K to max K do ( + for q from -p + min K_(infinity) to max K_(infinity) -p do ( + myList = + append(myList, {p,q} => ErMaps(K,p,q,r, Prune => opts.Prune)) )); ); + new SpectralSequencePageMap from join(myList, { + symbol degree => {-r, r-1}, + symbol filteredComplex => K, + symbol Prune => opts.Prune, + symbol cache => new CacheTable, + } + ) +) -SpectralSequencePageMap _ List := Matrix => (d,i)-> (if (d)#?i then d#i - else - if d.Prune == false then - epqrMaps(d.filteredComplex,i#0,i#1,- d.degree #0) - else - pruneEpqrMaps(d.filteredComplex,i#0,i#1,- d.degree #0) - ) +SpectralSequencePageMap _ List := Matrix => (d,i)-> ( + if d#?i then d#i else + if d.Prune + then pruneEpqrMaps(d.filteredComplex,i#0,i#1,- d.degree #0) + else epqrMaps(d.filteredComplex,i#0,i#1,- d.degree #0) + ) -SpectralSequencePageMap ^ List := Matrix => (d,i)-> (d_(-i)) +SpectralSequencePageMap ^ List := Matrix => (d,i)-> (d_(-i)) --- auxiliary spectral sequence stuff. +-- auxiliary spectral sequence stuff. -filteredComplex SpectralSequence := FilteredComplex => opts -> E -> E.filteredComplex -chainComplex SpectralSequence := ChainComplex => E -> chainComplex filteredComplex E -- given a morphism f: A --> B -- compute the connecting map -- HH_{n+1}( coker f) --> HH_n (im f) connectingMorphism = method() +connectingMorphism(ComplexMap, ZZ) := (a, n) -> ( + K := filteredComplex ({a}); + e := spectralSequence K; + e^1 .dd_{1, n}) -connectingMorphism(ChainComplexMap,ZZ) := (a,n) -> ( - K := filteredComplex ({a}) ; - e := spectralSequence K ; - e^1 .dd_{1, n} - ) --- here are some needed functions related to Hilbert polynomials -- -hilbertPolynomial ZZ := ProjectiveHilbertPolynomial => o -> (M) -> ( if M == 0 - then new ProjectiveHilbertPolynomial from {} else - new ProjectiveHilbertPolynomial from {0 => M} - ) -ProjectiveHilbertPolynomial == ZZ := (M,N) -> (M == hilbertPolynomial N) -ProjectiveHilbertPolynomial + ZZ := (P, N) -> P + hilbertPolynomial N -ZZ + ProjectiveHilbertPolynomial := (P,N) -> hilbertPolynomial P + N -ProjectiveHilbertPolynomial - ZZ := (P, N) -> P - hilbertPolynomial N -ZZ - ProjectiveHilbertPolynomial := (P,N) -> hilbertPolynomial P - N ---- - -hilbertPolynomial (SpectralSequencePage) := Page => o -> (E) -> ( +hilbertPolynomial Page := Page => o -> E -> ( P := new Page; - apply(spots E .dd, i -> P#i = hilbertPolynomial(E_i)); - P - ) + apply(spots page E, i -> P#i = hilbertPolynomial(E_i)); + P) pruningMaps = method() -pruningMaps(SpectralSequencePage) := (E) -> ( if E.Prune == false then error "page is not pruned" - else +pruningMaps SpectralSequencePage := E -> ( + if not E.Prune then error "page is not pruned"; P := new PageMap; P.degree = E.dd.degree; apply(spots E.dd, i -> P#i = E.dd_i .cache.sourcePruningMap); - P - ) + P) -basis (ZZ,SpectralSequencePage) := opts -> (deg,E) -> ( +basis(ZZ, SpectralSequencePage) := +basis(List, SpectralSequencePage) := Page => opts -> (deg, E) -> ( P := new Page; apply(spots E.dd, i -> P#i = basis(deg,E_i)); - P - ) - -basis (List,SpectralSequencePage) := opts -> (deg,E) -> ( - P := new Page; - apply(spots E.dd, i -> P#i = basis(deg,E_i)); - P - ) --- --- --- + P) edgeComplex = method() - -edgeComplex(SpectralSequence) := (E) -> ( - if E.Prune == true then error "not currently implemented for pruned spectral sequences"; - if E.Prune == true then error "not currently implemented for pruned spectral sequences"; +edgeComplex SpectralSequence := E -> ( + if E.Prune then error "not currently implemented for pruned spectral sequences"; M := select(spots E^2 .dd, i -> E^2_i != 0); l := min apply(M, i -> i#0); m := min apply(M, i -> i#1); - C := chainComplex E; + C := complex E; if M != {} then ( - chainComplex {inducedMap(E^2_{l + 1, m}, HH_(l + m + 1) C, id_(C_(l + m + 1))), - inducedMap(HH_(l + m + 1) C, E^2_{l,m + 1}, id_(C_(l + m + 1))), - E^2 .dd_{l + 2,m}, inducedMap(E^2_{l + 2, m}, HH_(l + m + 2) C, id_(C_(l + m + 2)))}) - else - (c := new ChainComplex; c.ring = E.filteredComplex _infinity .ring; - c) - ) + complex {inducedMap(E^2_{l + 1, m}, HH_(l + m + 1) C, id_(C_(l + m + 1))), + inducedMap(HH_(l + m + 1) C, E^2_{l,m + 1}, id_(C_(l + m + 1))), + E^2 .dd_{l + 2,m}, inducedMap(E^2_{l + 2, m}, HH_(l + m + 2) C, id_(C_(l + m + 2)))}) + else complex C.ring) - filteredHomologyObject = method() - -filteredHomologyObject(ZZ, ZZ,FilteredComplex) := (p,n,K) -> ( - image(inducedMap(HH_n K_infinity, HH_n K_p, id_(K_infinity _n))) - ) - +filteredHomologyObject(ZZ, ZZ, FilteredComplex) := (p,n,K) -> ( + image inducedMap(HH_n K_infinity, HH_n K_p, id_(K_infinity _n))) associatedGradedHomologyObject = method() - -associatedGradedHomologyObject(ZZ,ZZ,FilteredComplex) := (p,n,K) -> ( - filteredHomologyObject(p,n,K) / filteredHomologyObject(p-1,n,K) - ) - - - ------------------------------------------------------------ ------------------------------------------------------------ - - - -beginDocumentation() - -undocumented { - -- page, --- (degree, Page), --- (net, FilteredComplex), --- (net, Page), --- (net, PageMap), --- (net, SpectralSequencePage), --- (net, SpectralSequence), --- (symbol _, Page, List), --- (page, SpectralSequencePage), --- (symbol _, PageMap, List), --- (ring, Page), --- (spectralSequencePageMap, FilteredComplex, ZZ), --- (spots, PageMap), --- (support, SpectralSequencePage), - -- ReducedHomology, ---sourcePruningMap, targetPruningMap, --- pageMap, --- ErMaps, --- (ErMaps,FilteredComplex, ZZ, ZZ, ZZ), --- (support, PageMap), --- (page,List, List, Page), --- (expression, SpectralSequence), --- spectralSequencePageMap, --- Shift, --- (support, FilteredComplex) - } - - -document { - Key => { - Shift - }, - Headline => "name for an optional argument" -} - -document { - Key => { - ReducedHomology - }, - Headline => "name for an optional argument" -} - - -doc /// - Key - targetPruningMap -/// - - -doc /// - Key - sourcePruningMap -/// - - - -doc /// - Key - [spectralSequence,Prune] - -/// - -doc /// - Key - [spectralSequencePage,Prune] - -/// - -doc /// - Key - [filteredComplex, ReducedHomology] -/// - -doc /// - Key - [filteredComplex, Shift] -/// - -doc /// - Key - [page,Prune] -/// - -doc /// - Key - [spectralSequencePageMap,Prune] -/// - - - -document { - Key => SpectralSequences, - Headline => "a package for working with filtered complexes and spectral sequences", - "Spectral sequences, although notoriously technical, are very useful in applications---especially when they degenerate quickly. - By contrast, little is known about their general structure when they fail to degenerate quickly. Even in cases when the terms in the spectral sequences are well understood, the maps remain mysterious. - One of the motivations behind this package is to shed light on spectral sequences through examples. Its purpose - is to allow for effective calculations of particular kinds of spectral sequences. - As one general situation, which illustrates some capabilities of this package, - let k be a computable field, S a k-algebra of finite type, C a bounded chain complex of - finitely generated S-modules, and FC a bounded ascending filtration of C. This package is - capable of computing, under these assumptions, the spectral sequence---especially the differentials on each page---determined by FC. - ", - -- SUBSECTION "Contributors", - -- "The following people have generously contributed code or worked on our code.", - -- UL { - -- {HREF("","")}, - -- {HREF("","")}, - -- {HREF("","")}, - -- {HREF("","")}, - -- {HREF("","")},}, - SUBSECTION "Constructors used in this package", - UL { - TO "How to make filtered complexes from chain complex maps", --"How to work with filtered complexes", --"Making filtered chain complexes from chain complex maps", - TO "Filtrations and tensor product complexes", - TO "Filtrations and homomorphism complexes", - TO "Filtered complexes and simplicial complexes", - TO "I-adic filtrations of chain complexes and their spectral sequences", - -- TO "Spectral sequences from filtered chain complexes" - }, - - - SUBSECTION "Other examples which illustrate this package", - UL { - TO "Computing the Serre Spectral Sequence associated to a Hopf Fibration", - TO "Balancing Tor", - TO "Spectral sequences and hypercohomology calculations", - TO "Spectral sequences and connecting morphisms", - TO "Spectral sequences and non-Koszul syzygies", - TO "A spectral sequence which fails to degenerate quickly", - TO "Seeing Cancellations", - TO "Edge homomorphisms", - TO "Examples of change of rings Spectral Sequences" - }, - - SUBSECTION "More easy topological examples", - UL { TO "Identifying anti-podal points of the two sphere", --"The quotient map SS ^2 --> RR PP ^2",--"More topological examples", - TO "The fibration of the Klein Bottle over the sphere with fibers the sphere", --"The fibration SS^1 --> Klein Bottle --> SS^1", - TO "The trivial fibration over the sphere with fibers the sphere"}, -- SS^1 --> SS^1 x SS^1 --> SS^1"}, -} - - -doc /// - Key - "Examples of filtered complexes and spectral sequences" - Headline - How to use this package - Description - Text - Here is a list of some examples which illustrate various parts of this package. - - {\bf First examples which show how to use this package} - - $\bullet$ @TO"How to make filtered complexes from chain complex maps"@ - - $\bullet$ @TO"Filtrations and tensor product complexes"@ - - $\bullet$ @TO"Filtrations and homomorphism complexes"@ - - $\bullet$ @TO"Filtered complexes and simplicial complexes"@ - - $\bullet$ @TO"I-adic filtrations of chain complexes and their spectral sequences"@ - - - {\bf More elaborate examples which illustrate this package} - - $\bullet$ @TO"Computing the Serre Spectral Sequence associated to a Hopf Fibration"@ - - $\bullet$ @TO"Balancing Tor"@ - - $\bullet$ @TO"Spectral sequences and hypercohomology calculations"@ - - $\bullet$ @TO"Spectral sequences and connecting morphisms"@ - - $\bullet$ @TO"Spectral sequences and non-Koszul syzygies"@ - - $\bullet$ @TO"Seeing Cancellations"@ - - $\bullet$ @TO"A spectral sequence which fails to degenerate quickly"@ - - $\bullet$ @TO"Edge homomorphisms"@ - - $\bullet$ @TO"Examples of change of rings Spectral Sequences"@ - - {\bf More easy topological examples} - - $\bullet$ @TO"Identifying anti-podal points of the two sphere"@ - - $\bullet$ @TO"The fibration of the Klein Bottle over the sphere with fibers the sphere"@ - - $\bullet$ @TO"The trivial fibration over the sphere with fibers the sphere"@ - - - -/// - -doc /// - Key - "I-adic filtrations of chain complexes and their spectral sequences" - Description - Text - By multiplying a chain complex by successive powers of an ideal we obtain a filtered complex. - Example - B = QQ[a..d] - J = ideal vars B - C = complete res monomialCurveIdeal(B,{1,3,4}) - K = filteredComplex(J,C,4) - Text - Here are some higher pages of the associated spectral sequence: - Example - E = prune spectralSequence K --- E^2 --- E^3 --- E^3 .dd - E^4 - E^4 .dd -/// - - -doc /// - Key - "Filtered complexes and simplicial complexes" - Description - Text - We can make a filtered complex from a nested list of simplicial - complexes: - Example - A = QQ[x,y,z,w]; - F2D = simplicialComplex {x*y*z, w*z}; - F1D = simplicialComplex {x*y, w}; - F0D = simplicialComplex {x,w}; - K = filteredComplex{F2D, F1D, F0D} - Text - The resulting spectral sequence takes the form: - Example - E = prune spectralSequence K; - E^0 - E^0 .dd - E^1 - E^1 .dd - E^2 - E^2 .dd - E^infinity - Text - If we want the homology of the complex to be the non-reduced homology - of the simplicial complex we set the ReducedHomology option to false: - Example - k = filteredComplex({F2D, F1D, F0D}, ReducedHomology => false) - Text - The resulting spectral sequence takes the form: - Example - e = prune spectralSequence k; - e^0 - e^0 .dd - e^1 .dd - e^2 - e^2 .dd - e^infinity - SeeAlso - "How to make filtered complexes from chain complex maps" - "Filtrations and tensor product complexes" - "Filtrations and homomorphism complexes" -/// - - -doc /// - Key - "Filtrations and homomorphism complexes" - Description - Text - Let $S$ be a commutative ring and let - $B : \dots \rightarrow B_{i} \rightarrow B_{i - 1} \rightarrow \cdots $ and - $C : \dots \rightarrow C_{i} \rightarrow C_{i - 1} \rightarrow \cdots $ be chain complexes. - - For all integers $p$ and $q$ let $K_{p,q} := Hom_S(B_{-p}, C_q)$, - let $d'_{p,q} : K_{p,q} \rightarrow K_{p - 1, q}$ denote the homorphism - $ \phi \mapsto \partial^B_{-p + 1} \phi$, and let - $d^{''}_{p,q} : K_{p,q} \rightarrow K_{p, q - 1} $ denote the homorphism - $\phi \mapsto (-1)^p \partial^C_q \phi$. - - The chain complex $Hom(B, C)$ is given by - $ Hom(B, C)_k := \prod_{p + q = k} Hom_S(B_{-p}, C_q) $ - and the differentials - by $ \partial := d^{'} + d^{''} $; - it carries two natural ascending filtrations $F' ( Hom(B, C) )$ and $F''( Hom(B, C))$. - - The first is obtained by - letting $F'_n (Hom(B, C))$ be the chain complex determined by setting - $F'_n (Hom(B, C))_k := \prod_{p + q = k , p \leq n} Hom_S(B_{-p}, C_q)$ - and the differentials $\partial := d' + d''$. - - The second is obtained by letting $F''_n (Hom(B, C)) := \prod_{p + q = k , q \leq n} Hom_S(B_{-p}, C_q)$ - and the differentials $\partial := d' + d''$. - - In {\it Macaulay2}, using this package, $F'$ and $F''$ as defined above are - computed as illustrated in the following example, by using - Hom(filteredComplex B, C) or Hom(B,filteredComplex C). - - Example - A = QQ[x,y,z,w]; - B = res monomialCurveIdeal(A, {1,2,3}); - C = res monomialCurveIdeal(A, {1,3,4}); - F' = Hom(filteredComplex B, C) - F'' = Hom(B,filteredComplex C) - Text - Notice that the display above shows that these are different filtered complexes. - The resulting spectral sequences take the form: - Example - E' = prune spectralSequence F'; - E'' = prune spectralSequence F'' ; - E' ^0 - E' ^ 0 .dd - E'' ^0 - E'' ^1 -/// - -doc /// - Key - "Filtrations and tensor product complexes" - Description - Text - Let $S$ be a commutative ring and let - $B : \dots \rightarrow B_{i} \rightarrow B_{i - 1} \rightarrow \dots $ and - $C : \dots \rightarrow C_{i} \rightarrow C_{i - 1} \rightarrow \dots $ be chain complexes. - - For all integers $p$ and $q$ let $K_{p,q} := B_p \otimes_S C_q$, let $d'_{p,q} : K_{p,q} \rightarrow K_{p - 1, q}$ - denote the homorphism - $\partial^B_{p} \otimes 1$, and let $d''_{p,q} : K_{p,q} \rightarrow K_{p, q - 1} $ denote the - homorphism $(-1)^p \otimes \partial_q^C $. - - The chain complex $B \otimes_S C$ is given by - $ (B \otimes_S C)_k := \oplus_{p + q = k} B_p \otimes_S C_q$ - and the differentials by $\partial := d' + d''$. It carries two natural ascending filtrations - $F'B \otimes_S C$ and $F'' B \otimes_S C$. - - The first is obtained by letting - $F'_n (B \otimes_S C)$ be the chain complex determined by setting - $F'_n (B \otimes_S C)_k := \oplus_{p + q = k , p \leq n} B_{p} \otimes_S C_q$ - and the differentials $\partial := d' + d''$. - - The second is obtained by letting - $F''_n (B \otimes_S C)$ be the chain complex determined by setting - $F''_n (B \otimes_S C)_k := \oplus_{p + q = k , q \leq n} B_{p} \otimes_S C_q$ - and the differentials $\partial := d' + d''$. - - In Macaulay2 we can compute these filtered complexes as follows. - --To obtain the chain complex $F' B \otimes_S C$ we use the syntax - --$(filteredComplex B)\otimes C$. - --To obtain the chain complex $ F'' B \otimes_S C$ we use the syntax - --$ B\otimes(filteredComplex C)$. - Example - A = QQ[x,y,z,w]; - B = res monomialCurveIdeal(A,{1,2,3}); - C = res monomialCurveIdeal(A,{1,3,4}); - F' = (filteredComplex B) ** C - F'' = B ** (filteredComplex C) - Text - The pages of the resulting spectral sequences take the form: - Example - E' = prune spectralSequence F'; - E'' = prune spectralSequence F''; - E' ^0 - E' ^ 1 - E'' ^0 - E'' ^1 - SeeAlso - "Balancing Tor" -/// - -doc /// - Key - "How to make filtered complexes from chain complex maps" - -- Headline - -- the most primitive way to make filtered complexes - Description - Text - We describe - the most primitive way to create filtered complexes. - - Let $C$ be a chain complex and consider a list of - chain complex maps $\{\phi_n, \phi_{n - 1}, \dots, \phi_0 \}$ - with properties that $C$ is the target of $\phi_i$, for $0 \leq i \leq n$, and the - image of $\phi_{i-1}$ is a subchain complex of the image of $\phi_i$, for $1 \leq i \leq n$. - Given this input data we produce an ascending filtered chain complex $FC$ - with the properties that $F_k C = C$ for $k \geq n + 1$ and $F_k C = image \phi_k$, for $k = 0, \dots, n$. - - We now illustrate how this is done in two easy examples. - We first make three chain complexes $C$, $D$, and $E$, - two chain complex maps, $d : D \rightarrow C$ - and $e : E \rightarrow C$, and then - compute the resulting filtration of $C$. --- When then consider a boundary case by considering the filtered complex obtained --- from a single chain complex map, that is the identity of $C$. - Text - Let's make our chain complexes $C$, $D$, and $E$. - Example - R = QQ[x,y,z,w] ; - c2 = matrix(R,{{1},{0}}) ; - c1 = matrix(R,{{0,1}}) ; - C = chainComplex({c1,c2}) - D_2 = image matrix(R,{{1}}); - D_1 = image matrix(R,{{1,0},{0,0}}); - D_0 = image matrix(R,{{1}}); - D = chainComplex({inducedMap(D_0,D_1,C.dd_1),inducedMap(D_1,D_2,C.dd_2)}) - E_2 = image matrix(R,{{0}}); - E_1 = image matrix(R,{{1,0},{0,0}}); - E_0 = image matrix(R,{{1}}); - E = chainComplex({inducedMap(E_0,E_1,C.dd_1),inducedMap(E_1,E_2,C.dd_2)}) - Text - We now make our chain complex maps. - Example - d = chainComplexMap(C,D,apply(spots C, i-> inducedMap(C_i,D_i,id_C _i))) - e = chainComplexMap(C,E,apply(spots C, i->inducedMap(C_i,E_i, id_C _i))) - Text - We can check that these are indeed chain complex maps: - Example - isChainComplexMap d - isChainComplexMap e - Text - Now, given the list of chain complex maps $\{d, e\}$, we obtain - a filtration of $C$ by: - Example - K = filteredComplex({d,e}) - Text - If we want to specify a minimum filtration degree - we can use the Shift option. - Example - L = filteredComplex({d,e},Shift =>1) - M = filteredComplex({d,e},Shift =>-1) --- Text --- We now explain a boundary case in which the list consists of a single map $\{\phi_0\}$. --- Example --- P = filteredComplex {id_C} --- P_1 -/// +associatedGradedHomologyObject(ZZ, ZZ, FilteredComplex) := (p,n,K) -> ( + filteredHomologyObject(p,n,K) / filteredHomologyObject(p-1,n,K)) --- --- Examples +-- Documentation and tests --- -doc /// - Key - "A spectral sequence which fails to degenerate quickly" - -- Headline - -- nonzero maps on higher page numbers - Description - Text - The following example is taken from p. 127, Fig 7.2 of - Zomorodian's {\it Topology for computing}. In that figure, a filtration of a suitable - simplicial complex is pictured. Here we compute the associated spectral sequence. - As we will see below, the spectral sequences has nonzero maps on higher page numbers. - Example - A = ZZ [s,t,u,v,w] ; - D0 = simplicialComplex {s} ; - D1 = simplicialComplex {s,t} ; - D2 = simplicialComplex {s,t,u} ; - D3 = simplicialComplex {s*t, u} ; - D4 = simplicialComplex {s*t, u, v} ; - D5 = simplicialComplex {s*t, u, v, w} ; - D6 = simplicialComplex {s*t, s*w ,u, v} ; - D7 = simplicialComplex {s*t, s*w ,t * w, u, v} ; - D8 = simplicialComplex {s*t, s*w ,t * w, u * v} ; - D9 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v} ; - D10 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u} ; - D11 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w} ; - D12 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u} ; - D13 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w} ; - D14 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w} ; - D15 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u} ; - D16 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v} ; - D17 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v, s*t*w} ; - L = reverse {D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16, D17} ; - K = filteredComplex (L, ReducedHomology => false) ; - E = prune spectralSequence K ; - E^0 - E^1 .dd - E^8 - E^8 .dd - E^9 - E^9 .dd - E^infinity - prune HH K_infinity -/// - -doc /// - Key - "Seeing Cancellations" - -- Headline - -- nonzero maps on higher page numbers - Description - Text - Here we give an example of a spectral sequence that takes n+2 steps to degenerate, where - n is the embedding dimension of the ring. We present this when n = 2 but the user with - computational power can easily do a bigger case. - Example - S = ZZ/101[x,y]; - I = ideal(x^2,x*y,y^2); - R = S/I; - kR = coker vars R; - kS = coker vars S; - CS = res kS; - CR = res(kR,LengthLimit=>6); - CS' = CS**R; - E = prune spectralSequence (CS' ** filteredComplex CR); - Text - Since this spectral sequence only consists of $k$ vector spaces, and all are generated - in a single degree, for ease of presentation we may as well just look at the rank and degree - which we can easily encode in a matrix with $rt^d$ encoding the rank $r$ and degree $d$ of each - vector space $E_{i,j}$. - Example - use ZZ[t] - easyPresentation = (P,n,m) -> ( - transpose matrix apply(n, - i-> apply(m, - j-> (length (P_{i,j}))*t^( - if (L = unique flatten degrees P_{i,j})!= {} then first L else 0) - ) - )); - Text - To see what we're going for, we compute the E_{infinity} page and also some earlier pages. - Notice that it's clear that all terms except those in the top row of the matrix must eventually - disappear, but for this to happen, there must a map of the right degree mapping to them. - Example - easyPresentation(E_infinity,6,3) - easyPresentation(E_1,6,3) - easyPresentation(E_2,6,3) - easyPresentation(E_3,6,3) - length image ((E_2).dd_{3,0}) - length image (E_3).dd_{3,0} - Text - The final two computations are meant to explain that the copy of $k^8$ in degree 3 that - appears on the $E_1$ cancels in two steps via an $E_2$ map with $k^6$ and via an $E_3$ map with a $k^2$. -/// - -doc /// - Key - "Identifying anti-podal points of the two sphere" - Description - Text - In this example we compute the spectral sequence arising from - the quotient map - $\mathbb{S}^2 \rightarrow \mathbb{R} \mathbb{P}^2$, - given by identifying anti-podal points. - This map can be realized by a simplicial map along the lines of Exercise 27, Section 6.5 of Armstrong's - book {\it Basic Topology}. - In order to give a combinatorial picture of the quotient map - $\mathbb{S}^2 \rightarrow \mathbb{R} \mathbb{P}^2$, - given by identifying anti-podal points, we - first make an appropriate simplicial realization of $\mathbb{S}^2$. - Note that we have added a few barycentric coordinates. - Example - S = ZZ[v1,v2,v3,v4,v5,v6,v15,v12,v36,v34,v46,v25]; - twoSphere = simplicialComplex {v3*v4*v5, v5*v4*v15, v15*v34*v4, v15*v34*v1, v34*v1*v6, v34*v46*v6, v36*v46*v6, v3*v4*v46, v4*v46*v34, v3*v46*v36, v1*v6*v2, v6*v2*v36, v2*v36*v12,v36*v12*v3, v12*v3*v5, v12*v5*v25, v25*v5*v15, v2*v12*v25, v1*v2*v25, v1*v25*v15}; - Text - We can check that the homology of the simplicial complex twoSphere agrees with that of $\mathbb{S}^2$. - Example - C = truncate(chainComplex complex twoSphere,1) - prune HH C - Text - We now write down our simplicial complex whose topological realization - is $\mathbb{R} \mathbb{P}^2$. - Example - R = ZZ[a,b,c,d,e,f]; - realProjectivePlane = simplicialComplex {a*b*c, b*c*d, c*d*e, a*e*d, e*b*a, e*f*b, d*f*b, a*f*d, c*f*e,a*f*c}; - Text - Again we can check that we've entered a simplicial complex - whose homology agrees with that of the real projective plane. - Example - B = truncate(chainComplex complex realProjectivePlane,1) - prune HH B - Text - We now compute the fibers of the anti-podal quotient map - $\mathbb{S}^2 \rightarrow \mathbb{R} \mathbb{P}^2$. - The way this works for example is: - $a = v3 ~ v1, b = v6 ~ v5, d = v36 ~ v15, c = v4 ~ v2, - e = v34 ~ v12, f = v46 ~ v25$ - - The fibers over the vertices of $\mathbb{R} \mathbb{P}^2$ are: - Example - F0twoSphere = simplicialComplex {v1,v3,v5,v6, v4,v2, v36,v15, v34,v12, v46,v25} - Text - The fibers over the edges of $\mathbb{R}\mathbb{P}^2$ are: - Example - F1twoSphere = simplicialComplex {v3*v4, v1*v2,v3*v5, v1*v6,v4*v5, v2*v6, v5*v15, v6*v36, v4*v34, v2*v12, v15*v34, v36*v12, v1*v15, v3*v36, v46*v34, v25*v12, v6*v34, v5*v12, v6*v46, v5*v25, v36*v46, v15*v25, v3*v46, v1*v25, v4*v15, v2*v36, v1*v34, v3*v12, v4*v46, v25*v2} - Text - The fibers over the faces is all of $\mathbb{S}^2$. - Example - F2twoSphere = twoSphere - Text - The resulting filtered complex is: - Example - K = filteredComplex({F2twoSphere, F1twoSphere, F0twoSphere}, ReducedHomology => false) - Text - We now compute the resulting spectral sequence. - Example - E = prune spectralSequence K - E^0 - E^1 - E^0 .dd - E^1 .dd - E^2 - E^2 .dd -/// - -doc/// - Key - "The fibration of the Klein Bottle over the sphere with fibers the sphere" - Description - Text - In this example we give a simplicial realization of the fibration - $\mathbb{S}^1 \rightarrow {\rm Klein Bottle} \rightarrow \mathbb{S}^1$. - To give a simplicial realization of this fibration we first make a simplicial - complex which gives a triangulation of the Klein Bottle. - The triangulation of the Klein Bottle that we use has 18 facets and is, up to relabling, the triangulation of the Klein bottle given - in Figure 6.14 of Armstrong's book {\it Basic Topology}. - Example - S = ZZ[a00,a10,a20,a01,a11,a21,a02,a12,a22]; - -- there will be 18 facets of Klein Bottle - Delta = simplicialComplex {a00*a10*a02, a02*a12*a10, a01*a02*a12, a01*a12*a11, a00*a01*a11, a00*a11*a10, a10*a12*a20, a12*a20*a22, a11*a12*a22, a11*a22*a21, a10*a11*a21, a10*a21*a20, a20*a22*a00, a22*a00*a01, a21*a22*a01, a21*a02*a01, a20*a21*a02, a20*a02*a00} - Text - We can check that the homology of this simplicial complex agrees with that - of the Klein Bottle: - Example - C = truncate(chainComplex complex Delta,1) - prune HH C - Text - Let $S$ be the simplicial complex with facets $\{A_0 A_1, A_0 A_2, A_1 A_2\}$. Then $S$ is a triangulation of $S^1$. The simplicial map - $\pi : \Delta \rightarrow S$ given by $\pi(a_{i,j}) = A_i$ is a combinatorial realization of the fibration - $S^1 \rightarrow {\rm Klein Bottle} \rightarrow S^1$. - The subsimplicial complexes of $\Delta$, which arise from the - the inverse images of the simplicies of $S$, are described below. - Example - F1Delta = Delta - F0Delta = simplicialComplex {a00*a01,a01*a02,a00*a02,a10*a11,a10*a12,a11*a12,a21*a20,a20*a22,a21*a22} - Text - The resulting filtered chain complex is: - Example - K = filteredComplex({F1Delta, F0Delta}, ReducedHomology => false) - Text - The resulting spectral sequence is: - Example - E = prune spectralSequence K - E^0 - E^0 .dd - E^1 - E^1 .dd - E^2 - Text - Note that the spectral sequence is abutting to what it should --- the integral - homology of the Klein bottle -/// - -doc /// - Key - "The trivial fibration over the sphere with fibers the sphere"--"The trivial fibration over the sphere with fiber the sphere" - Description - Text - In this example we compute the spectral sequence associated to the - trivial fibration $\mathbb{S}^1 \rightarrow \mathbb{S}^1 x \mathbb{S}^1 \rightarrow \mathbb{S}^1$, - where the map is given by one of the projections. To give a simplicial realization of this fibration we first make a simplicial complex - which gives a triangulation of $\mathbb{S}^1 \times \mathbb{S}^1$. The simplicial complex that we construct - is the triangulation of the torus given in Figure 6.4 of Armstrong's book - {\it Basic Topology} and has 18 facets. - Example - S = ZZ/101[a00,a10,a20,a01,a11,a21,a02,a12,a22]; - --S = ZZ[a00,a10,a20,a01,a11,a21,a02,a12,a22]; for some reason get an error - -- if use ZZ coefs... - -- there will be 18 facets of SS^1 x SS^1 - Delta = simplicialComplex {a00*a02*a10, a02*a12*a10, a01*a02*a12, a01*a11*a12, a00*a01*a11, a00*a10*a11, a12*a10*a20, a12*a20*a22, a11*a12*a22, a11*a22*a21, a10*a11*a21, a10*a21*a20, a20*a22*a00, a22*a00*a02, a21*a22*a02, a21*a02*a01, a20*a21*a01, a20*a01*a00} - Text - We can check that the homology of the simplicial complex - $\Delta$ agrees with that of the torus - $\mathbb{S}^1 \times \mathbb{S}^1 $ - Example - C = truncate(chainComplex complex Delta,1) - prune HH C - Text - Let $S$ be the simplicial complex with facets $\{A_0 A_1, A_0 A_2, A_1 A_2\}$. Then $S$ is a triangulation of $S^1$. The simplicial map - $\pi : \Delta \rightarrow S$ given by $\pi(a_{i,j}) = A_i$ is a combinatorial realization of the trivial fibration - $\mathbb{S}^1 \rightarrow \mathbb{S}^1 \times \mathbb{S}^1 \rightarrow \mathbb{S}^1$. - We now make subsimplicial complexes arising from the filtrations of the - inverse images of the simplicies. - Example - F1Delta = Delta; - F0Delta = simplicialComplex {a00*a01, a01*a02, a00*a02, a10*a11,a11*a12,a10*a12, a21*a20,a21*a22,a20*a22}; - K = filteredComplex({F1Delta, F0Delta}, ReducedHomology => false) ; - Text - The resulting spectral sequence is: - Example - E = prune spectralSequence K - E^0 - E^0 .dd - E^1 - E^1 .dd - E^2 -/// - -doc /// - Key - "Spectral sequences and non-Koszul syzygies" - Description - Text - We illustrate some aspects of the paper - "A case study in bigraded commutative algebra" by Cox-Dickenstein-Schenck. - In that paper, an appropriate term on the E_2 page of a suitable - spectral sequence corresponds to non-koszul syzygies. - - Using our indexing conventions, the E^2_{3,-1} term will be what the - $E^{0,1}_2$ term is in their paper. - - We illustrate an instance of the non-generic case for non-Koszul syzygies. - To do this we look at the three polynomials used in their Example 4.3. - The behaviour that we expect to exhibit is predicted by their Proposition 5.2. - Example - R = QQ[x,y,z,w, Degrees => {{1,0},{1,0},{0,1},{0,1}}]; - B = ideal(x*z, x*w, y*z, y*w); - p_0 = x^2*z; - p_1 = y^2*w; - p_2 = y^2*z+x^2*w; - I = ideal(p_0,p_1,p_2); - -- make the frobenious power of the irrelevant ideal - B = B_*/(x -> x^2)//ideal; - -- need to take a large enough power. - -- it turns out that 2 is large enough for this example - G = complete res image gens B; - F = koszul gens I; - K = Hom(G, filteredComplex(F)); - E = prune spectralSequence K; - E^1 - E^2 - Text - The degree zero piece of the module $E^2_{3,-1}$ twisted by $R((2,3))$ below - shows that there is a $1$-dimensional space of non-Koszul syzygies - of bi-degree $(2,3)$. This is what is predicted by the paper. - Example - E^2_{3,-1} - basis({0,0}, E^2_{3, -1} ** R^{{2, 3}}) - E^2 .dd_{3, -1} --- E^2 .dd - basis({0,0}, image E^2 .dd_{3,-1} ** R^{{2,3}}) - basis({0,0}, E^2_{1,0} ** R^{{2,3}}) - -- this shows that there is a 1 dimensional space of non-Koszul syzygies of bi-degree (2,3) - -- which is also what is predicted by the paper. - Text - The degree zero piece of the module $E^2_{3,-1}$ twisted by $R((6,1))$ below - shows that there is a $1$-dimensional space of non-Koszul syzygies of bi-degree - $(6,1)$. This is also what is predicted by the paper. - Example - basis({0,0}, E^2 _{3, -1} ** R^{{6,1}}) - -- this shows that there is a 1 dimensional space of non-Koszul syzygies of bi-degree (6,1) - -- this is what is predicted by the paper. - isIsomorphism(E^2 .dd_{3, -1}) -/// - -doc /// - Key - "Spectral sequences and connecting morphisms" - Description - Text - If $0 \rightarrow A \rightarrow B \rightarrow C \rightarrow 0$ is a - short exact sequence of chain complexes then the connecting morphism - $H_i(C) \rightarrow H_{i - 1}(A)$ can realized as a suitable map - on the $E^1$ of a spectral sequence determined by a suitably defined - two step filtration of $B$. - - Here we illustrate this realization in a concrete situation: we - compute the connecting morphism $H^i(X, F) \rightarrow H^{i + 1}(X, G)$ - arising from a short exact sequence - $0 \rightarrow G \rightarrow H \rightarrow F \rightarrow 0$ of sheaves - on a smooth toric variety $X$. - - More specifically we let $X = \mathbb{P}^1 \times \mathbb{P}^1$ and use multigraded commutative algebra - together with spectral sequences to compute the connecting - morphism $H^1(C, OO_C(1,0)) \rightarrow H^2(X, OO_X(-2,-3))$ where - $C$ is a general divisor of type $(3,3)$ on $X$. This connecting morphism is an - isomorphism. - Example - R = ZZ/101[a_0..b_1, Degrees=>{2:{1,0},2:{0,1}}]; -- PP^1 x PP^1 - M = intersect(ideal(a_0,a_1),ideal(b_0,b_1)) ; -- irrelevant ideal - M = M_*/(x -> x^5)//ideal ; -- Suitably high Frobenius power of M - G = res image gens M ; - I = ideal random(R^1, R^{{-3,-3}}) -- ideal of C - b = chainComplex gradedModule R^{{1,0}} -- make line bundle a chain complex - a = chainComplex gradedModule R^{{-2,-3}} - -- make the map OO(-2, -3) --> OO(1,0) - f = chainComplexMap(b, a,{random(R^1, R^{{-3,-3}})}) ; - K = filteredComplex ({Hom(G,f)}) ; -- the two step filtered complex we want - E = prune spectralSequence K ; - Text - The degree zero piece of the map $E^1 .dd_{1, -2}$ below is the desired connecting - morphism $H^1(C, OO_C(1,0)) \rightarrow H^2(X, OO_X(-2,-3))$. - Example - E^1 .dd_{1,-2} -- the connecting map HH^1(C, OO_C(1,0)) --> HH^2(X, OO_X(-2,-3)) - basis({0,0}, image E^1 .dd_{1,-2}) -- image 2-dimensional - basis({0,0}, ker E^1 .dd_{1,-2}) -- map is injective - basis({0,0}, target E^1 .dd_{1,-2}) -- target 2-dimensional - basis({0,0}, source E^1 .dd_{1,-2}) -- source 2 dimensional - Text - An alternative way to compute the connecting morphism is - Example - prune connectingMorphism(Hom(G, f), - 2) ; - prune connectingMorphism(Hom(G, f), - 2) == E^1 .dd_{1, -2} - -/// - -doc /// - Key - "Spectral sequences and hypercohomology calculations" - -- Headline - -- using spectral sequences to compute hypercohomology - Description - Text - If $\mathcal{F}$ is a coherent sheaf on a smooth toric variety $X$ - then multigraded commutative algebra can be used to compute - the cohomology groups $H^i(X, \mathcal{F})$. - - Indeed if $B$ is the irrelevant ideal of $X$ then the cohomology group - $H^i(X, \mathcal{F})$ can be realized as the degree zero piece of the multigraded - module - $Ext^i(B^{[l]}, F)$ for sufficiently large $l$; here $B^{[l]}$ denotes - the $l$th Frobenius power of $B$ and $F$ is any multigraded module whose - corresponding sheaf on $X$ is $\mathcal{F}$. - - Given the fan of - $X$ and $F$ a sufficiently large power of $l$ can be determined effectively. - We refer to sections 2 and 3 of the paper - "Cohomology on Toric Varieties and Local Cohomology with Monomial Supports" - for more details. - - In this example, we consider - the case that $X = \mathbb{P}^1 \times \mathbb{P}^1$ and - $F = \mathcal{O}_C(1,0)$ where - $C$ is a general divisor of type $(3,3)$ on $X$. - In this setting, $H^0(C,F)$ and $H^1(C, F)$ are both $2$-dimensional - vector spaces. - - We first make the multi-graded coordinate ring of - $\mathbb{P}^1 \times \mathbb{P}^1$, the - irrelevant ideal, and a sufficentily high Frobenus power of the - irrelevant ideal needed for our calculations. Also the complex $G$ - below is a resolution of the irrelevant ideal. - Example - -- C \subseteq PP^1 x PP^1 type (3,3) - -- Use hypercohomology to compute HH OO_C(1,0) - R = ZZ/101[a_0..b_1, Degrees=>{2:{1,0},2:{0,1}}]; -- PP^1 x PP^1 - B = intersect(ideal(a_0,a_1),ideal(b_0,b_1)) ; -- irrelevant ideal - B = B_*/(x -> x^5)//ideal ; -- Sufficentily high Frobenius power - G = res image gens B ; - Text - We next make the ideal, denoted by $I$ below, of a general divisor of type $(3,3)$ - on $\mathbb{P}^1 \times \mathbb{P}^1$. Also the chain complex - $F$ below is a resolution of this ideal. - Example - I = ideal random(R^1, R^{{-3,-3}}) ; -- ideal of C - F = res comodule I - Text - To use hypercohomology to compute the cohomology groups of the - line bundle $\mathcal{O}_C(1,0)$ on $C$ we twist the - complex $F$ above by a line of ruling and then - make a filtered complex whose associated spectral - sequence abuts to the desired cohomology groups. - Example - K = Hom(G , filteredComplex (F ** R^{{1,0}})) ; -- Twist F by a line of ruling and make filtered complex whose ss abuts to HH OO_C(1,0) - E = prune spectralSequence K ; --the spectral sequence degenerates on the second page - E^1 - E^2 ; -- output is a mess - Text - The cohomology groups we want are obtained as follows. - Example - basis({0,0}, E^2_{0,0}) -- == HH^0 OO_C(1,0) - basis({0,0}, E^2_{1,-2}) -- == HH^1 OO_C(1,0) - - SeeAlso - "Spectral sequences and connecting morphisms" - "Spectral sequences and non-Koszul syzygies" -/// - - -doc /// - Key - "Computing the Serre Spectral Sequence associated to a Hopf Fibration" - Description - Text - We compute the Serre Spectral Sequence - associated to the Hopf Fibration - $S^1 \rightarrow S^3 \rightarrow S^2$. - This example is made possible by the minimal - triangulation of this fibration given in the paper - "A minimal triangulation of the Hopf map and its application" - by K.V. Madahar and K.S Sarkaria. Geom Dedicata, 2000. - Text - We first make the relevant simplicial complexes - described on page 110 of the paper. The - simplicial complex $S3$ below is a triangulation of - $S^3$. - Example - B = QQ[a_0..a_2,b_0..b_2,c_0..c_2,d_0..d_2]; - l1 = {a_0*b_0*b_1*c_1,a_0*b_0*c_0*c_1,a_0*a_1*b_1*c_1,b_0*b_1*c_1*d_1,b_0*c_0*c_1*d_2,a_0*a_1*c_1*d_2,a_0*c_0*c_1*d_2,b_0*c_1*d_1*d_2}; - l2 = {b_1*c_1*c_2*a_2,b_1*c_1*a_1*a_2,b_1*b_2*c_2*a_2,c_1*c_2*a_2*d_1,c_1*a_1*a_2*d_2,b_1*b_2*a_2*d_2,b_1*a_1*a_2*d_2,c_1*a_2*d_1*d_2}; - l3 = {c_2*a_2*a_0*b_0,c_2*a_2*b_2*b_0,c_2*c_0*a_0*b_0,a_2*a_0*b_0*d_1,a_2*b_2*b_0*d_2,c_2*c_0*b_0*d_2,c_2*b_2*b_0*d_2,a_2*b_0*d_1*d_2}; - l4 = {a_0*b_0*b_1*d_1,a_0*b_1*d_0*d_1,b_1*c_1*c_2*d_1,b_1*c_2*d_0*d_1,a_0*a_2*c_2*d_1,a_0*c_2*d_0*d_1}; - l5 = {a_0*b_1*d_0*d_2,a_0*a_1*b_1*d_2,b_1*c_2*d_0*d_2,b_1*b_2*c_2*d_2,a_0*c_2*d_0*d_2,a_0*c_0*c_2*d_2}; - S3 = simplicialComplex(join(l1,l2,l3,l4,l5)); - Text - We identify the two sphere $S^2$ with the simplicial complex $S2$ defined - by the facets $\{abc, abd, bcd, acd \}$. The Hopf fibration - $S^1 \rightarrow S^3 \rightarrow S^2$ is then realized by the simplicial - map $p: S3 \rightarrow S2$ defined by $a_i \mapsto a$, $b_i \mapsto b$, - $c_i \mapsto c$, and $d_i \mapsto d$. - - We now explain how to construct the filtration of $S3$ obtained by - considering the $k$-skeletons of this fibration. - - The simplicial complex $F1S3$ below - is the subsimplicial complex of $S3$ obtained by considering the - inverse images of the - $1$-dimensional faces of the simplicial complex $S2$. - We first describe the simplicial complex $F1S3$ in pieces. - - For example, to compute $f1l1$ below, we observe that - the inverse image of $ab$ under $p$ is - $a_0b_0b_1, a_0a_1b_1$ etc. - All of these inverse images have been computed by hand previously. - Example - f1l1 = {a_0*b_0*b_1,a_0*a_1*b_1,a_0*c_0*c_1,a_0*a_1*c_1,a_0*a_1*d_2,d_1*d_2,b_0*b_1*c_1,b_0*c_0*c_1,b_0*b_1*d_1,b_0*d_1*d_2,c_1*d_1*d_2,c_0*c_1*d_2}; - f1l2 = {b_1*a_1*a_2,b_1*b_2*a_2,c_1*c_2*a_2,c_1*a_1*a_2,a_1*a_2*d_2,a_2*d_1*d_2,b_1*c_1*c_2,b_1*b_2*c_2,b_1*b_2*d_2,d_1*d_2,c_1*d_1*d_2,c_1*c_2*d_1}; - f1l3 = {a_2*a_0*b_0,a_2*b_2*b_0, c_2*a_2*a_0,c_2*c_0*a_0,a_2*a_0*d_1,a_2*d_1*d_2,b_2*b_0*c_2,c_2*c_0*b_0,b_2*b_0*d_2,b_0*d_1*d_2,c_2*c_0*d_2,d_1*d_2}; - f1l4 = {a_0*b_0*b_1,a_0*a_2,a_0*a_2*c_2,c_1*c_2,a_0*d_0*d_1,a_0*a_2*d_1,b_1*c_1*c_2,b_0*b_1,b_0*b_1*d_1,b_1*d_0*d_1,c_1*c_2*d_1,c_2*d_0*d_1} - f1l5 = {a_0*a_1*b_1,b_1*b_2,a_0*c_0*c_2,a_0*a_1,a_0*d_0*d_2,a_0*a_1*d_2,b_1*b_2*c_2,c_0*c_2,b_1*d_0*d_2,b_1*b_2*d_2,c_2*d_0*d_2,c_0*c_2*d_2}; - F1S3 = simplicialComplex(join(f1l1,f1l2,f1l3,f1l4,f1l5)); - Text - The simplicial complex $F0S3$ below is the subsimplicial complex of $F1S3$ - obtained by considering the inverse images of - the $0$-dimensional faces of the simplicial complex $S2$. Again we describe - this simplicial complex in pieces. - Example - f0l1 = {a_0*a_1,b_0*b_1,c_0*c_1,d_1*d_2}; - f0l2 = {a_1*a_2,b_1*b_2,c_1*c_2,d_1*d_2}; - f0l3 = {a_0*a_2,b_0*b_2,c_0*c_2,d_1*d_2}; - f0l4 = {a_0*a_2,b_0*b_1,c_1*c_2,d_0*d_1}; - f0l5 = {a_0*a_1,b_1*b_2,c_0*c_2,d_0*d_2}; - F0S3 = simplicialComplex(join(f0l1,f0l2,f0l3,f0l4,f0l5)); - Text - The simplicial complex $S3$ is obtained by considering the - inverse images of the $2$ dimensional faces of $S2$. - - To compute a simplicial version of - the Serre spectral sequence for the - $S^1 \rightarrow S^3 \rightarrow S^2$ - correctly, meaning that the spectral sequence takes the form - $E^2_{p,q} = H_p(S^2,H_q(S^1,QQ))$, we need to - use non-reduced homology. - Example - K = filteredComplex({S3,F1S3,F0S3}, ReducedHomology => false); - Text - We now compute the various pages of the spectral sequence. - To make the output - intelligible we prune the spectral sequence. - Example - E = prune spectralSequence K; - Example - E0 = E^0 - Text - Here are the maps. - Example - E0.dd - Text - Now try the $E^1$ page. - Example - E1 = E^1 - Text - Here are the maps. - Example - E1.dd - Text - Now try the $E^2$ page. - Example - E2 = E^2 - Text - Here are the maps. - Example - E2.dd - Text - Note that the modules on the $E^2$ page appear to have been computed correctly. - The statement of the Serre spectral sequence, see for example Theorem 1.3 p. 8 of - Hatcher's Spectral Sequence book, asserts that - $E^2_{p,q} = H_p(S^2,H_q(S^1,QQ))$. - This is exactly what we obtained above. Also - the maps on the $E^2$ page also seem to be computed correctly as the spectral sequence - will abut to the homology of $S^3$. - Example - E3 = E^3 - E3.dd - Text - Thus the E^3 page appears to have been computed correctly. -/// - -doc /// - Key - "Balancing Tor" - Description - Text - To balance Tor we first need to make some modules over a ring. - Example - A = QQ[x,y,z,w]; - M = monomialCurveIdeal(A,{1,2,3}); - N = monomialCurveIdeal(A,{1,3,4}); - Text - To compute $Tor^A_i(M,N)$ we resolve the modules, tensor appropriately, - and then take homology. - Example - K = res M - J = res N - Text - The spectral sequence that computes $Tor^A_i(M,N)$ by tensoring - $K$ with $N$ and taking homology is given by - Example - E = prune spectralSequence((filteredComplex K) ** J) - Text - The spectral sequence that computes $Tor^A_i(M,N)$ by tensoring - $J$ with $M$ and taking homology is given by - Example - F = prune spectralSequence((K ** (filteredComplex J))) - Text - Let's compute some pages and maps of these spectral sequences. - The zeroth pages takes the form: - Example - E^0 - E^0 .dd - F^0 --- F^0 .dd - Text - The first pages take the form: - Example - E^1 --- E^1 .dd - F^1 --- F^1 .dd - Text - The second pages take the form: - Example - E^2 --- E^2 .dd - F^2 --- F^2 .dd - Text - Observe that $E^2$ and $F^2$ are equal as they should. - SeeAlso - "Filtrations and tensor product complexes" - "Filtrations and homomorphism complexes" -/// - - -doc /// - Key - "Examples of change of rings Spectral Sequences" - Description - Text - Here are some examples of change of rings spectral sequences. - Text - Given a ring map f: R -> S, an R-module M and an R-module S, - there is a spectral sequence E with E^2_{p,q} = Tor^S_p(Tor^R_q(M,S),N) - that abuts to Tor^R_{p+q}(M,N). - Example --- First example - k=QQ; - R=k[a,b,c]; - S=k[s,t]; - f = map(S,R,{s^2,s*t,t^2}); - N = coker vars S; - M = coker vars R --; - F := complete res N; - pushFwdF := pushFwd(f,F); - G := complete res M; - E := spectralSequence(filteredComplex(G) ** pushFwdF); - EE := spectralSequence(G ** (filteredComplex pushFwdF)); - e = prune E; - ee = prune EE; - e^0 - e^1 - e^2 - e^infinity - ee^0 - SeeAlso - "Filtrations and tensor product complexes" - -/// - --------------------------------------------- --- Documentation of methods and functions -- --------------------------------------------- - --- --- Types --- - -doc /// - Key - FilteredComplex - Headline - the type of all filtered complexes - Description - Text - An ascending filtration of a bounded (homological, lower index, or degree $-1$) chain complex - $C : \dots \rightarrow C_i \rightarrow C_{i - 1} \rightarrow \dots$ - is an ordered family of chain subcomplexes - $FC : \dots \subseteq F_{n - 1} C \subseteq F_n C \subseteq \dots $. - Such a filtration is said to be bounded if $F_s C = C$ for all sufficiently - large $s$ and $F_t C = 0$ for all sufficiently small $t$. - - Alternatively, a descending filtration of a bounded (cohomological, or upper index, or degree $1$) chain complex - $C : \dots \rightarrow C^i \rightarrow C^{i + 1} \rightarrow \dots $ - is an ordered family of subchain complexes - $FC : \dots \subseteq F^{n + 1} C \subseteq F^n C \subseteq \dots$. - Such a filtration is said to be bounded if $F^s C = 0$ for all sufficiently - large $s$ and $F^t C = C$ for all sufficiently small $t$. - - The type {\tt FilteredComplex} is a data type for working with bounded filtrations of bounded chain complexes. - Caveat - By assumption all filtered complexes arise from bounded filtrations of bounded chain complexes. Filtrations on degree $-1$ - chain complexes are ascending. Filtrations on degree $1$ chain complexes are - descending. - SeeAlso - "How to make filtered complexes from chain complex maps" - "Filtered complexes and simplicial complexes" - "Filtrations and tensor product complexes" - "Filtrations and homomorphism complexes" -/// - -doc /// - Key - SpectralSequence - Headline - the type of all spectral sequences - Description - Text - A (homological, or lower index) spectral sequence consists of: - - 1. A sequence of modules $\{E^r_{p,q}\}$ for $p,q \in \mathbb{Z}$ and $r \geq 0$; - - 2. A collection of homomorphisms $\{d^r_{p,q}: E^r_{p,q} \rightarrow E^r_{p-r,q+r-1} \}$, for $p,q \in \mathbb{Z}$ and $ r \geq 0$, such that - $d^r_{p,q} d^r_{p+r,q-r+1} = 0$ ; - - 3. A collection of isomorphisms $E^{r+1}_{p,q} \rightarrow ker d^r_{p,q} / image d^r_{p+r,q-r+1}$. - - Alternatively a (cohomological, or upper index) spectral sequence consists of: - - 1'. A sequence of modules $\{E_r^{p,q}\}$ for $p,q \in \mathbb{Z}$, and $r \geq 0$; - - 2'. A collection of homomorphisms $\{d_r^{p,q}: E_r^{p,q} \rightarrow E_{r}^{p+r,q-r+1}\}$ for $p,q \in \mathbb{Z}, r \geq 0$ such that - $d_r^{p,q} d_r^{p-r,q+r-1} = 0$ ; - - 3'. A collection of isomorphisms $E_{r+1}^{p,q} $\rightarrow$ ker d_r^{p,q} / image d_r^{p-r,q+r-1}$. - - The type {\tt SpectralSequence} is a data type for working with spectral sequences. - In this package, a spectral sequence is represented by a sequence of spectral sequence pages. - Caveat - All spectral sequences arise from bounded filtrations of bounded chain complexes. Ascending filtrations of degree $-1$ chain complexes - determine spectral sequences of the first type. Descending filtrations of degree $1$ chain complex determine spectral sequences of the second type. - SeeAlso - "SpectralSequencePage" - "SpectralSequencePageMap" - "Filtered complexes and simplicial complexes" - "Filtrations and tensor product complexes" - "Filtrations and homomorphism complexes" -/// - - - -doc /// - Key - (describe, SpectralSequence) - Headline - real description - Usage - describe S - Description - Text - see describe - SeeAlso - describe -/// - - - -doc /// - Key - SpectralSequencePage - Headline - the type of all spectral sequence pages - Description - Text - A (homological, or lower index) spectral sequence page consists of: - - 1. A fixed integer $r \geq 0$, the page number; - - 2. A sequence of modules $\{E^r_{p,q}\}$ for $p,q \in \mathbb{Z}$; - - 3. A collection of homomorphisms $\{d^r_{p,q}: E^r_{p,q} \rightarrow E^r_{p-r,q+r-1}\}$ for - $p,q \in \mathbb{Z}, r \geq 0$ such that - $d^r_{p,q} d^r_{p+r,q-r+1} = 0$ ; - - 4. A collection of isomorphisms $E^{r+1}_{p,q} \rightarrow ker d^r_{p,q} / image d^r_{p+r,q-r+1}$. - - Alternatively a (cohomological, or upper index) spectral sequence page consists of: - - 1'. A fixed integer $r \geq 0$, the page number; - - 2'. A sequence of modules $\{E_r^{p,q}\}$ for $p,q \in \mathbb{Z}$; - - 3'. A collection of homomorphisms $\{d_r^{p,q}: E_r^{p,q} \rightarrow E_r^{p+r,q-r+1}\}$ for - $ p,q \in \mathbb{Z}, r \geq 0$ such that - $d_r^{p,q} d_r^{p-r,q+r-1} = 0$ ; - - 4'. A collection of isomorphisms $E_{r+1}^{p,q} \rightarrow ker d_r^{p,q} / image d_r^{p-r,q+r-1}$. - - The type {\tt SpectralSequencePage} is a data type for working with spectral sequences - and spectral sequence pages. - Caveat - The isomorphisms $4$ and $4$' are not explicitly - part of the data type, although they can be obtained by using the command @TO"homologyIsomorphism"@. - SeeAlso - "SpectralSequence" - "SpectralSequencePageMap" - "Page" -/// - -doc /// - Key - (support, FilteredComplex) -/// - - -doc /// - Key - (expression, SpectralSequence) -/// - - -doc /// - Key - (support, PageMap) -/// - - -doc /// - Key - (support, SpectralSequencePage) -/// - - -doc /// - Key - (spots, PageMap) -/// - - -doc /// - Key - spectralSequencePageMap - (spectralSequencePageMap, FilteredComplex, ZZ) - Headline - compute the maps on a spectral sequence page - Usage - d = spectralSequencePageMap(FilteredComplex, ZZ) - Inputs - K:FilteredComplex - n:ZZ - Outputs - D:SpectralSequencePageMap - Description - Text - Returns the differentials of a spectral sequence page. -/// - - - -doc /// - Key - (ring, Page) -/// - - -doc /// - Key - (symbol _, PageMap, List) -/// - - -doc /// - Key - (page, SpectralSequencePage) -/// - - -doc /// - Key - (symbol _, Page, List) -/// - - - -doc /// - Key - (net, SpectralSequence) -/// - - -doc /// - Key - (net, SpectralSequencePage) -/// - - -doc /// - Key - (net, PageMap) -/// - -doc /// - Key - (net, Page) -/// - - -doc /// - Key - (net, FilteredComplex) -/// - - -doc /// - Key - (degree, Page) -/// - ---doc /// --- Key --- spectralSequencePageMap ---/// - -doc /// - Key - pageMap -/// - -doc /// - Key - page - (page,List,List,Page) - Description - Text - adds keys to a a page. - SeeAlso - Page -/// - - ---doc /// --- Key --- page ---/// - - -doc /// - Key - (describe, SpectralSequencePage) - Headline - real description - Usage - describe S - Description - Text - see describe - SeeAlso - describe -/// - - - - -doc /// - Key - SpectralSequencePageMap - Headline - the type of all spectral sequence page maps - Description - Text - A (homological, or lower index) spectral sequence page map consists of: - - 1. A fixed integer $r \geq 0 $, the page number; - - 2. A collection of homomorphisms $\{d^r_{p,q}: E^r_{p,q} \rightarrow E^r_{p-r,q+r-1}\}$ for $p,q \in \mathbb{Z}, r \geq 0$ such that - $d^r_{p,q} d^r_{p+r,q-r+1} = 0$. - - Alternatively a (cohomological, or upper index) spectral sequence page consists of: - - 1'. A fixed integer $r \geq 0$, the page number; - - 2'. A collection of homomorphisms $\{d_r^{p,q}: E_r^{p,q} \rightarrow E_r^{p+r,q-r+1}\}$ for $p,q \in \mathbb{Z}, r \geq 0$ such that - $d_r^{p,q} d_r^{p-r,q+r-1} = 0$. - - The type {\tt SpectralSequencePageMap} is a data type for working with spectral sequences and the differentials - on the pages of a spectral sequence. - SeeAlso - "SpectralSequence" - "SpectralSequencePage" - "PageMap" -/// - - - -doc /// - Key - (describe, SpectralSequencePageMap) - Headline - real description - Usage - describe S - Description - Text - see describe - SeeAlso - describe -/// - - -doc /// - Key - Page - Headline - the type of all pages - Description - Text - A page is a collection of modules which are indexed by lists of integers. This is a parent class for the type @TO"SpectralSequencePage"@. The infinity page of a spectral sequence - is an example of a page which is not a spectral sequence page. - - As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - The infinity page of the resulting spectral sequence is computed below. - Example - E = prune spectralSequence K; - E^infinity - SeeAlso - SpectralSequencePage - (symbol ^, SpectralSequence, InfiniteNumber) - (symbol _, SpectralSequence, InfiniteNumber) -/// - - - -doc /// - Key - (describe, Page) - Headline - real description - Usage - describe S - Description - Text - see describe - SeeAlso - describe -/// - -doc /// - Key - (NewMethod, Page) -/// - - - -doc /// - Key - spots - (spots, Page) - Headline - which spots does the given page has a module. - Usage - s = spots P - Inputs - P:Page - Outputs - s:List - Description - Text - Returns a list of all the spots where the given page has a module. - SeeAlso - -/// - - -doc /// - Key - (support, Page) - Headline - which non-zero modules appear in the given page. - Usage - l = support P - Inputs - P:Page - Outputs - l:List - Description - Text - Returns a list of all the non-zero modules appearing in the given page has a module. - SeeAlso - -/// - - -doc /// - Key - PageMap - Headline - the type of all page maps - Description - Text - A page map is a collection of homomorphisms which are indexed by lists of integers. This is a parent class for the type @TO"SpectralSequencePageMap"@. The output of the - method {\tt pruningMaps(SpectralSequencePage)} is an example of a {\tt Page} which is not a {\tt SpectralSequencePage}. - - As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - We compute an example of a pruning map below. - Example - E = prune spectralSequence K; - pruningMaps E^2 - SeeAlso - (pruningMaps,SpectralSequencePage) - prune -/// - -doc /// - Key - (describe, PageMap) - Headline - real description - Usage - describe S - Description - Text - see describe - SeeAlso - describe -/// - ---- functions and methods --- - -doc /// - Key - (spots, ChainComplex) - Headline - which spots does the given chain complex has a module. - Usage - s = spots L - Inputs - L:ChainComplex - Outputs - s:List - Description - Text - Returns a list of all the spots where the given chain complex has a module. - SeeAlso - -/// - - -doc /// - Key - filteredComplex - Headline - make a filtered complex - Usage - K = filteredComplex L - Inputs - L:List - or - L:ChainComplex - or - L:SpectralSequence - ReducedHomology => Boolean - Shift => ZZ - Outputs - K: FilteredComplex - Description - Text - This is the primitive filtered complex constructor. - SeeAlso - FilteredComplex - "How to make filtered complexes from chain complex maps" - "Filtrations and tensor product complexes" - "Filtrations and homomorphism complexes" - "Filtered complexes and simplicial complexes" -/// - - -doc /// - Key - (spots, FilteredComplex) - Headline - which spots does the given filtered complex has a module. - Usage - s = spots L - Inputs - L:FilteredComplex - Outputs - s:List - Description - Text - Returns a list of all the spots where the given filtered complex has a module. - SeeAlso - -/// - -doc /// - Key - (max, FilteredComplex) - Headline - maximum spot where the given filtered complex has a module. - Usage - m = max L - Inputs - L:FilteredComplex - Outputs - m:ZZ - Description - Text - Returns the maximum spot where the given filtered complex has a module. - SeeAlso - -/// - - - -doc /// - Key - (min, FilteredComplex) - Headline - minimum spot where the given filtered complex has a module. - Usage - m = min L - Inputs - L:FilteredComplex - Outputs - m:ZZ - Description - Text - Returns the minimum spot where the given filtered complex has a module. - SeeAlso - -/// - -doc /// - Key - spectralSequence - Headline - construct a spectral sequence - Usage - E = spectralSequence K - Inputs - K:FilteredComplex - A filtered complex - Outputs - E:SpectralSequence - Description - Text - This is the primitive spectral sequence constructor. - - In the example below we construct a spectral sequence - $E$ from the filtered complex $K$. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - E = spectralSequence K - Text - To view pages and or maps we proceed, for example, as follows (note we suppress the output of the E^0.dd command to prevent excessive output) - Example - E^0 - E^0 .dd; - E^infinity - SeeAlso - SpectralSequence - SpectralSequencePage - (symbol ^,SpectralSequence,ZZ) - (spectralSequence, FilteredComplex) - "Examples of filtered complexes and spectral sequences" -/// - -doc /// - Key - spectralSequencePage - Headline - construct a spectral sequence page from a filtered complex - Usage - E = spectralSequencePage(K,r) - Inputs - K:FilteredComplex - A filtered complex - r:ZZ - Outputs - E:SpectralSequencePage - Description - Text - This is the primitive spectral sequence page constructor. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - E = spectralSequence K - Text - To view pages and or maps we proceed, for example, as follows - Example - E^0 - - SeeAlso - spectralSequence - (spectralSequence, FilteredComplex) - SpectralSequencePageMap - "Examples of filtered complexes and spectral sequences" -/// - - - -doc /// - Key - (truncate, ChainComplex, ZZ) - Headline - compute the hard truncation of a chain complex - Description - Text - Computes the hard truncation of a chain complex as a specified homological degree. - Example - B = QQ[a..d]; - C = koszul vars B - truncate(C,1) - truncate(C,-1) - truncate(C,-10) - truncate(C,10) -/// - -doc /// - Key - pruningMaps - Headline - compute the pruning maps on a spectral sequence page - Usage - d = pruningMaps E - Inputs - E:SpectralSequencePage - Outputs - d:PageMap - Description - Text - Returns the pruning maps which are cached in the process of pruning the spectral sequence page. - - As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - We compute an example of a pruning map below. - Example - E = prune spectralSequence K; - pruningMaps E^2 - - SeeAlso - (prune, SpectralSequence) - SpectralSequencePage - PageMap -/// - -doc /// - Key - (support,ChainComplex) - Headline - nonzero parts of a chain complex - Description - Text - Computes the homological degrees in which the chain complex admits a nonzero module - - Example - A = QQ[x,y]; - C = koszul vars A - support C - D = truncate(C,1) - spots D - support D - SeeAlso - (spots, ChainComplex) -/// - - -doc /// - Key - (pruningMaps, SpectralSequencePage) - Headline - compute the pruning maps on a spectral sequence page - Description - Text - Returns the pruning maps which are cached in the process of pruning the spectral sequence page. - - As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - We compute an example of a pruning map below. - Example - E = prune spectralSequence K; - pruningMaps E^2 - - SeeAlso - (prune, SpectralSequence) - SpectralSequencePage - PageMap -/// - -doc /// - Key - (filteredComplex, List) - Headline - obtain a filtered complex from a list of chain complex maps or a nested list of simplicial complexes - Usage - K = filteredComplex L - Inputs - L: List - ReducedHomology => Boolean - Shift => ZZ - Outputs - K: FilteredComplex - Description - Text - We can make a filtered complex from a list of chain complex maps as follows. - We first need to load the relevant packages. - Example - needsPackage "SpectralSequences" - Text - We then make a chain complex. - Example - R = QQ[x,y,z,w] - d2 = matrix(R,{{1},{0}}) - d1 = matrix(R,{{0,1}}) - C = chainComplex({d1,d2}) - Text - We now make the modules of the another chain complex which we will label D. - Example - D_2 = image matrix(R,{{1}}) - D_1 = image matrix(R,{{1,0},{0,0}}) - D_0 = image matrix(R,{{1}}) - D = chainComplex({inducedMap(D_0,D_1,C.dd_1),inducedMap(D_1,D_2,C.dd_2)}) - Text - Now make a chain complex map. - Example - d = chainComplexMap(C,D,apply(spots C, i-> inducedMap(C_i,D_i,id_C _i))) - isChainComplexMap d - d == chainComplexMap(C,D,{inducedMap(C_0,D_0,id_(C_0)),inducedMap(C_1,D_1,id_(C_1)),inducedMap(C_2,D_2,id_(C_2))}) - Text - We now make the modules of another chain complex which we will label E. - Example - E_2 = image matrix(R,{{0}}) - E_1 = image matrix(R,{{1,0},{0,0}}) - E_0 = image matrix(R,{{1}}) - E = chainComplex({inducedMap(E_0,E_1,C.dd_1),inducedMap(E_1,E_2,C.dd_2)}) - Text - Now make a chain complex map. - Example - e = chainComplexMap(C,E,apply(spots C, i->inducedMap(C_i,D_i, id_C _i))) - Text - Now make a filtered complex from a list of chain complex maps. - Example - K = filteredComplex({d,e}) - Text - We can make a filtered complex, with a specified minimum filtration degree - from a list of ChainComplexMaps by using the Shift option. - Example - L = filteredComplex({d,e},Shift => 1) - M = filteredComplex({d,e},Shift => -1) - Text - We can make a filtered complex from a nested list of simplicial - complexes as follows - Example - D = simplicialComplex {x*y*z, x*y, y*z, w*z} - E = simplicialComplex {x*y, w} - F = simplicialComplex {x,w} - K = filteredComplex{D,E,F} - Text - If we want the resulting complexes to correspond to the non-reduced homology - of the simplicial complexes we can do the following. - Example - filteredComplex({D,E,F}, ReducedHomology => false) - SeeAlso - "maps between chain complexes" -/// - -doc /// - Key - (filteredComplex, ChainComplex) - Headline - obtain a filtered complex from a chain complex - Usage - K = filteredComplex C - Inputs - C: ChainComplex --- these options don't do anything for this constructor. - ReducedHomology => Boolean - Shift => ZZ - Outputs - K: FilteredComplex - Description - Text - Produces the filtered complex obtained by successively truncating the complex. - Example - needsPackage "SpectralSequences" - A = QQ[x,y] - C = koszul vars A - K = filteredComplex C - SeeAlso - (truncate, ChainComplex,ZZ) -/// - -doc /// - Key - (filteredComplex, SpectralSequence) - Headline - obtain the filtered complex associated to the spectral sequence - Usage - K = filteredComplex E - Inputs - E: SpectralSequence --- these options don't do anything for this constructor. - ReducedHomology => Boolean - Shift => ZZ - Outputs - K: FilteredComplex - Description - Text - Produces the filtered complex which determined the spectral sequence. - Consider the spectral sequence $E$ which arises from a nested list of simplicial - complexes. - Example - A = QQ[a,b,c,d]; - D = simplicialComplex {a*d*c, a*b, a*c, b*c}; - F2D = D; - F1D = simplicialComplex {a*c, d}; - F0D = simplicialComplex {a,d}; - K = filteredComplex {F2D, F1D, F0D}; - E = spectralSequence(K) ; - Text - The underlying filtered chain complex - can be recovered from the - spectral sequence by: - Example - C = filteredComplex E - SeeAlso - --(_, FilteredComplex,InfiniteNumber) - --(^,FilteredComplex,InfiniteNumber) -/// - - -doc /// - Key - (basis, List, SpectralSequencePage) - (basis, ZZ, SpectralSequencePage) - Headline - generators of a particular degree - Usage - B = basis(L, E) - Inputs - L:List - E:SpectralSequencePage - Outputs - B:Matrix --Note!! The output should actually be a page!! - Description - Text - Returns generators for the requested (multi)degree of the spectral sequence page. It is designed to extend - the function @TO"basis"@ which can be applied to modules, for instance. - - As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - We compute the degree $0$ piece of the $E^3$ page below. - Example - E = prune spectralSequence K; - E^3 - basis(0,E^3) - SeeAlso - basis -/// - -doc /// - Key - (hilbertPolynomial, SpectralSequencePage) - Headline - the Hilbert polynomial of a spectral sequence page - Usage - H = hilbertPolynomial(E) - Inputs - E:SpectralSequencePage - Outputs - H:Page - Description - Text - Returns the Hilbert polynomials of all modules of the spectral sequence page - - As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - We compute the degree $0$ piece of the $E^3$ page below. - Example - E = prune spectralSequence K; - hilbertPolynomial(E^3) -/// - -doc /// - Key - (chainComplex, FilteredComplex) - Headline - the ambient chain complex of a filtered complex - Usage - C = chainComplex K - Inputs - K:FilteredComplex - Outputs - C:ChainComplex - Description - Text - Returns the ambient chain complex of the filtered complex. - Example - A = QQ[x,y]; - C = koszul vars A - K = filteredComplex C; - chainComplex K - K_infinity - SeeAlso - (symbol _, FilteredComplex, ZZ) - (symbol _, FilteredComplex, InfiniteNumber) - (symbol ^, FilteredComplex, ZZ) - (symbol ^, FilteredComplex, InfiniteNumber) -/// - -doc /// - Key - (minimalPresentation, SpectralSequence) - (prune, SpectralSequence) - Headline - a minimal presentation of a spectral sequence - Usage - E = minimalPresentation e - Inputs - e:SpectralSequence - Outputs - E:SpectralSequence - Description - Text - Returns the minimal presentation of a spectral sequence. - - If we fail to prune a spectral sequence then the out-put can be highly - unintelligible. - - As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - Compare some pages of the non-pruned version of the spectral sequence - with that of the pruned version. - Example - E = prune spectralSequence K; - e = spectralSequence K; - e^3 - E^3 - SeeAlso - (minimalPresentation, SpectralSequencePage) - (prune, SpectralSequencePage) - minimalPresentation - prune - pruningMaps -/// - -doc /// - Key - (minimalPresentation, SpectralSequencePage) - (prune, SpectralSequencePage) - Headline - a minimal presentation of a spectral sequence page - Usage - E = minimalPresentation e - Inputs - e:SpectralSequencePage - Outputs - E:SpectralSequencePage - Description - Text - Returns a minimal presentation of the spectral sequence page. - - If we fail to prune a spectral sequence then the out-put can be highly - unintelligible. - - As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - Compare some pruned and non-prunded pages the spectral sequence $E$ below. - Example - E = spectralSequence K; - E^3 - prune E^3 - - SeeAlso - (minimalPresentation, SpectralSequence) - (prune, SpectralSequence) - minimalPresentation - prune -/// - - -doc /// - Key - (spectralSequence, FilteredComplex) - -- spectralSequence - Headline - construct a spectral sequence from a filtered complex - Usage - E = spectralSequence K - Inputs - K:FilteredComplex - A filtered complex - Outputs - E:SpectralSequence - Description - Text - Returns the spectral sequence associated to the filtered complex. - Example - A = QQ[x,y]; - C = koszul vars A - K = filteredComplex C; - E = spectralSequence K -/// - -doc /// - Key - (Hom, FilteredComplex, ChainComplex) - (Hom, ChainComplex, FilteredComplex) - Headline - the filtered Hom complex - Usage - f = Hom(K,C) - Inputs - K:FilteredComplex - C:ChainComplex - Outputs - f:FilteredComplex - Description - Text - Returns the filtrations of the Hom complex determined by the double complex. Here is - an example which illustrates the syntax. - Example - A = QQ[x,y,z,w]; - B = res monomialCurveIdeal(A, {1,2,3}); - C = res monomialCurveIdeal(A, {1,3,4}); - F' = Hom(filteredComplex B, C) - F'' = Hom(B,filteredComplex C) - SeeAlso - "Filtrations and tensor product complexes" -/// - -doc /// - Key - (chainComplex, SpectralSequence) - Headline - the underlying chain complex of a Spectral Sequence - Usage - K = chainComplex E - Inputs - E:SpectralSequence - Outputs - K:ChainComplex - Description - Text - Returns the underlying chain complex of a spectral sequence. - Example - A = QQ[x,y]; - C = koszul vars A - K = filteredComplex C; - E = spectralSequence K - chainComplex E -/// - -doc /// - Key - (spectralSequencePage, FilteredComplex, ZZ) - -- spectralSequencePage - Headline - construct a spectral sequence page from a filtered complex - Usage - E = spectralSequencePage(K,r) - Inputs - K:FilteredComplex - A filtered complex - r:ZZ - Outputs - E:SpectralSequencePage - Description - Text - Returns the rth page of the spectral sequence determined by K. - - Consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - - Text - Let $E$ be the spectral sequence determined by $K$. - Example - E = spectralSequence K; - Text - We now compute some pages. - Example - E^0 - E^1 - E^infinity - SeeAlso - "Examples of filtered complexes and spectral sequences" -/// - - - -doc /// - Key - netPage - (netPage,Page,List,List) - Headline - display a small portion of a given Spectral Sequence page - Usage - E' = netPage(E,L1,L2) - Inputs - E: Page - L1: List - -- A list {minP,minQ}, the bottom left corner coordinates to display - L2: List - -- A list {maxP,maxQ}, the top right corner coordinates to display - Outputs - E': Net - Description - Text - Produces the portion of a given spectral sequence page that lies in the square - with given bottom right and top left coordinates. - Text - Example - R = QQ[x]; - S = R/ideal"x2"; - N = S^1/ideal"x"; - M = R^1/R_0; - C = res M; - C' = C ** S; - D = res(N,LengthLimit => 10); - E0 = C' ** (filteredComplex D); - E = prune spectralSequence E0; - Text - The E_2 page has nonzero E_2^{p,q} when 0 <= p <= 10 and 0 <= q <= 1, - so we may ask to restrict the display to 2 <= p <= 6 and 0 <= q <= 1. - - netPage(E_2,{2,0},{6,1}) - Text - If we ask for a square that is too large, only the relevant portion of the page will be displayed. - Example - R = QQ[x]; - S = R/ideal"x2"; - N = S^1/ideal"x"; - M = R^1/R_0; - C = res M; - C' = C ** S; - D = res(N,LengthLimit => 10); - E0 = C' ** (filteredComplex D); - E = prune spectralSequence E0; - netPage(E_2,{-5,0},{7,1}) -/// - - -doc /// - Key - (symbol _, SpectralSequence, ZZ) - Headline - the kth page of a spectral sequence - Usage - P = E_k - Inputs - E:SpectralSequence - k:ZZ - Outputs - P: SpectralSequencePage - Description - Text - Returns the kth page of the spectral sequence determined by K. - - Consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - - Text - Let $E$ be the spectral sequence determined by $K$. - Example - E = spectralSequence K; - Text - We now compute some pages. - Example - E_0 - E_1 - E_infinity - SeeAlso - (symbol ^,SpectralSequence,ZZ) - "Examples of filtered complexes and spectral sequences" -/// - -doc /// - Key - (symbol _, SpectralSequencePageMap, List) - Headline - The p,q th map on of a spectral sequence page - Usage - d = D _L - Inputs - D:SpectralSequencePageMap - L:List - A list L = \{p,q\} \ of integers. - Outputs - d: Matrix - Description - Text - Returns the p,q th map on a (lower index) spectral sequence page. The relationship - $D_{p,q} = D^{-p,-q}$ holds. - - Consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - We compute a map on the third page of the spectral sequence associated to $K$. - Example - E = spectralSequence K - E^3 .dd_{-1,2} - SeeAlso - (symbol ^, SpectralSequencePageMap, List) - "Examples of filtered complexes and spectral sequences" -/// - -doc /// - Key - (symbol ^, SpectralSequencePageMap, List) - Headline - the p,q th map on of a spectral sequence page - Usage - d = D ^L - Inputs - D:SpectralSequencePageMap - L:List - A list L = \{p,q\} \ of integers. - Outputs - d: Matrix - Description - Text - Returns the p,q th map on an (upper index) spectral sequence page. The relationship $D^{p,q} = D_{-p,-q}$ holds. - - Consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - Text - We compute a map on the third page of the spectral sequence associated to $K$. - Example - E = spectralSequence K - E_3 .dd^{1,-2} - SeeAlso - (symbol _, SpectralSequencePageMap, List) - "Examples of filtered complexes and spectral sequences" -/// - - -doc /// - Key - (symbol ^, SpectralSequence, ZZ) - Headline - the kth page of a spectral sequence - Usage - P = E^k - Inputs - E:SpectralSequence - k:ZZ - Outputs - P:SpectralSequencePage - Description - Text - Returns the kth page of the spectral sequence. - - Consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of - the rational quartic space curve by successive powers of the irrelevant ideal. - Example - B = QQ[a..d]; - J = ideal vars B; - C = complete res monomialCurveIdeal(B,{1,3,4}); - K = filteredComplex(J,C,4); - - Text - Let $E$ be the spectral sequence determined by $K$. - Example - E = spectralSequence K; - Text - We now compute some pages. - Example - E^0 - E^1 - E^infinity - SeeAlso - (symbol _, SpectralSequence, ZZ) - "Examples of filtered complexes and spectral sequences" -/// - -doc /// - Key - (symbol ^, SpectralSequence, InfiniteNumber) - (symbol _, SpectralSequence, InfiniteNumber) - Headline - the infinity page of a spectral sequence - Usage - P = E^k - Inputs - E:SpectralSequence - k:InfiniteNumber - Outputs - P:SpectralSequencePage - Description - Text - Returns the infinity page a spectral sequence. -/// - -doc /// - Key - (symbol ^, SpectralSequencePage, List) - Headline - the module in the i,j position on the page - Usage - M = P^L - Inputs - P:SpectralSequencePage - L:List - A list L = \{i,j\} of integers - Outputs - M:Module - Description - Text - Returns the module in the \{i,j\} \ position in the spectral sequence page. - (Using cohomological or upper indexing conventions.) The relationship $E^{-i,-j} = E_{i,j}$ holds. - Example - A = QQ[x,y] - C = koszul vars A; - K = filteredComplex C; - E = spectralSequence K - E_0 - E_0 ^{-1,0} - E^0 _{1,0} - SeeAlso - "Examples of filtered complexes and spectral sequences" -/// - -doc /// - Key - (symbol _, SpectralSequencePage, List) - - Headline - the module in the i,j position on the page - Usage - M = P_L - Inputs - P:SpectralSequencePage - L:List - A list L = \{i,j\} \ of integers - Outputs - M:Module - Description - Text - Returns the module in the \{i,j\} \ position in the spectral sequence page. - (Using homological or lower indexing conventions.) The relationship $E_{i,j} = E^{-i,-j}$ holds. - Example - A = QQ[x,y] - C = koszul vars A; - K = filteredComplex C; - E = spectralSequence K - E^0 - E^0 _{1,0} - E_0 ^{-1,0} - SeeAlso - "Examples of filtered complexes and spectral sequences" -/// - - -doc /// - Key - (symbol **, ChainComplex, FilteredComplex) - (symbol **, FilteredComplex, ChainComplex) - Headline - filtered tensor product of complexes - Usage - KK = C ** K - KK = K ** C - Inputs - C:ChainComplex - K:FilteredComplex - Outputs - KK:FilteredComplex - Description - Text - Returns the two filtrations of the tensor product complex determined by - the double complex. - The following example illustrates the syntax. - Example - A = QQ[x,y]; - B = koszul vars A; - C = koszul vars A; - F' = (filteredComplex B) ** C - F'' = B ** (filteredComplex C) - SeeAlso - "Filtrations and tensor product complexes" -/// - -doc /// - Key - (tensor, RingMap, ChainComplex) - Headline - tensor product of a chain complex by a ring map - Usage - D = tensor(f,C) - Inputs - f:RingMap - C:ChainComplex - Outputs - D:ChainComplex - Description - Text - Given a ring map R -> S and a chain complex over R, - returns the tensor product of the given chain complex. - Example - R = QQ[x]; - M = R^1/(x^2); - S = R/(x^4); - C = res M - f = map(S,R,{1}); - tensor(f,C) - SeeAlso - "Filtrations and tensor product complexes" -/// - - - -doc /// - Key - (inducedMap, FilteredComplex, ZZ) - Headline - the i th inclusion map in a filtered complex - Usage - f = inducedMap(K,i) - Inputs - K:FilteredComplex - i:ZZ - Outputs - f:ChainComplexMap - Description - Text - Returns the chain complex map specifying the inclusion of the i piece - of the filtered - complex to the ambient chain complex. - Example - A = QQ[x,y]; - C = koszul vars A; - K = filteredComplex C - inducedMap(K,1) -/// - -doc /// - Key - (symbol _, FilteredComplex, ZZ) - (symbol _, FilteredComplex, InfiniteNumber) - Headline - the filtered pieces - Usage - C = K _ j - Inputs - K:FilteredComplex - j:ZZ - an integer, infinity, or -infinity - Outputs - C:ChainComplex - Description - Text - Returns the chain complex in (homological) filtration degree j. - The relationship $K _ j = K ^{(-j)}$ holds. - Example - A = QQ[x,y]; - C = koszul vars A; - K = filteredComplex C - K_0 - K_1 - K_2 - K^(-1) - K^(-2) - K_infinity - K_(-infinity) - K^(- infinity) - K^infinity - SeeAlso - (symbol ^, FilteredComplex, ZZ) - (symbol ^, FilteredComplex, InfiniteNumber) -/// - -doc /// - Key - (symbol ^, FilteredComplex, ZZ) - (symbol ^, FilteredComplex, InfiniteNumber) - Headline - the filtered pieces - Usage - C = K ^ j - Inputs - K:FilteredComplex - j:ZZ - an integer, infinity, or -infinity - Outputs - C:ChainComplex - Description - Text - Returns the chain complex in (cohomological) filtration degree j. - The relationship $K ^ j = K _{(-j)}$ holds. - Example - A = QQ[x,y]; - C = koszul vars A; - K = filteredComplex C - K_0 - K_1 - K_2 - K^(-1) - K^(-2) - K_infinity - K_(-infinity) - K^(-infinity) - K^infinity - SeeAlso - (symbol _, FilteredComplex, ZZ) - (symbol _, FilteredComplex, InfiniteNumber) -/// - - -doc /// - Key - connectingMorphism - Headline - use spectral sequences to compute connecting morphisms - Usage - g = connectingMorphism(f, n) - Inputs - f:ChainComplexMap - n:ZZ - Outputs - g:Matrix - Description - Text - Given a morphism $f: A \rightarrow B$ of chain complexes - returns the connecting map $H_{n+1}(coker f) \rightarrow H_n (im f)$. -/// - -doc /// - Key - (connectingMorphism, ChainComplexMap,ZZ) - Headline - use spectral sequences to compute connecting morphisms - Usage - g = connectingMorphism(f, n) - Inputs - f:ChainComplexMap - n:ZZ - Outputs - g:Matrix - Description - Text - Given a morphism $f: A \rightarrow B$ of chain complexes - returns the connecting map $H_{n+1}(coker f) \rightarrow H_n (im f)$. -/// - -doc /// - Key - homologyIsomorphism - Headline - compute the homology isomorphism - Description - Text - Computes the isomorphism $ker d^r_{p,q} / image d^r_{p + r, q - r + 1} \rightarrow E^{r+1}_{p,q}$ - SeeAlso - (homologyIsomorphism, SpectralSequence, ZZ, ZZ, ZZ) -/// - - -doc /// - Key - (homologyIsomorphism, SpectralSequence, ZZ, ZZ, ZZ) - Headline - the homology isomorphism - Usage - g = homologyIsomorphism(SpectralSequence, ZZ, ZZ, ZZ) - Inputs - E:SpectralSequence - p:ZZ - q:ZZ - r:ZZ - Outputs - g:Matrix - Description - Text - Computes the isomorphism $ker d^r_{p,q} / image d^r_{p + r, q - r + 1} \rightarrow E^{r+1}_{p,q}$ - Example - A = ZZ [s,t,u,v,w] ; - K = filteredComplex(reverse {simplicialComplex {s}, simplicialComplex {s,t}, simplicialComplex {s,t,u}, simplicialComplex {s*t, u}, simplicialComplex {s*t, u, v}, simplicialComplex {s*t, u, v, w}, simplicialComplex {s*t, s*w ,u, v}, simplicialComplex {s*t, s*w ,t * w, u, v}, simplicialComplex {s*t, s*w ,t * w, u * v}, simplicialComplex {s*t, s*w ,t * w, u * v, s * v}, simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u}, simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w}, simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u}, simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w}, simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w}, simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u}, simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v}, simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v, s*t*w}}, ReducedHomology => false); - E = prune spectralSequence K - e = spectralSequence K - apply(keys support E^11, i -> homologyIsomorphism(E, i#0, i#1, 11)) - apply(keys support e^11, i -> homologyIsomorphism(e, i#0, i#1, 11)) - SeeAlso - homologyIsomorphism -/// - -doc /// - Key - "filtered complexes and spectral sequences from simplicial complexes" - Description - Text - To make a filtered complex from a list of simplicial - complexes we first need to make some simplicial complexes. - Example - R = QQ[x,y,z,w]; - a = simplicialComplex {x*y*z, x*y, y*z, w*z} - b = simplicialComplex {x*y, w} - c = simplicialComplex {x,w} - Text - Note that $b$ is a simplicial subcomplex of $a$ and that - $c$ is a simplicial subcomplex of $b$. - Let's now create a filtered complex. - Example - K = filteredComplex{a,b,c} - Text - The associated spectral sequence takes the form: - Example - E = spectralSequence K - Text - Let's view some pages and maps of these pages. - Example - E^0 - F0 = minimalPresentation(E^0) - E^0 .dd - F0.dd - E^1 - F1 = minimalPresentation(E^1) - E^1 .dd - F1.dd - E^2 - F2 = minimalPresentation(E^2) - E^2 .dd - F2.dd - E^infinity - (prune E) ^infinity - Text - If we want the resulting complexes to correspond to the non-reduced homology - of the simplicial complexes we set the ReducedHomology option - to false. - Example - J = filteredComplex({a,b,c}, ReducedHomology => false) - Text - The resulting spectral sequence looks like - Example - D = spectralSequence J - D^0 - G0 = minimalPresentation(D^0) - G0.dd - D^1 - G1 = minimalPresentation(D^1) - G1.dd - D^2 - G2 = minimalPresentation(D^2) - G2.dd - D^infinity -/// - -doc /// - Key - filteredHomologyObject - Headline - compute the filtered homology object - SeeAlso - (filteredHomologyObject, ZZ, ZZ, FilteredComplex) - (associatedGradedHomologyObject, ZZ, ZZ, FilteredComplex) -/// - -doc /// - Key - (filteredHomologyObject, ZZ, ZZ, FilteredComplex) - Headline - compute the filtered homology object - Usage - M = filteredHomologyObject(ZZ, ZZ, FilteredComplex) - Inputs - p:ZZ - n:ZZ - K:FilteredComplex - Outputs - M:Module - Description - Text - Computes the filtered homology object determined by the filtered chain complex - SeeAlso - (associatedGradedHomologyObject, ZZ, ZZ, FilteredComplex) - -/// - ---doc /// --- Key --- associatedGradedHomologyObject ---/// - -doc /// - Key - associatedGradedHomologyObject - (associatedGradedHomologyObject, ZZ, ZZ, FilteredComplex) - Headline - compute the associated graded homology object - Usage - M = associatedGradedHomologyObject(ZZ, ZZ, FilteredComplex) - Inputs - p:ZZ - n:ZZ - K:FilteredComplex - Outputs - M:Module - Description - Text - Computes the associated graded homology object determined by the filtered chain complex -/// - -doc /// - Key - "Edge homomorphisms" - Description - Text - Suppose that $E$ is a spectral sequence with the properties that: - - 1. $E^2_{p,q} = 0$ for all $p < l$ and all $q \in \mathbb{Z}$; - - 2. $E^2_{p,q} = 0 $ for all $q < m$ and all $p \in \mathbb{Z}$; - - 3. $E$ converges to the graded module $\{H_n\}$ for $n \in \mathbb{Z}$. - - Then $E$ determines a $5$-term exact sequence - $H_{l+m+2} \rightarrow E^2_{l+2,m} \rightarrow E^2_{l,m+1} \rightarrow H_{l+m+1} \rightarrow E^2_{l+1,m} \rightarrow 0$ which we refer to as the - {\it edge complex}. - - Note that the above properties are satisfied if $E$ is the spectral sequence determined by a bounded filtration of a bounded chain complex. - - The following is an easy example, of a spectral sequence which arises from a nested chain of simplicial complexes, which illustrates this concept. - - Example - A = QQ[a,b,c,d]; - D = simplicialComplex {a*d*c, a*b, a*c, b*c}; - F2D = D; - F1D = simplicialComplex {a*c, d}; - F0D = simplicialComplex {a,d}; - K = filteredComplex({F2D, F1D, F0D},ReducedHomology => false); - C = K_infinity; - prune HH C - Text - The second page of the corresponding spectral sequences take the form: - Example - E = spectralSequence(K); - e = prune E; - E^2 - e^2 - Text - The acyclic edge complex for this example has the form - $H_1(C) \rightarrow E^2_{2,-1} \rightarrow E^2_{0,0} \rightarrow H_0(C) \rightarrow E^2_{1, -1} \rightarrow 0$ - and is given by - Example - edgeComplex E - prune edgeComplex E - Text - To see that it is acyclic we can compute - Example - prune HH edgeComplex E - Caveat - The method currently does not support pruned spectral sequences. - SeeAlso - "Examples of filtered complexes and spectral sequences" - -/// - - -doc /// - Key - edgeComplex - (edgeComplex,SpectralSequence) - Headline - the edge homomorphisms - Usage - C = edgeComplex E - Inputs - E: SpectralSequence - Outputs - C: ChainComplex - Description - Text - Suppose that $E$ is a spectral sequence with the properties that: - - 1. $E^2_{p,q} = 0$ for all $p < l$ and all $q \in \mathbb{Z}$; - - 2. $E^2_{p,q} = 0 $ for all $q < m$ and all $p \in \mathbb{Z}$; - - 3. $E$ converges to the graded module $\{H_n\}$ for $n \in \mathbb{Z}$. - - Then $E$ determines a $5$-term exact sequence - $H_{l+m+2} \rightarrow E^2_{l+2,m} \rightarrow E^2_{l,m+1} \rightarrow H_{l+m+1} \rightarrow E^2_{l+1,m} \rightarrow 0$ which we refer to as the - {\it edge complex}. - - Note that the above properties are satisfied if $E$ is the spectral sequence determined by a bounded filtration of a bounded chain complex. - - The following is an easy example, of a spectral sequence which arises from a nested chain of simplicial complexes, which illustrates this concept. - - Example - A = QQ[a,b,c,d]; - D = simplicialComplex {a*d*c, a*b, a*c, b*c}; - F2D = D; - F1D = simplicialComplex {a*c, d}; - F0D = simplicialComplex {a,d}; - K = filteredComplex({F2D, F1D, F0D},ReducedHomology => false); - C = K_infinity; - prune HH C - Text - The second page of the corresponding spectral sequences take the form: - Example - E = spectralSequence(K); - e = prune E; - E^2 - e^2 - Text - The acyclic edge complex for this example has the form - $H_1(C) \rightarrow E^2_{2,-1} \rightarrow E^2_{0,0} \rightarrow H_0(C) \rightarrow E^2_{1, -1} \rightarrow 0$ - and is given by - Example - edgeComplex E - prune edgeComplex E - Text - To see that it is acyclic we can compute - Example - prune HH edgeComplex E - Caveat - The method currently does not support pruned spectral sequences. -/// - -doc /// - Key - (filteredComplex, Ideal, ChainComplex, ZZ) - Headline - I-adic filtrations of chain complexes - Usage - K = filteredComplex(I,C,n) - Inputs - I: Ideal - C: ChainComplex - n: ZZ - Outputs - K: FilteredComplex - Description - Text - By multiplying a chain complex by successive powers of an ideal we obtain a filtered complex. - Example - B = QQ[a..d] - J = ideal vars B - C = complete res monomialCurveIdeal(B,{1,3,4}) - K = filteredComplex(J,C,4) - Text - Here are higher some pages of the associated spectral sequence: - Example - e = prune spectralSequence K - e^2 --- e^3 --- e^3 .dd --- e^4 --- e^4 .dd - assert(all(keys support e^0, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,0))) - assert(all(keys support e^1, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,1))) - assert(all(keys support e^2, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,2))) - assert(all(keys support e^3, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,3))) - assert(all(keys support e^4, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,4))) -/// - - -doc /// - Key - "Example 1" - Headline - Easy example of a filtered simplicial complex - Description - Text - Here we provide an easy example of a filtered simplicial complex and - the resulting spectral sequence. This example is small enough - that all aspects of it can be explicitly computed by hand. - Example - A = QQ[a,b,c,d]; - D = simplicialComplex {a*d*c, a*b, a*c, b*c}; - F2D = D - F1D = simplicialComplex {a*c, d} - F0D = simplicialComplex {a,d} - K= filteredComplex({F2D, F1D, F0D},ReducedHomology => false) - E = prune spectralSequence(K) - E^0 - E^1 - E^2 - E^3 - E^infinity - C = K_infinity - prune HH C - E^2 .dd - Text - Considering the $E^2$ and $E^3$ pages of the spectral sequence - we conclude that the map $d^2_{2,-1}$ must have a $1$-dimensional - image and a $1$-dimensional kernel. This can be verified easily: - Example - rank ker E^2 .dd_{2,-1} - rank image E^2 .dd_{2,-1} -/// - --- We might want to not include this next example -doc /// - Key - "Example 2" - Headline - Easy example of a filtered simplicial complex - Description - Text - We provide an easy example of a filtered simplicial complex and - the resulting spectral sequence. This example is small enough that - all aspects of it can be explicitly computed by hand. - Example - A = QQ[a,b,c]; - D = simplicialComplex({a*b*c}) - F3D = D; - F2D = simplicialComplex({a*b,a*c,b*c}) - F1D = simplicialComplex({a*b,c}) - F0D = simplicialComplex({a,b}) - K = filteredComplex({F3D,F2D,F1D,F0D}, ReducedHomology => false) - E = prune spectralSequence K - E^0 - E^0 .dd - E^0 - E^1 - E^0 .dd_{1,0} - E^1 .dd - E^1 - E^0 - E^2 - prune HH K_infinity - E^infinity -/// - --- We might want to not include this next example -doc /// - Key - "Example 3" - Headline - Easy example of a filtered simplicial complex - Description - Text - We provide an easy example of a filtered simplicial complex - and the resulting spectral sequence. This example is small enough that - all aspects of it can be explicitly computed by hand. - Example - A = QQ[a,b,c] - D = simplicialComplex {a*b*c} - F2D = D - F1D = simplicialComplex {a*b,a*c,b*c} - F0D = simplicialComplex {a,b,c} - K = filteredComplex({F2D,F1D,F0D}, ReducedHomology => false) - C = K_infinity - E = prune spectralSequence K - E^0 - E^0 .dd - E^1 - E^1 .dd - E^2 - E^2 .dd - E^infinity - prune HH K_infinity -/// - - - -TEST /// -restart; -needsPackage "SpectralSequences"; -A = QQ[a,b,c]; -C = new ChainComplex; -C.ring = A; -K = filteredComplex C; -assert(K_0 == C); -assert(K_1 == C); -/// - -TEST /// -restart; -needsPackage "SpectralSequences"; -A = QQ[a,b,c]; -D = simplicialComplex {a*b*c}; -F2D = D; -F1D = simplicialComplex {a*b,a*c,b*c}; -F0D = simplicialComplex {a,b,c}; -K = filteredComplex({F2D,F1D,F0D}, ReducedHomology => false); -E = prune spectralSequence K; -e = spectralSequence K; -assert(all(keys support E^0, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,0))) -assert(all(keys support E^1, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,1))) -assert(all(keys support E^2, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,2))) -assert(all(keys support E^3, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,3))) -assert(all(keys support E^4, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,4))) -assert(all(keys support E^5, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,5))) -assert(all(keys support e^0, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,0))) -assert(all(keys support e^1, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,1))) -assert(all(keys support e^2, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,2))) -assert(all(keys support e^3, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,3))) -assert(all(keys support e^4, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,4))) -assert(all(keys support e^5, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,5))) -/// - -TEST /// -restart -needsPackage "SpectralSequences"; --- The following example is taken from p. 127, Fig 7.2 of --- Zomorodian's "Topology for computing" -A = ZZ [s,t,u,v,w] ; -d0 = simplicialComplex {s}; -d1 = simplicialComplex {s,t} ; -d2 = simplicialComplex {s,t,u} ; -d3 = simplicialComplex {s*t, u} ; -d4 = simplicialComplex {s*t, u, v} ; -d5 = simplicialComplex {s*t, u, v, w} ; -d6 = simplicialComplex {s*t, s*w ,u, v} ; -d7 = simplicialComplex {s*t, s*w ,t * w, u, v} ; -d8 = simplicialComplex {s*t, s*w ,t * w, u * v}; -d9 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v}; -d10 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u}; -d11 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w}; -d12 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u}; -d13 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w}; -d14 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w}; -d15 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u}; -d16 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v}; -d17 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v, s*t*w}; -L = reverse {d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17}; -K = filteredComplex (L, ReducedHomology => false); -E = prune spectralSequence K -e = spectralSequence K -assert(all(keys support E^0, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,0))) -assert(all(keys support E^1, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,1))) -assert(all(keys support E^2, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,2))) -assert(all(keys support E^3, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,3))) -assert(all(keys support E^4, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,4))) -assert(all(keys support E^5, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,5))) -assert(all(keys support E^6, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,6))) -assert(all(keys support E^7, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,7))) -assert(all(keys support E^8, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,8))) -assert(all(keys support E^9, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,9))) -assert(all(keys support E^10, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,10))) -assert(all(keys support E^11, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,11))) -assert(all(keys support E^12, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,12))) -assert(all(keys support e^0, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,0))) -assert(all(keys support e^1, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,1))) -assert(all(keys support e^2, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,2))) -assert(all(keys support e^3, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,3))) -assert(all(keys support e^4, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,4))) -assert(all(keys support e^5, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,5))) -assert(all(keys support e^6, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,6))) -assert(all(keys support e^7, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,7))) -assert(all(keys support e^8, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,8))) -assert(all(keys support e^9, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,9))) -assert(all(keys support e^10, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,10))) -assert(all(keys support e^11, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,11))) -assert(all(keys support e^12, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,12))) -/// - -TEST /// -restart -needsPackage "SpectralSequences"; -A = QQ[a,b,c,d]; -D = simplicialComplex {a*d*c, a*b, a*c, b*c}; -F2D = D; -F1D = simplicialComplex {a*c, d}; -F0D = simplicialComplex {a,d}; -K = filteredComplex({F2D, F1D, F0D},ReducedHomology => false); -E = spectralSequence(K); -e = prune E; -assert(all(keys support E^0, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,0))) -assert(all(keys support E^1, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,1))) -assert(all(keys support E^2, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,2))) -assert(all(keys support E^3, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,3))) -assert(all(keys support E^4, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,4))) -assert(all(keys support E^5, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,5))) -assert(all(keys support E^6, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,6))) -assert(all(keys support E^7, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,7))) -assert(all(keys support E^8, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,8))) -assert(all(keys support E^9, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,9))) -assert(all(keys support E^10, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,10))) -assert(all(keys support E^11, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,11))) -assert(all(keys support E^12, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,12))) -assert(all(keys support e^0, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,0))) -assert(all(keys support e^1, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,1))) -assert(all(keys support e^2, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,2))) -assert(all(keys support e^3, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,3))) -assert(all(keys support e^4, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,4))) -assert(all(keys support e^5, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,5))) -assert(all(keys support e^6, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,6))) -assert(all(keys support e^7, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,7))) -assert(all(keys support e^8, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,8))) -assert(all(keys support e^9, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,9))) -assert(all(keys support e^10, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,10))) -assert(all(keys support e^11, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,11))) -assert(all(keys support e^12, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,12))) -/// - -TEST /// -restart -needsPackage "SpectralSequences"; -B = QQ[a..d]; -J = ideal vars B; -C = complete res monomialCurveIdeal(B,{1,3,4}); -K = filteredComplex(J,C,4); -e = prune spectralSequence K; -assert(all(keys support e^0, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,0))) -assert(all(keys support e^1, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,1))) -assert(all(keys support e^2, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,2))) -assert(all(keys support e^3, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,3))) -assert(all(keys support e^4, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,4))) -/// - +beginDocumentation() -TEST /// -restart -needsPackage "SpectralSequences"; -S = ZZ/101[x,y]; -I = ideal(x^2,x*y,y^2); -R = S/I; -kR = coker vars R; -kS = coker vars S; -CS = res kS; -CR = res(kR,LengthLimit=>6); -CS' = CS**R; -E = prune spectralSequence (CS' ** filteredComplex CR); -assert(all(keys support E^0, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,0))) -assert(all(keys support E^1, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,1))) -assert(all(keys support E^2, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,2))) -assert(all(keys support E^3, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,3))) -assert(all(keys support E^4, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,4))) -/// -end +load "./SpectralSequences/docs.m2" +load "./SpectralSequences/examples.m2" +load "./SpectralSequences/tests.m2" --- -- scratch code -- --- +end-- + -------------------------------------------------------------------------------- restart uninstallPackage"SpectralSequences" @@ -4338,7 +810,3 @@ installPackage("SpectralSequences", RemakeAllDocumentation => true) check "SpectralSequences"; viewHelp SpectralSequences ------------------------------------------ - -Status API Training Shop Blog About -© 2016 GitHub, Inc. Terms Privacy Security Contact Help - diff --git a/M2/Macaulay2/packages/SpectralSequences/docs.m2 b/M2/Macaulay2/packages/SpectralSequences/docs.m2 new file mode 100644 index 00000000000..be828cc9110 --- /dev/null +++ b/M2/Macaulay2/packages/SpectralSequences/docs.m2 @@ -0,0 +1,1484 @@ +undocumented { + (NewMethod, Page), + (degree, Page), + (describe, Page), + (describe, PageMap), + (describe, SpectralSequence), + (expression, SpectralSequence), + (net, FilteredComplex), + (net, Page), + (net, PageMap), + (net, SpectralSequence), + (net, SpectralSequencePage), + (page, Page), + (page, SpectralSequencePage), + (ring, Page), + (spots, PageMap), + (support, FilteredComplex), + (support, PageMap), + (support, SpectralSequencePage), + (symbol _, Page, List), + (symbol _, PageMap, List), + targetPruningMap, + sourcePruningMap, + } + +doc /// +Node + Key + SpectralSequences + Headline + a package for working with filtered complexes and spectral sequences + Description + Text + Spectral sequences, although notoriously technical, are very useful in applications, + especially when they degenerate quickly. By contrast, little is known about their general structure + when they fail to degenerate quickly. Even in cases when the terms in the spectral sequences are well + understood, the maps remain mysterious. One of the motivations behind this package is to shed light on + spectral sequences through examples. Its purpose is to allow for effective calculations of particular + kinds of spectral sequences. + + As one general situation, which illustrates some capabilities of this package, let $k$ be a computable field, + $S$ a $k$-algebra of finite type, $C$ a bounded chain complex of finitely generated $S$-modules, + and $FC$ a bounded ascending filtration of $C$. This package is capable of computing, under these assumptions, + the spectral sequence determined by $FC$ along with its differentials. + + Tree + :Main types and methods introduced in this package + > "FilteredComplex" + > "SpectralSequence" + > "Page" + > "SpectralSequencePage" + > "PageMap" + > "SpectralSequencePageMap" + + Text + Here is a list of some examples which illustrate various parts of this package. + Tree + :Constructors used in this package + > "How to make filtered complexes from chain complex maps" + --> "How to work with filtered complexes" + --> "Making filtered chain complexes from chain complex maps" + > "Filtrations and tensor product complexes" + > "Filtrations and homomorphism complexes" + > "I-adic filtrations of chain complexes and their spectral sequences" + --> "Spectral sequences from filtered chain complexes" + :Examples involving simplicial complexes + -- TODO: combine these examples + > "Filtered complexes and simplicial complexes" + > "Filtered complexes and spectral sequences from simplicial complexes" + > "Example 1" + > "Example 2" + :Other examples which illustrate this package + > "Computing the Serre Spectral Sequence associated to a Hopf Fibration" + > "Balancing Tor" + > "Spectral sequences and hypercohomology calculations" + > "Spectral sequences and connecting morphisms" + > "Spectral sequences and non-Koszul syzygies" + > "A spectral sequence which fails to degenerate quickly" + > "Seeing Cancellations" + > "Edge homomorphisms" + > "Examples of change of rings Spectral Sequences" + :More easy topological examples + > "Identifying anti-podal points of the two sphere" + --> "The quotient map S^2 --> RP^2" + --> "More topological examples" + > "The fibration of the Klein Bottle over the sphere with fibers the sphere" + --> "The fibration S^1 --> Klein Bottle --> S^1" + > "The trivial fibration over the sphere with fibers the sphere" + --> "S^1 --> S^1 x S^1 --> S^1" + + -- Contributors + -- The following people have generously contributed code or worked on our code. + -- @UL { + -- HREF("",""}, + -- HREF("",""} + -- }@ +/// + +-------------------------------------------- +-- FilteredComplex +-------------------------------------------- + +doc /// +Node + Key + FilteredComplex + Headline + the type of all filtered complexes + Description + Text + An ascending filtration of a bounded (homological, lower index, or degree $-1$) chain complex + $C : \cdots \rightarrow C_i \rightarrow C_{i - 1} \rightarrow \cdots$ + is an ordered family of chain subcomplexes + $FC : \cdots \subseteq F_{n - 1} C \subseteq F_n C \subseteq \cdots $. + Such a filtration is said to be bounded if $F_s C = C$ for all sufficiently + large $s$ and $F_t C = 0$ for all sufficiently small $t$. + + Alternatively, a descending filtration of a bounded (cohomological, or upper index, or degree $1$) chain complex + $C : \cdots \rightarrow C^i \rightarrow C^{i + 1} \rightarrow \cdots $ + is an ordered family of subchain complexes + $FC : \cdots \subseteq F^{n + 1} C \subseteq F^n C \subseteq \cdots$. + Such a filtration is said to be bounded if $F^s C = 0$ for all sufficiently + large $s$ and $F^t C = C$ for all sufficiently small $t$. + + The type {\tt FilteredComplex} is a data type for working with bounded filtrations of bounded chain complexes. + Tree + :Methods involving filtered complexes + > "filteredComplex(List)" + > "filteredComplex(Complex)" + > "filteredComplex(Ideal,Complex,ZZ)" + > "FilteredComplex ^ ZZ" + > "min(FilteredComplex)" + > "max(FilteredComplex)" + > "associatedGradedHomologyObject" + > "filteredHomologyObject" + > "inducedMap(FilteredComplex,ZZ)" + > "spots(FilteredComplex)" + > "complex(FilteredComplex)" + > "Complex ** FilteredComplex" + > "Hom(FilteredComplex,Complex)" + Caveat + By assumption all filtered complexes arise from bounded filtrations of bounded chain complexes. Filtrations on degree $-1$ + chain complexes are ascending. Filtrations on degree $1$ chain complexes are + descending. + SeeAlso + "How to make filtered complexes from chain complex maps" + "Filtered complexes and simplicial complexes" + "Filtrations and tensor product complexes" + "Filtrations and homomorphism complexes" + +-- TODO: merge +Node + Key + filteredComplex + (filteredComplex, List) + [filteredComplex, ReducedHomology] + [filteredComplex, Shift] + Shift + ReducedHomology + Headline + construct a filtered complex from a filtration + Usage + K = filteredComplex L + Inputs + L: List + ReducedHomology => Boolean + Shift => ZZ + Outputs + K: FilteredComplex + Description + Text + We can make a filtered complex from a list of chain complex maps as follows. + We first need to load the relevant packages. + Example + needsPackage "SpectralSequences" + Text + We then make a chain complex. + Example + R = QQ[x,y,z,w] + d2 = matrix(R,{{1},{0}}) + d1 = matrix(R,{{0,1}}) + C = complex({d1,d2}) + Text + We now make the modules of the another chain complex which we will label D. + Example + D_2 = image matrix(R,{{1}}) + D_1 = image matrix(R,{{1,0},{0,0}}) + D_0 = image matrix(R,{{1}}) + D = complex({inducedMap(D_0,D_1,C.dd_1),inducedMap(D_1,D_2,C.dd_2)}) + Text + Now make a chain complex map. + Example + d = map(C,D,{inducedMap(C_0,D_0,id_(C_0)),inducedMap(C_1,D_1,id_(C_1)),inducedMap(C_2,D_2,id_(C_2))}) + isWellDefined d + Text + We now make the modules of another chain complex which we will label E. + Example + E_2 = image matrix(R,{{0}}) + E_1 = image matrix(R,{{1,0},{0,0}}) + E_0 = image matrix(R,{{1}}) + E = complex({inducedMap(E_0,E_1,C.dd_1),inducedMap(E_1,E_2,C.dd_2)}) + Text + Now make a chain complex map. + Example + e = map(C,E,{inducedMap(C_0,E_0,id_(C_0)),inducedMap(C_1,E_1,id_(C_1)),inducedMap(C_2,E_2,id_(C_2))}) + isWellDefined e + Text + Now make a filtered complex from a list of chain complex maps. + Example + K = filteredComplex({d,e}) + Text + We can make a filtered complex, with a specified minimum filtration degree + from a list of ComplexMaps by using the Shift option. + Example + L = filteredComplex({d,e},Shift => 1) + M = filteredComplex({d,e},Shift => -1) + Text + Alternatively, we can make a filtered complex from a nested list of simplicial complexes as follows. + Example + D = simplicialComplex {x*y*z, x*y, y*z, w*z} + E = simplicialComplex {x*y, w} + F = simplicialComplex {x,w} + K = filteredComplex{D,E,F} + Text + If we want the resulting complexes to correspond to the non-reduced homology + of the simplicial complexes we can do the following. + Example + filteredComplex({D,E,F}, ReducedHomology => false) + SeeAlso + FilteredComplex + "Complexes :: Making maps between chain complexes" + "How to make filtered complexes from chain complex maps" + "Filtrations and tensor product complexes" + "Filtrations and homomorphism complexes" + "Filtered complexes and simplicial complexes" + +Node + Key + (filteredComplex, Complex) + Headline + obtain a filtered complex from a chain complex + Usage + K = filteredComplex C + Inputs + C: Complex + Outputs + K: FilteredComplex + Description + Text + Produces the filtered complex obtained by successively truncating the complex. + Example + A = QQ[x,y] + C = koszulComplex vars A + K = filteredComplex C + SeeAlso + (naiveTruncation, Complex, ZZ, ZZ) + +Node + Key + (filteredComplex, SpectralSequence) + Headline + obtain the filtered complex associated to the spectral sequence + Usage + K = filteredComplex E + Inputs + E: SpectralSequence + Outputs + K: FilteredComplex + Description + Text + Produces the filtered complex which determined the spectral sequence. + Consider the spectral sequence $E$ which arises from a nested list of simplicial + complexes. + Example + A = QQ[a,b,c,d]; + D = simplicialComplex {a*d*c, a*b, a*c, b*c}; + F2D = D; + F1D = simplicialComplex {a*c, d}; + F0D = simplicialComplex {a,d}; + K = filteredComplex {F2D, F1D, F0D}; + E = spectralSequence(K) ; + Text + The underlying filtered chain complex + can be recovered from the + spectral sequence by: + Example + C = filteredComplex E + complex C + C_infinity + SeeAlso + (complex, FilteredComplex) + (symbol ^, FilteredComplex, InfiniteNumber) + +Node + Key + (filteredComplex, Ideal, Complex, ZZ) + Headline + I-adic filtrations of chain complexes + Usage + K = filteredComplex(I,C,n) + Inputs + I: Ideal + C: Complex + n: ZZ + Outputs + K: FilteredComplex + Description + Text + By multiplying a chain complex by successive powers of an ideal we obtain a filtered complex. + Example + S = QQ[a..d] + J = ideal vars S + C = res monomialCurveIdeal(S,{1,3,4}) + K = filteredComplex(J,C,2) + Text + Here are higher some pages of the associated spectral sequence: + Example + E = prune spectralSequence K + E^2 + E^3 + assert all(keys support E^0, j -> isIsomorphism homologyIsomorphism(E, j#0, j#1, 0)) + assert all(keys support E^1, j -> isIsomorphism homologyIsomorphism(E, j#0, j#1, 1)) + assert all(keys support E^2, j -> isIsomorphism homologyIsomorphism(E, j#0, j#1, 2)) + assert all(keys support E^3, j -> isIsomorphism homologyIsomorphism(E, j#0, j#1, 3)) + assert all(keys support E^4, j -> isIsomorphism homologyIsomorphism(E, j#0, j#1, 4)) + +Node + Key + (symbol ^, FilteredComplex, ZZ) + (symbol ^, FilteredComplex, InfiniteNumber) + (symbol _, FilteredComplex, ZZ) + (symbol _, FilteredComplex, InfiniteNumber) + Headline + retrieve the filtered pieces of a filtered complex + Usage + C = K ^ j + C = K _ j + Inputs + K:FilteredComplex + j:ZZ + an integer, infinity, or -infinity + Outputs + C:Complex + Description + Text + The notation @TT "K_j"@ returns the chain complex in homological filtration degree j. + Example + A = QQ[x,y]; + C = koszulComplex vars A; + K = filteredComplex C + K_0 + K_1 + K_2 + K_infinity + K_(-infinity) + Text + The notation @TT "K^j"@ teturns the chain complex in cohomological filtration degree j. + Example + K^0 + K^(-1) + K^(-2) + K^(-infinity) + K^infinity + Text + The relationship $K ^ j = K _{(-j)}$ holds. + Example + K_1 === K^(-1) + K_2 === K^(-2) + K_infinity === K^(-infinity) + K^infinity === K_(-infinity) + +Node + Key + (symbol **, Complex, FilteredComplex) + (symbol **, FilteredComplex, Complex) + Headline + filtered tensor product of complexes + Usage + KK = C ** K + KK = K ** C + Inputs + C:Complex + K:FilteredComplex + Outputs + KK:FilteredComplex + Description + Text + Returns the two filtrations of the tensor product complex determined by + the double complex. + The following example illustrates the syntax. + Example + A = QQ[x,y]; + B = koszulComplex vars A; + C = koszulComplex vars A; + F' = (filteredComplex B) ** C + F'' = B ** (filteredComplex C) + SeeAlso + "Filtrations and tensor product complexes" + +Node + Key + (inducedMap, FilteredComplex, ZZ) + Headline + the i th inclusion map in a filtered complex + Usage + f = inducedMap(K,i) + Inputs + K:FilteredComplex + i:ZZ + Outputs + f:ComplexMap + Description + Text + Returns the chain complex map specifying the inclusion of the i piece + of the filtered + complex to the ambient chain complex. + Example + A = QQ[x,y]; + C = koszulComplex vars A; + K = filteredComplex C + inducedMap(K,1) + +Node + Key + (complex, FilteredComplex) + Headline + the ambient chain complex of a filtered complex + Usage + C = complex K + Inputs + K:FilteredComplex + Outputs + C:Complex + Description + Text + Returns the ambient chain complex of the filtered complex. + Example + A = QQ[x,y]; + C = koszulComplex vars A + K = filteredComplex C; + complex K + K_infinity + SeeAlso + (symbol _, FilteredComplex, InfiniteNumber) + +Node + Key + (Hom, FilteredComplex, Complex) + (Hom, Complex, FilteredComplex) + Headline + the filtered Hom complex + Usage + f = Hom(K,C) + Inputs + K:FilteredComplex + C:Complex + Outputs + f:FilteredComplex + Description + Text + Returns the filtrations of the Hom complex determined by the double complex. Here is + an example which illustrates the syntax. + Example + A = QQ[x,y,z,w]; + B = res monomialCurveIdeal(A, {1,2,3}); + C = res monomialCurveIdeal(A, {1,3,4}); + F' = Hom(filteredComplex B, C) + F'' = Hom(B,filteredComplex C) + SeeAlso + "Filtrations and tensor product complexes" + +Node + Key + filteredHomologyObject + (filteredHomologyObject, ZZ, ZZ, FilteredComplex) + Headline + compute the filtered homology object + Usage + M = filteredHomologyObject(ZZ, ZZ, FilteredComplex) + Inputs + p:ZZ + n:ZZ + K:FilteredComplex + Outputs + M:Module + Description + Text + Computes the filtered homology object determined by the filtered chain complex + SeeAlso + (associatedGradedHomologyObject, ZZ, ZZ, FilteredComplex) + +Node + Key + associatedGradedHomologyObject + (associatedGradedHomologyObject, ZZ, ZZ, FilteredComplex) + Headline + compute the associated graded homology object + Usage + M = associatedGradedHomologyObject(ZZ, ZZ, FilteredComplex) + Inputs + p:ZZ + n:ZZ + K:FilteredComplex + Outputs + M:Module + Description + Text + Computes the associated graded homology object determined by the filtered chain complex + +Node + Key + (spots, FilteredComplex) + Headline + which spots does the given filtered complex has a module. + Usage + s = spots L + Inputs + L:FilteredComplex + Outputs + s:List + Description + Text + Returns a list of all the spots where the given filtered complex has a module. + +Node + Key + (max, FilteredComplex) + Headline + maximum spot where the given filtered complex has a module. + Usage + m = max L + Inputs + L:FilteredComplex + Outputs + m:ZZ + Description + Text + Returns the maximum spot where the given filtered complex has a module. + +Node + Key + (min, FilteredComplex) + Headline + minimum spot where the given filtered complex has a module. + Usage + m = min L + Inputs + L:FilteredComplex + Outputs + m:ZZ + Description + Text + Returns the minimum spot where the given filtered complex has a module. +/// + +-------------------------------------------- +-- SpectralSequence +-------------------------------------------- + +doc /// +Node + Key + SpectralSequence + Headline + the type of all spectral sequences + Description + Text + A (homological, or lower index) spectral sequence consists of: + + @OL{ + "A sequence of modules $\\{E^r_{p,q}\\}$ for $p,q \\in \\ZZ$ and $r \\geq 0$;", + "A collection of homomorphisms $\\{d^r_{p,q}: E^r_{p,q} \\rightarrow E^r_{p-r,q+r-1} \\}$, for $p,q \\in \\ZZ$ and $ r \\geq 0$, such that $d^r_{p,q} d^r_{p+r,q-r+1} = 0$;", + "A collection of isomorphisms $E^{r+1}_{p,q} \\rightarrow \\ker d^r_{p,q} / \\operatorname{image} d^r_{p+r,q-r+1}$." + }@ + + Alternatively a (cohomological, or upper index) spectral sequence consists of: + + @OL{ + "A sequence of modules $\\{E_r^{p,q}\\}$ for $p,q \\in \\ZZ$, and $r \\geq 0$;", + "A collection of homomorphisms $\\{d_r^{p,q}: E_r^{p,q} \\rightarrow E_{r}^{p+r,q-r+1}\\}$ for $p,q \\in \\ZZ, r \\geq 0$ such that $d_r^{p,q} d_r^{p-r,q+r-1} = 0$;", + "A collection of isomorphisms $E_{r+1}^{p,q} \\rightarrow \\ker d_r^{p,q} / \\operatorname{image} d_r^{p-r,q+r-1}$." + }@ + + The type {\tt SpectralSequence} is a data type for working with spectral sequences. + In this package, a spectral sequence is represented by a sequence of spectral sequence pages. + Tree + :Methods involving spectral sequences + > "spectralSequence(FilteredComplex)" + > "SpectralSequence ^ ZZ" + > "minimalPresentation(SpectralSequence)" + > "homologyIsomorphism(SpectralSequence,ZZ,ZZ,ZZ)" + > "filteredComplex(SpectralSequence)" + > "complex(SpectralSequence)" + Caveat + All spectral sequences arise from bounded filtrations of bounded chain complexes. Ascending filtrations of degree $-1$ chain complexes + determine spectral sequences of the first type. Descending filtrations of degree $1$ chain complex determine spectral sequences of the second type. + SeeAlso + SpectralSequencePage + SpectralSequencePageMap + "Filtered complexes and simplicial complexes" + "Filtrations and tensor product complexes" + "Filtrations and homomorphism complexes" +/// + +doc /// + Key + spectralSequence + (spectralSequence, FilteredComplex) + [spectralSequence, Prune] + Headline + construct a spectral sequence from a filtered complex + Usage + E = spectralSequence K + Inputs + K:FilteredComplex + Outputs + E:SpectralSequence + Description + Text + This method constructs the spectral sequence associated to a filtered complex. + + In the example below we construct a spectral sequence $E$ from the filtered complex $K$. + Example + B = QQ[a..d]; + J = ideal vars B; + C = res monomialCurveIdeal(B,{1,3,4}); + K = filteredComplex(J,C,2); + E = spectralSequence K + Text + To view pages or maps we proceed as follows. + Example + E^2 + support E^2 .dd + E^2 .dd _{0,1} + E^infinity + SeeAlso + SpectralSequence + SpectralSequencePage + (symbol ^, SpectralSequence, ZZ) + (spectralSequence, FilteredComplex) +/// + +doc /// + Key + (symbol ^, SpectralSequence, ZZ) + (symbol ^, SpectralSequence, InfiniteNumber) + (symbol _, SpectralSequence, ZZ) + (symbol _, SpectralSequence, InfiniteNumber) + Headline + retrieve the k-th page of a spectral sequence + Usage + P = E^k + P = E_k + Inputs + E:SpectralSequence + k:ZZ + Outputs + P: SpectralSequencePage + Description + Text + Returns the k-th page of the spectral sequence. + Example + S = QQ[a..d]; + C = koszulComplex vars S + K = filteredComplex C + Text + Let $E$ be the spectral sequence determined by $K$. + Example + E = spectralSequence K; + Text + We now compute some pages. + Example + E_0 + E_1 + E_infinity + E^0 + E^1 + E^infinity +/// + +doc /// + Key + edgeComplex + (edgeComplex, SpectralSequence) + "Edge homomorphisms" + Headline + the edge homomorphisms + Usage + C = edgeComplex E + Inputs + E: SpectralSequence + Outputs + C: Complex + Description + Text + Suppose that $E$ is a spectral sequence with the properties that: + + @OL{ + "$E^2_{p,q} = 0$ for all $p < l$ and all $q \\in \\ZZ$;", + "$E^2_{p,q} = 0 $ for all $q < m$ and all $p \\in \\ZZ$;", + "$E$ converges to the graded module $\\{H_n\\}$ for $n \\in \\ZZ$." + }@ + + Then $E$ determines a $5$-term exact sequence + $$H_{l+m+2} \rightarrow E^2_{l+2,m} \rightarrow E^2_{l,m+1} \rightarrow H_{l+m+1} \rightarrow E^2_{l+1,m} \rightarrow 0$$ + which we refer to as the {\it edge complex}. + + Note that the above properties are satisfied if $E$ is the spectral sequence determined by a bounded filtration of a bounded chain complex. + + The following is an easy example, of a spectral sequence which arises from a nested chain of simplicial complexes, which illustrates this concept. + Example + A = QQ[a,b,c,d]; + D = simplicialComplex {a*d*c, a*b, a*c, b*c}; + F2D = D; + F1D = simplicialComplex {a*c, d}; + F0D = simplicialComplex {a,d}; + K = filteredComplex({F2D, F1D, F0D},ReducedHomology => false); + C = K_infinity; + prune HH C + Text + The second page of the corresponding spectral sequences take the form: + Example + E = spectralSequence(K); + e = prune E; + E^2 + e^2 + Text + The acyclic edge complex for this example has the form + $H_1(C) \rightarrow E^2_{2,-1} \rightarrow E^2_{0,0} \rightarrow H_0(C) \rightarrow E^2_{1, -1} \rightarrow 0$ + and is given by + Example + edgeComplex E + prune edgeComplex E + Text + To see that it is acyclic we can compute + Example + prune HH edgeComplex E + Caveat + The method currently does not support pruned spectral sequences. +/// + +doc /// + Key + (minimalPresentation, SpectralSequence) + (prune, SpectralSequence) + Headline + compute the minimal presentation of a spectral sequence + Usage + E = minimalPresentation e + Inputs + e:SpectralSequence + Outputs + E:SpectralSequence + Description + Text + Returns the minimal presentation of a spectral sequence. + + If we fail to prune a spectral sequence then the out-put can be highly unintelligible. + + As a specific example consider the filtered complex $K$ below, + obtained by multiplying the minimal free resolution of the rational + quartic space curve by successive powers of the irrelevant ideal. + Example + S = QQ[a..d]; + J = ideal vars S; + C = res monomialCurveIdeal(S, {1,3,4}); + K = filteredComplex(J,C,2); + Text + Compare some pages of the non-pruned version of the spectral sequence with that of the pruned version. + Example + E = spectralSequence K; + E' = prune E; + E^3 + E'^3 + SeeAlso + (minimalPresentation, SpectralSequencePage) + (prune, SpectralSequencePage) + minimalPresentation + prune + pruningMaps +/// + +doc /// + Key + (complex, SpectralSequence) + Headline + the underlying chain complex of a Spectral Sequence + Usage + K = complex E + Inputs + E:SpectralSequence + Outputs + K:Complex + Description + Text + Returns the underlying chain complex of a spectral sequence. + Example + A = QQ[x,y]; + C = koszulComplex vars A + K = filteredComplex C; + E = spectralSequence K + complex E +/// + +-------------------------------------------- +-- Page and SpectralSequencePage +-------------------------------------------- + +doc /// + Key + Page + Headline + the type of all pages + Description + Text + A page is a collection of modules which are indexed by lists of integers. + This is a parent class for the type @TO"SpectralSequencePage"@. + The infinity page of a spectral sequence is an example of a page which is not a spectral sequence page. + Tree + :Methods involving pages + --> "new Page" + > "page" + > "netPage" + > "support(Page)" + Text + As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of + the rational quartic space curve by successive powers of the irrelevant ideal. + Example + S = QQ[a..d]; + J = ideal vars S; + C = res monomialCurveIdeal(S,{1,3,4}); + K = filteredComplex(J,C,2); + Text + The infinity page of the resulting spectral sequence is computed below. + Example + E = prune spectralSequence K; + E^infinity + SeeAlso + SpectralSequencePage + (symbol ^, SpectralSequence, InfiniteNumber) + (symbol _, SpectralSequence, InfiniteNumber) + PageMap +/// + +doc /// + Key + page + (page, List, List, Page) + [page, Prune] + Description + Text + Adds keys to a page. + SeeAlso + Page +/// + +doc /// + Key + spots + (spots, Page) + Headline + which spots does the given page has a module. + Usage + s = spots P + Inputs + P:Page + Outputs + s:List + Description + Text + Returns a list of all the spots where the given page has a module. +/// + +doc /// + Key + (support, Page) + Headline + which non-zero modules appear in the given page. + Usage + l = support P + Inputs + P:Page + Outputs + l:List + Description + Text + Returns a list of all the non-zero modules appearing in the given page has a module. +/// + +doc /// + Key + SpectralSequencePage + Headline + the type of all spectral sequence pages + Description + Text + A (homological, or lower index) spectral sequence page consists of: + + @OL{ + "A fixed integer $r \\geq 0$, the page number;", + "A sequence of modules $\\{E^r_{p,q}\\}$ for $p,q \\in \\ZZ$;", + "A collection of homomorphisms $\\{d^r_{p,q}: E^r_{p,q} \\rightarrow E^r_{p-r,q+r-1}\\}$ for $p,q \\in \\ZZ, r \\geq 0$ such that $d^r_{p,q} d^r_{p+r,q-r+1} = 0$;", + "A collection of isomorphisms $E^{r+1}_{p,q} \\rightarrow \\ker d^r_{p,q} / \\operatorname{image} d^r_{p+r,q-r+1}$." + }@ + + Alternatively a (cohomological, or upper index) spectral sequence page consists of: + + @OL{ + "A fixed integer $r \\geq 0$, the page number;", + "A sequence of modules $\\{E_r^{p,q}\\}$ for $p,q \\in \\ZZ$;", + "A collection of homomorphisms $\\{d_r^{p,q}: E_r^{p,q} \\rightarrow E_r^{p+r,q-r+1}\\}$ for $p,q \\in \\ZZ, r \\geq 0$ such that $d_r^{p,q} d_r^{p-r,q+r-1} = 0$;", + "A collection of isomorphisms $E_{r+1}^{p,q} \\rightarrow \\ker d_r^{p,q} / \\operatorname{image} d_r^{p-r,q+r-1}$." + }@ + + The type {\tt SpectralSequencePage} is a data type for working with spectral sequence pages. + Tree + :Methods involving spectral sequence pages + > "spectralSequencePage" + > "spectralSequencePage(FilteredComplex,ZZ)" + > "minimalPresentation(SpectralSequencePage)" + > "pruningMaps(SpectralSequencePage)" + > "basis(List,SpectralSequencePage)" + > "hilbertPolynomial(Page)" + > "SpectralSequencePage ^ List" + Caveat + The isomorphisms above are not explicitly part of the data type, + but they can be obtained by using the command @TO"homologyIsomorphism"@. + SeeAlso + SpectralSequence + SpectralSequencePageMap +/// + +doc /// + Key + (spectralSequencePage, FilteredComplex, ZZ) + Headline + construct a spectral sequence page from a filtered complex + Usage + E = spectralSequencePage(K,r) + Inputs + K:FilteredComplex + r:ZZ + Outputs + E:SpectralSequencePage + Description + Text + Returns the rth page of the spectral sequence determined by K. + + Consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of + the rational quartic space curve by successive powers of the irrelevant ideal. + Example + S = QQ[a..d]; + J = ideal vars S; + C = res monomialCurveIdeal(S, {1,3,4}); + K = filteredComplex(J,C,2); + Text + Let $E$ be the spectral sequence determined by $K$. + Example + E = spectralSequence K; + Text + We now compute some pages. + Example + E^0 + E^2 + E^infinity +/// + +doc /// + Key + spectralSequencePage + [spectralSequencePage, Prune] + Headline + construct a spectral sequence page from a filtered complex + Usage + E = spectralSequencePage(K,r) + Inputs + K:FilteredComplex + r:ZZ + Outputs + E:SpectralSequencePage + Description + Text + This is the primitive spectral sequence page constructor. + Example + S = QQ[a..d]; + J = ideal vars S; + C = res monomialCurveIdeal(S,{1,3,4}); + K = filteredComplex(J,C,2); + E = spectralSequence K + Text + To view pages or maps we proceed as follows. + Example + E^2 + support E^2 .dd + E^2 .dd _{0,1} + E^infinity + SeeAlso + spectralSequence + (spectralSequence, FilteredComplex) + SpectralSequencePageMap +/// + +doc /// + Key + (symbol ^, SpectralSequencePage, List) + (symbol _, SpectralSequencePage, List) + Headline + retrieve the module in the {i,j} position on the page + Usage + M = P^{i,j} + M = P_{i,j} + Inputs + P:SpectralSequencePage + "{i,j}": -- a pair of integers + Outputs + M:Module + Description + Text + The notation @TT "P^{i,j}"@ returns the module in the cohomological \{i,j\} position in the spectral sequence page. + Example + A = QQ[x,y] + C = koszulComplex vars A; + K = filteredComplex C; + E = spectralSequence K + E_0 + E_0 ^{-1,0} + Text + The notation @TT "P_{i,j}"@ returns the module in the homological \{i,j\} \ position in the spectral sequence page. + Example + E^0 + E_0 _{1,0} + Text + The relationship $E^{-i,-j} = E_{i,j}$ holds. + Example + E_0 ^{-1,0} === E_0 _{1,0} +/// + +doc /// + Key + pruningMaps + (pruningMaps, SpectralSequencePage) + Headline + compute the pruning maps on a spectral sequence page + Usage + d = pruningMaps E + Inputs + E:SpectralSequencePage + Outputs + d:PageMap + Description + Text + Returns the pruning maps which are cached in the process of pruning the spectral sequence page. + Example + S = QQ[a..d]; + C = koszulComplex vars S + K = filteredComplex C + E = prune spectralSequence K + pruningMaps E^2 + SeeAlso + (prune, SpectralSequence) + SpectralSequencePage + PageMap +/// + +doc /// + Key + (basis, List, SpectralSequencePage) + (basis, ZZ, SpectralSequencePage) + Headline + generators of a particular degree + Usage + B = basis(L, E) + Inputs + L:List + E:SpectralSequencePage + Outputs + B:Page + Description + Text + Returns generators for the requested (multi)degree of the spectral sequence page. + It is designed to extend the function @TO"basis"@ which can be applied to modules, for instance. + + As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of + the rational quartic space curve by successive powers of the irrelevant ideal. + Example + S = QQ[a..d]; + J = ideal vars S; + C = res monomialCurveIdeal(S, {1,3,4}); + K = filteredComplex(J,C,2); + Text + We compute the degree $0$ piece of the $E^3$ page below. + Example + E = prune spectralSequence K; + E^3 + basis(0, E^3) + SeeAlso + basis +/// + +doc /// + Key + (hilbertPolynomial, Page) + Headline + the Hilbert polynomial of a page + Usage + H = hilbertPolynomial(E) + Inputs + E:Page + Outputs + H:Page + Description + Text + Returns the Hilbert polynomials of all modules in a page. + + As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of + the rational quartic space curve by successive powers of the irrelevant ideal. + Example + S = QQ[a..d]; + J = ideal vars S; + C = res monomialCurveIdeal(S, {1,3,4}); + K = filteredComplex(J,C,2); + Text + We compute the degree $0$ piece of the $E^3$ page below. + Example + E = prune spectralSequence K; + hilbertPolynomial(E^0) + hilbertPolynomial(E^1) + hilbertPolynomial(E^infinity) +/// + +doc /// + Key + (minimalPresentation, SpectralSequencePage) + (prune, SpectralSequencePage) + Headline + a minimal presentation of a spectral sequence page + Usage + E = minimalPresentation e + Inputs + e:SpectralSequencePage + Outputs + E:SpectralSequencePage + Description + Text + Returns a minimal presentation of the spectral sequence page. + + If we fail to prune a spectral sequence then the out-put can be highly + unintelligible. + + As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of + the rational quartic space curve by successive powers of the irrelevant ideal. + Example + S = QQ[a..d]; + J = ideal vars S; + C = res monomialCurveIdeal(S, {1,3,4}); + K = filteredComplex(J,C,2); + Text + Compare some pruned and non-prunded pages the spectral sequence $E$ below. + Example + E = spectralSequence K; + E^3 + prune E^3 + SeeAlso + (minimalPresentation, SpectralSequence) + (prune, SpectralSequence) + minimalPresentation + prune +/// + +doc /// + Key + netPage + (netPage,Page, List, List) + Headline + display a small portion of a given Spectral Sequence page + Usage + E' = netPage(E,L1,L2) + Inputs + E: Page + L1: List + -- A list {minP,minQ}, the bottom left corner coordinates to display + L2: List + -- A list {maxP,maxQ}, the top right corner coordinates to display + Outputs + E': Net + Description + Text + Produces the portion of a given spectral sequence page that lies in the square + with given bottom right and top left coordinates. + Example + R = QQ[x]; + S = R/ideal"x2"; + N = S^1/ideal"x"; + M = R^1/R_0; + C = res M; + C' = C ** S; + D = res(N,LengthLimit => 10); + E0 = C' ** (filteredComplex D); + E = prune spectralSequence E0; + Text + The E_2 page has nonzero E_2^{p,q} when 0 <= p <= 10 and 0 <= q <= 1, + so we may ask to restrict the display to 2 <= p <= 6 and 0 <= q <= 1. + Example + netPage(E_2,{2,0},{6,1}) + Text + If we ask for a square that is too large, only the relevant portion of the page will be displayed. + Example + R = QQ[x]; + S = R/ideal"x2"; + N = S^1/ideal"x"; + M = R^1/R_0; + C = res M; + C' = C ** S; + D = res(N,LengthLimit => 10); + E0 = C' ** (filteredComplex D); + E = prune spectralSequence E0; + netPage(E_2,{-5,0},{7,1}) +/// + +-------------------------------------------- +-- PageMap and SpectralSequencePageMap +-------------------------------------------- + +doc /// + Key + PageMap + Headline + the type of all page maps + Description + Text + A page map is a collection of homomorphisms which are indexed by lists of integers. + This is a parent class for the type @TO"SpectralSequencePageMap"@. + The output of the method {\tt pruningMaps(SpectralSequencePage)} is an example of a {\tt Page} which is not a {\tt SpectralSequencePage}. + Text + As a specific example consider the filtered complex $K$ below, obtained by multiplying the minimal free resolution of + the rational quartic space curve by successive powers of the irrelevant ideal. + Example + S = QQ[a..d]; + J = ideal vars S; + C = res monomialCurveIdeal(S, {1,3,4}); + K = filteredComplex(J,C,2); + Text + We compute an example of a pruning map below. + Example + E = prune spectralSequence K; + D = E^2 .dd + support D + D_{0,1} + SeeAlso + Page + SpectralSequencePageMap + (pruningMaps, SpectralSequencePage) +/// + +doc /// + Key + SpectralSequencePageMap + Headline + the type of all spectral sequence page maps + Description + Text + A (homological, or lower index) spectral sequence page map consists of: + + @OL{ + "A fixed integer $r \\geq 0 $, the page number;", + "A collection of homomorphisms $\\{d^r_{p,q}: E^r_{p,q} \\rightarrow E^r_{p-r,q+r-1}\\}$ for $p,q \\in \\ZZ, r \\geq 0$ such that $d^r_{p,q} d^r_{p+r,q-r+1} = 0$." + }@ + + Alternatively a (cohomological, or upper index) spectral sequence page consists of: + + @OL{ + "A fixed integer $r \\geq 0$, the page number;", + "A collection of homomorphisms $\\{d_r^{p,q}: E_r^{p,q} \\rightarrow E_r^{p+r,q-r+1}\\}$ for $p,q \\in \\ZZ, r \\geq 0$ such that $d_r^{p,q} d_r^{p-r,q+r-1} = 0$." + }@ + + The type {\tt SpectralSequencePageMap} is a data type for working with the differentials on the pages of a spectral sequence. + Tree + :Methods involving spectral sequence page maps + > "spectralSequencePageMap(FilteredComplex,ZZ)" + > "SpectralSequencePageMap ^ List" + SeeAlso + SpectralSequence + SpectralSequencePage +/// + +doc /// + Key + spectralSequencePageMap + (spectralSequencePageMap, FilteredComplex, ZZ) + [spectralSequencePageMap, Prune] + Headline + compute the maps on a spectral sequence page + Usage + d = spectralSequencePageMap(FilteredComplex, ZZ) + Inputs + K:FilteredComplex + n:ZZ + Outputs + D:SpectralSequencePageMap + Description + Text + Returns the differentials of a spectral sequence page. +/// + +doc /// + Key + (symbol ^, SpectralSequencePageMap, List) + (symbol _, SpectralSequencePageMap, List) + Headline + retrieve the map from the {p,q} term of a spectral sequence page + Usage + d = D ^ {p,q} + d = D _ {p,q} + Inputs + D:SpectralSequencePageMap + "{p,q}": -- a pair of integers + Outputs + d: Matrix + Description + Text + The notation @TT "P.dd_{p,q}"@ returns the map with source the homological {p,q} term on a spectral sequence page. + Example + S = QQ[a..d]; + J = ideal vars S; + C = res monomialCurveIdeal(S, {1,2,3}); + K = filteredComplex(J,C,2); + Text + We compute a map on the third page of the spectral sequence associated to $K$. + Example + E = prune spectralSequence K + P = E^2 + P.dd_{0,1} + Text + The notation @TT "P.dd^{p,q}"@ returns the map with source the cohomological {p,q} term on a spectral sequence page. + Example + P.dd^{0,-1} + Text + The relationship $P.dd_{p,q} = P.dd^{-p,-q}$ holds. + Example + P.dd_{0,1} === P.dd^{0,-1} +/// + +-------------------------------------------- +-- Other methods +-------------------------------------------- + +doc /// + Key + connectingMorphism + (connectingMorphism, ComplexMap, ZZ) + Headline + use spectral sequences to compute connecting morphisms + Usage + g = connectingMorphism(f, n) + Inputs + f:ComplexMap + n:ZZ + Outputs + g:Matrix + Description + Text + Given a morphism $f: A \rightarrow B$ of chain complexes + returns the connecting map $H_{n+1}(\coker f) \rightarrow H_n (\im f)$. +/// + +doc /// + Key + homologyIsomorphism + (homologyIsomorphism, SpectralSequence, ZZ, ZZ, ZZ) + Headline + compute the homology isomorphism + Usage + g = homologyIsomorphism(SpectralSequence, ZZ, ZZ, ZZ) + Inputs + E:SpectralSequence + p:ZZ + q:ZZ + r:ZZ + Outputs + g:Matrix + Description + Text + Computes the isomorphism \$ker d^r_{p,q} / \im d^r_{p + r, q - r + 1} \rightarrow E^{r+1}_{p,q}$ + Example + A = ZZ [s,t,u,v,w] ; + K = filteredComplex(reverse { + simplicialComplex {s}, + simplicialComplex {s,t}, + simplicialComplex {s,t,u}, + simplicialComplex {s*t, u}, + simplicialComplex {s*t, u, v}, + simplicialComplex {s*t, u, v, w}, + simplicialComplex {s*t, s*w ,u, v}, + simplicialComplex {s*t, s*w ,t * w, u, v}, + simplicialComplex {s*t, s*w ,t * w, u * v}, + simplicialComplex {s*t, s*w ,t * w, u * v, s * v}, + simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u}, + simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w}, + simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u}, + simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w}, + simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w}, + simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u}, + simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v}, + simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v, s*t*w}}, ReducedHomology => false); + E = prune spectralSequence K + e = spectralSequence K + apply(keys support E^11, i -> homologyIsomorphism(E, i#0, i#1, 11)) + apply(keys support e^11, i -> homologyIsomorphism(e, i#0, i#1, 11)) + SeeAlso + homologyIsomorphism +/// + +--- TODO: Move to Complexes +doc /// + Key + (naiveTruncation, Complex, ZZ) + Headline + compute the hard truncation of a chain complex + Usage + naiveTruncation(C, n) + Inputs + C:Complex + n:ZZ + Outputs + :Complex + Description + Text + This method returns the naive truncation of $C$ by truncating + the low homological degrees if $n$ is positive (i.e. from left) + and high homological degrees if $n$ is negative (i.e. from right). + Example + B = QQ[a..d]; + C = (koszulComplex vars B)[2] + naiveTruncation(C, 10) + naiveTruncation(C, 2) + naiveTruncation(C, 1) + naiveTruncation(C, 0) + naiveTruncation(C,-1) + naiveTruncation(C,-2) + naiveTruncation(C,-10) + SeeAlso + (naiveTruncation, Complex, ZZ, ZZ) +/// + +--- TODO: Move to Complexes? +doc /// + Key + (spots, Complex) + Headline + which spots does the given chain complex has a module. + Usage + s = spots L + Inputs + L:Complex + Outputs + s:List + Description + Text + Returns a list of all the spots where the given chain complex has a module. + SeeAlso + (concentration, Complex) + (support, Complex) +/// + +--- TODO: Move to Complexes +doc /// + Key + (support, Complex) + Headline + nonzero parts of a chain complex + Description + Text + Computes the homological degrees in which the chain complex admits a nonzero module + Example + A = QQ[x,y]; + C = koszulComplex vars A + support C + D = naiveTruncation(C, 1) + spots D + support D + SeeAlso + (concentration, Complex) + (spots, Complex) +/// diff --git a/M2/Macaulay2/packages/SpectralSequences/examples.m2 b/M2/Macaulay2/packages/SpectralSequences/examples.m2 new file mode 100644 index 00000000000..57cba2e50e2 --- /dev/null +++ b/M2/Macaulay2/packages/SpectralSequences/examples.m2 @@ -0,0 +1,1007 @@ +doc /// + Key + "I-adic filtrations of chain complexes and their spectral sequences" + Description + Text + By multiplying a chain complex by successive powers of an ideal we obtain a filtered complex. + Example + B = QQ[a..d] + J = ideal vars B + C = res monomialCurveIdeal(B,{1,3,4}) + K = filteredComplex(J,C,2) + Text + Here are some higher pages of the associated spectral sequence: + Example + E = prune spectralSequence K + E^2 + E^2 .dd + E^infinity +/// + +doc /// + Key + "Filtered complexes and simplicial complexes" + Description + Text + We can make a filtered complex from a nested list of simplicial + complexes: + Example + A = QQ[x,y,z,w]; + F2D = simplicialComplex {x*y*z, w*z}; + F1D = simplicialComplex {x*y, w}; + F0D = simplicialComplex {x,w}; + K = filteredComplex{F2D, F1D, F0D} + Text + The resulting spectral sequence takes the form: + Example + E = prune spectralSequence K; + E^0 + E^0 .dd + E^1 + E^1 .dd + E^2 + E^2 .dd + E^infinity + Text + If we want the homology of the complex to be the non-reduced homology + of the simplicial complex we set the ReducedHomology option to false: + Example + k = filteredComplex({F2D, F1D, F0D}, ReducedHomology => false) + Text + The resulting spectral sequence takes the form: + Example + e = prune spectralSequence k; + e^0 + e^0 .dd + e^1 .dd + e^2 + e^2 .dd + e^infinity + SeeAlso + "How to make filtered complexes from chain complex maps" + "Filtrations and tensor product complexes" + "Filtrations and homomorphism complexes" +/// + +doc /// + Key + "Filtered complexes and spectral sequences from simplicial complexes" + Description + Text + To make a filtered complex from a list of simplicial + complexes we first need to make some simplicial complexes. + Example + R = QQ[x,y,z,w]; + a = simplicialComplex {x*y*z, x*y, y*z, w*z} + b = simplicialComplex {x*y, w} + c = simplicialComplex {x,w} + Text + Note that $b$ is a simplicial subcomplex of $a$ and that + $c$ is a simplicial subcomplex of $b$. + Let's now create a filtered complex. + Example + K = filteredComplex{a,b,c} + Text + The associated spectral sequence takes the form: + Example + E = spectralSequence K + Text + Let's view some pages and maps of these pages. + Example + E^0 + F0 = minimalPresentation(E^0) + E^0 .dd + F0.dd + E^1 + F1 = minimalPresentation(E^1) + E^1 .dd + F1.dd + E^2 + F2 = minimalPresentation(E^2) + E^2 .dd + F2.dd + E^infinity + (prune E) ^infinity + Text + If we want the resulting complexes to correspond to the non-reduced homology + of the simplicial complexes we set the ReducedHomology option + to false. + Example + J = filteredComplex({a,b,c}, ReducedHomology => false) + Text + The resulting spectral sequence looks like + Example + D = spectralSequence J + D^0 + G0 = minimalPresentation(D^0) + G0.dd + D^1 + G1 = minimalPresentation(D^1) + G1.dd + D^2 + G2 = minimalPresentation(D^2) + G2.dd + D^infinity +/// + +doc /// + Key + "Filtrations and homomorphism complexes" + Description + Text + Let $S$ be a commutative ring and let + $B : \cdots \rightarrow B_{i} \rightarrow B_{i - 1} \rightarrow \cdots $ and + $C : \cdots \rightarrow C_{i} \rightarrow C_{i - 1} \rightarrow \cdots $ be chain complexes. + + For all integers $p$ and $q$ let $K_{p,q} := Hom_S(B_{-p}, C_q)$, + let $d'_{p,q} : K_{p,q} \rightarrow K_{p - 1, q}$ denote the homorphism + $ \phi \mapsto \partial^B_{-p + 1} \phi$, and let + $d^{''}_{p,q} : K_{p,q} \rightarrow K_{p, q - 1} $ denote the homorphism + $\phi \mapsto (-1)^p \partial^C_q \phi$. + + The chain complex $Hom(B, C)$ is given by + $ Hom(B, C)_k := \prod_{p + q = k} Hom_S(B_{-p}, C_q) $ + and the differentials + by $ \partial := d^{'} + d^{''} $; + it carries two natural ascending filtrations $F' ( Hom(B, C) )$ and $F''( Hom(B, C))$. + + The first is obtained by + letting $F'_n (Hom(B, C))$ be the chain complex determined by setting + $F'_n (Hom(B, C))_k := \prod_{p + q = k , p \leq n} Hom_S(B_{-p}, C_q)$ + and the differentials $\partial := d' + d''$. + + The second is obtained by letting $F''_n (Hom(B, C)) := \prod_{p + q = k , q \leq n} Hom_S(B_{-p}, C_q)$ + and the differentials $\partial := d' + d''$. + + In {\it Macaulay2}, using this package, $F'$ and $F''$ as defined above are + computed as illustrated in the following example, by using + Hom(filteredComplex B, C) or Hom(B,filteredComplex C). + + Example + A = QQ[x,y,z,w]; + B = res monomialCurveIdeal(A, {1,2,3}); + C = res monomialCurveIdeal(A, {1,3,4}); + F' = Hom(filteredComplex B, C) + F'' = Hom(B,filteredComplex C) + Text + Notice that the display above shows that these are different filtered complexes. + The resulting spectral sequences take the form: + Example + E' = prune spectralSequence F'; + E'' = prune spectralSequence F'' ; + E' ^0 + E' ^ 0 .dd + E'' ^0 + E'' ^1 +/// + +doc /// + Key + "Filtrations and tensor product complexes" + Description + Text + Let $S$ be a commutative ring and let + $B : \cdots \rightarrow B_{i} \rightarrow B_{i - 1} \rightarrow \cdots $ and + $C : \cdots \rightarrow C_{i} \rightarrow C_{i - 1} \rightarrow \cdots $ be chain complexes. + + For all integers $p$ and $q$ let $K_{p,q} := B_p \otimes_S C_q$, let $d'_{p,q} : K_{p,q} \rightarrow K_{p - 1, q}$ + denote the homorphism + $\partial^B_{p} \otimes 1$, and let $d''_{p,q} : K_{p,q} \rightarrow K_{p, q - 1} $ denote the + homorphism $(-1)^p \otimes \partial_q^C $. + + The chain complex $B \otimes_S C$ is given by + $ (B \otimes_S C)_k := \oplus_{p + q = k} B_p \otimes_S C_q$ + and the differentials by $\partial := d' + d''$. It carries two natural ascending filtrations + $F'B \otimes_S C$ and $F'' B \otimes_S C$. + + The first is obtained by letting + $F'_n (B \otimes_S C)$ be the chain complex determined by setting + $F'_n (B \otimes_S C)_k := \oplus_{p + q = k , p \leq n} B_{p} \otimes_S C_q$ + and the differentials $\partial := d' + d''$. + + The second is obtained by letting + $F''_n (B \otimes_S C)$ be the chain complex determined by setting + $F''_n (B \otimes_S C)_k := \oplus_{p + q = k , q \leq n} B_{p} \otimes_S C_q$ + and the differentials $\partial := d' + d''$. + + In Macaulay2 we can compute these filtered complexes as follows. + --To obtain the chain complex $F' B \otimes_S C$ we use the syntax + --$(filteredComplex B)\otimes C$. + --To obtain the chain complex $ F'' B \otimes_S C$ we use the syntax + --$ B\otimes(filteredComplex C)$. + Example + A = QQ[x,y,z,w]; + B = res monomialCurveIdeal(A,{1,2,3}); + C = res monomialCurveIdeal(A,{1,3,4}); + F' = (filteredComplex B) ** C + F'' = B ** (filteredComplex C) + Text + The pages of the resulting spectral sequences take the form: + Example + E' = prune spectralSequence F'; + E'' = prune spectralSequence F''; + E' ^0 + E' ^ 1 + E'' ^0 + E'' ^1 + SeeAlso + "Balancing Tor" +/// + +doc /// + Key + "How to make filtered complexes from chain complex maps" + -- Headline + -- the most primitive way to make filtered complexes + Description + Text + We describe the most primitive way to create filtered complexes. + + Let $C$ be a chain complex and consider a list of + chain complex maps $\{\phi_n, \phi_{n - 1}, \dots, \phi_0 \}$ + with properties that $C$ is the target of $\phi_i$, for $0 \leq i \leq n$, and the + image of $\phi_{i-1}$ is a subchain complex of the image of $\phi_i$, for $1 \leq i \leq n$. + Given this input data we produce an ascending filtered chain complex $FC$ + with the properties that $F_k C = C$ for $k \geq n + 1$ and $F_k C = image \phi_k$, for $k = 0, \dots, n$. + + We now illustrate how this is done in two easy examples. + We first make three chain complexes $C$, $D$, and $E$, + two chain complex maps, $d : D \rightarrow C$ + and $e : E \rightarrow C$, and then + compute the resulting filtration of $C$. +-- When then consider a boundary case by considering the filtered complex obtained +-- from a single chain complex map, that is the identity of $C$. + Text + Let's make our chain complexes $C$, $D$, and $E$. + Example + R = QQ[x,y,z,w] ; + c2 = matrix(R,{{1},{0}}) ; + c1 = matrix(R,{{0,1}}) ; + C = complex({c1,c2}) + D_2 = image matrix(R,{{1}}); + D_1 = image matrix(R,{{1,0},{0,0}}); + D_0 = image matrix(R,{{1}}); + D = complex({inducedMap(D_0,D_1,C.dd_1),inducedMap(D_1,D_2,C.dd_2)}) + E_2 = image matrix(R,{{0}}); + E_1 = image matrix(R,{{1,0},{0,0}}); + E_0 = image matrix(R,{{1}}); + E = complex({inducedMap(E_0,E_1,C.dd_1),inducedMap(E_1,E_2,C.dd_2)}) + Text + We now make our chain complex maps. + Example + d = map(C,D,apply(spots C, i-> inducedMap(C_i,D_i,id_C _i))) + e = map(C,E,apply(spots C, i->inducedMap(C_i,E_i, id_C _i))) + Text + We can check that these are indeed chain complex maps: + Example + isWellDefined d + isWellDefined e + Text + Now, given the list of chain complex maps $\{d, e\}$, we obtain + a filtration of $C$ by: + Example + K = filteredComplex({d,e}) + Text + If we want to specify a minimum filtration degree we can use the Shift option. + Example + L = filteredComplex({d,e},Shift =>1) + M = filteredComplex({d,e},Shift =>-1) +-- Text +-- We now explain a boundary case in which the list consists of a single map $\{\phi_0\}$. +-- Example +-- P = filteredComplex {id_C} +-- P_1 +/// + +--- +-- Examples +--- + +doc /// + Key + "A spectral sequence which fails to degenerate quickly" + -- Headline + -- nonzero maps on higher page numbers + Description + Text + The following example is taken from p. 127, Fig 7.2 of + Zomorodian's {\it Topology for computing}. In that figure, a filtration of a suitable + simplicial complex is pictured. Here we compute the associated spectral sequence. + As we will see below, the spectral sequences has nonzero maps on higher page numbers. + Example + A = ZZ [s,t,u,v,w] ; + D0 = simplicialComplex {s} ; + D1 = simplicialComplex {s,t} ; + D2 = simplicialComplex {s,t,u} ; + D3 = simplicialComplex {s*t, u} ; + D4 = simplicialComplex {s*t, u, v} ; + D5 = simplicialComplex {s*t, u, v, w} ; + D6 = simplicialComplex {s*t, s*w ,u, v} ; + D7 = simplicialComplex {s*t, s*w ,t * w, u, v} ; + D8 = simplicialComplex {s*t, s*w ,t * w, u * v} ; + D9 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v} ; + D10 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u} ; + D11 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w} ; + D12 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u} ; + D13 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w} ; + D14 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w} ; + D15 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u} ; + D16 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v} ; + D17 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v, s*t*w} ; + L = reverse {D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16, D17} ; + K = filteredComplex (L, ReducedHomology => false) ; + E = prune spectralSequence K ; + E^0 + E^1 .dd + E^8 + E^8 .dd + E^9 + E^9 .dd + E^infinity + prune HH K_infinity +/// + +doc /// + Key + "Seeing Cancellations" + -- Headline + -- nonzero maps on higher page numbers + Description + Text + Here we give an example of a spectral sequence that takes n+2 steps to degenerate, where + n is the embedding dimension of the ring. We present this when n = 2 but the user with + computational power can easily do a bigger case. + Example + S = ZZ/101[x,y]; + I = ideal(x^2,x*y,y^2); + R = S/I; + kR = coker vars R; + kS = coker vars S; + CS = res kS; + CR = res(kR,LengthLimit=>6); + CS' = CS**R; + E = prune spectralSequence (CS' ** filteredComplex CR); + Text + Since this spectral sequence only consists of $k$ vector spaces, and all are generated + in a single degree, for ease of presentation we may as well just look at the rank and degree + which we can easily encode in a matrix with $rt^d$ encoding the rank $r$ and degree $d$ of each + vector space $E_{i,j}$. + Example + use ZZ[t] + easyPresentation = (P,n,m) -> ( + transpose matrix apply(n, + i -> apply(m, + j -> (length (P_{i,j}))*t^( + if (L = unique flatten degrees P_{i,j})!= {} then first L else 0) + ) + )); + Text + To see what we're going for, we compute the E_{infinity} page and also some earlier pages. + Notice that it's clear that all terms except those in the top row of the matrix must eventually + disappear, but for this to happen, there must a map of the right degree mapping to them. + Example + easyPresentation(E_infinity,6,3) + easyPresentation(E_1,6,3) + easyPresentation(E_2,6,3) + easyPresentation(E_3,6,3) + length image ((E_2).dd_{3,0}) + length image (E_3).dd_{3,0} + Text + The final two computations are meant to explain that the copy of $k^8$ in degree 3 that + appears on the $E_1$ cancels in two steps via an $E_2$ map with $k^6$ and via an $E_3$ map with a $k^2$. +/// + +doc /// + Key + "Identifying anti-podal points of the two sphere" + Description + Text + In this example we compute the spectral sequence arising from + the quotient map + $\mathbb{S}^2 \rightarrow \mathbb{R} \mathbb{P}^2$, + given by identifying anti-podal points. + This map can be realized by a simplicial map along the lines of Exercise 27, Section 6.5 of Armstrong's + book {\it Basic Topology}. + In order to give a combinatorial picture of the quotient map + $\mathbb{S}^2 \rightarrow \mathbb{R} \mathbb{P}^2$, + given by identifying anti-podal points, we + first make an appropriate simplicial realization of $\mathbb{S}^2$. + Note that we have added a few barycentric coordinates. + Example + S = ZZ[v1,v2,v3,v4,v5,v6,v15,v12,v36,v34,v46,v25]; + twoSphere = simplicialComplex {v3*v4*v5, v5*v4*v15, v15*v34*v4, v15*v34*v1, v34*v1*v6, v34*v46*v6, v36*v46*v6, v3*v4*v46, v4*v46*v34, v3*v46*v36, v1*v6*v2, v6*v2*v36, v2*v36*v12,v36*v12*v3, v12*v3*v5, v12*v5*v25, v25*v5*v15, v2*v12*v25, v1*v2*v25, v1*v25*v15}; + Text + We can check that the homology of the simplicial complex twoSphere agrees with that of $\mathbb{S}^2$. + Example + C = naiveTruncation(complex twoSphere, 1) + prune HH C + Text + We now write down our simplicial complex whose topological realization + is $\mathbb{R} \mathbb{P}^2$. + Example + R = ZZ[a,b,c,d,e,f]; + realProjectivePlane = simplicialComplex {a*b*c, b*c*d, c*d*e, a*e*d, e*b*a, e*f*b, d*f*b, a*f*d, c*f*e,a*f*c}; + Text + Again we can check that we've entered a simplicial complex + whose homology agrees with that of the real projective plane. + Example + B = naiveTruncation(complex realProjectivePlane, 1) + prune HH B + Text + We now compute the fibers of the anti-podal quotient map + $\mathbb{S}^2 \rightarrow \mathbb{R} \mathbb{P}^2$. + The way this works for example is: + $a = v3 ~ v1, b = v6 ~ v5, d = v36 ~ v15, c = v4 ~ v2, + e = v34 ~ v12, f = v46 ~ v25$ + + The fibers over the vertices of $\mathbb{R} \mathbb{P}^2$ are: + Example + F0twoSphere = simplicialComplex {v1,v3,v5,v6, v4,v2, v36,v15, v34,v12, v46,v25} + Text + The fibers over the edges of $\mathbb{R}\mathbb{P}^2$ are: + Example + F1twoSphere = simplicialComplex {v3*v4, v1*v2,v3*v5, v1*v6,v4*v5, v2*v6, v5*v15, v6*v36, v4*v34, v2*v12, v15*v34, v36*v12, v1*v15, v3*v36, v46*v34, v25*v12, v6*v34, v5*v12, v6*v46, v5*v25, v36*v46, v15*v25, v3*v46, v1*v25, v4*v15, v2*v36, v1*v34, v3*v12, v4*v46, v25*v2} + Text + The fibers over the faces is all of $\mathbb{S}^2$. + Example + F2twoSphere = twoSphere + Text + The resulting filtered complex is: + Example + K = filteredComplex({F2twoSphere, F1twoSphere, F0twoSphere}, ReducedHomology => false) + Text + We now compute the resulting spectral sequence. + Example + E = prune spectralSequence K + E^0 + E^1 + E^0 .dd + E^1 .dd + E^2 + E^2 .dd +/// + +doc/// + Key + "The fibration of the Klein Bottle over the sphere with fibers the sphere" + Description + Text + In this example we give a simplicial realization of the fibration + $\mathbb{S}^1 \rightarrow {\rm Klein Bottle} \rightarrow \mathbb{S}^1$. + To give a simplicial realization of this fibration we first make a simplicial + complex which gives a triangulation of the Klein Bottle. + The triangulation of the Klein Bottle that we use has 18 facets and is, up to relabling, the triangulation of the Klein bottle given + in Figure 6.14 of Armstrong's book {\it Basic Topology}. + Example + S = ZZ[a00,a10,a20,a01,a11,a21,a02,a12,a22]; + -- there will be 18 facets of Klein Bottle + Delta = simplicialComplex {a00*a10*a02, a02*a12*a10, a01*a02*a12, a01*a12*a11, a00*a01*a11, a00*a11*a10, a10*a12*a20, a12*a20*a22, a11*a12*a22, a11*a22*a21, a10*a11*a21, a10*a21*a20, a20*a22*a00, a22*a00*a01, a21*a22*a01, a21*a02*a01, a20*a21*a02, a20*a02*a00} + Text + We can check that the homology of this simplicial complex agrees with that + of the Klein Bottle: + Example + C = naiveTruncation(complex Delta, 1) + prune HH C + Text + Let $S$ be the simplicial complex with facets $\{A_0 A_1, A_0 A_2, A_1 A_2\}$. Then $S$ is a triangulation of $S^1$. The simplicial map + $\pi : \Delta \rightarrow S$ given by $\pi(a_{i,j}) = A_i$ is a combinatorial realization of the fibration + $S^1 \rightarrow {\rm Klein Bottle} \rightarrow S^1$. + The subsimplicial complexes of $\Delta$, which arise from the + the inverse images of the simplicies of $S$, are described below. + Example + F1Delta = Delta + F0Delta = simplicialComplex {a00*a01,a01*a02,a00*a02,a10*a11,a10*a12,a11*a12,a21*a20,a20*a22,a21*a22} + Text + The resulting filtered chain complex is: + Example + K = filteredComplex({F1Delta, F0Delta}, ReducedHomology => false) + Text + The resulting spectral sequence is: + Example + E = prune spectralSequence K + E^0 + E^0 .dd + E^1 + E^1 .dd + E^2 + Text + Note that the spectral sequence is abutting to what it should --- the integral + homology of the Klein bottle +/// + +doc /// + Key + "The trivial fibration over the sphere with fibers the sphere"--"The trivial fibration over the sphere with fiber the sphere" + Description + Text + In this example we compute the spectral sequence associated to the + trivial fibration $\mathbb{S}^1 \rightarrow \mathbb{S}^1 x \mathbb{S}^1 \rightarrow \mathbb{S}^1$, + where the map is given by one of the projections. To give a simplicial realization of this fibration we first make a simplicial complex + which gives a triangulation of $\mathbb{S}^1 \times \mathbb{S}^1$. The simplicial complex that we construct + is the triangulation of the torus given in Figure 6.4 of Armstrong's book + {\it Basic Topology} and has 18 facets. + Example + S = ZZ/101[a00,a10,a20,a01,a11,a21,a02,a12,a22]; + --S = ZZ[a00,a10,a20,a01,a11,a21,a02,a12,a22]; for some reason get an error + -- if use ZZ coefs... + -- there will be 18 facets of SS^1 x SS^1 + Delta = simplicialComplex {a00*a02*a10, a02*a12*a10, a01*a02*a12, a01*a11*a12, a00*a01*a11, a00*a10*a11, a12*a10*a20, a12*a20*a22, a11*a12*a22, a11*a22*a21, a10*a11*a21, a10*a21*a20, a20*a22*a00, a22*a00*a02, a21*a22*a02, a21*a02*a01, a20*a21*a01, a20*a01*a00} + Text + We can check that the homology of the simplicial complex + $\Delta$ agrees with that of the torus + $\mathbb{S}^1 \times \mathbb{S}^1 $ + Example + C = naiveTruncation(complex Delta, 1) + prune HH C + Text + Let $S$ be the simplicial complex with facets $\{A_0 A_1, A_0 A_2, A_1 A_2\}$. Then $S$ is a triangulation of $S^1$. The simplicial map + $\pi : \Delta \rightarrow S$ given by $\pi(a_{i,j}) = A_i$ is a combinatorial realization of the trivial fibration + $\mathbb{S}^1 \rightarrow \mathbb{S}^1 \times \mathbb{S}^1 \rightarrow \mathbb{S}^1$. + We now make subsimplicial complexes arising from the filtrations of the + inverse images of the simplicies. + Example + F1Delta = Delta; + F0Delta = simplicialComplex {a00*a01, a01*a02, a00*a02, a10*a11,a11*a12,a10*a12, a21*a20,a21*a22,a20*a22}; + K = filteredComplex({F1Delta, F0Delta}, ReducedHomology => false) ; + Text + The resulting spectral sequence is: + Example + E = prune spectralSequence K + E^0 + E^0 .dd + E^1 + E^1 .dd + E^2 +/// + +doc /// + Key + "Spectral sequences and non-Koszul syzygies" + Description + Text + We illustrate some aspects of the paper + "A case study in bigraded commutative algebra" by Cox-Dickenstein-Schenck. + In that paper, an appropriate term on the E_2 page of a suitable + spectral sequence corresponds to non-koszul syzygies. + + Using our indexing conventions, the E^2_{3,-1} term will be what the + $E^{0,1}_2$ term is in their paper. + + We illustrate an instance of the non-generic case for non-Koszul syzygies. + To do this we look at the three polynomials used in their Example 4.3. + The behaviour that we expect to exhibit is predicted by their Proposition 5.2. + Example + R = QQ[x,y,z,w, Degrees => {{1,0},{1,0},{0,1},{0,1}}]; + B = ideal(x*z, x*w, y*z, y*w); + p_0 = x^2*z; + p_1 = y^2*w; + p_2 = y^2*z+x^2*w; + I = ideal(p_0,p_1,p_2); + -- make the frobenious power of the irrelevant ideal + B = B_*/(x -> x^2)//ideal; + -- need to take a large enough power. + -- it turns out that 2 is large enough for this example + G = res image gens B; + F = koszulComplex gens I; + K = Hom(G, filteredComplex(F)); + E = prune spectralSequence K; + E^1 + E^2 + Text + The degree zero piece of the module $E^2_{3,-1}$ twisted by $R((2,3))$ below + shows that there is a $1$-dimensional space of non-Koszul syzygies + of bi-degree $(2,3)$. This is what is predicted by the paper. + Example + E^2_{3,-1} + basis({0,0}, E^2_{3, -1} ** R^{{2, 3}}) + E^2 .dd_{3, -1} +-- E^2 .dd + basis({0,0}, image E^2 .dd_{3,-1} ** R^{{2,3}}) + basis({0,0}, E^2_{1,0} ** R^{{2,3}}) + -- this shows that there is a 1 dimensional space of non-Koszul syzygies of bi-degree (2,3) + -- which is also what is predicted by the paper. + Text + The degree zero piece of the module $E^2_{3,-1}$ twisted by $R((6,1))$ below + shows that there is a $1$-dimensional space of non-Koszul syzygies of bi-degree + $(6,1)$. This is also what is predicted by the paper. + Example + basis({0,0}, E^2 _{3, -1} ** R^{{6,1}}) + -- this shows that there is a 1 dimensional space of non-Koszul syzygies of bi-degree (6,1) + -- this is what is predicted by the paper. + isIsomorphism(E^2 .dd_{3, -1}) +/// + +doc /// + Key + "Spectral sequences and connecting morphisms" + Description + Text + If $0 \rightarrow A \rightarrow B \rightarrow C \rightarrow 0$ is a + short exact sequence of chain complexes then the connecting morphism + $H_i(C) \rightarrow H_{i - 1}(A)$ can realized as a suitable map + on the $E^1$ of a spectral sequence determined by a suitably defined + two step filtration of $B$. + + Here we illustrate this realization in a concrete situation: we + compute the connecting morphism $H^i(X, F) \rightarrow H^{i + 1}(X, G)$ + arising from a short exact sequence + $0 \rightarrow G \rightarrow H \rightarrow F \rightarrow 0$ of sheaves + on a smooth toric variety $X$. + + More specifically we let $X = \mathbb{P}^1 \times \mathbb{P}^1$ and use multigraded commutative algebra + together with spectral sequences to compute the connecting + morphism $H^1(C, OO_C(1,0)) \rightarrow H^2(X, OO_X(-2,-3))$ where + $C$ is a general divisor of type $(3,3)$ on $X$. This connecting morphism is an + isomorphism. + Example + R = ZZ/101[a_0..b_1, Degrees=>{2:{1,0},2:{0,1}}]; -- PP^1 x PP^1 + M = intersect(ideal(a_0,a_1),ideal(b_0,b_1)) ; -- irrelevant ideal + M = M_*/(x -> x^5)//ideal ; -- Suitably high Frobenius power of M + G = res image gens M ; + b = complex R^{{1,0}} -- make line bundle a chain complex + a = complex R^{{-2,-3}} + -- make the map OO(-2, -3) --> OO(1,0) + f = randomComplexMap(b, a, Degree => 0) + K = filteredComplex ({Hom(G,f)}) ; -- the two step filtered complex we want + E = prune spectralSequence K ; + Text + The degree zero piece of the map $E^1 .dd_{1, -2}$ below is the desired connecting + morphism $H^1(C, OO_C(1,0)) \rightarrow H^2(X, OO_X(-2,-3))$. + Example + E^1 .dd_{1,-2} -- the connecting map HH^1(C, OO_C(1,0)) --> HH^2(X, OO_X(-2,-3)) + basis({0,0}, image E^1 .dd_{1,-2}) -- image 2-dimensional + basis({0,0}, ker E^1 .dd_{1,-2}) -- map is injective + basis({0,0}, target E^1 .dd_{1,-2}) -- target 2-dimensional + basis({0,0}, source E^1 .dd_{1,-2}) -- source 2 dimensional + Text + An alternative way to compute the connecting morphism is + Example + prune connectingMorphism(Hom(G, f), - 2) ; + prune connectingMorphism(Hom(G, f), - 2) == E^1 .dd_{1, -2} +/// + +doc /// + Key + "Spectral sequences and hypercohomology calculations" + -- Headline + -- using spectral sequences to compute hypercohomology + Description + Text + If $\mathcal{F}$ is a coherent sheaf on a smooth toric variety $X$ + then multigraded commutative algebra can be used to compute + the cohomology groups $H^i(X, \mathcal{F})$. + + Indeed if $B$ is the irrelevant ideal of $X$ then the cohomology group + $H^i(X, \mathcal{F})$ can be realized as the degree zero piece of the multigraded + module + $Ext^i(B^{[l]}, F)$ for sufficiently large $l$; here $B^{[l]}$ denotes + the $l$th Frobenius power of $B$ and $F$ is any multigraded module whose + corresponding sheaf on $X$ is $\mathcal{F}$. + + Given the fan of + $X$ and $F$ a sufficiently large power of $l$ can be determined effectively. + We refer to sections 2 and 3 of the paper + "Cohomology on Toric Varieties and Local Cohomology with Monomial Supports" + for more details. + + In this example, we consider + the case that $X = \mathbb{P}^1 \times \mathbb{P}^1$ and + $F = \mathcal{O}_C(1,0)$ where + $C$ is a general divisor of type $(3,3)$ on $X$. + In this setting, $H^0(C,F)$ and $H^1(C, F)$ are both $2$-dimensional + vector spaces. + + We first make the multi-graded coordinate ring of + $\mathbb{P}^1 \times \mathbb{P}^1$, the + irrelevant ideal, and a sufficentily high Frobenus power of the + irrelevant ideal needed for our calculations. Also the complex $G$ + below is a resolution of the irrelevant ideal. + Example + -- C \subseteq PP^1 x PP^1 type (3,3) + -- Use hypercohomology to compute HH OO_C(1,0) + R = ZZ/101[a_0..b_1, Degrees=>{2:{1,0},2:{0,1}}]; -- PP^1 x PP^1 + B = intersect(ideal(a_0,a_1),ideal(b_0,b_1)) ; -- irrelevant ideal + B = B_*/(x -> x^5)//ideal ; -- Sufficentily high Frobenius power + G = res image gens B ; + Text + We next make the ideal, denoted by $I$ below, of a general divisor of type $(3,3)$ + on $\mathbb{P}^1 \times \mathbb{P}^1$. Also the chain complex + $F$ below is a resolution of this ideal. + Example + I = ideal random(R^1, R^{{-3,-3}}) ; -- ideal of C + F = res comodule I + Text + To use hypercohomology to compute the cohomology groups of the + line bundle $\mathcal{O}_C(1,0)$ on $C$ we twist the + complex $F$ above by a line of ruling and then + make a filtered complex whose associated spectral + sequence abuts to the desired cohomology groups. + Example + K = Hom(G , filteredComplex (F ** R^{{1,0}})) ; -- Twist F by a line of ruling and make filtered complex whose ss abuts to HH OO_C(1,0) + E = prune spectralSequence K ; --the spectral sequence degenerates on the second page + E^1 + E^2 ; -- output is a mess + Text + The cohomology groups we want are obtained as follows. + Example + basis({0,0}, E^2_{0,0}) -- == HH^0 OO_C(1,0) + basis({0,0}, E^2_{1,-2}) -- == HH^1 OO_C(1,0) + SeeAlso + "Spectral sequences and connecting morphisms" + "Spectral sequences and non-Koszul syzygies" +/// + +doc /// + Key + "Computing the Serre Spectral Sequence associated to a Hopf Fibration" + Description + Text + We compute the Serre Spectral Sequence associated to the Hopf Fibration + $S^1 \rightarrow S^3 \rightarrow S^2$. + This example is made possible by the minimal triangulation of this fibration given in the paper + "A minimal triangulation of the Hopf map and its application" + by K.V. Madahar and K.S Sarkaria. Geom Dedicata, 2000. + Text + We first make the relevant simplicial complexes described on page 110 of the paper. + The simplicial complex $S3$ below is a triangulation of $S^3$. + Example + B = QQ[a_0..a_2,b_0..b_2,c_0..c_2,d_0..d_2]; + l1 = {a_0*b_0*b_1*c_1,a_0*b_0*c_0*c_1,a_0*a_1*b_1*c_1,b_0*b_1*c_1*d_1,b_0*c_0*c_1*d_2,a_0*a_1*c_1*d_2,a_0*c_0*c_1*d_2,b_0*c_1*d_1*d_2}; + l2 = {b_1*c_1*c_2*a_2,b_1*c_1*a_1*a_2,b_1*b_2*c_2*a_2,c_1*c_2*a_2*d_1,c_1*a_1*a_2*d_2,b_1*b_2*a_2*d_2,b_1*a_1*a_2*d_2,c_1*a_2*d_1*d_2}; + l3 = {c_2*a_2*a_0*b_0,c_2*a_2*b_2*b_0,c_2*c_0*a_0*b_0,a_2*a_0*b_0*d_1,a_2*b_2*b_0*d_2,c_2*c_0*b_0*d_2,c_2*b_2*b_0*d_2,a_2*b_0*d_1*d_2}; + l4 = {a_0*b_0*b_1*d_1,a_0*b_1*d_0*d_1,b_1*c_1*c_2*d_1,b_1*c_2*d_0*d_1,a_0*a_2*c_2*d_1,a_0*c_2*d_0*d_1}; + l5 = {a_0*b_1*d_0*d_2,a_0*a_1*b_1*d_2,b_1*c_2*d_0*d_2,b_1*b_2*c_2*d_2,a_0*c_2*d_0*d_2,a_0*c_0*c_2*d_2}; + S3 = simplicialComplex(join(l1,l2,l3,l4,l5)); + Text + We identify the two sphere $S^2$ with the simplicial complex $S2$ defined by the facets $\{abc, abd, bcd, acd \}$. + The Hopf fibration $S^1 \rightarrow S^3 \rightarrow S^2$ is then realized by the simplicial map + $p: S3 \rightarrow S2$ defined by $a_i \mapsto a$, $b_i \mapsto b$, $c_i \mapsto c$, and $d_i \mapsto d$. + + We now explain how to construct the filtration of $S3$ obtained by + considering the $k$-skeletons of this fibration. + + The simplicial complex $F1S3$ below is the subsimplicial complex of $S3$ obtained by considering the + inverse images of the $1$-dimensional faces of the simplicial complex $S2$ + We first describe the simplicial complex $F1S3$ in pieces. + + For example, to compute $f1l1$ below, we observe that the inverse image of $ab$ under $p$ is + $a_0b_0b_1, a_0a_1b_1$ etc. All of these inverse images have been computed by hand previously. + Example + f1l1 = {a_0*b_0*b_1,a_0*a_1*b_1,a_0*c_0*c_1,a_0*a_1*c_1,a_0*a_1*d_2,d_1*d_2,b_0*b_1*c_1,b_0*c_0*c_1,b_0*b_1*d_1,b_0*d_1*d_2,c_1*d_1*d_2,c_0*c_1*d_2}; + f1l2 = {b_1*a_1*a_2,b_1*b_2*a_2,c_1*c_2*a_2,c_1*a_1*a_2,a_1*a_2*d_2,a_2*d_1*d_2,b_1*c_1*c_2,b_1*b_2*c_2,b_1*b_2*d_2,d_1*d_2,c_1*d_1*d_2,c_1*c_2*d_1}; + f1l3 = {a_2*a_0*b_0,a_2*b_2*b_0, c_2*a_2*a_0,c_2*c_0*a_0,a_2*a_0*d_1,a_2*d_1*d_2,b_2*b_0*c_2,c_2*c_0*b_0,b_2*b_0*d_2,b_0*d_1*d_2,c_2*c_0*d_2,d_1*d_2}; + f1l4 = {a_0*b_0*b_1,a_0*a_2,a_0*a_2*c_2,c_1*c_2,a_0*d_0*d_1,a_0*a_2*d_1,b_1*c_1*c_2,b_0*b_1,b_0*b_1*d_1,b_1*d_0*d_1,c_1*c_2*d_1,c_2*d_0*d_1} + f1l5 = {a_0*a_1*b_1,b_1*b_2,a_0*c_0*c_2,a_0*a_1,a_0*d_0*d_2,a_0*a_1*d_2,b_1*b_2*c_2,c_0*c_2,b_1*d_0*d_2,b_1*b_2*d_2,c_2*d_0*d_2,c_0*c_2*d_2}; + F1S3 = simplicialComplex join(f1l1, f1l2, f1l3, f1l4, f1l5); + Text + The simplicial complex $F0S3$ below is the subsimplicial complex of $F1S3$ obtained by + considering the inverse images of the $0$-dimensional faces of the simplicial complex $S2$. + Again we describe this simplicial complex in pieces. + Example + f0l1 = {a_0*a_1,b_0*b_1,c_0*c_1,d_1*d_2}; + f0l2 = {a_1*a_2,b_1*b_2,c_1*c_2,d_1*d_2}; + f0l3 = {a_0*a_2,b_0*b_2,c_0*c_2,d_1*d_2}; + f0l4 = {a_0*a_2,b_0*b_1,c_1*c_2,d_0*d_1}; + f0l5 = {a_0*a_1,b_1*b_2,c_0*c_2,d_0*d_2}; + F0S3 = simplicialComplex(join(f0l1,f0l2,f0l3,f0l4,f0l5)); + Text + The simplicial complex $S3$ is obtained by considering the + inverse images of the $2$ dimensional faces of $S2$. + + To compute a simplicial version of + the Serre spectral sequence for the + $S^1 \rightarrow S^3 \rightarrow S^2$ + correctly, meaning that the spectral sequence takes the form + $E^2_{p,q} = H_p(S^2,H_q(S^1,QQ))$, we need to + use non-reduced homology. + Example + K = filteredComplex({S3,F1S3,F0S3}, ReducedHomology => false); + Text + We now compute the various pages of the spectral sequence. + To make the output + intelligible we prune the spectral sequence. + Example + E = prune spectralSequence K; + Example + E0 = E^0 + Text + Here are the maps. + Example + E0.dd + Text + Now try the $E^1$ page. + Example + E1 = E^1 + Text + Here are the maps. + Example + E1.dd + Text + Now try the $E^2$ page. + Example + E2 = E^2 + Text + Here are the maps. + Example + E2.dd + Text + Note that the modules on the $E^2$ page appear to have been computed correctly. + The statement of the Serre spectral sequence, see for example Theorem 1.3 p. 8 of + Hatcher's Spectral Sequence book, asserts that $E^2_{p,q} = H_p(S^2,H_q(S^1,QQ))$. + This is exactly what we obtained above. Also the maps on the $E^2$ page also seem + to be computed correctly as the spectral sequence will abut to the homology of $S^3$. + Example + E3 = E^3 + E3.dd + Text + Thus the E^3 page appears to have been computed correctly. +/// + +doc /// + Key + "Balancing Tor" + Description + Text + To balance Tor we first need to make some modules over a ring. + Example + A = QQ[x,y,z,w]; + M = monomialCurveIdeal(A,{1,2,3}); + N = monomialCurveIdeal(A,{1,3,4}); + Text + To compute $Tor^A_i(M,N)$ we resolve the modules, tensor appropriately, + and then take homology. + Example + K = res M + J = res N + Text + The spectral sequence that computes $Tor^A_i(M,N)$ by tensoring + $K$ with $N$ and taking homology is given by + Example + E = prune spectralSequence((filteredComplex K) ** J) + Text + The spectral sequence that computes $Tor^A_i(M,N)$ by tensoring + $J$ with $M$ and taking homology is given by + Example + F = prune spectralSequence((K ** (filteredComplex J))) + Text + Let's compute some pages and maps of these spectral sequences. + The zeroth pages takes the form: + Example + E^0 + E^0 .dd + F^0 + -- F^0 .dd + Text + The first pages take the form: + Example + E^1 + -- E^1 .dd + F^1 + -- F^1 .dd + Text + The second pages take the form: + Example + E^2 + -- E^2 .dd + F^2 + -- F^2 .dd + Text + Observe that $E^2$ and $F^2$ are equal as they should. + SeeAlso + "Filtrations and tensor product complexes" + "Filtrations and homomorphism complexes" +/// + +doc /// + Key + "Examples of change of rings Spectral Sequences" + Description + Text + Here are some examples of change of rings spectral sequences. + Text + Given a ring map f: R -> S, an R-module M and an R-module S, + there is a spectral sequence E with E^2_{p,q} = Tor^S_p(Tor^R_q(M,S),N) + that abuts to Tor^R_{p+q}(M,N). + Example +-- First example + k=QQ; + R=k[a,b,c]; + S=k[s,t]; + f = map(S,R,{s^2,s*t,t^2}); + N = coker vars S; + M = coker vars R --; + F := res N; + pushFwdF := pushFwd(f,F); + G := res M; + E := spectralSequence(filteredComplex(G) ** pushFwdF); + EE := spectralSequence(G ** (filteredComplex pushFwdF)); + e = prune E; + ee = prune EE; + e^0 + e^1 + e^2 + e^infinity + ee^0 + SeeAlso + "Filtrations and tensor product complexes" +/// + +doc /// + Key + "Example 1" + Headline + Easy example of a filtered simplicial complex + Description + Text + Here we provide an easy example of a filtered simplicial complex and + the resulting spectral sequence. This example is small enough + that all aspects of it can be explicitly computed by hand. + Example + A = QQ[a,b,c,d]; + D = simplicialComplex {a*d*c, a*b, a*c, b*c}; + F2D = D + F1D = simplicialComplex {a*c, d} + F0D = simplicialComplex {a,d} + K = filteredComplex({F2D, F1D, F0D},ReducedHomology => false) + E = prune spectralSequence(K) + E^0 + E^1 + E^2 + E^3 + E^infinity + C = K_infinity + prune HH C + E^2 .dd + Text + Considering the $E^2$ and $E^3$ pages of the spectral sequence + we conclude that the map $d^2_{2,-1}$ must have a $1$-dimensional + image and a $1$-dimensional kernel. This can be verified easily: + Example + rank ker E^2 .dd_{2,-1} + rank image E^2 .dd_{2,-1} +/// + +-- We might want to not include this next example +doc /// + Key + "Example 2" + Headline + Easy example of a filtered simplicial complex + Description + Text + We provide an easy example of a filtered simplicial complex + and the resulting spectral sequence. This example is small enough that + all aspects of it can be explicitly computed by hand. + Example + A = QQ[a,b,c] + D = simplicialComplex {a*b*c} + F3D = D + F2D = simplicialComplex {a*b,a*c,b*c} + F1D = simplicialComplex {a,b,c} + K = filteredComplex({F3D,F2D,F1D}, ReducedHomology => false) + C = K_infinity + E = prune spectralSequence K + E^0 + E^0 .dd + E^1 + E^1 .dd + E^2 + E^2 .dd + E^infinity + prune HH K_infinity + Example + F0D = simplicialComplex({a,b}) + K = filteredComplex({F3D,F2D,F1D,F0D}, ReducedHomology => false) + E = prune spectralSequence K + E^0 + E^0 .dd + E^0 + E^1 + E^0 .dd_{1,0} + E^1 .dd + E^1 + E^0 + E^2 + prune HH K_infinity + E^infinity +/// diff --git a/M2/Macaulay2/packages/SpectralSequences/tests.m2 b/M2/Macaulay2/packages/SpectralSequences/tests.m2 new file mode 100644 index 00000000000..bca2ebdc1d8 --- /dev/null +++ b/M2/Macaulay2/packages/SpectralSequences/tests.m2 @@ -0,0 +1,152 @@ +TEST /// + A = QQ[a,b,c]; + C = complex A^0 + K = filteredComplex C; + assert(K_0 == C); + assert(K_1 == C); +/// + +TEST /// + A = QQ[a,b,c]; + D = simplicialComplex {a*b*c}; + F2D = D; + F1D = simplicialComplex {a*b,a*c,b*c}; + F0D = simplicialComplex {a,b,c}; + K = filteredComplex({F2D,F1D,F0D}, ReducedHomology => false); + E = prune spectralSequence K; + e = spectralSequence K; + assert(all(keys support E^0, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,0))) + assert(all(keys support E^1, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,1))) + assert(all(keys support E^2, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,2))) + assert(all(keys support E^3, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,3))) + assert(all(keys support E^4, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,4))) + assert(all(keys support E^5, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,5))) + assert(all(keys support e^0, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,0))) + assert(all(keys support e^1, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,1))) + assert(all(keys support e^2, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,2))) + assert(all(keys support e^3, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,3))) + assert(all(keys support e^4, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,4))) + assert(all(keys support e^5, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,5))) +/// + +TEST /// + -- The following example is taken from p. 127, Fig 7.2 of + -- Zomorodian's "Topology for computing" + A = ZZ [s,t,u,v,w] ; + d0 = simplicialComplex {s}; + d1 = simplicialComplex {s,t} ; + d2 = simplicialComplex {s,t,u} ; + d3 = simplicialComplex {s*t, u} ; + d4 = simplicialComplex {s*t, u, v} ; + d5 = simplicialComplex {s*t, u, v, w} ; + d6 = simplicialComplex {s*t, s*w ,u, v} ; + d7 = simplicialComplex {s*t, s*w ,t * w, u, v} ; + d8 = simplicialComplex {s*t, s*w ,t * w, u * v}; + d9 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v}; + d10 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u}; + d11 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w}; + d12 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u}; + d13 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w}; + d14 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w}; + d15 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u}; + d16 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v}; + d17 = simplicialComplex {s*t, s*w ,t * w, u * v, s * v, s*u, u * w, t* u, t*u*w, s*u*w,s*t*u, s*u*v, s*t*w}; + L = reverse {d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17}; + K = filteredComplex (L, ReducedHomology => false); + E = prune spectralSequence K + e = spectralSequence K + assert(all(keys support E^0, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,0))) + assert(all(keys support E^1, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,1))) + assert(all(keys support E^2, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,2))) + assert(all(keys support E^3, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,3))) + assert(all(keys support E^4, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,4))) + assert(all(keys support E^5, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,5))) + assert(all(keys support E^6, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,6))) + assert(all(keys support E^7, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,7))) + assert(all(keys support E^8, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,8))) + assert(all(keys support E^9, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,9))) + assert(all(keys support E^10, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,10))) + assert(all(keys support E^11, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,11))) + assert(all(keys support E^12, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,12))) + assert(all(keys support e^0, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,0))) + assert(all(keys support e^1, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,1))) + assert(all(keys support e^2, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,2))) + assert(all(keys support e^3, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,3))) + assert(all(keys support e^4, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,4))) + assert(all(keys support e^5, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,5))) + assert(all(keys support e^6, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,6))) + assert(all(keys support e^7, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,7))) + assert(all(keys support e^8, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,8))) + assert(all(keys support e^9, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,9))) + assert(all(keys support e^10, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,10))) + assert(all(keys support e^11, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,11))) + assert(all(keys support e^12, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,12))) +/// + +TEST /// + A = QQ[a,b,c,d]; + D = simplicialComplex {a*d*c, a*b, a*c, b*c}; + F2D = D; + F1D = simplicialComplex {a*c, d}; + F0D = simplicialComplex {a,d}; + K = filteredComplex({F2D, F1D, F0D},ReducedHomology => false); + E = spectralSequence(K); + e = prune E; + assert(all(keys support E^0, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,0))) + assert(all(keys support E^1, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,1))) + assert(all(keys support E^2, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,2))) + assert(all(keys support E^3, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,3))) + assert(all(keys support E^4, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,4))) + assert(all(keys support E^5, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,5))) + assert(all(keys support E^6, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,6))) + assert(all(keys support E^7, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,7))) + assert(all(keys support E^8, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,8))) + assert(all(keys support E^9, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,9))) + assert(all(keys support E^10, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,10))) + assert(all(keys support E^11, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,11))) + assert(all(keys support E^12, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,12))) + assert(all(keys support e^0, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,0))) + assert(all(keys support e^1, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,1))) + assert(all(keys support e^2, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,2))) + assert(all(keys support e^3, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,3))) + assert(all(keys support e^4, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,4))) + assert(all(keys support e^5, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,5))) + assert(all(keys support e^6, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,6))) + assert(all(keys support e^7, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,7))) + assert(all(keys support e^8, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,8))) + assert(all(keys support e^9, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,9))) + assert(all(keys support e^10, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,10))) + assert(all(keys support e^11, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,11))) + assert(all(keys support e^12, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,12))) +/// + +TEST /// + B = QQ[a..d]; + J = ideal vars B; + C = res monomialCurveIdeal(B,{1,3,4}); + K = filteredComplex(J,C,4); + e = prune spectralSequence K; + assert(all(keys support e^0, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,0))) + assert(all(keys support e^1, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,1))) + assert(all(keys support e^2, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,2))) + assert(all(keys support e^3, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,3))) + assert(all(keys support e^4, j -> isIsomorphism homologyIsomorphism(e,j#0,j#1,4))) +/// + + +TEST /// + S = ZZ/101[x,y]; + I = ideal(x^2,x*y,y^2); + R = S/I; + kR = coker vars R; + kS = coker vars S; + CS = res kS; + CR = res(kR,LengthLimit=>6); + CS' = CS**R; + E = prune spectralSequence (CS' ** filteredComplex CR); + assert(all(keys support E^0, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,0))) + assert(all(keys support E^1, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,1))) + assert(all(keys support E^2, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,2))) + assert(all(keys support E^3, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,3))) + assert(all(keys support E^4, j -> isIsomorphism homologyIsomorphism(E,j#0,j#1,4))) +/// diff --git a/M2/Macaulay2/tests/normal/quotient.m2 b/M2/Macaulay2/tests/normal/quotient.m2 index 44276ba8483..93dac5ce5cf 100644 --- a/M2/Macaulay2/tests/normal/quotient.m2 +++ b/M2/Macaulay2/tests/normal/quotient.m2 @@ -40,3 +40,117 @@ assert(f \\ h == g) assert((f\\h) * f == h) assert(g // h == 0) -- does it always happen that this is zero if lift can't occur? Probably not assert(h \\ f == 0) + + +-- tests which show that the "Reflexive" strategy doesn't always work +S = QQ[x_0,x_1,x_2] --/ sum(3, i -> x_i^3) +a = x_0 + x_1 +b = x_0^2-x_0*x_1+x_1^2 +A = matrix {{x_2, a}, {b, -x_2^2}} +B = matrix {{x_2^2, a}, {b, -x_2}} + +f = map(S^2 / a, S^2 / a, A * B) +f' = map(S^2 / a, S^2, A * B) +g = map(S^2 / a, S^2, A) +h = map(S^2 / a, S^2 / a, B) +assert all({f', f, g, h}, isWellDefined) + +-- f does not factor through g without a remainder +assert not isSubset(image homomorphism' f, image Hom(source f, g)) + +-- here is the example +q = f // g +assert(isWellDefined q and q == 0) + +q = quotient(f, g, Strategy => Default) +assert(isWellDefined q and q == 0) + +-- the Reflexive strategy is not applicable here +assert try ( quotient(f, g, Strategy => "Reflexive"); false ) else true + +-- but f' does (left) factor through g +assert isSubset(image homomorphism' f, image Hom(g, target f)) + +q = g \\ f' +assert isWellDefined q +assert(f' == q * g) +assert(h == q) + +q = quotient'(f', g, Strategy => Default) +assert isWellDefined q +assert(f' == q * g) +assert(h == q) + +assert try ( quotient'(f', g, Strategy => "Reflexive"); false ) else true + + +-- this is an example where the improved "Reflexive" strategy works +f = homomorphism random Hom(image(A | B), S^2) +g = homomorphism random Hom(image(B | A), S^2) +h = homomorphism random Hom(image(A | B), image(B | A)) +f = g * h +assert all({f, g}, isWellDefined) + +-- f factors through g without a remainder +assert isSubset(image homomorphism' f, image Hom(source f, g)) + +-- here is the example +q = f // g +assert(isWellDefined q and f == g * q) + +q = quotient(f, g, Strategy => Default) +assert(isWellDefined q and f == g * q) + + +-- this is an example where the improved "Reflexive" strategy works +R = ZZ/2[x,y,z,w] +g = matrix {{x, x+y+z}, {x+y+z, z}} +f = g * matrix {{y^2}, {z^2}} +f = inducedMap(target f / (x+y+z), source f / (x+y+z), f) +g = inducedMap(target g / (x+y+z), source g, g) +isWellDefined f +isWellDefined g + +-- f does not factor through g without a remainder +assert not isSubset(image homomorphism' f, image Hom(source f, g)) + +q = quotient(f, g, Strategy => Default) +assert(isWellDefined q and q == 0) + +assert try ( quotient(f, g, Strategy => "Reflexive"); false ) else true + +---- +clearAll +B = QQ[a..d] +f = prune map(B^1, image(map(B^{{-2}, 3:{-3}}, B^{{-3}, 3:{-4}, {-3}, 3:{-4}, {-3}, 3:{-4}, {-3}, 3:{-4}}, {{a, 0, 0, 0, b, 0, 0, 0, c, 0, 0, 0, d, 0, 0, 0}, {0, a, 0, 0, 0, b, 0, 0, 0, c, 0, 0, 0, d, 0, 0}, {0, 0, a, 0, 0, 0, b, 0, 0, 0, c, 0, 0, 0, d, 0}, {0, 0, 0, a, 0, 0, 0, b, 0, 0, 0, c, 0, 0, 0, d}})),{{a*b*c-a^2*d, a*b^3-a^3*c, a^2*c^2-a*b^2*d, a*c^3-a*b*d^2, b^2*c-a*b*d, b^4-a^2*b*c, a*b*c^2-b^3*d, b*c^3-b^2*d^2, b*c^2-a*c*d, b^3*c-a^2*c^2, a*c^3-b^2*c*d, c^4-b*c*d^2, b*c*d-a*d^2, b^3*d-a^2*c*d, a*c^2*d-b^2*d^2, c^3*d-b*d^3}}) +g = prune map(B^1, image(map(B^1, B^{4:{-1}}, {{a, b, c, d}})), {{a, b, c, d}}) +assert isSubset(image homomorphism' f, image Hom(source f, g)) +elapsedTime assert(f == g * quotient(f, g, Strategy => Default)) +elapsedTime assert(f == g * quotient(f, g, Strategy => "Reflexive")) + +---- +S = QQ[x] +f = random(S^1/x, S^1/x^3) +g = random(S^1/x, S^1/x^2) +elapsedTime assert(f == g * quotient(f, g, Strategy => Default)) +elapsedTime assert(f == g * quotient(f, g, Strategy => "Reflexive")) + +---- +S = QQ[x,y]; +M = coker matrix {{x,y},{-y,x}}; +g = random(M, M) +f = g * random(M, M) +q = quotient(f, g, Strategy => "Reflexive") +assert(isWellDefined q and f == g * q) + +---- +S = QQ[x,y,z] +M = S^{-2} +N = S^{-3} +P = truncate(3, S^1) +h = homomorphism random(3, Hom(P, N)) +g = homomorphism random(0, Hom(N, M)) +f = g * h +assert all({f, g, h}, isWellDefined) +q = quotient(f, g, Strategy => "Reflexive") +assert(isWellDefined q and f == g * q) diff --git a/M2/cmake/build-libraries.cmake b/M2/cmake/build-libraries.cmake index 2c1e1608aa5..10471a9d900 100644 --- a/M2/cmake/build-libraries.cmake +++ b/M2/cmake/build-libraries.cmake @@ -511,7 +511,7 @@ ExternalProject_Add(build-msolve TEST_EXCLUDE_FROM_MAIN ON STEP_TARGETS install test ) -_ADD_COMPONENT_DEPENDENCY(programs msolve "gmp;mpfr;flint" MSOLVE_FOUND) +_ADD_COMPONENT_DEPENDENCY(programs msolve "gmp;mpfr;flint" MSOLVE) # https://numpi.dm.unipi.it/software/mpsolve