Documentation

LeanPool.BrillNoetherGraphs.Utilities.Iso.Fossil

The fossil of a chip-firing graph #

In this library, fossil is a deliberately short name for the graph's degree-one Abel--Jacobi image. For a connected graph this is the construction usually called its 2-edge-connectivization: contract every separating edge, map the remaining edge occurrences across the quotient, and discard the loops created by contraction. “Fossil” is local terminology, not a replacement for either standard name in mathematical prose.

Concretely, two vertices have the same fossil image when their one-chip divisors are linearly equivalent.

This module begins with the quotient construction and its canonical divisor pushforward. The main objective is to prove that this pushforward identifies the divisor class groups, hence preserves winnability, rank, and Brill--Noether existence. Unlike a chosen sequence of bridge contractions, the fossil is canonical and can therefore serve as a common target for constructions which differ only by attached trees.

Vertex classes and the quotient graph #

def Utilities.chipEquivalent (G : CFGraph) (v w : G.V) :

Two vertices belong to the same fossil class when their one-chip divisors are linearly equivalent.

Equations
Instances For

    Linear equivalence of one-chip divisors, packaged as a setoid.

    Equations
    Instances For
      @[reducible, inline]

      A vertex of the fossil is a linear-equivalence class of vertices.

      Equations
      Instances For

        The canonical map from the original vertex set to its fossil classes.

        Equations
        Instances For

          Map the two endpoints of an edge to their fossil classes.

          Equations
          Instances For
            noncomputable def Utilities.fossil (G : CFGraph) :

            The fossil of G: its degree-one Abel--Jacobi image, equivalently (when G is connected) its 2-edge-connectivization. It quotients vertices by one-chip divisor class and discards edge occurrences that become loops.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For
              @[simp]
              theorem Utilities.fossil_edges (G : CFGraph) :
              (fossil G).edges = Multiset.filter (fun (edge : FossilVertex G × FossilVertex G) => edge.1 ≠ edge.2) (Multiset.map (fossilEdge G) G.edges)

              Canonical contraction and divisor pushforward #

              The quotient map, viewed as a graph-contraction certificate.

              Equations
              Instances For

                The fossil really is the quotient graph associated to its vertex map: between two distinct classes its multiplicity is the sum of all source multiplicities between the two fibres.

                noncomputable def Utilities.fossilPushforward (G : CFGraph) (D : CFDiv G) :

                Push a divisor to the fossil by summing its coefficients over each linear-equivalence class of vertices.

                Equations
                Instances For
                  @[simp]
                  theorem Utilities.fossilPushforward_apply (G : CFGraph) (D : CFDiv G) (q : FossilVertex G) :
                  fossilPushforward G D q = ∑ v : G.V, if fossilVertex G v = q then D v else 0

                  Fibre summation, packaged as an additive homomorphism.

                  Equations
                  Instances For

                    A canonical section on divisors #

                    noncomputable def Utilities.fossilRepresentative (G : CFGraph) (q : FossilVertex G) :
                    G.V

                    A noncomputably chosen original vertex in each fossil class. The mathematical statements below do not depend on this choice.

                    Equations
                    Instances For
                      theorem Utilities.divisor_eq_sum_smul_oneChip {K : CFGraph} (D : CFDiv K) :
                      D = ∑ v : K.V, D v • oneChip v

                      Every divisor is the coefficient-weighted sum of its one-chip divisors.

                      noncomputable def Utilities.fossilLift (G : CFGraph) (D : CFDiv (fossil G)) :

                      Lift a fossil divisor by placing the coefficient of each class at its chosen representative.

                      Equations
                      Instances For
                        @[simp]

                        The chosen lift is a right inverse to fibre summation.

                        noncomputable def Utilities.fossilPullScript (G : CFGraph) (tau : firingScript (fossil G)) :

                        Pull a fossil firing script back to the original graph.

                        Equations
                        Instances For
                          @[simp]
                          theorem Utilities.fossilPullScript_apply (G : CFGraph) (tau : firingScript (fossil G)) (v : G.V) :
                          fossilPullScript G tau v = tau (fossilVertex G v)

                          The quotient Laplacian identity for the fossil.

                          The easy half of divisor-class invariance #

                          theorem Utilities.linear_equiv_zsmul {K : CFGraph} {D E : CFDiv K} (h : linearEquiv K D E) (n : ℤ) :
                          linearEquiv K (n • D) (n • E)

                          Linear equivalence is preserved by integer scaling.

                          theorem Utilities.linear_equiv_sum {K : CFGraph} {ι : Type u_1} [Fintype ι] {D E : ι → CFDiv K} (h : ∀ (i : ι), linearEquiv K (D i) (E i)) :
                          linearEquiv K (∑ i : ι, D i) (∑ i : ι, E i)

                          A finite sum of termwise linearly equivalent divisors is linearly equivalent.

                          Each vertex is linearly equivalent, as a one-chip divisor, to the chosen representative of its fossil class.

                          Every divisor is linearly equivalent to the chosen lift of its pushforward: redistributing chips inside a fossil fibre only moves them between linearly equivalent vertices.

                          Divisors with the same fossil pushforward are linearly equivalent. Their only difference is redistribution inside the quotient fibres.

                          Reflection of linear equivalence through the fossil. This is the formal version of pulling a quotient firing script back and observing that the remaining discrepancy only moves chips inside quotient fibres.

                          The fossil has no further degree-one vertex identifications: two of its vertices carry equivalent one-chip divisors exactly when they are the same quotient class.

                          Consequently the second fossil quotient has singleton fibres.

                          Script descent and class-group invariance #

                          Adding the correcting constant on one side of a separating bridge does not change the fossil pushforward of the principal divisor.

                          noncomputable def Utilities.separatingBadPairs (G : CFGraph) (sigma : firingScript G) :
                          Finset (G.V × G.V)

                          Ordered separating-edge pairs on which a script has unequal endpoint values. Orienting both ways is harmless and avoids making an arbitrary orientation part of the API.

                          Equations
                          Instances For
                            @[simp]
                            theorem Utilities.mem_separatingBadPairs_iff (G : CFGraph) (sigma : firingScript G) (pair : G.V × G.V) :
                            pair ∈ separatingBadPairs G sigma ↔ Nonempty (SeparatingEdgeCut G pair.1 pair.2) ∧ sigma pair.1 ≠ sigma pair.2
                            theorem Utilities.exists_separating_normalization (G : CFGraph) (sigma : firingScript G) :
                            ∃ (normalized : firingScript G), (∀ {x y : G.V} (cut : SeparatingEdgeCut G x y), normalized x = normalized y) ∧ fossilPushforward G ((prin G) normalized) = fossilPushforward G ((prin G) sigma)

                            Repeatedly applying the one-side constant correction produces a script whose values agree across every separating edge. The corrections never destroy an equality already achieved, because separating cuts do not cross; therefore the finite set of bad endpoint pairs strictly shrinks.

                            theorem Utilities.exists_fossilScript_pushforward_prin (G : CFGraph) (hConnected : graphConnected G) (sigma : firingScript G) :
                            ∃ (tau : firingScript (fossil G)), fossilPushforward G ((prin G) sigma) = (prin (fossil G)) tau

                            On a connected graph, every source firing script can be normalized along separating-edge cuts so that it is constant on fossil fibres. Pushing its principal divisor then gives the principal divisor of the descended script.

                            Linear equivalence descends to the fossil.

                            On a connected graph, the fossil pushforward identifies divisor classes exactly.

                            Lifting an effective fossil divisor at chosen representatives remains effective.

                            Winnability is invariant under passage to the fossil.

                            theorem Utilities.rank_geq_fossil_iff (G : CFGraph) (hConnected : graphConnected G) (D : CFDiv G) (k : ℤ) :

                            Every rank inequality is invariant under passage to the fossil.

                            theorem Utilities.rank_fossilPushforward (G : CFGraph) (hConnected : graphConnected G) (D : CFDiv G) :

                            Baker--Norine rank is unchanged by passing to the fossil.

                            theorem Utilities.BNExists_fossil_iff (G : CFGraph) (hConnected : graphConnected G) (r d : ℤ) :
                            BNExists G r d ↔ BNExists (fossil G) r d

                            Brill--Noether existence is invariant under passage to the fossil.