|
| 1 | +import Mathlib.Analysis.Calculus.ContDiff.Operations |
| 2 | +import Ray.Misc.Bound |
| 3 | + |
| 4 | +/-! |
| 5 | +## Facts about Möbius transforms |
| 6 | +
|
| 7 | +We consider only Möbius transform of the form `z ↦ (w - z) / (1 - conj w * z)`, which is what we |
| 8 | +need to prove the Schwarz-Pick theorem. |
| 9 | +-/ |
| 10 | + |
| 11 | +open Metric (ball) |
| 12 | +open Set |
| 13 | +open scoped ComplexConjugate ContDiff Topology |
| 14 | +noncomputable section |
| 15 | + |
| 16 | +variable {w z : ℂ} |
| 17 | + |
| 18 | +/-- The particular Möbius transform we need for Schwarz-Pick -/ |
| 19 | +def mobius (w z : ℂ) : ℂ := |
| 20 | + (w - z) / (1 - conj w * z) |
| 21 | + |
| 22 | +/-- As a definition, for simp convenience -/ |
| 23 | +lemma mobius_def (w z : ℂ) : mobius w z = (w - z) / (1 - conj w * z) := rfl |
| 24 | + |
| 25 | +/-- Our Möbius denominator is nonsingular -/ |
| 26 | +lemma norm_mobius_denom_pos (w1 : ‖w‖ < 1) (z1 : ‖z‖ < 1) : 0 < ‖1 - conj w * z‖ := by |
| 27 | + calc ‖1 - conj w * z‖ |
| 28 | + _ ≥ ‖(1 : ℂ)‖ - ‖conj w * z‖ := by bound |
| 29 | + _ = 1 - ‖w‖ * ‖z‖ := by simp |
| 30 | + _ ≥ 1 - ‖z‖ := by bound |
| 31 | + _ > 0 := by linarith |
| 32 | + |
| 33 | +/-- Our Möbius denominator is nonsingular -/ |
| 34 | +lemma mobius_denom_ne_zero (w1 : ‖w‖ < 1) (z1 : ‖z‖ < 1) : 1 - conj w * z ≠ 0 := |
| 35 | + norm_pos_iff.mp (norm_mobius_denom_pos w1 z1) |
| 36 | + |
| 37 | +/-- Our Möbius transforms map the unit disk to itself -/ |
| 38 | +lemma mapsTo_mobius (w1 : ‖w‖ < 1) : MapsTo (mobius w) (ball 0 1) (ball 0 1) := by |
| 39 | + intro z z1 |
| 40 | + simp only [Metric.mem_ball, dist_zero_right] at z1 |
| 41 | + simp only [Metric.mem_ball, dist_zero_right, mobius, Complex.norm_div, |
| 42 | + div_lt_iff₀ (norm_mobius_denom_pos w1 z1), one_mul] |
| 43 | + rw [← sq_lt_sq₀ (by bound) (by bound), ← Complex.ofReal_re (‖w - z‖ ^ 2), |
| 44 | + ← Complex.ofReal_re (‖1 - (starRingEnd ℂ) w * z‖ ^ 2)] |
| 45 | + simp only [← Complex.conj_mul', Complex.ofReal_pow, map_sub, mul_sub, sub_mul, Complex.sub_re, |
| 46 | + mul_one, map_one, Complex.one_re, Complex.conj_conj, map_mul, one_mul] |
| 47 | + rw [← sub_pos] |
| 48 | + ring_nf |
| 49 | + refine lt_of_lt_of_le (b := (1 - ‖w‖ ^ 2 : ℂ).re * (1 - ‖z‖ ^ 2 : ℂ).re) ?_ (le_of_eq ?_) |
| 50 | + · simp only [Complex.ofReal_re, ← Complex.ofReal_pow, Complex.sub_re, Complex.one_re] |
| 51 | + bound |
| 52 | + · simp only [Complex.conj_mul', ← mul_assoc, mul_comm _ (conj w)] |
| 53 | + simp only [mul_assoc, Complex.conj_mul', Complex.sub_re, Complex.one_re, ← Complex.ofReal_pow, |
| 54 | + Complex.ofReal_re, ← Complex.ofReal_mul] |
| 55 | + ring |
| 56 | + |
| 57 | +/-- Our Möbius transforms are analytic -/ |
| 58 | +lemma contDiffAt_mobius {n : WithTop ℕ∞} (w1 : ‖w‖ < 1) (z1 : ‖z‖ < 1) : |
| 59 | + ContDiffAt ℂ n (mobius w) z := by |
| 60 | + refine ContDiffAt.div (by fun_prop) (by fun_prop) ?_ |
| 61 | + exact mobius_denom_ne_zero w1 z1 |
| 62 | + |
| 63 | +/-- Our Möbius transforms are analytic -/ |
| 64 | +lemma contDiffOn_mobius {n : WithTop ℕ∞} (w1 : ‖w‖ < 1) : ContDiffOn ℂ n (mobius w) (ball 0 1) := |
| 65 | + fun z z1 ↦ (contDiffAt_mobius w1 (by simpa using z1)).contDiffWithinAt |
| 66 | + |
| 67 | +/-- Our Möbius transforms map the unit disk to itself -/ |
| 68 | +lemma norm_mobius_lt_one (w1 : ‖w‖ < 1) (z1 : ‖z‖ < 1) : ‖mobius w z‖ < 1 := by |
| 69 | + simpa using mapsTo_mobius w1 (x := z) (by simpa) |
| 70 | + |
| 71 | +/-- Our Möbius transforms are involutions -/ |
| 72 | +lemma mobius_mobius (w1 : ‖w‖ < 1) (z1 : ‖z‖ < 1) : mobius w (mobius w z) = z := by |
| 73 | + have n1 := mobius_denom_ne_zero w1 z1 |
| 74 | + have n2 := mobius_denom_ne_zero w1 (norm_mobius_lt_one w1 z1) |
| 75 | + simp only [mobius] at n1 n2 ⊢ |
| 76 | + rw [div_eq_iff n2, ← mul_left_inj' n1] |
| 77 | + simp only [sub_mul, div_mul_cancel₀ _ n1, mul_assoc] |
| 78 | + ring |
| 79 | + |
| 80 | +@[simp] lemma mobius_zero : mobius w 0 = w := by simp [mobius] |
| 81 | +@[simp] lemma mobius_self : mobius w w = 0 := by simp [mobius] |
0 commit comments