Begin with a three-state orbit

Take the finite base space

\[ \Omega=\{0,1,2\} \]

and let \(T\) move clockwise:

\[ 0\longmapsto1\longmapsto2\longmapsto0. \]

Give every state probability \(1/3\). The map preserves this measure because it permutes equally weighted atoms. Every subset is measurable, and every real-valued function on this finite discrete space is measurable.

Define the one-step values

\[ X_1(0)=9,\qquad X_1(1)=1,\qquad X_1(2)=2. \]

Their one-step expectation is

\[ \frac{9+1+2}{3}=4. \]

The finite one-step orbit sum is

\[ S_n(\omega) {} = \sum_{j=0}^{n-1}X_1(T^j\omega). \]

Now define the complete process by subtracting a deterministic penalty:

\[ X_n(\omega)=S_n(\omega)-n(n-1). \]

This is not circular. The right side uses the already specified one-step function \(X_1\); the penalty vanishes at \(n=1\), so the formula reproduces the three one-step values exactly.

Finally, subtract the one-step orbit sum:

\[ Y_n(\omega)=X_n(\omega)-S_n(\omega). \]

For this model,

\[ Y_n(\omega)=-n(n-1) \]

at every state. The residual is zero at horizons zero and one, then strictly negative.

Why this process is genuinely subadditive

The orbit sum has the exact shifted addition law

\[ S_{m+n}(\omega) {} = S_m(\omega)+S_n(T^m\omega). \]

The penalty satisfies

\[ (m+n)(m+n-1) {} = m(m-1)+n(n-1)+2mn. \]

Subtract the second identity from the first:

\[ \begin{aligned} X_{m+n}(\omega) &= X_m(\omega)+X_n(T^m\omega)-2mn\\ &\le X_n(T^m\omega)+X_m(\omega). \end{aligned} \]

So this is an exact shifted-subadditive process. The gap in the inequality is \(2mn\), independent of the state.

Read the finite horizon ledger

The first five horizons are:

Horizon \(n\)\(S_n\) at states \(0,1,2\)\(X_n\) at states \(0,1,2\)\(Y_n=X_n-S_n\)
\(0\)\([0,0,0]\)\([0,0,0]\)\([0,0,0]\)
\(1\)\([9,1,2]\)\([9,1,2]\)\([0,0,0]\)
\(2\)\([10,3,11]\)\([8,1,9]\)\([-2,-2,-2]\)
\(3\)\([12,12,12]\)\([6,6,6]\)\([-6,-6,-6]\)
\(4\)\([21,13,14]\)\([9,1,2]\)\([-12,-12,-12]\)

The target theorem calls \(S_n\) a majorant because

\[ X_n(\omega)\le S_n(\omega) \]

pointwise. In this model the difference is exactly \(n(n-1)\).

At horizon three, the finite normalized split is especially transparent:

\[ \frac{X_3}{3} {} = \frac{Y_3}{3}+\frac{S_3}{3}, \qquad 2=-2+4. \]

This is an equality of three finite numbers. It does not assert that any sequence converges as \(n\) grows.

Three equally likely states form a cycle with one-step values nine, one, and two. A table gives the orbit-majorant, process, and centered residual vectors from horizons zero through four. At horizon three they are twelve, six, and minus six at every state. A normalized badge shows two equals minus two plus four, and an analytic badge shows absolute means six for the process and residual.
FigureExact finite ledger: \(S_n\) adds the one-step values along the orbit, \(X_n=S_n-n(n-1)\), and \(Y_n=X_n-S_n=-n(n-1)\). At horizon three, the normalized identity is \(2=-2+4\). Because the base is finite and discrete, every displayed function is measurable; the finite absolute means establish integrability without an asymptotic theorem.

Measurability and integrability are visible here

On this finite probability space, the integral of a function \(f:\Omega\to\mathbb R\) is

\[ \int_\Omega f\,d\mu {} = \frac{f(0)+f(1)+f(2)}{3}. \]

Integrability asks for a finite integral of the absolute value:

\[ \int_\Omega |f|\,d\mu\lt\infty. \]

At horizon three,

\[ \int_\Omega |X_3|\,d\mu=6, \qquad \int_\Omega |Y_3|\,d\mu=6, \qquad \int_\Omega |S_3|\,d\mu=12. \]

All are finite. The same reasoning works at every fixed horizon because each function is a finite list of finite real numbers.

This small model separates three interfaces:

The general Lean theorem cannot use “finite list” as its proof. Instead, the candidate supplies integrability of every \(X_n\), and measure preservation transports integrability of \(X_1\) to \(X_1\circ T^j\). Finite-sum closure then proves the Birkhoff sum integrable. Subtracting two integrable real functions proves the centered horizon integrable.

No probability normalization is required by the module. The uniform probability measure only makes this example and its expectations concrete.

The shift is determined by the early block

Now use the same model to split horizon three as

\[ 3=m+n,\qquad m=1,\quad n=2, \]

starting at state \(\omega=2\).

The early block has length one:

\[ X_1(2)=2. \]

After consuming it, the later block begins at

