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 #
Two vertices belong to the same fossil class when their one-chip divisors are linearly equivalent.
Equations
- Utilities.chipEquivalent G v w = linearEquiv G (oneChip v) (oneChip w)
Instances For
Linear equivalence of one-chip divisors, packaged as a setoid.
Equations
- Utilities.chipSetoid G = { r := Utilities.chipEquivalent G, iseqv := ⋯ }
Instances For
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
- Utilities.fossilVertex G v = ⟦v⟧
Instances For
Equations
Equations
Map the two endpoints of an edge to their fossil classes.
Equations
- Utilities.fossilEdge G edge = (Utilities.fossilVertex G edge.1, Utilities.fossilVertex G edge.2)
Instances For
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
Canonical contraction and divisor pushforward #
The quotient map, viewed as a graph-contraction certificate.
Equations
- Utilities.fossilContraction G = { vertexMap := Utilities.fossilVertex G }
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.
Push a divisor to the fossil by summing its coefficients over each linear-equivalence class of vertices.
Equations
Instances For
Fibre summation, packaged as an additive homomorphism.
Equations
- Utilities.fossilPushforwardHom G = { toFun := Utilities.fossilPushforward G, map_zero' := ⋯, map_add' := ⋯ }
Instances For
A canonical section on divisors #
A noncomputably chosen original vertex in each fossil class. The mathematical statements below do not depend on this choice.
Equations
Instances For
Lift a fossil divisor by placing the coefficient of each class at its chosen representative.
Equations
- Utilities.fossilLift G D = ∑ q : Utilities.FossilVertex G, D q • oneChip (Utilities.fossilRepresentative G q)
Instances For
The chosen lift is a right inverse to fibre summation.
Pull a fossil firing script back to the original graph.
Equations
- Utilities.fossilPullScript G tau = (Utilities.fossilContraction G).pullScript tau
Instances For
The quotient Laplacian identity for the fossil.
The easy half of divisor-class invariance #
Linear equivalence is preserved by integer scaling.
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.
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
- Utilities.separatingBadPairs G sigma = {pair : G.V × G.V | Nonempty (Utilities.SeparatingEdgeCut G pair.1 pair.2) ∧ sigma pair.1 ≠ sigma pair.2}
Instances For
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.
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.
Every rank inequality is invariant under passage to the fossil.
Baker--Norine rank is unchanged by passing to the fossil.
Brill--Noether existence is invariant under passage to the fossil.