Skip to content

Commit 03854c5

Browse files
feat: port Analysis.Complex.Liouville (#4894)
1 parent 512a73e commit 03854c5

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,7 @@ import Mathlib.Analysis.Complex.CauchyIntegral
513513
import Mathlib.Analysis.Complex.Circle
514514
import Mathlib.Analysis.Complex.Conformal
515515
import Mathlib.Analysis.Complex.Isometry
516+
import Mathlib.Analysis.Complex.Liouville
516517
import Mathlib.Analysis.Complex.OperatorNorm
517518
import Mathlib.Analysis.Complex.ReImTopology
518519
import Mathlib.Analysis.Complex.RealDeriv
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
/-
2+
Copyright (c) 2022 Yury G. Kudryashov. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yury G. Kudryashov
5+
6+
! This file was ported from Lean 3 source module analysis.complex.liouville
7+
! leanprover-community/mathlib commit f2ce6086713c78a7f880485f7917ea547a215982
8+
! Please do not edit these lines, except to modify the commit id
9+
! if you have ported upstream changes.
10+
-/
11+
import Mathlib.Analysis.Complex.CauchyIntegral
12+
import Mathlib.Analysis.Calculus.FDerivAnalytic
13+
import Mathlib.Analysis.NormedSpace.Completion
14+
15+
/-!
16+
# Liouville's theorem
17+
18+
In this file we prove Liouville's theorem: if `f : E → F` is complex differentiable on the whole
19+
space and its range is bounded, then the function is a constant. Various versions of this theorem
20+
are formalized in `Differentiable.apply_eq_apply_of_bounded`,
21+
`Differentiable.exists_const_forall_eq_of_bounded`, and
22+
`Differentiable.exists_eq_const_of_bounded`.
23+
24+
The proof is based on the Cauchy integral formula for the derivative of an analytic function, see
25+
`Complex.deriv_eq_smul_circleIntegral`.
26+
-/
27+
28+
29+
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue #2220
30+
31+
open TopologicalSpace Metric Set Filter Asymptotics Function MeasureTheory
32+
33+
open scoped Topology Filter NNReal Real
34+
35+
universe u v
36+
37+
variable {E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] {F : Type v} [NormedAddCommGroup F]
38+
[NormedSpace ℂ F]
39+
40+
local postfix:100 "̂" => UniformSpace.Completion
41+
42+
namespace Complex
43+
44+
/-- If `f` is complex differentiable on an open disc with center `c` and radius `R > 0` and is
45+
continuous on its closure, then `f' c` can be represented as an integral over the corresponding
46+
circle.
47+
48+
TODO: add a version for `w ∈ Metric.ball c R`.
49+
50+
TODO: add a version for higher derivatives. -/
51+
theorem deriv_eq_smul_circleIntegral [CompleteSpace F] {R : ℝ} {c : ℂ} {f : ℂ → F} (hR : 0 < R)
52+
(hf : DiffContOnCl ℂ f (ball c R)) :
53+
deriv f c = (2 * π * I : ℂ)⁻¹ • ∮ z in C(c, R), (z - c) ^ (-2 : ℤ) • f z := by
54+
lift R to ℝ≥0 using hR.le
55+
refine' (hf.hasFPowerSeriesOnBall hR).hasFPowerSeriesAt.deriv.trans _
56+
simp only [cauchyPowerSeries_apply, one_div, zpow_neg, pow_one, smul_smul, zpow_two, mul_inv]
57+
#align complex.deriv_eq_smul_circle_integral Complex.deriv_eq_smul_circleIntegral
58+
59+
theorem norm_deriv_le_aux [CompleteSpace F] {c : ℂ} {R C : ℝ} {f : ℂ → F} (hR : 0 < R)
60+
(hf : DiffContOnCl ℂ f (ball c R)) (hC : ∀ z ∈ sphere c R, ‖f z‖ ≤ C) :
61+
‖deriv f c‖ ≤ C / R := by
62+
have : ∀ z ∈ sphere c R, ‖(z - c) ^ (-2 : ℤ) • f z‖ ≤ C / (R * R) :=
63+
fun z (hz : abs (z - c) = R) => by
64+
simpa [-mul_inv_rev, norm_smul, hz, zpow_two, ← div_eq_inv_mul] using
65+
(div_le_div_right (mul_pos hR hR)).2 (hC z hz)
66+
calc
67+
‖deriv f c‖ = ‖(2 * π * I : ℂ)⁻¹ • ∮ z in C(c, R), (z - c) ^ (-2 : ℤ) • f z‖ :=
68+
congr_arg norm (deriv_eq_smul_circleIntegral hR hf)
69+
_ ≤ R * (C / (R * R)) :=
70+
(circleIntegral.norm_two_pi_i_inv_smul_integral_le_of_norm_le_const hR.le this)
71+
_ = C / R := by rw [mul_div_left_comm, div_self_mul_self', div_eq_mul_inv]
72+
#align complex.norm_deriv_le_aux Complex.norm_deriv_le_aux
73+
74+
/-- If `f` is complex differentiable on an open disc of radius `R > 0`, is continuous on its
75+
closure, and its values on the boundary circle of this disc are bounded from above by `C`, then the
76+
norm of its derivative at the center is at most `C / R`. -/
77+
theorem norm_deriv_le_of_forall_mem_sphere_norm_le {c : ℂ} {R C : ℝ} {f : ℂ → F} (hR : 0 < R)
78+
(hd : DiffContOnCl ℂ f (ball c R)) (hC : ∀ z ∈ sphere c R, ‖f z‖ ≤ C) :
79+
‖deriv f c‖ ≤ C / R := by
80+
set e : F →L[ℂ] F̂ := UniformSpace.Completion.toComplL
81+
have : HasDerivAt (e ∘ f) (e (deriv f c)) c :=
82+
e.hasFDerivAt.comp_hasDerivAt c
83+
(hd.differentiableAt isOpen_ball <| mem_ball_self hR).hasDerivAt
84+
calc
85+
‖deriv f c‖ = ‖deriv (e ∘ f) c‖ := by
86+
rw [this.deriv]
87+
exact (UniformSpace.Completion.norm_coe _).symm
88+
_ ≤ C / R :=
89+
norm_deriv_le_aux hR (e.differentiable.comp_diffContOnCl hd) fun z hz =>
90+
(UniformSpace.Completion.norm_coe _).trans_le (hC z hz)
91+
#align complex.norm_deriv_le_of_forall_mem_sphere_norm_le Complex.norm_deriv_le_of_forall_mem_sphere_norm_le
92+
93+
/-- An auxiliary lemma for Liouville's theorem `Differentiable.apply_eq_apply_of_bounded`. -/
94+
theorem liouville_theorem_aux {f : ℂ → F} (hf : Differentiable ℂ f) (hb : Bounded (range f))
95+
(z w : ℂ) : f z = f w := by
96+
suffices : ∀ c, deriv f c = 0; exact is_const_of_deriv_eq_zero hf this z w
97+
clear z w; intro c
98+
obtain ⟨C, C₀, hC⟩ : ∃ C > (0 : ℝ), ∀ z, ‖f z‖ ≤ C := by
99+
rcases bounded_iff_forall_norm_le.1 hb with ⟨C, hC⟩
100+
exact
101+
⟨max C 1, lt_max_iff.2 (Or.inr zero_lt_one), fun z =>
102+
(hC (f z) (mem_range_self _)).trans (le_max_left _ _)⟩
103+
refine' norm_le_zero_iff.1 (le_of_forall_le_of_dense fun ε ε₀ => _)
104+
calc
105+
‖deriv f c‖ ≤ C / (C / ε) :=
106+
norm_deriv_le_of_forall_mem_sphere_norm_le (div_pos C₀ ε₀) hf.diffContOnCl fun z _ => hC z
107+
_ = ε := div_div_cancel' C₀.lt.ne'
108+
#align complex.liouville_theorem_aux Complex.liouville_theorem_aux
109+
110+
end Complex
111+
112+
namespace Differentiable
113+
114+
open Complex
115+
116+
/-- **Liouville's theorem**: a complex differentiable bounded function `f : E → F` is a constant. -/
117+
theorem apply_eq_apply_of_bounded {f : E → F} (hf : Differentiable ℂ f) (hb : Bounded (range f))
118+
(z w : E) : f z = f w := by
119+
set g : ℂ → F := f ∘ fun t : ℂ => t • (w - z) + z
120+
suffices g 0 = g 1 by simpa
121+
apply liouville_theorem_aux
122+
exacts [hf.comp ((differentiable_id.smul_const (w - z)).add_const z),
123+
hb.mono (range_comp_subset_range _ _)]
124+
#align differentiable.apply_eq_apply_of_bounded Differentiable.apply_eq_apply_of_bounded
125+
126+
/-- **Liouville's theorem**: a complex differentiable bounded function is a constant. -/
127+
theorem exists_const_forall_eq_of_bounded {f : E → F} (hf : Differentiable ℂ f)
128+
(hb : Bounded (range f)) : ∃ c, ∀ z, f z = c :=
129+
⟨f 0, fun _ => hf.apply_eq_apply_of_bounded hb _ _⟩
130+
#align differentiable.exists_const_forall_eq_of_bounded Differentiable.exists_const_forall_eq_of_bounded
131+
132+
/-- **Liouville's theorem**: a complex differentiable bounded function is a constant. -/
133+
theorem exists_eq_const_of_bounded {f : E → F} (hf : Differentiable ℂ f) (hb : Bounded (range f)) :
134+
∃ c, f = const E c :=
135+
(hf.exists_const_forall_eq_of_bounded hb).imp fun _ => funext
136+
#align differentiable.exists_eq_const_of_bounded Differentiable.exists_eq_const_of_bounded
137+
138+
end Differentiable

0 commit comments

Comments
 (0)