\[ T^m\omega=T^1(2)=0. \]

The correct later value is

\[ X_2(0)=8. \]

The shifted-subadditive theorem therefore reads

\[ X_3(2)=6\le X_2(T^1(2))+X_1(2)=8+2=10. \]

The gap is \(4=2mn\), exactly as the process formula predicted.

The orbit majorant splits with equality:

\[ S_3(2) {} = S_1(2)+S_2(T^1(2)) {} = 2+10 {} = 12. \]

The exponent on \(T\) is \(m\), the length of the early block. It is not the length \(n\) of the later block.

A wrong shift that actually breaks the inequality

If one mistakenly starts the later block at \(T^n\omega=T^2(2)=1\), then

\[ X_2(1)=1. \]

The false calculation becomes

\[ 6\le1+2=3, \]

which is wrong. This is more than an aesthetic indexing complaint: the incorrect shift produces a false theorem on a three-point example.

Two other seductive meanings of “centered”

The project definition subtracts majorant from process:

\[ Y_3=X_3-S_3=6-12=-6. \]

Reversing the subtraction gives \(S_3-X_3=+6\), destroying the nonpositivity conclusion.

Subtracting the expectation of \(X_1\) is a different legitimate operation:

\[ X_1-\mathbb E[X_1]=(5,-3,-2). \]

That vector has mean zero, but it is neither identically zero nor pointwise nonpositive. The project theorem is not expectation centering. It is pointwise compensation by an additive orbit majorant.

Starting at state two, a horizon-three process is split into an early block of length one and later block of length two. The correct later start is T to the first power of state two, state zero, and six is at most eight plus two. The wrong T squared start is state one and gives the false inequality six is at most one plus two. Three lower cards compare the correct residual minus six, the wrong-sign residual plus six, and expectation-centered values five, minus three, minus two.
FigureShift and sign audit: the later block starts at \(T^m\omega\) because \(m\) early steps have been consumed. Replacing it by \(T^n\omega\) makes \(6\le3\) in this ledger. The lower cards separate orbit-majorant compensation from reversed subtraction and from expectation centering.

Choose a route up

RouteBegin withDestination
First encounterThe three-state orbitCompute \(S_n\), \(X_n\), and \(Y_n\) exactly
Analytic routeMeasurability and integrabilityConnect finite absolute means to the general interfaces
Shift routeThe early block decides the shiftSee \(T^m\omega\) and a numerical failure of \(T^n\omega\)
Lean routeSeven bridgesTranslate each human claim into exact syntax
Hands-on routeRun the worksheetRecheck every integer, rational mean, and failed inequality
Proof routeWhy the generic theorem worksFollow majorization, cancellation, and integrability
Interface routeThe complete declaration mapAudit all public declarations and private helpers
Summit routeWhat has and has not been provedKeep the finite split separate from limits

Learning objectives

By the summit, you should be able to reproduce the three-state ledger; prove its shifted subadditivity with exact slack \(2mn\); explain why the correct later start is \(T^m\omega\); distinguish orbit-majorant and expectation centering; read seven Lean bridges token by token; execute the bounded Std worksheet; explain how preservation transports integrability; reconstruct centered subadditivity by cancellation; audit all eighteen public declarations and two private helpers; and state precisely which normalized, ergodic, cocycle, and Lyapunov conclusions remain absent.

In Lean: seven bridges from orbit slack to the cocycle

Bridge one: subtract the finite one-step Birkhoff sum

One idea, three languages Read across, then read the syntax map
A human says
At horizon n, subtract the sum of the one-step process values along the first n orbit states.
On paper
\(Y_n(\omega)=X_n(\omega)-\sum_{j=0}^{n-1}X_1(T^j\omega).\)
In Lean
centeredProcess T X n ω
Syntax map
  • T is the base self-map.
  • X has type ℕ → Ω → ℝ.
  • n is the finite horizon and ω the starting state.
  • birkhoffSum T (X 1) n ω samples indices \(0,\ldots,n-1\).
  • The subtraction order is process minus orbit majorant.
  • No measure, probability, integrability, or convergence premise appears in the definition.

The simplification theorems say centeredProcess T X 0 = X 0 and centeredProcess T X 1 = 0. At time zero the Birkhoff sum is empty; at time one it is exactly \(X_1\).

Bridge two: majorize every positive horizon

One idea, three languages Read across, then read the syntax map
A human says
For a positive horizon, shifted subadditivity makes the one-step orbit sum a pointwise upper bound.
On paper
\(n\ne0\Longrightarrow X_n(\omega)\le\sum_{j=0}^{n-1}X_1(T^j\omega).\)
In Lean
hX.oneStepBirkhoffMajorant_of_ne_zero n hn ω
Syntax map
  • hX is an IsIntegrableSubadditiveProcessCandidate T μ X.
  • hn : n ≠ 0 selects the positive-horizon theorem.
  • The proof uses only hX.add_le, not the candidate’s integrability field.
  • The induction appends \(X_1(T^n\omega)\) at the correct shifted state.
  • A separate theorem hX.oneStepBirkhoffMajorant hX0 n ω includes \(n=0\) when hX0 : X 0 = 0.

