|
| 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