@@ -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 hε
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+
329423end CRNT
330424
331425
0 commit comments