# How to make filtered complexes from chain complex maps

We describe the most primitative 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$.

Let's make our chain complexes $C$, $D$, and $E$.

 i1 : R = QQ[x,y,z,w] ; i2 : c2 = matrix(R,{{1},{0}}) ; 2 1 o2 : Matrix R <--- R i3 : c1 = matrix(R,{{0,1}}) ; 1 2 o3 : Matrix R <--- R i4 : C = chainComplex({c1,c2}) 1 2 1 o4 = R <-- R <-- R 0 1 2 o4 : ChainComplex i5 : D_2 = image matrix(R,{{1}}); i6 : D_1 = image matrix(R,{{1,0},{0,0}}); i7 : D_0 = image matrix(R,{{1}}); i8 : D = chainComplex({inducedMap(D_0,D_1,C.dd_1),inducedMap(D_1,D_2,C.dd_2)}) o8 = image | 1 | <-- image | 1 0 | <-- image | 1 | | 0 0 | 0 2 1 o8 : ChainComplex i9 : E_2 = image matrix(R,{{0}}); i10 : E_1 = image matrix(R,{{1,0},{0,0}}); i11 : E_0 = image matrix(R,{{1}}); i12 : E = chainComplex({inducedMap(E_0,E_1,C.dd_1),inducedMap(E_1,E_2,C.dd_2)}) o12 = image | 1 | <-- image | 1 0 | <-- image 0 | 0 0 | 0 2 1 o12 : ChainComplex

We now make our chain complex maps.

 i13 : d = chainComplexMap(C,D,apply(spots C, i-> inducedMap(C_i,D_i,id_C _i))) 1 o13 = 0 : R <--------- image | 1 | : 0 | 1 | 2 1 : R <----------- image | 1 0 | : 1 | 1 0 | | 0 0 | | 0 0 | 1 2 : R <--------- image | 1 | : 2 | 1 | o13 : ChainComplexMap i14 : e = chainComplexMap(C,E,apply(spots C, i->inducedMap(C_i,E_i, id_C _i))) 1 o14 = 0 : R <--------- image | 1 | : 0 | 1 | 2 1 : R <----------- image | 1 0 | : 1 | 1 0 | | 0 0 | | 0 0 | 1 2 : R <----- image 0 : 2 0 o14 : ChainComplexMap

We can check that these are indeed chain complex maps:

 i15 : isChainComplexMap d o15 = true i16 : isChainComplexMap e o16 = true

Now, given the list of chain complex maps $\{d, e\}$, we obtain a filtration of $C$ by:

 i17 : K = filteredComplex({d,e}) o17 = -1 : image 0 <-- image 0 <-- image 0 0 1 2 0 : image | 1 | <-- image | 1 0 | <-- image 0 | 0 0 | 0 2 1 1 : image | 1 | <-- image | 1 0 | <-- image | 1 | | 0 0 | 0 2 1 1 2 1 2 : R <-- R <-- R 0 1 2 o17 : FilteredComplex

If we want to specify a minimum filtration degree we can use the Shift option.

 i18 : L = filteredComplex({d,e},Shift =>1) o18 = -2 : image 0 <-- image 0 <-- image 0 0 1 2 -1 : image | 1 | <-- image | 1 0 | <-- image 0 | 0 0 | 0 2 1 0 : image | 1 | <-- image | 1 0 | <-- image | 1 | | 0 0 | 0 2 1 1 2 1 1 : R <-- R <-- R 0 1 2 o18 : FilteredComplex i19 : M = filteredComplex({d,e},Shift =>-1) o19 = 0 : image 0 <-- image 0 <-- image 0 0 1 2 1 : image | 1 | <-- image | 1 0 | <-- image 0 | 0 0 | 0 2 1 2 : image | 1 | <-- image | 1 0 | <-- image | 1 | | 0 0 | 0 2 1 1 2 1 3 : R <-- R <-- R 0 1 2 o19 : FilteredComplex