Bridge three: turn the majorant into a sign theorem

One idea, three languages Read across, then read the syntax map
A human says
Subtracting the pointwise upper bound leaves a nonpositive residual.
On paper
\(Y_n(\omega)\le0.\)
In Lean
hX.centeredProcess_nonpos hX0 n ω
Syntax map
  • The uniform theorem uses exact time-zero normalization hX0 : X 0 = 0.
  • Without it, use centeredProcess_nonpos_of_ne_zero n hn ω.
  • The proof is the ordered-ring equivalence sub_nonpos.mpr.
  • It is pointwise, not almost everywhere.
  • It does not claim the residual has mean zero.

Bridge four: preserve the shifted-subadditive structure

One idea, three languages Read across, then read the syntax map
A human says
The centered residual obeys the same shifted subadditive inequality as the original process.
On paper
\(Y_{m+n}(\omega)\le Y_n(T^m\omega)+Y_m(\omega).\)
In Lean
hX.centeredProcess_add_le m n ω
Syntax map
  • The later block is evaluated at T^[m] ω.
  • birkhoffSum_add splits the orbit sum at that same state.
  • Subtracting an exact additive identity from a subadditive inequality leaves a subadditive inequality.
  • Integrability and \(X_0=0\) are not used by this proof.
  • The three-state wrong-shift calculation above shows why replacing m by n is invalid.

Bridge five: preserve finite-horizon integrability

One idea, three languages Read across, then read the syntax map
A human says
If the base preserves the measure, every centered finite-horizon function is integrable.
On paper
\(T_*\mu=\mu\Longrightarrow Y_n\in L^1(\mu).\)
In Lean
hX.integrable_centeredProcess hT n
Syntax map
  • hX.integrable n gives integrability of \(X_n\).
  • hT : MeasurePreserving T μ μ transports one-step integrability along all orbit iterates.
  • integrable_birkhoffSum_blocks adds the finite family.
  • Integrable.sub closes under subtraction.
  • Probability normalization, ergodicity, and time-zero normalization are not required.

The companion hX.centeredProcess_candidate hT packages both this integrability field and bridge four into a new process candidate.

Bridge six: split the normalized finite value

One idea, three languages Read across, then read the syntax map
A human says
Dividing the defining equality by the horizon separates the original value into a centered quotient and a one-step Birkhoff average.
On paper
\(X_n(\omega)/n=Y_n(\omega)/n+\frac1n\sum_{j=0}^{n-1}X_1(T^j\omega).\)
In Lean
normalized_eq_centered_add_birkhoffAverage n ω
Syntax map
  • (n : ℝ) coerces the natural horizon to a real number.
  • birkhoffAverage ℝ T (X 1) n ω is the totalized finite average.
  • At n = 0, real division and the Birkhoff average both totalize to zero; the identity remains true.
  • The theorem needs no measurability, integrability, or preservation.
  • An equality for every finite \(n\) is not a convergence theorem for either right-hand branch.

Bridge seven: specialize the reduction to cocycle positive-log growth

One idea, three languages Read across, then read the syntax map
A human says
For the matrix cocycle, subtract the existing one-step log-positive orbit sum from the finite-horizon log-positive norm.
On paper
\(Y_n^C(\omega)=P_n(\omega)-S_n(\omega)\le0.\)
In Lean
C.centeredLogPlusNormObservable_nonpos n ω
Syntax map
  • C.centeredLogPlusNormObservable n is centeredProcess C.base C.logPlusNormObservable n.
  • The prior orbitLogPlusSum is definitionally the corresponding Mathlib Birkhoff sum.
  • The pointwise sign theorem needs the cocycle but not its integrability hypothesis.
  • Shifted subadditivity is C.centeredLogPlusNormObservable_add_le m n ω.
  • Only hC.centeredLogPlusNormObservable_candidate needs HasIntegrableGeneratorLogPlus.
  • Positive log still erases contraction and exact collapse before centering.

Check the exact project interface

Try it in the repository NonlinearDynamics/Random/RandomCocycles/SubadditiveCentering.lean

Full project check: pinned project plus Mathlib. A temporary project scratch file can inspect the complete public surface:

import NonlinearDynamics.Random.RandomCocycles.SubadditiveCentering

open NonlinearDynamics.Random.RandomCocycles

