Skip to content

Commit 367fae1

Browse files
committed
Prove the Schwarz-Pick theorem
This is the best bound on the derivative of a holomorphic function within the ball, which we'll use to bound the derivative of bottcher in terms of our bounds on its values.
1 parent 0d0b1e4 commit 367fae1

4 files changed

Lines changed: 153 additions & 0 deletions

File tree

Ray.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,5 @@ import Ray.Koebe.Koebe
2323
import Ray.Koebe.Wind
2424
import Ray.Koebe.WindArea
2525
import Ray.Misc.ChartedSpace
26+
import Ray.Schwarz.Mobius
27+
import Ray.Schwarz.SchwarzPick

Ray/Misc/Bound.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ attribute [bound] norm_add_le mul_lt_of_lt_one_left Complex.normSq_nonneg norm_i
1616

1717
@[bound] private alias ⟨_, Bound.ennreal_coe_pos⟩ := ENNReal.coe_pos
1818

19+
@[bound] private alias ⟨_, Bound.sq_lt_one₀⟩ := sq_lt_one_iff₀
20+
21+
@[bound] private alias ⟨_, Bound.sq_le_one₀⟩ := sq_le_one_iff₀
22+
1923
@[bound] private lemma Bound.lt_mul_of_one_lt_left [MulOneClass α] [Zero α] {a b : α} [Preorder α]
2024
[MulPosStrictMono α] [MulPosReflectLT α] (a0 : 0 < a) (b1 : 1 < b) : a < b * a :=
2125
(lt_mul_iff_one_lt_left a0).mpr b1

Ray/Schwarz/Mobius.lean

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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+
calc1 - 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]

Ray/Schwarz/SchwarzPick.lean

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import Mathlib.Analysis.Complex.Schwarz
2+
import Ray.Schwarz.Mobius
3+
4+
/-!
5+
## Schwarz-Pick theorem
6+
7+
The Schwarz-Pick theorem provides the tightest bounds on finite differences and derivatives of
8+
an anlytic function on the unit disk:
9+
10+
https://en.wikipedia.org/wiki/Schwarz_lemma#Schwarz%E2%80%93Pick_theorem
11+
-/
12+
13+
open Filter (Tendsto)
14+
open Metric (ball isOpen_ball)
15+
open Set
16+
open scoped ComplexConjugate ContDiff Topology
17+
noncomputable section
18+
19+
variable {w z : ℂ} {f : ℂ → ℂ}
20+
21+
/-- Finite difference version of Schwarz-Pick for the unit disk -/
22+
lemma Complex.dist_le_mul_mobius_of_mapsTo_unit_ball (fa : ContDiffOn ℂ ω f (ball 0 1))
23+
(fi : MapsTo f (ball 0 1) (ball 0 1)) (z1 : ‖z‖ < 1) (w1 : ‖w‖ < 1) :
24+
‖f z - f w‖ ≤ ‖1 - conj (f z) * f w‖ * ‖mobius z w‖ := by
25+
have fz1 : ‖f z‖ < 1 := by simpa using fi (x := z) (by simpa)
26+
have fw1 : ‖f w‖ < 1 := by simpa using fi (x := w) (by simpa)
27+
set g := mobius (f z) ∘ f ∘ mobius z
28+
have gm' := fi.comp (mapsTo_mobius z1)
29+
have gm : MapsTo g (ball 0 1) (ball 0 1) := (mapsTo_mobius fz1).comp gm'
30+
have ga : ContDiffOn ℂ ω g (ball 0 1) :=
31+
(contDiffOn_mobius fz1).comp (fa.comp (contDiffOn_mobius z1) (mapsTo_mobius z1)) gm'
32+
have g0 : g 0 = 0 := by simp only [g, Function.comp_apply, mobius_zero, mobius_self]
33+
set u := mobius z w
34+
have u1 : ‖u‖ < 1 := norm_mobius_lt_one z1 w1
35+
simpa only [g, Function.comp_apply, mobius_def (f z), u, mobius_mobius z1 w1, norm_div,
36+
div_le_iff₀ (norm_mobius_denom_pos fz1 fw1), mul_comm ‖mobius _ _‖] using
37+
Complex.norm_le_norm_of_mapsTo_ball_self (ga.differentiableOn le_top) gm g0 u1
38+
39+
/-- Derivative version of Schwarz-Pick for the unit disk -/
40+
lemma Complex.norm_deriv_le_div_of_mapsTo_unit_ball (fa : ContDiffOn ℂ ω f (ball 0 1))
41+
(fi : MapsTo f (ball 0 1) (ball 0 1)) (z1 : ‖z‖ < 1) :
42+
‖deriv f z‖ ≤ (1 - ‖f z‖ ^ 2) / (1 - ‖z‖ ^ 2) := by
43+
have zm : z ∈ ball 0 1 := by simpa using z1
44+
have fz1 : ‖f z‖ < 1 := by simpa using fi (x := z) (by simpa)
45+
have df := (fa.differentiableOn le_top).differentiableAt (x := z) (isOpen_ball.mem_nhds zm)
46+
have s : ∀ᶠ w in 𝓝[≠] z, ‖slope f z w‖ - ‖1 - conj (f z) * f w‖ / ‖1 - conj z * w‖ ≤ 0 := by
47+
simp only [eventually_nhdsWithin_iff, mem_compl_iff, mem_singleton_iff]
48+
filter_upwards [isOpen_ball.eventually_mem zm] with w w1 wz
49+
simp only [Metric.mem_ball, dist_zero_right] at w1
50+
have s := Complex.dist_le_mul_mobius_of_mapsTo_unit_ball fa fi z1 w1
51+
simp only [mobius, Complex.norm_div, ← mul_div_assoc, mul_div_right_comm] at s
52+
rw [← div_le_iff₀ (norm_pos_iff.mpr (by grind))] at s
53+
simpa [slope, ← div_eq_inv_mul, norm_sub_rev (f w), norm_sub_rev w]
54+
have dc : ContinuousAt (fun w ↦ ‖1 - conj (f z) * f w‖ / ‖1 - conj z * w‖) z :=
55+
ContinuousAt.div (by fun_prop) (by fun_prop) (norm_mobius_denom_pos z1 z1).ne'
56+
have t1 := (continuous_norm.tendsto _).comp df.hasDerivAt.tendsto_slope
57+
have t2 := dc.tendsto
58+
have e : ∀ x : ℝ, (1 - x : ℂ) = (1 - x : ℝ) := by simp
59+
have n : ∀ {z : ℂ}, ‖z‖ < 1 → |1 - ‖z‖ ^ 2| = (1 - ‖z‖ ^ 2) := by
60+
intro z z1
61+
rw [abs_of_nonneg]
62+
bound
63+
simp only [Function.comp_def, conj_mul', ← Complex.ofReal_pow, e, Complex.norm_real,
64+
Real.norm_eq_abs, n z1, n fz1] at t1 t2
65+
rw [← sub_nonpos]
66+
exact le_of_tendsto (t1.sub (t2.mono_left nhdsWithin_le_nhds)) s

0 commit comments

Comments
 (0)