The AHL stationary-measure vocabulary — walk decomposition, weights, and marginal sums #
This file lands nodes W0–W2 of the Alon–Hoory–Linial irregular-Moore walk-count proof, i.e. the
vocabulary the weighted AM–GM assembly (W3–W9) consumes. Building on the non-backtracking
machinery of AHL.NBWalkCount / AHL.NBWeighted (nbWalksFrom, nbExtend, nb_concat_iff,
card_nbWalksFrom), it packages three layers.
Contents #
- W0 — the reusable one-step decomposition.
nbWalksFrom_succ_eq_biUnionexhibits the length-(k+1)non-backtracking walks fromxas the disjointbiUnionof the one-edge extensions of the length-kwalks (k ≥ 1), withpairwiseDisjoint_nbExtend, the fiber cardinalitycard_nbExtend(= deg (prefix end) − 1), and the endpoint/penultimate fiber factsadj_of_mem_nbExtend/penultimate_of_mem_nbExtend. Both the cardinality (already landed) and every weighted marginal below then reduce throughFinset.sum_biUnion. No new mathematics — this simply extracts the decomposition buried incard_nbWalksFrom_succ. - W1 — the AHL walk weight.
nbWeight ⟨v, p⟩ = ∏_{1 ≤ j < len} (deg (getVert j) − 1)⁻¹(the product over the intermediate vertices only). It is positive underδ ≥ 2(nbWeight_pos), is1on walks of length≤ 1(nbWeight_one), and multiplies by exactly(deg end − 1)⁻¹under a one-edge extension (nbWeight_concat) — the mass-conservation identity driving the exact degree-bias. - W2 — the marginal sums. Over the global sigma finset
nbAll k(all length-knon-backtracking walks, tagged by start): the last-edge marginalnbLastWeight k u v(walks ending atvwith penultimateu), the end marginalnbEndWeight k v(walks ending atv), and the totalnbWeightTotal k. Their exact values (= 1,= deg v,= D) are AHL's stationarityxP = x, proved in the follow-up node W3–W5, not here; this file lands the defs and their membership rewritemem_nbAll.
Formalization note — directed edges as (penultimate, end) pairs, not SimpleGraph.Dart #
AHL runs its stationary walk over the D directed edges; the xP = x identity is a statement
about the last directed edge of a walk. Mathlib offers SimpleGraph.Dart, but the landed
counting vocabulary already carries the whole walk, whose last directed edge (penultimate, end)
is recovered by Walk.penultimate and the endpoint tag s.1. We therefore formalize a directed
edge as that (penultimate, end) pair and phrase the last-edge marginal nbLastWeight as a filter
on those two fields — keeping the marginal identities as sums over the already-landed nbWalksFrom
finsets with no Dart-to-walk bridge. (Walk.penultimate_concat is already in Mathlib, so the
"penultimate of an extension" fiber fact needs no fresh lemma.)
W0 — the reusable one-step decomposition #
Disjointness of the extension fibers. Over distinct prefix walks the one-edge
non-backtracking extension sets nbExtend G x are disjoint: a shared extension p.concat _
determines its prefix p via Walk.concat_inj. This is the disjointness the biUnion
decomposition and every weighted regrouping below rely on.
Fiber cardinality. A prefix walk s (non-nil, so its endpoint has a penultimate) has
exactly deg s.1 − 1 non-backtracking extensions — one per neighbour of the endpoint other than
the arrived-from vertex. This is nb_extension_count transported across the image.
Penultimate of an extension. Every extension of s has the prefix endpoint s.1 as its
penultimate vertex: the old endpoint becomes the new intermediate vertex. (Immediate from
Walk.penultimate_concat.)
The one-step decomposition (W0). For k ≥ 1, the length-(k+1) non-backtracking walks
from x are exactly the disjoint union of the one-edge non-backtracking extensions of the
length-k ones. Extracted from the proof of card_nbWalksFrom_succ; the cardinality and every
weighted marginal of the AHL assembly are read off this identity via Finset.sum_biUnion.
W1 — the AHL walk weight #
The AHL walk weight. For a length-len non-backtracking walk s = ⟨v, p⟩ starting at x,
the weight is the product ∏_{1 ≤ j < len} (deg (p.getVert j) − 1)⁻¹ over the intermediate
vertices only (endpoints 0 and len excluded; the empty product is 1 when len ≤ 1). This is
AHL's non-returning-walk probability, cleared of the uniform starting mass.
Equations
- ACMax.nbWeight s = ∏ j ∈ Finset.Ico 1 s.snd.length, (↑(G.degree (s.snd.getVert j)) - 1)⁻¹
Instances For
Unfolding of nbWeight on an explicit sigma constructor.
The weight is 1 on short walks. For a walk of length ≤ 1 the intermediate range
Ico 1 len is empty, so the weight is the empty product 1.
Positivity. Under δ ≥ 2 every factor (deg (getVert j) − 1)⁻¹ is positive, so the whole
weight is positive.
Weight under a one-edge extension (mass conservation). Extending a non-nil walk
p : G.Walk x v by an edge h : G.Adj v t multiplies the weight by exactly (deg v − 1)⁻¹ — the
old endpoint v becomes the new intermediate vertex. This is the whole AHL trick: the weighted
end-count obeys an exact degree law (unlike the raw end-count).
W2 — the marginal sums #
The global sigma finset of all length-k non-backtracking walks, tagged by their start: an
element ⟨x, ⟨v, p⟩⟩ is a length-k non-backtracking walk p : G.Walk x v.
Equations
- ACMax.nbAll k = Finset.univ.sigma fun (x : V) => ACMax.nbWalksFrom G x k
Instances For
Membership in nbAll: ⟨x, ⟨v, p⟩⟩ lies in nbAll k iff p has length k and is
non-backtracking (the start ranges over all of V).
The last-edge marginal (AHL's xP = x, def only). The total weight of the length-k
non-backtracking walks whose last directed edge is (u, v) — i.e. ending at v with penultimate
u. Its value 1 (for k ≥ 1, G.Adj u v) is the stationarity identity proved in node W3.
Equations
- ACMax.nbLastWeight k u v = ∑ t ∈ ACMax.nbAll k with t.snd.fst = v ∧ t.snd.snd.penultimate = u, ACMax.nbWeight t.snd
Instances For
The end marginal (def only). The total weight of the length-k non-backtracking walks
ending at v; its value deg v (node W4) is the marginal of nbLastWeight over the neighbours of
v.
Equations
- ACMax.nbEndWeight k v = ∑ t ∈ ACMax.nbAll k with t.snd.fst = v, ACMax.nbWeight t.snd
Instances For
The total weight (def only). The total weight of all length-k non-backtracking walks;
its value D = ∑ v, deg v (node W5) is the normalization ∑_v nbEndWeight k v.
Equations
- ACMax.nbWeightTotal k = ∑ t ∈ ACMax.nbAll k, ACMax.nbWeight t.snd