#print centeredProcess
#check centeredProcess_zero
#check centeredProcess_one
#check IsIntegrableSubadditiveProcessCandidate.oneStepBirkhoffMajorant_of_ne_zero
#check IsIntegrableSubadditiveProcessCandidate.oneStepBirkhoffMajorant
#check IsIntegrableSubadditiveProcessCandidate.centeredProcess_nonpos_of_ne_zero
#check IsIntegrableSubadditiveProcessCandidate.centeredProcess_nonpos
#check IsIntegrableSubadditiveProcessCandidate.centeredProcess_add_le
#check IsIntegrableSubadditiveProcessCandidate.integrable_centeredProcess
#check IsIntegrableSubadditiveProcessCandidate.centeredProcess_candidate
#check normalized_eq_centered_add_birkhoffAverage
#check DiscreteMatrixCocycle.birkhoffSum_logPlusNormObservable_one_eq_orbitLogPlusSum
#print DiscreteMatrixCocycle.centeredLogPlusNormObservable
#check DiscreteMatrixCocycle.centeredLogPlusNormObservable_apply
#check DiscreteMatrixCocycle.centeredLogPlusNormObservable_nonpos
#check DiscreteMatrixCocycle.centeredLogPlusNormObservable_add_le
#check DiscreteMatrixCocycle.HasIntegrableGeneratorLogPlus.centeredLogPlusNormObservable_candidate
#check DiscreteMatrixCocycle.logPlusNormObservable_normalized_eq_centered_add_birkhoffAverage

The two raw-algebra helpers are private and therefore absent from this external interface. The full project command rendered below checks the authoritative module with the pinned toolchain and dependencies.

Full project check, from the repository root
cd formalization
lake env lean -DwarningAsError=true NonlinearDynamics/Random/RandomCocycles/SubadditiveCentering.lean

Resource note: this exact file uses the repository's pinned Lean and Mathlib dependencies. Initial project setup can require substantial disk space and build time. For a lightweight first step on macOS or Linux, use the page's standalone Lean-core or Std tutorial.

Type the entire ledger with Lean and Std

The project theorem uses Mathlib’s Birkhoff sums, measures, integrability, and cocycle interfaces. The complete finite arithmetic can be checked first by a bounded file that imports only Std.

Create a scratch directory outside formalization/. Save this exact block as OrbitMajorantCenteringTutorial.lean:

import Std

namespace OrbitMajorantCenteringTutorial

/-
Three equally weighted states form the cycle 0 → 1 → 2 → 0.
The one-step process values are 9, 1, and 2.

The finite process is deliberately subadditive:

  X_n(ω) = S_n(ω) - n(n - 1),

where S_n is the orbit sum of the one-step values.  Its centered residual is
therefore Y_n(ω) = -n(n - 1).
-/

def nextState (state : Nat) : Nat :=
  (state + 1) % 3

def iterateState (steps state : Nat) : Nat :=
  (state + steps) % 3

def oneStep (state : Nat) : Int :=
  match state % 3 with
  | 0 => 9
  | 1 => 1
  | _ => 2

def orbitSum (state horizon : Nat) : Int :=
  ((List.range horizon).map
    (fun j => oneStep (iterateState j state))).sum

def penalty (horizon : Nat) : Int :=
  (horizon : Int) * ((horizon : Int) - 1)

def process (state horizon : Nat) : Int :=
  orbitSum state horizon - penalty horizon

def oneStepMajorant (state horizon : Nat) : Int :=
  ((List.range horizon).map
    (fun j => process (iterateState j state) 1)).sum

def centered (state horizon : Nat) : Int :=
  process state horizon - oneStepMajorant state horizon

def processVector (horizon : Nat) : List Int :=
  (List.range 3).map (fun state => process state horizon)

def majorantVector (horizon : Nat) : List Int :=
  (List.range 3).map (fun state => oneStepMajorant state horizon)

def centeredVector (horizon : Nat) : List Int :=
  (List.range 3).map (fun state => centered state horizon)

def uniformMean (values : List Int) : Rat :=
  (values.sum : Rat) / values.length

def uniformAbsoluteMean (values : List Int) : Rat :=
  (((values.map Int.natAbs).sum : Nat) : Rat) / values.length

structure HorizonLedger where
  horizon : Nat
  majorant : List Int
  process : List Int
  centered : List Int
  processMean : Rat
  centeredAbsoluteMean : Rat
  deriving Repr, DecidableEq

def horizonLedger (horizon : Nat) : HorizonLedger :=
  { horizon := horizon
    majorant := majorantVector horizon
    process := processVector horizon
    centered := centeredVector horizon
    processMean := uniformMean (processVector horizon)
    centeredAbsoluteMean := uniformAbsoluteMean (centeredVector horizon) }

structure ShiftLedger where
  start : Nat
  earlyLength : Nat
  laterLength : Nat
  fullProcess : Int
  earlyProcess : Int
  correctLaterStart : Nat
  correctLaterProcess : Int
  correctRightSide : Int
  correctInequality : Bool
  wrongLaterStart : Nat
  wrongLaterProcess : Int
  wrongRightSide : Int
  wrongInequality : Bool
  fullMajorant : Int
  correctMajorantPieces : Int × Int
  wrongMajorantPieces : Int × Int
  deriving Repr, DecidableEq

