Skip to content

Commit c5daafe

Browse files
committed
feat: weaken assumptions in Schwarz lemma (leanprover-community#33362)
Assume that `f` maps an open ball to a closed ball. Also, generalize the "same radius" versions to any codomain.
1 parent b6f08c0 commit c5daafe

1 file changed

Lines changed: 42 additions & 51 deletions

File tree

Mathlib/Analysis/Complex/Schwarz.lean

Lines changed: 42 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ public import Mathlib.Analysis.Complex.RemovableSingularity
1414
In this file we prove several versions of the Schwarz lemma.
1515
1616
* `Complex.norm_deriv_le_div_of_mapsTo_ball`, `Complex.abs_deriv_le_div_of_mapsTo_ball`: if
17-
`f : ℂ → E` sends an open disk with center `c` and a positive radius `R₁` to an open ball with
17+
`f : ℂ → E` sends an open disk with center `c` and a positive radius `R₁` to a closed ball with
1818
center `f c` and radius `R₂`, then the norm of the derivative of `f` at `c` is at most
1919
the ratio `R₂ / R₁`;
2020
2121
* `Complex.dist_le_div_mul_dist_of_mapsTo_ball`: if `f : ℂ → E` sends an open disk with center `c`
22-
and radius `R₁` to an open disk with center `f c` and radius `R₂`, then for any `z` in the former
22+
and radius `R₁` to a closed disk with center `f c` and radius `R₂`, then for any `z` in the former
2323
disk we have `dist (f z) (f c) ≤ (R₂ / R₁) * dist z c`;
2424
25-
* `Complex.abs_deriv_le_one_of_mapsTo_ball`: if `f : ℂ → ℂ` sends an open disk of positive radius
26-
to itself and the center of this disk to itself, then the norm of the derivative of `f`
27-
at the center of this disk is at most `1`;
25+
* `Complex.abs_deriv_le_one_of_mapsTo_ball`: if `f : ℂ → ℂ` sends a point `c` to itself
26+
and it maps an open disk with center `c` to the closed disk with the same center and radius,
27+
then the norm of the derivative of `f` at the center of this disk is at most `1`;
2828
29-
* `Complex.dist_le_dist_of_mapsTo_ball_self`: if `f : ℂ → ℂ` sends an open disk to itself and the
30-
center `c` of this disk to itself, then for any point `z` of this disk we have
31-
`dist (f z) c ≤ dist z c`;
29+
* `Complex.dist_le_dist_of_mapsTo_ball_self`: if `f : ℂ → ℂ` sends a point `c` to itself
30+
and it maps an open disk with center `c` to the closed disk with the same center and radius,
31+
then for any point `z` of this disk we have `dist (f z) c ≤ dist z c`;
3232
3333
* `Complex.norm_le_norm_of_mapsTo_ball_self`: if `f : ℂ → ℂ` sends an open disk with center `0` to
3434
itself, then for any point `z` of this disk we have `abs (f z) ≤ abs z`.
@@ -40,32 +40,25 @@ over complex numbers.
4040
4141
## TODO
4242
43-
* Prove that these inequalities are strict unless `f` is an affine map.
44-
4543
* Prove that any diffeomorphism of the unit disk to itself is a Möbius map.
4644
4745
## Tags
4846
4947
Schwarz lemma
5048
-/
5149

52-
@[expose] public section
53-
54-
5550
open Metric Set Function Filter TopologicalSpace
5651

57-
open scoped Topology
52+
open scoped Topology ComplexConjugate
5853

59-
namespace Complex
60-
61-
section Space
62-
63-
variable {E : Type*} [NormedAddCommGroup E] [NormedSpace ℂ E] {R₁ R₂ : ℝ} {f : ℂ → E}
54+
variable {E : Type*} [NormedAddCommGroup E] [NormedSpace ℂ E] {R R₁ R₂ : ℝ} {f : ℂ → E}
6455
{c z z₀ : ℂ}
6556

57+
namespace Complex
58+
6659
/-- An auxiliary lemma for `Complex.norm_dslope_le_div_of_mapsTo_ball`. -/
6760
theorem schwarz_aux {f : ℂ → ℂ} (hd : DifferentiableOn ℂ f (ball c R₁))
68-
(h_maps : MapsTo f (ball c R₁) (ball (f c) R₂)) (hz : z ∈ ball c R₁) :
61+
(h_maps : MapsTo f (ball c R₁) (closedBall (f c) R₂)) (hz : z ∈ ball c R₁) :
6962
‖dslope f c z‖ ≤ R₂ / R₁ := by
7063
have hR₁ : 0 < R₁ := nonempty_ball.1 ⟨z, hz⟩
7164
suffices ∀ᶠ r in 𝓝[<] R₁, ‖dslope f c z‖ ≤ R₂ / r by
@@ -84,39 +77,40 @@ theorem schwarz_aux {f : ℂ → ℂ} (hd : DifferentiableOn ℂ f (ball c R₁)
8477
intro z hz
8578
have hz' : z ≠ c := ne_of_mem_sphere hz hr₀.ne'
8679
rw [dslope_of_ne _ hz', slope_def_module, norm_smul, norm_inv, mem_sphere_iff_norm.1 hz, ←
87-
div_eq_inv_mul, div_le_div_iff_of_pos_right hr₀, ← dist_eq_norm]
88-
exact le_of_lt (h_maps (mem_ball.2 (by rw [mem_sphere.1 hz]; exact hr.2)))
80+
div_eq_inv_mul, div_le_div_iff_of_pos_right hr₀, ← mem_closedBall_iff_norm]
81+
exact h_maps <| mem_ball.2 <| by rw [mem_sphere.1 hz]; exact hr.2
8982
· rw [closure_ball c hr₀.ne', mem_closedBall]
9083
exact hr.1.le
9184

85+
public section
86+
9287
/-- Two cases of the **Schwarz Lemma** (derivative and distance), merged together. -/
9388
theorem norm_dslope_le_div_of_mapsTo_ball (hd : DifferentiableOn ℂ f (ball c R₁))
94-
(h_maps : MapsTo f (ball c R₁) (ball (f c) R₂)) (hz : z ∈ ball c R₁) :
89+
(h_maps : MapsTo f (ball c R₁) (closedBall (f c) R₂)) (hz : z ∈ ball c R₁) :
9590
‖dslope f c z‖ ≤ R₂ / R₁ := by
9691
have hR₁ : 0 < R₁ := nonempty_ball.1 ⟨z, hz⟩
97-
have hR₂ : 0 < R₂ := nonempty_ball.1 ⟨f z, h_maps hz⟩
92+
have hR₂ : 0 R₂ := nonempty_closedBall.mp ⟨f z, h_maps hz⟩
9893
rcases eq_or_ne (dslope f c z) 0 with hc | hc
99-
· rw [hc, norm_zero]; exact div_nonneg hR₂.le hR₁.le
94+
· rw [hc, norm_zero]; exact div_nonneg hR₂ hR₁.le
10095
rcases exists_dual_vector ℂ _ hc with ⟨g, hg, hgf⟩
10196
have hg' : ‖g‖₊ = 1 := NNReal.eq hg
102-
have hg₀ : ‖g‖₊ ≠ 0 := by simpa only [hg'] using one_ne_zero
10397
calc
10498
‖dslope f c z‖ = ‖dslope (g ∘ f) c z‖ := by
10599
rw [g.dslope_comp, hgf, RCLike.norm_ofReal, abs_norm]
106100
exact fun _ => hd.differentiableAt (ball_mem_nhds _ hR₁)
107101
_ ≤ R₂ / R₁ := by
108102
refine schwarz_aux (g.differentiable.comp_differentiableOn hd) (MapsTo.comp ?_ h_maps) hz
109-
simpa only [hg', NNReal.coe_one, one_mul] using g.lipschitz.mapsTo_ball hg₀ (f c) R₂
103+
simpa only [hg', NNReal.coe_one, one_mul] using g.lipschitz.mapsTo_closedBall (f c) R₂
110104

111105
/-- Equality case in the **Schwarz Lemma**: in the setup of `norm_dslope_le_div_of_mapsTo_ball`, if
112106
`‖dslope f c z₀‖ = R₂ / R₁` holds at a point in the ball then the map `f` is affine. -/
113107
theorem affine_of_mapsTo_ball_of_exists_norm_dslope_eq_div [CompleteSpace E] [StrictConvexSpace ℝ E]
114-
(hd : DifferentiableOn ℂ f (ball c R₁)) (h_maps : Set.MapsTo f (ball c R₁) (ball (f c) R₂))
108+
(hd : DifferentiableOn ℂ f (ball c R₁))
109+
(h_maps : Set.MapsTo f (ball c R₁) (closedBall (f c) R₂))
115110
(h_z₀ : z₀ ∈ ball c R₁) (h_eq : ‖dslope f c z₀‖ = R₂ / R₁) :
116111
Set.EqOn f (fun z => f c + (z - c) • dslope f c z₀) (ball c R₁) := by
117112
set g := dslope f c
118113
rintro z hz
119-
by_cases h : z = c; · simp [h]
120114
have h_R₁ : 0 < R₁ := nonempty_ball.mp ⟨_, h_z₀⟩
121115
have g_le_div : ∀ z ∈ ball c R₁, ‖g z‖ ≤ R₂ / R₁ := fun z hz =>
122116
norm_dslope_le_div_of_mapsTo_ball hd h_maps hz
@@ -131,7 +125,7 @@ theorem affine_of_mapsTo_ball_of_exists_norm_dslope_eq_div [CompleteSpace E] [St
131125

132126
theorem affine_of_mapsTo_ball_of_exists_norm_dslope_eq_div' [CompleteSpace E]
133127
[StrictConvexSpace ℝ E] (hd : DifferentiableOn ℂ f (ball c R₁))
134-
(h_maps : Set.MapsTo f (ball c R₁) (ball (f c) R₂))
128+
(h_maps : Set.MapsTo f (ball c R₁) (closedBall (f c) R₂))
135129
(h_z₀ : ∃ z₀ ∈ ball c R₁, ‖dslope f c z₀‖ = R₂ / R₁) :
136130
∃ C : E, ‖C‖ = R₂ / R₁ ∧ Set.EqOn f (fun z => f c + (z - c) • C) (ball c R₁) :=
137131
let ⟨z₀, h_z₀, h_eq⟩ := h_z₀
@@ -141,46 +135,43 @@ theorem affine_of_mapsTo_ball_of_exists_norm_dslope_eq_div' [CompleteSpace E]
141135
`R₁` to an open ball with center `f c` and radius `R₂`, then the norm of the derivative of
142136
`f` at `c` is at most the ratio `R₂ / R₁`. -/
143137
theorem norm_deriv_le_div_of_mapsTo_ball (hd : DifferentiableOn ℂ f (ball c R₁))
144-
(h_maps : MapsTo f (ball c R₁) (ball (f c) R₂)) (h₀ : 0 < R₁) : ‖deriv f c‖ ≤ R₂ / R₁ := by
138+
(h_maps : MapsTo f (ball c R₁) (closedBall (f c) R₂)) (h₀ : 0 < R₁) :
139+
‖deriv f c‖ ≤ R₂ / R₁ := by
145140
simpa only [dslope_same] using norm_dslope_le_div_of_mapsTo_ball hd h_maps (mem_ball_self h₀)
146141

147-
/-- The **Schwarz Lemma**: if `f : ℂ → E` sends an open disk with center `c` and radius `R₁` to an
148-
open ball with center `f c` and radius `R₂`, then for any `z` in the former disk we have
142+
/-- The **Schwarz Lemma**: if `f : ℂ → E` sends an open disk with center `c` and radius `R₁` to a
143+
closed ball with center `f c` and radius `R₂`, then for any `z` in the former disk we have
149144
`dist (f z) (f c) ≤ (R₂ / R₁) * dist z c`. -/
150145
theorem dist_le_div_mul_dist_of_mapsTo_ball (hd : DifferentiableOn ℂ f (ball c R₁))
151-
(h_maps : MapsTo f (ball c R₁) (ball (f c) R₂)) (hz : z ∈ ball c R₁) :
146+
(h_maps : MapsTo f (ball c R₁) (closedBall (f c) R₂)) (hz : z ∈ ball c R₁) :
152147
dist (f z) (f c) ≤ R₂ / R₁ * dist z c := by
153148
rcases eq_or_ne z c with (rfl | hne)
154149
· simp only [dist_self, mul_zero, le_rfl]
155150
simpa only [dslope_of_ne _ hne, slope_def_module, norm_smul, norm_inv, ← div_eq_inv_mul, ←
156151
dist_eq_norm, div_le_iff₀ (dist_pos.2 hne)] using norm_dslope_le_div_of_mapsTo_ball hd h_maps hz
157152

158-
end Space
159-
160-
variable {f : ℂ → ℂ} {c z : ℂ} {R R₁ R₂ : ℝ}
161-
162153
/-- The **Schwarz Lemma**: if `f : ℂ → ℂ` sends an open disk of positive radius to itself and the
163154
center of this disk to itself, then the norm of the derivative of `f` at the center of
164155
this disk is at most `1`. -/
165156
theorem norm_deriv_le_one_of_mapsTo_ball (hd : DifferentiableOn ℂ f (ball c R))
166-
(h_maps : MapsTo f (ball c R) (ball c R)) (hc : f c = c) (h₀ : 0 < R) : ‖deriv f c‖ ≤ 1 :=
167-
(norm_deriv_le_div_of_mapsTo_ball hd (by rwa [hc]) h₀).trans_eq (div_self h₀.ne')
157+
(h_maps : MapsTo f (ball c R) (closedBall (f c) R)) (h₀ : 0 < R) : ‖deriv f c‖ ≤ 1 :=
158+
(norm_deriv_le_div_of_mapsTo_ball hd h_maps h₀).trans_eq (div_self h₀.ne')
168159

169160
/-- The **Schwarz Lemma**: if `f : ℂ → ℂ` sends an open disk to itself and the center `c` of this
170161
disk to itself, then for any point `z` of this disk we have `dist (f z) c ≤ dist z c`. -/
171162
theorem dist_le_dist_of_mapsTo_ball_self (hd : DifferentiableOn ℂ f (ball c R))
172-
(h_maps : MapsTo f (ball c R) (ball c R)) (hc : f c = c) (hz : z ∈ ball c R) :
173-
dist (f z) c ≤ dist z c := by
174-
have := dist_le_div_mul_dist_of_mapsTo_ball hd (by rwa [hc]) hz
175-
rwa [hc, div_self, one_mul] at this
176-
exact (nonempty_ball.1 ⟨z, hz⟩).ne'
177-
178-
/-- The **Schwarz Lemma**: if `f : ℂ → ℂ` sends an open disk with center `0` to itself, then for any
179-
point `z` of this disk we have `‖f z‖ ≤ ‖z‖`. -/
163+
(h_maps : MapsTo f (ball c R) (closedBall (f c) R)) (hz : z ∈ ball c R) :
164+
dist (f z) (f c) ≤ dist z c := by
165+
simpa [(nonempty_ball.1 ⟨z, hz⟩).ne'] using dist_le_div_mul_dist_of_mapsTo_ball hd h_maps hz
166+
167+
/-- The **Schwarz Lemma**: if `f : ℂ → E` sends an open disk with center `0`
168+
to the closed ball with center `0` of the same radius,
169+
then for any point `z` of this disk we have `‖f z‖ ≤ ‖z‖`. -/
180170
theorem norm_le_norm_of_mapsTo_ball_self (hd : DifferentiableOn ℂ f (ball 0 R))
181-
(h_maps : MapsTo f (ball 0 R) (ball 0 R)) (h₀ : f 0 = 0) (hz : ‖z‖ < R) :
171+
(h_maps : MapsTo f (ball 0 R) (closedBall 0 R)) (h₀ : f 0 = 0) (hz : ‖z‖ < R) :
182172
‖f z‖ ≤ ‖z‖ := by
183-
replace hz : z ∈ ball (0 : ℂ) R := mem_ball_zero_iff.2 hz
184-
simpa only [dist_zero_right] using dist_le_dist_of_mapsTo_ball_self hd h_maps h₀ hz
173+
simpa [h₀] using dist_le_dist_of_mapsTo_ball_self hd (by rwa [h₀]) (mem_ball_zero_iff.mpr hz)
174+
175+
end -- public section
185176

186177
end Complex

0 commit comments

Comments
 (0)