Skip to content

Commit f3fdb4e

Browse files
committed
Prove unconditional Gale-Nikaido global univalence
1 parent e57a31a commit f3fdb4e

2 files changed

Lines changed: 102 additions & 0 deletions

File tree

CRNT/Multistationarity/GaleNikaidoUniv.lean

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,100 @@ theorem pmatrix_order_eq : ∀ {n : ℕ} {F : (Fin n → ℝ) → (Fin n → ℝ
326326
· exact hia
327327
· exact congrFun hrm k
328328

329+
/-- The diagonal sign map `x ↦ (ε i * x i)ᵢ` as a continuous linear map. -/
330+
noncomputable def signDiag {n : ℕ} (ε : Fin n → ℝ) : (Fin n → ℝ) →L[ℝ] (Fin n → ℝ) :=
331+
ContinuousLinearMap.pi (fun i => (ε i) • ContinuousLinearMap.proj i)
332+
333+
@[simp] theorem signDiag_apply {n : ℕ} (ε : Fin n → ℝ) (x : Fin n → ℝ) (i : Fin n) :
334+
signDiag ε x i = ε i * x i := by
335+
simp [signDiag, ContinuousLinearMap.pi_apply]
336+
337+
/-- **Diagonal-conjugation Jacobian.** The Jacobian of `D ∘ L ∘ D` (with `D` the diagonal sign map)
338+
is the signature conjugate `(ε i · M i j · ε j)` of `jacobianMatrix L`. -/
339+
theorem jacobianMatrix_diagConj {n : ℕ} (L : (Fin n → ℝ) →L[ℝ] (Fin n → ℝ)) (ε : Fin n → ℝ) :
340+
jacobianMatrix ((signDiag ε).comp (L.comp (signDiag ε)))
341+
= Matrix.of (fun i j => ε i * (jacobianMatrix L) i j * ε j) := by
342+
apply Matrix.ext
343+
intro k l
344+
have hcol : signDiag ε (Pi.single l 1) = ε l • Pi.single l (1 : ℝ) := by
345+
funext m
346+
simp only [signDiag_apply, Pi.smul_apply, smul_eq_mul, Pi.single_apply]
347+
split <;> simp_all
348+
have hact : ((signDiag ε).comp (L.comp (signDiag ε))) (Pi.single l 1) k
349+
= ε k * (ε l * (jacobianMatrix L) k l) := by
350+
simp only [ContinuousLinearMap.comp_apply, signDiag_apply, hcol, map_smul, Pi.smul_apply,
351+
smul_eq_mul]
352+
rw [← jacobianMatrix_mulVec]
353+
simp [Matrix.mulVec_single]
354+
have hjac : jacobianMatrix ((signDiag ε).comp (L.comp (signDiag ε))) k l
355+
= ((signDiag ε).comp (L.comp (signDiag ε))) (Pi.single l 1) k := by
356+
rw [← jacobianMatrix_mulVec]; simp [Matrix.mulVec_single]
357+
rw [Matrix.of_apply, hjac, hact]; ring
358+
359+
/-- **Gale–Nikaido Theorem 4 — global univalence (unconditional box-GN).** A `C¹` map whose Jacobian
360+
is a P-matrix at every point of a box is injective on that box. Given `F a = F b`, the sign
361+
normalization `D` (flip the coordinates where `a > b`) makes `a* := D a ≤ D b =: b*` while `H := D∘F∘D`
362+
keeps a P-matrix Jacobian (`signatureConj`); since `H a* = H b*`, Theorem 3 gives `a* = b*`, hence
363+
`a = b`. -/
364+
theorem injOn_of_pmatrix_fderiv {n : ℕ} {F : (Fin n → ℝ) → (Fin n → ℝ)}
365+
{F' : (Fin n → ℝ) → ((Fin n → ℝ) →L[ℝ] (Fin n → ℝ))} {lo hi : Fin n → ℝ}
366+
(hF : ∀ z ∈ Set.Icc lo hi, HasFDerivAt F (F' z) z)
367+
(hP : ∀ z ∈ Set.Icc lo hi, (jacobianMatrix (F' z)).IsPMatrix) :
368+
Set.InjOn F (Set.Icc lo hi) := by
369+
intro a ha b hb hFab
370+
classical
371+
set ε : Fin n → ℝ := fun i => if a i ≤ b i then (1 : ℝ) else -1 with
372+
have hεpm : ∀ i, ε i = 1 ∨ ε i = -1 := by
373+
intro i; simp only [hε]; split_ifs <;> simp
374+
have hεsq : ∀ i, ε i * ε i = 1 := by
375+
intro i; rcases hεpm i with h | h <;> rw [h] <;> norm_num
376+
have hDD : ∀ x : Fin n → ℝ, signDiag ε (signDiag ε x) = x := by
377+
intro x; funext i; rw [signDiag_apply, signDiag_apply, ← mul_assoc, hεsq, one_mul]
378+
set as : Fin n → ℝ := signDiag ε a with has
379+
set bs : Fin n → ℝ := signDiag ε b with hbs
380+
have hasbs : as ≤ bs := by
381+
intro i
382+
rw [has, hbs, signDiag_apply, signDiag_apply]
383+
simp only [hε]
384+
by_cases h : a i ≤ b i
385+
· rw [if_pos h, one_mul, one_mul]; exact h
386+
· rw [if_neg h]; rw [not_le] at h; nlinarith
387+
have hDmem : ∀ x ∈ Set.Icc as bs, signDiag ε x ∈ Set.Icc lo hi := by
388+
rintro x ⟨hxa, hxb⟩
389+
refine ⟨fun i => ?_, fun i => ?_⟩ <;> rw [signDiag_apply]
390+
· rcases hεpm i with h | h
391+
· have hxi := hxa i; rw [has, signDiag_apply, h, one_mul] at hxi
392+
rw [h, one_mul]; exact (ha.1 i).trans hxi
393+
· have hxi := hxb i; rw [hbs, signDiag_apply, h] at hxi
394+
rw [h]; nlinarith [hb.1 i, hxi]
395+
· rcases hεpm i with h | h
396+
· have hxi := hxb i; rw [hbs, signDiag_apply, h, one_mul] at hxi
397+
rw [h, one_mul]; exact hxi.trans (hb.2 i)
398+
· have hxi := hxa i; rw [has, signDiag_apply, h] at hxi
399+
rw [h]; nlinarith [ha.2 i, hxi]
400+
-- the conjugated map H and its data
401+
set H : (Fin n → ℝ) → (Fin n → ℝ) := fun x => signDiag ε (F (signDiag ε x)) with hH
402+
set H' : (Fin n → ℝ) → ((Fin n → ℝ) →L[ℝ] (Fin n → ℝ)) :=
403+
fun x => (signDiag ε).comp ((F' (signDiag ε x)).comp (signDiag ε)) with hH'
404+
have hHF : ∀ z ∈ Set.Icc as bs, HasFDerivAt H (H' z) z := by
405+
intro z hz
406+
have hc2 := (hF _ (hDmem z hz)).comp z (signDiag ε).hasFDerivAt
407+
exact (signDiag ε).hasFDerivAt.comp z hc2
408+
have hHP : ∀ z ∈ Set.Icc as bs, (jacobianMatrix (H' z)).IsPMatrix := by
409+
intro z hz
410+
rw [hH', jacobianMatrix_diagConj]
411+
exact (hP _ (hDmem z hz)).signatureConj hεpm
412+
have hasmem : as ∈ Set.Icc as bs := ⟨le_refl _, hasbs⟩
413+
have hbsmem : bs ∈ Set.Icc as bs := ⟨hasbs, le_refl _⟩
414+
have hHab : H bs ≤ H as := by
415+
have e1 : H bs = signDiag ε (F b) := by simp only [hH]; rw [hbs, hDD]
416+
have e2 : H as = signDiag ε (F a) := by simp only [hH]; rw [has, hDD]
417+
rw [e1, e2]; exact le_of_eq (by rw [hFab])
418+
have hbsas : bs = as := pmatrix_order_eq hHF hHP hasmem hbsmem hasbs hHab
419+
have hsd : signDiag ε bs = signDiag ε as := by rw [hbsas]
420+
rw [hbs, hDD, has, hDD] at hsd
421+
exact hsd.symm
422+
329423
end CRNT
330424

331425

test/Smoke.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2099,3 +2099,11 @@ example {n : ℕ} {F : (Fin (n + 1) → ℝ) → (Fin (n + 1) → ℝ)}
20992099
(Set.Icc (Fin.init a) (Fin.init b))) :
21002100
Set.InjOn F (Set.Icc a b) :=
21012101
CRNT.injOn_of_pmatrix_fderiv_of_sections hF hP hsec
2102+
-- **The Gale–Nikaido global univalence theorem (unconditional):** a C¹ map whose Jacobian is a
2103+
-- P-matrix at every point of a box is injective on that box. (Degree-free.)
2104+
example {n : ℕ} {F : (Fin n → ℝ) → (Fin n → ℝ)}
2105+
{F' : (Fin n → ℝ) → ((Fin n → ℝ) →L[ℝ] (Fin n → ℝ))} {lo hi : Fin n → ℝ}
2106+
(hF : ∀ z ∈ Set.Icc lo hi, HasFDerivAt F (F' z) z)
2107+
(hP : ∀ z ∈ Set.Icc lo hi, (CRNT.jacobianMatrix (F' z)).IsPMatrix) :
2108+
Set.InjOn F (Set.Icc lo hi) :=
2109+
CRNT.injOn_of_pmatrix_fderiv hF hP

0 commit comments

Comments
 (0)