def shiftLedger : ShiftLedger :=
  let state := 2
  let m := 1
  let n := 2
  let full := process state (m + n)
  let early := process state m
  let correctStart := iterateState m state
  let correctLater := process correctStart n
  let correctRight := correctLater + early
  let wrongStart := iterateState n state
  let wrongLater := process wrongStart n
  let wrongRight := wrongLater + early
  { start := state
    earlyLength := m
    laterLength := n
    fullProcess := full
    earlyProcess := early
    correctLaterStart := correctStart
    correctLaterProcess := correctLater
    correctRightSide := correctRight
    correctInequality := decide (full ≤ correctRight)
    wrongLaterStart := wrongStart
    wrongLaterProcess := wrongLater
    wrongRightSide := wrongRight
    wrongInequality := decide (full ≤ wrongRight)
    fullMajorant := oneStepMajorant state (m + n)
    correctMajorantPieces :=
      (oneStepMajorant state m, oneStepMajorant correctStart n)
    wrongMajorantPieces :=
      (oneStepMajorant state m, oneStepMajorant wrongStart n) }

def wrongSignCentered (state horizon : Nat) : Int :=
  oneStepMajorant state horizon - process state horizon

def expectationCenteredOneStep (state : Nat) : Int :=
  process state 1 - 4

def unshiftedRepeatedCentering (state horizon : Nat) : Int :=
  process state horizon - (horizon : Int) * process state 1

def constantOneProcess (_state _horizon : Nat) : Int :=
  1

def constantOneCentered (horizon : Nat) : Int :=
  constantOneProcess 0 horizon -
    ((List.range horizon).map
      (fun _ => constantOneProcess 0 1)).sum

def normalizedHorizonThree : Rat × Rat × Rat :=
  ((process 0 3 : Rat) / 3,
    (centered 0 3 : Rat) / 3,
    (oneStepMajorant 0 3 : Rat) / 3)

#eval (List.range 3).map oneStep
#eval (List.range 5).map horizonLedger
#eval shiftLedger
#eval (List.range 3).map (fun state => wrongSignCentered state 3)
#eval (List.range 3).map expectationCenteredOneStep
#eval (centered 2 3, unshiftedRepeatedCentering 2 3)
#eval (List.range 4).map constantOneCentered
#eval normalizedHorizonThree

example : (List.range 3).map oneStep = [9, 1, 2] := by
  native_decide

example : majorantVector 2 = [10, 3, 11] := by native_decide
example : processVector 2 = [8, 1, 9] := by native_decide
example : centeredVector 2 = [-2, -2, -2] := by native_decide

example : majorantVector 3 = [12, 12, 12] := by native_decide
example : processVector 3 = [6, 6, 6] := by native_decide
example : centeredVector 3 = [-6, -6, -6] := by native_decide

example : (List.range 9).all fun horizon =>
    (List.range 3).all fun state =>
      decide (process state horizon ≤ oneStepMajorant state horizon) := by
  native_decide

example : shiftLedger.correctLaterStart = 0 := by native_decide
example : shiftLedger.correctRightSide = 10 := by native_decide
example : shiftLedger.correctInequality = true := by native_decide
example : shiftLedger.wrongLaterStart = 1 := by native_decide
example : shiftLedger.wrongRightSide = 3 := by native_decide
example : shiftLedger.wrongInequality = false := by native_decide
example : shiftLedger.correctMajorantPieces = (2, 10) := by native_decide
example : shiftLedger.wrongMajorantPieces = (2, 3) := by native_decide

example : uniformAbsoluteMean (processVector 3) = 6 := by native_decide
example : uniformAbsoluteMean (centeredVector 3) = 6 := by native_decide
example : normalizedHorizonThree = (2, -2, 4) := by native_decide

example : (List.range 3).map expectationCenteredOneStep = [5, -3, -2] := by
  native_decide

example : (List.range 4).map constantOneCentered = [1, 0, -1, -2] := by
  native_decide

end OrbitMajorantCenteringTutorial

Open a terminal in that scratch directory and type:

source "$HOME/.elan/env"
elan run leanprover/lean4:v4.32.0 lean OrbitMajorantCenteringTutorial.lean

Resource label: small standalone Lean tutorial, ordinary Mac or Linux. This exact worksheet was executed with Lean 4.32.0 and printed this complete transcript:

[9, 1, 2]
[{ horizon := 0,
   majorant := [0, 0, 0],
   process := [0, 0, 0],
   centered := [0, 0, 0],
   processMean := 0,
   centeredAbsoluteMean := 0 },
 { horizon := 1,
   majorant := [9, 1, 2],
   process := [9, 1, 2],
   centered := [0, 0, 0],
   processMean := 4,
   centeredAbsoluteMean := 0 },
 { horizon := 2,
   majorant := [10, 3, 11],
   process := [8, 1, 9],
   centered := [-2, -2, -2],
   processMean := 6,
   centeredAbsoluteMean := 2 },
 { horizon := 3,
   majorant := [12, 12, 12],
   process := [6, 6, 6],
   centered := [-6, -6, -6],
   processMean := 6,
   centeredAbsoluteMean := 6 },
 { horizon := 4,
   majorant := [21, 13, 14],
   process := [9, 1, 2],
   centered := [-12, -12, -12],
   processMean := 4,
   centeredAbsoluteMean := 12 }]
{ start := 2,
  earlyLength := 1,
  laterLength := 2,
  fullProcess := 6,
  earlyProcess := 2,
  correctLaterStart := 0,
  correctLaterProcess := 8,
  correctRightSide := 10,
  correctInequality := true,
  wrongLaterStart := 1,
  wrongLaterProcess := 1,
  wrongRightSide := 3,
  wrongInequality := false,
  fullMajorant := 12,
  correctMajorantPieces := (2, 10),
  wrongMajorantPieces := (2, 3) }
