Documentation

QEC1.Definitions.Def_1_BoundaryCoboundaryMaps

Def_1: Boundary and Coboundary Maps #

Statement #

Let $G = (V, E)$ be a graph with a chosen collection $\mathcal{C}$ of cycles. We define the following $\mathbb{Z}_2$-linear maps using binary vector representations:

Boundary map $\partial: \mathbb{Z}_2^{|E|} \to \mathbb{Z}_2^{|V|}$: For a single edge $e = \{v, v'\}$, define $\partial e = v + v'$ (the binary vector with 1s at positions $v$ and $v'$). Extend linearly to edge-sets: $\partial(\sum_i e_i) = \sum_i \partial e_i$. Equivalently, $\partial$ is the incidence matrix of $G$ over $\mathbb{Z}_2$.

Coboundary map $\delta: \mathbb{Z}_2^{|V|} \to \mathbb{Z}_2^{|E|}$: Define $\delta = \partial^T$ (transpose of $\partial$). For a single vertex $v$, we have $\delta v = \sum_{e \ni v} e$ (the binary vector of all edges incident to $v$).

Second boundary map $\partial_2: \mathbb{Z}_2^{|\mathcal{C}|} \to \mathbb{Z}_2^{|E|}$: For a single cycle $c$, define $\partial_2 c = \sum_{e \in c} e$ (the binary vector of edges in $c$). Extend linearly.

Second coboundary map $\delta_2: \mathbb{Z}_2^{|E|} \to \mathbb{Z}_2^{|\mathcal{C}|}$: Define $\delta_2 = \partial_2^T$. For a single edge $e$, we have $\delta_2 e = \sum_{c \ni e} c$ (the binary vector of cycles containing $e$).

Main Definitions #

Key Properties #

Graph with Chosen Cycles #

structure GraphWithCycles (V : Type u_1) (E : Type u_2) (C : Type u_3) [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] :
Type (max (max u_1 u_2) u_3)

A simple graph together with a chosen collection of cycles (represented as sets of edges). The cycles are indexed by a finite type C.

  • graph : SimpleGraph V

    The underlying simple graph

  • decAdj : DecidableRel self.graph.Adj

    Decidable adjacency

  • edgeEndpoints : EV × V

    Edges are represented by a type E with a way to get endpoints

  • edge_adj (e : E) : self.graph.Adj (self.edgeEndpoints e).1 (self.edgeEndpoints e).2

    For each edge, the two endpoints are adjacent

  • edge_symm (e : E) : self.graph.Adj (self.edgeEndpoints e).2 (self.edgeEndpoints e).1

    Edges are symmetric: we don't distinguish (v, v') from (v', v)

  • cycles : CFinset E

    The cycles, each represented as a set of edges

Instances For

    Incidence Relation #

    def GraphWithCycles.isIncident {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) (v : V) :

    An edge e is incident to vertex v if v is one of its endpoints

    Equations
    Instances For
      def GraphWithCycles.incidentEdges {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (v : V) :

      The set of edges incident to a vertex v

      Equations
      Instances For
        def GraphWithCycles.edgeVertices {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) :

        The set of vertices incident to an edge e (its two endpoints)

        Equations
        Instances For
          @[simp]
          theorem GraphWithCycles.mem_edgeVertices {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) (v : V) :
          def GraphWithCycles.cycleContainsEdge {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (c : C) (e : E) :

          A cycle contains an edge if the edge is in the cycle's edge set

          Equations
          Instances For
            def GraphWithCycles.cyclesContaining {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) :

            The set of cycles containing a given edge

            Equations
            Instances For

              Binary Vector Spaces #

              @[reducible, inline]
              abbrev GraphWithCycles.VectorV' (V : Type u_4) :
              Type u_4

              Binary vectors over vertices: Z₂^V

              Equations
              Instances For
                @[reducible, inline]
                abbrev GraphWithCycles.VectorE' (E : Type u_4) :
                Type u_4

                Binary vectors over edges: Z₂^E

                Equations
                Instances For
                  @[reducible, inline]
                  abbrev GraphWithCycles.VectorC' (C : Type u_4) :
                  Type u_4

                  Binary vectors over cycles: Z₂^C

                  Equations
                  Instances For

                    Standard Basis Vectors #

                    def GraphWithCycles.basisV {V : Type u_1} [DecidableEq V] (v : V) :

                    Standard basis vector for vertices: 1 at position v, 0 elsewhere

                    Equations
                    Instances For
                      def GraphWithCycles.basisE {E : Type u_2} [DecidableEq E] (e : E) :

                      Standard basis vector for edges: 1 at position e, 0 elsewhere

                      Equations
                      Instances For
                        def GraphWithCycles.basisC {C : Type u_3} [DecidableEq C] (c : C) :

                        Standard basis vector for cycles: 1 at position c, 0 elsewhere

                        Equations
                        Instances For
                          @[simp]
                          theorem GraphWithCycles.basisV_apply_same {V : Type u_1} [DecidableEq V] [Fintype V] (v : V) :
                          basisV v v = 1
                          @[simp]
                          theorem GraphWithCycles.basisV_apply_ne {V : Type u_1} [DecidableEq V] [Fintype V] (v w : V) (h : v w) :
                          basisV v w = 0
                          @[simp]
                          theorem GraphWithCycles.basisE_apply_same {E : Type u_2} [DecidableEq E] [Fintype E] (e : E) :
                          basisE e e = 1
                          @[simp]
                          theorem GraphWithCycles.basisE_apply_ne {E : Type u_2} [DecidableEq E] [Fintype E] (e f : E) (h : e f) :
                          basisE e f = 0
                          @[simp]
                          theorem GraphWithCycles.basisC_apply_same {C : Type u_3} [DecidableEq C] [Fintype C] (c : C) :
                          basisC c c = 1
                          @[simp]
                          theorem GraphWithCycles.basisC_apply_ne {C : Type u_3} [DecidableEq C] [Fintype C] (c d : C) (h : c d) :
                          basisC c d = 0

                          The Boundary Map ∂ : Z₂^E → Z₂^V #

                          def GraphWithCycles.boundaryOfEdge {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) :

                          The boundary of a single edge e = {v, v'} is v + v' (the characteristic vector of {v, v'})

                          Equations
                          Instances For

                            The boundary map ∂ : Z₂^E → Z₂^V For edge e = {v, v'}, ∂(e) = v + v'. Extended linearly to all edge vectors.

                            Equations
                            Instances For

                              Notation for boundary map

                              Equations
                              Instances For
                                @[simp]
                                theorem GraphWithCycles.boundaryMap_apply {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorE' E) :
                                G.boundaryMap f = e : E, f e G.boundaryOfEdge e
                                @[simp]
                                theorem GraphWithCycles.boundaryMap_basisE {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) :

                                Boundary of basis vector is the boundary of that edge

                                theorem GraphWithCycles.edge_endpoints_ne {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) :

                                Endpoints of an edge are distinct (since SimpleGraph has no self-loops)

                                theorem GraphWithCycles.boundaryOfEdge_apply {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) (v : V) :

                                The boundary of an edge has 1s exactly at its endpoints

                                theorem GraphWithCycles.boundaryMap_apply_vertex {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorE' E) (v : V) :
                                G.boundaryMap f v = eG.incidentEdges v, f e

                                Alternative characterization: boundary counts (mod 2) how many times v appears as endpoint

                                The Coboundary Map δ : Z₂^V → Z₂^E #

                                def GraphWithCycles.coboundaryOfVertex {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (v : V) :

                                The coboundary of a single vertex v is the sum of all incident edges

                                Equations
                                Instances For

                                  The coboundary map δ : Z₂^V → Z₂^E For vertex v, δ(v) = sum of all edges incident to v. This is the transpose of the boundary map.

                                  Equations
                                  Instances For

                                    Notation for coboundary map

                                    Equations
                                    Instances For
                                      @[simp]
                                      theorem GraphWithCycles.coboundaryMap_apply {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorV' V) :
                                      G.coboundaryMap f = v : V, f v G.coboundaryOfVertex v
                                      @[simp]
                                      theorem GraphWithCycles.coboundaryMap_basisV {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (v : V) :

                                      Coboundary of basis vector is the coboundary of that vertex

                                      theorem GraphWithCycles.coboundaryOfVertex_apply {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (v : V) (e : E) :

                                      The coboundary map on a vertex gives the characteristic vector of incident edges

                                      theorem GraphWithCycles.coboundaryMap_apply_edge {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorV' V) (e : E) :
                                      G.coboundaryMap f e = vG.edgeVertices e, f v

                                      Coboundary map applied to a vertex vector at an edge e

                                      Transpose Relationship: δ = ∂ᵀ #

                                      theorem GraphWithCycles.coboundary_eq_boundary_transpose {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorE' E) (g : VectorV' V) :
                                      v : V, G.boundaryMap f v * g v = e : E, f e * G.coboundaryMap g e

                                      Key property: The coboundary is the transpose of the boundary. This means ⟨∂f, g⟩ = ⟨f, δg⟩ for the natural pairing.

                                      The Second Boundary Map ∂₂ : Z₂^C → Z₂^E #

                                      def GraphWithCycles.boundary2OfCycle {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (c : C) :

                                      The boundary of a single cycle c is the sum of its edges

                                      Equations
                                      Instances For

                                        The second boundary map ∂₂ : Z₂^C → Z₂^E For cycle c, ∂₂(c) = sum of all edges in c.

                                        Equations
                                        Instances For

                                          Notation for second boundary map

                                          Equations
                                          Instances For
                                            @[simp]
                                            theorem GraphWithCycles.boundary2Map_apply {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorC' C) :
                                            G.boundary2Map f = c : C, f c G.boundary2OfCycle c
                                            @[simp]
                                            theorem GraphWithCycles.boundary2Map_basisC {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (c : C) :

                                            Second boundary of basis vector is the boundary of that cycle

                                            theorem GraphWithCycles.boundary2OfCycle_apply {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (c : C) (e : E) :

                                            The boundary of a cycle has 1s exactly at edges in the cycle

                                            theorem GraphWithCycles.boundary2Map_apply_edge {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorC' C) (e : E) :
                                            G.boundary2Map f e = cG.cyclesContaining e, f c

                                            Second boundary map applied to edge e

                                            The Second Coboundary Map δ₂ : Z₂^E → Z₂^C #

                                            def GraphWithCycles.coboundary2OfEdge {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) :

                                            The coboundary of a single edge e is the sum of all cycles containing e

                                            Equations
                                            Instances For

                                              The second coboundary map δ₂ : Z₂^E → Z₂^C For edge e, δ₂(e) = sum of all cycles containing e. This is the transpose of the second boundary map.

                                              Equations
                                              Instances For

                                                Notation for second coboundary map

                                                Equations
                                                Instances For
                                                  @[simp]
                                                  theorem GraphWithCycles.coboundary2Map_apply {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorE' E) :
                                                  G.coboundary2Map f = e : E, f e G.coboundary2OfEdge e
                                                  @[simp]
                                                  theorem GraphWithCycles.coboundary2Map_basisE {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) :

                                                  Second coboundary of basis vector is the coboundary of that edge

                                                  theorem GraphWithCycles.coboundary2OfEdge_apply {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (e : E) (c : C) :

                                                  The coboundary of an edge has 1s exactly at cycles containing it

                                                  theorem GraphWithCycles.coboundary2Map_apply_cycle {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorE' E) (c : C) :
                                                  G.coboundary2Map f c = eG.cycles c, f e

                                                  Second coboundary map applied to cycle c

                                                  Transpose Relationship: δ₂ = ∂₂ᵀ #

                                                  theorem GraphWithCycles.coboundary2_eq_boundary2_transpose {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorC' C) (g : VectorE' E) :
                                                  e : E, G.boundary2Map f e * g e = c : C, f c * G.coboundary2Map g c

                                                  Key property: The second coboundary is the transpose of the second boundary. This means ⟨∂₂f, g⟩ = ⟨f, δ₂g⟩ for the natural pairing.

                                                  Special Case Properties #

                                                  Zero and Linearity Properties #

                                                  @[simp]
                                                  theorem GraphWithCycles.boundaryMap_zero {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) :
                                                  @[simp]
                                                  theorem GraphWithCycles.coboundaryMap_zero {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) :
                                                  @[simp]
                                                  theorem GraphWithCycles.boundary2Map_zero {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) :
                                                  @[simp]
                                                  theorem GraphWithCycles.coboundary2Map_zero {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) :
                                                  theorem GraphWithCycles.boundaryMap_add {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f g : VectorE' E) :
                                                  theorem GraphWithCycles.coboundaryMap_add {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f g : VectorV' V) :
                                                  theorem GraphWithCycles.boundary2Map_add {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f g : VectorC' C) :
                                                  theorem GraphWithCycles.coboundary2Map_add {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f g : VectorE' E) :

                                                  Incidence Matrix Interpretation #

                                                  def GraphWithCycles.incidenceMatrix {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) :
                                                  VEZMod 2

                                                  The boundary map can be viewed as multiplication by the incidence matrix. The (v, e) entry is 1 if v is incident to e, 0 otherwise.

                                                  Equations
                                                  Instances For
                                                    theorem GraphWithCycles.incidenceMatrix_eq_boundaryOfEdge {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (v : V) (e : E) :

                                                    The incidence matrix entry equals the boundary of edge evaluated at vertex

                                                    theorem GraphWithCycles.boundaryMap_eq_incidenceMatrix_mul {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorE' E) (v : V) :
                                                    G.boundaryMap f v = e : E, G.incidenceMatrix v e * f e

                                                    Boundary map is multiplication by incidence matrix

                                                    theorem GraphWithCycles.coboundaryMap_eq_incidenceMatrixT_mul {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorV' V) (e : E) :
                                                    G.coboundaryMap f e = v : V, G.incidenceMatrix v e * f v

                                                    Coboundary map is multiplication by transpose of incidence matrix

                                                    Cycle Matrix Interpretation #

                                                    def GraphWithCycles.cycleEdgeMatrix {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) :
                                                    CEZMod 2

                                                    The cycle-edge incidence matrix: (c, e) entry is 1 if edge e is in cycle c

                                                    Equations
                                                    Instances For
                                                      theorem GraphWithCycles.boundary2Map_eq_cycleMatrix_mul {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorC' C) (e : E) :
                                                      G.boundary2Map f e = c : C, G.cycleEdgeMatrix c e * f c

                                                      Second boundary map is multiplication by cycle-edge matrix

                                                      theorem GraphWithCycles.coboundary2Map_eq_cycleMatrixT_mul {V : Type u_1} {E : Type u_2} {C : Type u_3} [DecidableEq V] [DecidableEq E] [DecidableEq C] [Fintype V] [Fintype E] [Fintype C] (G : GraphWithCycles V E C) (f : VectorE' E) (c : C) :
                                                      G.coboundary2Map f c = e : E, G.cycleEdgeMatrix c e * f e

                                                      Second coboundary map is multiplication by transpose of cycle-edge matrix

                                                      Summary #

                                                      This formalization defines the boundary and coboundary maps for a graph with chosen cycles:

                                                      1. Boundary map ∂ : Z₂^E → Z₂^V

                                                        • For edge e = {v, v'}: ∂(e) = v + v' (sum in Z₂)
                                                        • Equivalently: the v-th component of ∂(f) counts (mod 2) edges in f incident to v
                                                      2. Coboundary map δ : Z₂^V → Z₂^E

                                                        • For vertex v: δ(v) = sum of all edges incident to v
                                                        • This is the transpose of ∂ : ⟨∂f, g⟩ = ⟨f, δg⟩
                                                      3. Second boundary map ∂₂ : Z₂^C → Z₂^E

                                                        • For cycle c: ∂₂(c) = sum of all edges in c
                                                        • Equivalently: the e-th component counts (mod 2) cycles in f containing e
                                                      4. Second coboundary map δ₂ : Z₂^E → Z₂^C

                                                        • For edge e: δ₂(e) = sum of all cycles containing e
                                                        • This is the transpose of ∂₂ : ⟨∂₂f, g⟩ = ⟨f, δ₂g⟩

                                                      Key properties proven: