Pith. sign in

IndisputableMonolith.Foundation.SimplicialLedger.DirichletAction

IndisputableMonolith/Foundation/SimplicialLedger/DirichletAction.lean · 307 lines · 17 declarations

show as:
view math explainer →

open module explainer GitHub source

Explainer status: pending

   1import Mathlib.Data.Real.Basic
   2import Mathlib.Algebra.BigOperators.Fin
   3import Mathlib.Tactic.Linarith
   4import Mathlib.Tactic.Ring
   5
   6/-!
   7# Finite weighted-graph Dirichlet action
   8
   9This module isolates the finite weighted-graph action used by the simplicial
  10ledger continuum bridge. Its imports are Mathlib-only. The action, Laplacian,
  11and pairing identities below contain no physical normalization or continuum
  12endpoint assumptions.
  13-/
  14
  15namespace IndisputableMonolith
  16namespace Foundation
  17namespace SimplicialLedger
  18namespace ContinuumBridge
  19
  20noncomputable section
  21
  22/-! ## Definitions -/
  23
  24/-- A weighted simplicial graph representing the ledger. -/
  25structure WeightedLedgerGraph (n : ℕ) where
  26  weight : Fin n → Fin n → ℝ
  27  weight_nonneg : ∀ i j, 0 ≤ weight i j
  28  weight_symm : ∀ i j, weight i j = weight j i
  29
  30/-- The discrete Laplacian action (= quadratic J-cost) on the graph. -/
  31def laplacian_action {n : ℕ} (G : WeightedLedgerGraph n) (ε : Fin n → ℝ) : ℝ :=
  32  (1 / 2) * ∑ i : Fin n, ∑ j : Fin n, G.weight i j * (ε i - ε j) ^ 2
  33
  34/-- The discrete Laplacian of ε at vertex i:
  35    (Δε)_i = Σ_j w_ij · (ε_i − ε_j) -/
  36def discrete_laplacian {n : ℕ} (G : WeightedLedgerGraph n) (ε : Fin n → ℝ) (i : Fin n) : ℝ :=
  37  ∑ j : Fin n, G.weight i j * (ε i - ε j)
  38
  39/-- The finite pairing `⟨η, Δε⟩`. -/
  40def laplacian_pairing {n : ℕ} (G : WeightedLedgerGraph n)
  41    (η ε : Fin n → ℝ) : ℝ :=
  42  ∑ i : Fin n, η i * discrete_laplacian G ε i
  43
  44/-- The symmetric polar form of the discrete Laplacian action. -/
  45def laplacian_bilinear {n : ℕ} (G : WeightedLedgerGraph n)
  46    (ε η : Fin n → ℝ) : ℝ :=
  47  (1 / 2) * ∑ i : Fin n, ∑ j : Fin n,
  48    G.weight i j * (ε i - ε j) * (η i - η j)
  49
  50/-! ## Finite-sum algebra -/
  51
  52private theorem right_weighted_sum_eq_neg_left {n : ℕ}
  53    (G : WeightedLedgerGraph n) (ε η : Fin n → ℝ) :
  54    (∑ i : Fin n, ∑ j : Fin n,
  55        G.weight i j * (ε i - ε j) * η j)
  56      =
  57    -∑ i : Fin n, ∑ j : Fin n,
  58        G.weight i j * (ε i - ε j) * η i := by
  59  calc
  60    (∑ i : Fin n, ∑ j : Fin n,
  61        G.weight i j * (ε i - ε j) * η j)
  62        =
  63      ∑ j : Fin n, ∑ i : Fin n,
  64        G.weight i j * (ε i - ε j) * η j := by
  65          rw [Finset.sum_comm]
  66    _ =
  67      ∑ i : Fin n, ∑ j : Fin n,
  68        G.weight j i * (ε j - ε i) * η i := by
  69          rfl
  70    _ =
  71      ∑ i : Fin n, ∑ j : Fin n,
  72        G.weight i j * (ε j - ε i) * η i := by
  73          refine Finset.sum_congr rfl (fun i _ => ?_)
  74          refine Finset.sum_congr rfl (fun j _ => ?_)
  75          rw [G.weight_symm]
  76    _ =
  77      -∑ i : Fin n, ∑ j : Fin n,
  78        G.weight i j * (ε i - ε j) * η i := by
  79          rw [← Finset.sum_neg_distrib]
  80          refine Finset.sum_congr rfl (fun i _ => ?_)
  81          rw [← Finset.sum_neg_distrib]
  82          refine Finset.sum_congr rfl (fun j _ => ?_)
  83          ring
  84
  85private theorem pairing_eq_left_weighted_sum {n : ℕ}
  86    (G : WeightedLedgerGraph n) (ε η : Fin n → ℝ) :
  87    laplacian_pairing G η ε
  88      =
  89    ∑ i : Fin n, ∑ j : Fin n,
  90      G.weight i j * (ε i - ε j) * η i := by
  91  unfold laplacian_pairing discrete_laplacian
  92  calc
  93    (∑ i : Fin n, η i * ∑ j : Fin n,
  94        G.weight i j * (ε i - ε j))
  95        =
  96      ∑ i : Fin n, ∑ j : Fin n,
  97        η i * (G.weight i j * (ε i - ε j)) := by
  98          refine Finset.sum_congr rfl (fun i _ => ?_)
  99          rw [Finset.mul_sum]
 100    _ =
 101      ∑ i : Fin n, ∑ j : Fin n,
 102        G.weight i j * (ε i - ε j) * η i := by
 103          refine Finset.sum_congr rfl (fun i _ => ?_)
 104          refine Finset.sum_congr rfl (fun j _ => ?_)
 105          ring
 106
 107/-! ## Exact Dirichlet identities -/
 108
 109/-- The edge polar form is exactly the Laplacian pairing `⟨η, Δε⟩`. -/
 110theorem laplacian_bilinear_eq_pairing {n : ℕ}
 111    (G : WeightedLedgerGraph n) (ε η : Fin n → ℝ) :
 112    laplacian_bilinear G ε η = laplacian_pairing G η ε := by
 113  unfold laplacian_bilinear
 114  let L : ℝ :=
 115    ∑ i : Fin n, ∑ j : Fin n,
 116      G.weight i j * (ε i - ε j) * η i
 117  let R : ℝ :=
 118    ∑ i : Fin n, ∑ j : Fin n,
 119      G.weight i j * (ε i - ε j) * η j
 120  have hR : R = -L := by
 121    dsimp [R, L]
 122    exact right_weighted_sum_eq_neg_left G ε η
 123  have hdiff :
 124      (∑ i : Fin n, ∑ j : Fin n,
 125        G.weight i j * (ε i - ε j) * (η i - η j)) = 2 * L := by
 126    calc
 127      (∑ i : Fin n, ∑ j : Fin n,
 128        G.weight i j * (ε i - ε j) * (η i - η j))
 129          = L - R := by
 130              dsimp [L, R]
 131              rw [← Finset.sum_sub_distrib]
 132              refine Finset.sum_congr rfl (fun i _ => ?_)
 133              rw [← Finset.sum_sub_distrib]
 134              refine Finset.sum_congr rfl (fun j _ => ?_)
 135              ring
 136      _ = 2 * L := by
 137            rw [hR]
 138            ring
 139  calc
 140    (1 / 2) * ∑ i : Fin n, ∑ j : Fin n,
 141        G.weight i j * (ε i - ε j) * (η i - η j)
 142        = L := by
 143            rw [hdiff]
 144            ring
 145    _ = laplacian_pairing G η ε := by
 146          exact (pairing_eq_left_weighted_sum G ε η).symm
 147
 148/-- The polar form is symmetric in its two fields. -/
 149theorem laplacian_bilinear_comm {n : ℕ}
 150    (G : WeightedLedgerGraph n) (ε η : Fin n → ℝ) :
 151    laplacian_bilinear G ε η = laplacian_bilinear G η ε := by
 152  unfold laplacian_bilinear
 153  congr 1
 154  refine Finset.sum_congr rfl (fun i _ => ?_)
 155  refine Finset.sum_congr rfl (fun j _ => ?_)
 156  ring
 157
 158/-- The discrete Laplacian is self-adjoint for the finite pairing. -/
 159theorem laplacian_pairing_comm {n : ℕ}
 160    (G : WeightedLedgerGraph n) (ε η : Fin n → ℝ) :
 161    laplacian_pairing G η ε = laplacian_pairing G ε η := by
 162  rw [← laplacian_bilinear_eq_pairing G ε η,
 163    laplacian_bilinear_comm,
 164    laplacian_bilinear_eq_pairing]
 165
 166/-- The Dirichlet energy is exactly the Laplacian quadratic pairing. -/
 167theorem laplacian_action_eq_pairing {n : ℕ}
 168    (G : WeightedLedgerGraph n) (ε : Fin n → ℝ) :
 169    laplacian_action G ε = laplacian_pairing G ε ε := by
 170  calc
 171    laplacian_action G ε = laplacian_bilinear G ε ε := by
 172      unfold laplacian_action laplacian_bilinear
 173      congr 1
 174      refine Finset.sum_congr rfl (fun i _ => ?_)
 175      refine Finset.sum_congr rfl (fun j _ => ?_)
 176      ring
 177    _ = laplacian_pairing G ε ε :=
 178      laplacian_bilinear_eq_pairing G ε ε
 179
 180private theorem double_sum_mul_left {n : ℕ}
 181    (c : ℝ) (f : Fin n → Fin n → ℝ) :
 182    (∑ i : Fin n, ∑ j : Fin n, c * f i j)
 183      = c * ∑ i : Fin n, ∑ j : Fin n, f i j := by
 184  calc
 185    (∑ i : Fin n, ∑ j : Fin n, c * f i j)
 186        = ∑ i : Fin n, c * ∑ j : Fin n, f i j := by
 187            refine Finset.sum_congr rfl (fun i _ => ?_)
 188            rw [Finset.mul_sum]
 189    _ = c * ∑ i : Fin n, ∑ j : Fin n, f i j := by
 190          rw [Finset.mul_sum]
 191
 192/-- Exact polynomial expansion of the action along the line `ε + tη`.
 193The linear coefficient is forced to be `2 * ⟨η, Δε⟩` by the action's
 194ordered-edge normalization. -/
 195theorem laplacian_action_line_expansion {n : ℕ}
 196    (G : WeightedLedgerGraph n) (ε η : Fin n → ℝ) (t : ℝ) :
 197    laplacian_action G (fun i => ε i + t * η i)
 198      =
 199    laplacian_action G ε
 200      + 2 * t * laplacian_pairing G η ε
 201      + t ^ 2 * laplacian_action G η := by
 202  have hsum :
 203      (∑ i : Fin n, ∑ j : Fin n,
 204        G.weight i j *
 205          ((ε i + t * η i) - (ε j + t * η j)) ^ 2)
 206        =
 207      (∑ i : Fin n, ∑ j : Fin n,
 208        G.weight i j * (ε i - ε j) ^ 2)
 209        + 2 * t * (∑ i : Fin n, ∑ j : Fin n,
 210          G.weight i j * (ε i - ε j) * (η i - η j))
 211        + t ^ 2 * (∑ i : Fin n, ∑ j : Fin n,
 212          G.weight i j * (η i - η j) ^ 2) := by
 213    calc
 214      (∑ i : Fin n, ∑ j : Fin n,
 215        G.weight i j *
 216          ((ε i + t * η i) - (ε j + t * η j)) ^ 2)
 217          =
 218        ∑ i : Fin n, ∑ j : Fin n,
 219          (G.weight i j * (ε i - ε j) ^ 2
 220            + (2 * t) *
 221                (G.weight i j * (ε i - ε j) * (η i - η j))
 222            + t ^ 2 * (G.weight i j * (η i - η j) ^ 2)) := by
 223              refine Finset.sum_congr rfl (fun i _ => ?_)
 224              refine Finset.sum_congr rfl (fun j _ => ?_)
 225              ring
 226      _ =
 227        (∑ i : Fin n, ∑ j : Fin n,
 228          G.weight i j * (ε i - ε j) ^ 2)
 229          + (∑ i : Fin n, ∑ j : Fin n,
 230            (2 * t) *
 231              (G.weight i j * (ε i - ε j) * (η i - η j)))
 232          + (∑ i : Fin n, ∑ j : Fin n,
 233            t ^ 2 * (G.weight i j * (η i - η j) ^ 2)) := by
 234              simp only [Finset.sum_add_distrib]
 235      _ =
 236        (∑ i : Fin n, ∑ j : Fin n,
 237          G.weight i j * (ε i - ε j) ^ 2)
 238          + 2 * t * (∑ i : Fin n, ∑ j : Fin n,
 239            G.weight i j * (ε i - ε j) * (η i - η j))
 240          + t ^ 2 * (∑ i : Fin n, ∑ j : Fin n,
 241            G.weight i j * (η i - η j) ^ 2) := by
 242              rw [double_sum_mul_left (n := n) (c := 2 * t)]
 243              rw [double_sum_mul_left (n := n) (c := t ^ 2)]
 244  unfold laplacian_action
 245  rw [hsum]
 246  rw [← laplacian_bilinear_eq_pairing G ε η]
 247  unfold laplacian_bilinear
 248  ring
 249
 250/-! ## Unit dipole consequences -/
 251
 252/-- The unit source at `a` paired with the unit sink at `b`. -/
 253def unitDipole {n : ℕ} (a b : Fin n) (i : Fin n) : ℝ :=
 254  (if i = a then 1 else 0) - (if i = b then 1 else 0)
 255
 256/-- Pairing a field with a unit dipole gives its potential drop. -/
 257theorem sum_mul_unitDipole {n : ℕ} (ε : Fin n → ℝ) (a b : Fin n) :
 258    (∑ i : Fin n, ε i * unitDipole a b i) = ε a - ε b := by
 259  unfold unitDipole
 260  simp [mul_sub, Finset.sum_sub_distrib]
 261
 262/-- If the Laplacian is a unit dipole, the action is the potential drop. -/
 263theorem laplacian_action_eq_potential_drop_of_eq_unitDipole {n : ℕ}
 264    (G : WeightedLedgerGraph n) (ε : Fin n → ℝ) (a b : Fin n)
 265    (hsource : ∀ i, discrete_laplacian G ε i = unitDipole a b i) :
 266    laplacian_action G ε = ε a - ε b := by
 267  rw [laplacian_action_eq_pairing]
 268  unfold laplacian_pairing
 269  calc
 270    (∑ i : Fin n, ε i * discrete_laplacian G ε i)
 271        = ∑ i : Fin n, ε i * unitDipole a b i := by
 272            refine Finset.sum_congr rfl (fun i _ => ?_)
 273            rw [hsource i]
 274    _ = ε a - ε b := sum_mul_unitDipole ε a b
 275
 276/-- If twice the Laplacian is a unit dipole, the action is half the
 277potential drop. This is the alternative normalization exposed by the forced
 278coefficient `2` in the action variation. -/
 279theorem laplacian_action_eq_half_potential_drop_of_two_eq_unitDipole {n : ℕ}
 280    (G : WeightedLedgerGraph n) (ε : Fin n → ℝ) (a b : Fin n)
 281    (hsource : ∀ i, 2 * discrete_laplacian G ε i = unitDipole a b i) :
 282    laplacian_action G ε = (ε a - ε b) / 2 := by
 283  rw [laplacian_action_eq_pairing]
 284  unfold laplacian_pairing
 285  have hhalf : ∀ i, discrete_laplacian G ε i = (1 / 2 : ℝ) * unitDipole a b i := by
 286    intro i
 287    linarith [hsource i]
 288  calc
 289    (∑ i : Fin n, ε i * discrete_laplacian G ε i)
 290        = ∑ i : Fin n, ε i * ((1 / 2 : ℝ) * unitDipole a b i) := by
 291            refine Finset.sum_congr rfl (fun i _ => ?_)
 292            rw [hhalf i]
 293    _ = (1 / 2 : ℝ) * ∑ i : Fin n, ε i * unitDipole a b i := by
 294          rw [Finset.mul_sum]
 295          refine Finset.sum_congr rfl (fun i _ => ?_)
 296          ring
 297    _ = (ε a - ε b) / 2 := by
 298          rw [sum_mul_unitDipole]
 299          ring
 300
 301end
 302
 303end ContinuumBridge
 304end SimplicialLedger
 305end Foundation
 306end IndisputableMonolith
 307

source mirrored from github.com/jonwashburn/shape-of-logic