[6, 6, 6]
[5, -3, -2]
(-6, 0)
[1, 0, -1, -2]
(2, -2, 4)

The first line is the one-step function. The next record list is the complete horizon-zero-through-four ledger. The shift record contains both the valid right side \(10\) and invalid right side \(3\), with the corresponding Boolean checks. The remaining lines expose the wrong sign, expectation centering, unshifted repeated subtraction, the constant-one time-zero boundary, and the normalized triple \(2,-2,4\).

The example declarations state all recorded values as propositions that Lean’s kernel checks. The nested Boolean check additionally verifies \(X_n\le S_n\) at all three states for horizons zero through eight. This worksheet models the finite arithmetic only. Mathlib’s actual birkhoffSum, MeasurePreserving, Integrable, and cocycle interfaces remain the full project check above.

Why the generic theorem works

The candidate separates algebra from analysis

The predecessor defines IsIntegrableSubadditiveProcessCandidate T μ X with exactly two fields:

integrable : ∀ k, Integrable (X k) μ
add_le : ∀ m n ω, X (m + n) ω ≤ X n (T^[m] ω) + X m ω

The structure does not store probability normalization, measure preservation, ergodicity, invertibility, or a limit. Measure preservation is requested only when a theorem actually pulls functions along the base orbit.

Positive-horizon majorization is pure induction

For \(n=1\), the Birkhoff sum contains only \(X_1(\omega)\), so the bound is equality. For the successor, shifted subadditivity gives

\[ X_{n+1}(\omega) \le X_1(T^n\omega)+X_n(\omega). \]

Apply the induction hypothesis to the second term and use Mathlib’s successor identity

\[ \operatorname{birkhoffSum}(T,X_1,n+1,\omega) {} = \operatorname{birkhoffSum}(T,X_1,n,\omega)+X_1(T^n\omega). \]

Only the candidate’s add_le field is read. The private helper oneStepBirkhoffMajorant_of_add_le makes that dependency explicit.

At \(n=0\), the Birkhoff sum is zero while subadditivity alone only forces \(X_0\ge0\). Exact normalization \(X_0=0\) is therefore a separate premise for the uniform theorem.

The constant-one boundary

On a singleton, let \(X_n=1\) for every \(n\). Then

\[ 1\le1+1, \]

so the process is subadditive and every horizon is integrable. Its centered values are

\[ (1,0,-1,-2,\ldots). \]

Positive horizons are nonpositive, but \(Y_0=1\). This model is a counterexample to the uniform nonpositivity theorem with the X 0 = 0 premise removed.

Centered subadditivity is cancellation

Let \(A_n\) denote the Birkhoff sum of \(X_1\). Mathlib proves

\[ A_{m+n}(\omega) {} = A_m(\omega)+A_n(T^m\omega). \]

Subtract this equality from

\[ X_{m+n}(\omega) \le X_n(T^m\omega)+X_m(\omega). \]

Regrouping produces

\[ Y_{m+n}(\omega) \le Y_n(T^m\omega)+Y_m(\omega). \]

The source’s first private helper, centeredProcess_add_le_of_add_le, performs exactly this rewrite and finishes with linear arithmetic. It needs neither integrability nor time-zero normalization.

Integrability uses preservation at one narrow gate

The candidate already says \(X_n\) and \(X_1\) are integrable. If \(T\) preserves \(\mu\), then every iterate \(T^j\) preserves \(\mu\), so

\[ X_1\circ T^j \]

is integrable. The finite Birkhoff sum is integrable by finite-sum closure. Then

\[ Y_n=X_n-A_n \]

is integrable by closure under subtraction.

Without preservation, composition can move mass into a heavy part of an integrable function and destroy integrability. The premise is analytic, not decorative.

The complete eighteen-declaration map

The source contains two private raw-algebra helpers and eighteen public declarations.

Private helpers in source order

HelperExact dependency
centeredProcess_add_le_of_add_leA raw shifted-subadditive inequality and the Birkhoff addition law
oneStepBirkhoffMajorant_of_add_leA raw shifted-subadditive inequality, positive horizon, and induction

Public declarations in source order

#DeclarationExact role
1centeredProcessDefines \(Y_n=X_n-\operatorname{birkhoffSum}(X_1)\)
2centeredProcess_zeroProves \(Y_0=X_0\)
3centeredProcess_oneProves \(Y_1=0\)
4oneStepBirkhoffMajorant_of_ne_zeroMajorizes every positive horizon
5oneStepBirkhoffMajorantIncludes time zero under \(X_0=0\)
6centeredProcess_nonpos_of_ne_zeroMakes every positive-horizon residual nonpositive
7centeredProcess_nonposMakes every residual nonpositive under \(X_0=0\)
8centeredProcess_add_lePreserves shifted subadditivity
9integrable_centeredProcessProves each \(Y_n\) integrable when \(T\) preserves \(\mu\)
10centeredProcess_candidateRepackages the centered family as an integrable subadditive candidate
11normalized_eq_centered_add_birkhoffAverageGives the totalized finite normalized identity
12birkhoffSum_logPlusNormObservable_one_eq_orbitLogPlusSumIdentifies the cocycle orbit sum definitionally
13centeredLogPlusNormObservableDefines the cocycle-centered positive-log process
14centeredLogPlusNormObservable_applyExpands it as \(P_n-S_n\)
15centeredLogPlusNormObservable_nonposProves cocycle-centered nonpositivity without integrability
16centeredLogPlusNormObservable_add_leProves cocycle-centered shifted subadditivity
17centeredLogPlusNormObservable_candidatePackages the cocycle family under one-step integrability
18logPlusNormObservable_normalized_eq_centered_add_birkhoffAverageSpecializes the finite normalized identity

Declarations 4 through 10 are methods in the IsIntegrableSubadditiveProcessCandidate namespace. Declarations 12 through 18 live in the DiscreteMatrixCocycle namespace.

The cocycle specialization is intentionally thin

For a discrete matrix cocycle, the earlier module defines

\[ P_n(\omega)=\log^+\lVert C(n,\omega)\rVert \]

and its one-step orbit sum

\[ S_n(\omega)=\sum_{j=0}^{n-1}P_1(T^j\omega). \]

The target proves by reflexivity that this \(S_n\) is Mathlib’s birkhoffSum with the same base, range, and iterate convention. It then defines

\[ Y_n^C=P_n-S_n. \]

The earlier pointwise majorant \(P_n\le S_n\) immediately yields \(Y_n^C\le0\), including time zero because \(P_0=0\). The earlier shifted subadditivity of \(P_n\) feeds the raw centering helper and proves shifted subadditivity of \(Y^C\).

These pointwise facts need no HasIntegrableGeneratorLogPlus. That hypothesis enters only when declaration 17 packages every centered horizon as integrable.

The cocycle normalized identity is

\[ \frac{P_n(\omega)}{n} {} = \frac{Y_n^C(\omega)}{n} {} + \operatorname{birkhoffAverage}(T,P_1,n,\omega). \]

It remains a finite equality. Positive log has already clipped contraction, so the residual cannot reconstruct signed logarithmic growth, inverse norms, or an Oseledets splitting.

A normalized finite process value splits into a normalized centered residual and a one-step orbit average. Both branches carry unresolved convergence questions, and a footer says that exact equality at every finite horizon is not a limit theorem.
FigureFinite identity, open asymptotics: dividing the defining equality by \(n\) reorganizes the same finite quantities. A limit for the left side still requires control of both right-hand branches through additional theorems and assumptions.

Edge cases that determine the theorem statements

Time zero is totalized, not ignored

Mathlib’s real division and Birkhoff average are total at zero:

\[ 0^{-1}=0,\qquad \operatorname{birkhoffAverage}(T,f,0,\omega)=0. \]

Therefore declaration 11 is algebraically true at \(n=0\). This does not make \(X_0/0\) a classical growth rate; it records Lean’s totalized field operations.

Candidate packaging does not need \(X_0=0\)

The centered candidate needs integrability and shifted subadditivity. Neither field asks for nonpositivity or a normalized time-zero value. The constant-one model has \(Y_0=1\) and still forms a valid centered candidate.

The zero measure is allowed

The generic module assumes an arbitrary measure. Under the zero measure, every measurable real-valued function is integrable and the identity map preserves the measure. No probability instance is used.

Empty matrix dimension is allowed

The cocycle layer assumes a finite matrix index type but not a nonempty one. In empty dimension the positive-log observable and its orbit sum are both zero, so the centered cocycle process is zero.

Additive processes are the zero-residual boundary

If \(X_n\) already equals the Birkhoff sum of \(X_1\), then \(Y_n=0\). The normalized identity reduces to

\[ X_n/n=\operatorname{birkhoffAverage}(T,X_1,n). \]

That still does not force the orbit average to converge. One can build a single binary orbit with alternating blocks whose lengths dominate everything before them; its empirical averages have subsequences near zero and one.

Exercises from foothill to summit

Foothill

  1. Starting at each state, compute \(S_2\) and recover \([10,3,11]\).
  2. Subtract \(2(2-1)\) and recover \(X_2=[8,1,9]\).
  3. Verify \(Y_2=[-2,-2,-2]\).
  4. Compute the three absolute means at horizon three.
  5. Check \(2=-2+4\) in the normalized horizon-three split.
  6. Explain why every function in the ledger is measurable.

Ridge

  1. Prove the exact penalty identity with the \(2mn\) cross term.
  2. Derive shifted subadditivity for the three-state process.
  3. Recompute the \(m=1,n=2,\omega=2\) correct split.
  4. Replace \(T^m\omega\) by \(T^n\omega\) and identify the false inequality.
  5. Prove the Birkhoff addition law by dividing the index range into its first \(m\) and next \(n\) terms.
  6. Reconstruct positive-horizon majorization by induction.
  7. Use the constant-one process to refute uniform nonpositivity without \(X_0=0\).
  8. Explain why expectation centering has mean zero but does not prove the target sign theorem.

Summit

  1. Translate integrable_centeredProcess into its three closure operations.
  2. Audit all eighteen public declarations and identify which proof fields each consumes.
  3. Explain why the normalized identity has no analytic premises.
  4. Build an additive process whose normalized orbit sum fails to converge.
  5. State the additional assumptions and theorem needed to obtain an almost-everywhere Birkhoff limit.
  6. State the stronger assumptions needed for a subadditive ergodic limit.
  7. Explain why the cocycle-centered positive-log process cannot recover negative logarithmic growth.
  8. Describe what a derivative-cocycle bridge would need before this scalar reduction could speak about nonlinear dynamics.

Reproduce the chapter

The bounded Std worksheet above is a standalone tutorial for an ordinary macOS or Linux host. The target module imports Mathlib and is a full project check. From the repository root, run:

cd formalization
lake env lean NonlinearDynamics/Random/RandomCocycles/SubadditiveCentering.lean

This command may require substantial disk space and memory. Passing automated checks would still leave human mathematical, source, accessibility, scientific-integrity, and editorial review pending.

Summit: what has and has not been proved

TopicStatus in RMT-19
Centered process \(X_n-\) one-step Birkhoff sumDefined
Time-zero valueExactly \(X_0\)
One-step centered valueExactly zero
Positive-horizon one-step majorantChecked from shifted subadditivity
Uniform majorant including zeroChecked under \(X_0=0\)
Positive-horizon centered nonpositivityChecked
Uniform centered nonpositivityChecked under \(X_0=0\)
Centered shifted subadditivityChecked by finite algebra
Centered finite-horizon integrabilityChecked under measure preservation
Centered candidate packagingChecked; no \(X_0=0\) needed
Totalized finite normalized identityChecked
Cocycle Birkhoff-sum bridgeDefinitionally checked
Cocycle-centered pointwise sign and subadditivityChecked without integrability
Cocycle-centered integrable candidateChecked under one-step positive-log integrability
Probability normalization or expectation centeringNot assumed
Mean-zero centered residualNot proved and generally false
Ergodicity, mixing, independence, or invertible baseNot assumed
Convergence of the one-step Birkhoff averageNot proved
Convergence of the normalized centered residualNot proved
Convergence of the normalized original processNot proved
Pointwise Birkhoff or Kingman theoremNot invoked
Signed logarithmic growth or inverse-tail controlNot proved
Lyapunov exponent, spectrum, filtration, or splittingNot defined or proved
Nonlinear derivative or random-Jacobian representationNot connected

The strongest justified summary is finite: subtracting the exact additive one-step orbit route exposes a nonpositive residual, preserves the shifted-subadditive structure, and, under measure preservation, preserves finite-horizon integrability. The normalized split prepares later arguments but proves no limit.

Where to continue

Finite Block Decomposition for Subadditive Processes is the immediate predecessor. It develops exact block-and-remainder bounds; the present one-step majorant is the block-length-one reduction.

Orbit-Majorant Centering Before Any Ergodic Limit is the Development Notebook companion that follows the Lean implementation and records its boundary probes.

The orbit-majorant centering glossary entry gives the compact operational definition. The Birkhoff sum entry isolates the finite orbit convention.

Finite Phase Averaging for Nonpositive Subadditive Processes is the immediate finite successor. It averages shifted block bounds across residue phases. It remains finite combinatorics, not an almost-everywhere theorem.

References

Mathlib contributors. Birkhoff sums, Mathlib 4 documentation. The exact pinned source defines the finite sum and its zero, one, successor, and shifted addition laws.

Mathlib contributors. Birkhoff averages, Mathlib 4 documentation. The pinned definition records the totalized finite average used by the normalized identity.

Mathlib contributors. Measure-preserving maps, Mathlib 4 documentation. This is the analytic interface used to transport integrability along the orbit.

Mathlib contributors. Integrable functions, Mathlib 4 documentation. The pinned source supplies composition under measure preservation and closure under finite sums and subtraction.

J. F. C. Kingman. The ergodic theory of subadditive stochastic processes, Journal of the Royal Statistical Society: Series B 30(3), 499–510, 1968. This is primary asymptotic context. RMT-19 proves a finite reduction only.

Steven P. Lalley. Kingman’s Subadditive Ergodic Theorem, University of Chicago lecture notes, undated, accessed 2026-07-21. These notes serve only as a teaching guide to later proof architecture.

Anders Karlsson and Gregory A. Margulis. A Multiplicative Ergodic Theorem and Nonpositively Curved Spaces, Communications in Mathematical Physics 208, 107–123, 1999. This paper is a later geometric destination. Its almost-sure tracking theorem is not used or formalized here.

The exact upstream revision audited for this chapter is Mathlib commit 81a5d257, the revision pinned by formalization/lake-manifest.json.