|
1 | 1 | import Mathlib.Analysis.Meromorphic.Order |
2 | 2 | import Mathlib.Analysis.Calculus.Deriv.Mul |
3 | 3 | import Mathlib.Analysis.Calculus.Deriv.Pow |
| 4 | +import Mathlib.Analysis.Calculus.InverseFunctionTheorem.Deriv |
| 5 | +import Mathlib.Analysis.Complex.CauchyIntegral |
4 | 6 |
|
5 | 7 | /-! |
6 | 8 | # Mathlib PR #33000: analytic order of a composition |
@@ -104,11 +106,98 @@ lemma MeromorphicAt.meromorphicOrderAt_comp_of_deriv_ne_zero |
104 | 106 | rw [hf.meromorphicOrderAt_comp hg, hgo] <;> |
105 | 107 | simp [eventuallyConst_iff_analyticOrderAt_sub_eq_top, hgo] |
106 | 108 |
|
| 109 | +/-- If `g` is analytic at `x`, and `g' x ≠ 0`, then the meromorphic order of |
| 110 | +`f ∘ g` at `x` is the meromorphic order of `f` at `g x` (even if `f` is not meromorphic). -/ |
| 111 | +lemma meromorphicOrderAt_comp_of_deriv_ne_zero (hg : AnalyticAt 𝕜 g x) (hg' : deriv g x ≠ 0) |
| 112 | + [CompleteSpace 𝕜] [CharZero 𝕜] : |
| 113 | + meromorphicOrderAt (f ∘ g) x = meromorphicOrderAt f (g x) := by |
| 114 | + by_cases hf : MeromorphicAt f (g x) |
| 115 | + · exact hf.meromorphicOrderAt_comp_of_deriv_ne_zero hg hg' |
| 116 | + · rw [meromorphicOrderAt_of_not_meromorphicAt hf, meromorphicOrderAt_of_not_meromorphicAt] |
| 117 | + contrapose! hf |
| 118 | + -- The remainder of this proof is showing that analytic functions with nonzero derivative |
| 119 | + -- have analytic inverses. TODO: extract this into a self-contained lemma. |
| 120 | + have hgd : HasStrictDerivAt g (deriv g x) x := by |
| 121 | + refine hasStrictDerivAt_iff_hasStrictFDerivAt.mpr ?_ |
| 122 | + convert hg.hasStrictFDerivAt using 1 |
| 123 | + ext |
| 124 | + simp |
| 125 | + have hgfd : HasStrictFDerivAt g |
| 126 | + (((ContinuousLinearEquiv.unitsEquivAut 𝕜) (Units.mk0 _ hg'))).toContinuousLinearMap |
| 127 | + x := hgd |
| 128 | + let R := hgfd.toOpenPartialHomeomorph _ |
| 129 | + have hx : x ∈ R.source := HasStrictFDerivAt.mem_toOpenPartialHomeomorph_source _ |
| 130 | + have hra : AnalyticAt 𝕜 R.symm (g x) := by |
| 131 | + refine (R.hasFPowerSeriesAt_symm hx hg.hasFPowerSeriesAt |
| 132 | + (i := (ContinuousLinearEquiv.unitsEquivAut 𝕜) (.mk0 _ hg')) ?_).analyticAt |
| 133 | + ext |
| 134 | + simp |
| 135 | + have hrne : deriv R.symm (g x) ≠ 0 := by |
| 136 | + simpa [(hgd.to_local_left_inverse hg' (R.eventually_left_inverse hx)).hasDerivAt.deriv] |
| 137 | + apply (((R.left_inv hx) ▸ hf).comp_analyticAt hra).congr |
| 138 | + exact .fun_comp ((R.eventually_right_inverse' hx).filter_mono nhdsWithin_le_nhds) f |
| 139 | + |
107 | 140 | /-- If `g` is analytic at `x`, `f` is meromorphic at `g x`, and `g' x ≠ 0`, then the order of |
108 | 141 | `f ∘ g` at `x` is the order of `f` at `g x`. -/ |
109 | | -lemma AnalyticAt.analyticOrderAt_comp_of_deriv_ne_zero {g : 𝕜 → 𝕜} |
| 142 | +lemma AnalyticAt.analyticOrderAt_comp_of_deriv_ne_zero |
110 | 143 | (hf : AnalyticAt 𝕜 f (g x)) (hg : AnalyticAt 𝕜 g x) (hg' : deriv g x ≠ 0) : |
111 | 144 | analyticOrderAt (f ∘ g) x = analyticOrderAt f (g x) := by |
112 | 145 | simp [hf.analyticOrderAt_comp hg, hg.analyticOrderAt_sub_eq_one_of_deriv_ne_zero hg'] |
113 | 146 |
|
| 147 | +/-- If `g` is analytic at `x` and `g' x ≠ 0`, then the order of `f ∘ g` at `x` is the order of `f` |
| 148 | +at `g x` (even if `f` is not analytic). -/ |
| 149 | +lemma analyticOrderAt_comp_of_deriv_ne_zero [CompleteSpace 𝕜] [CharZero 𝕜] |
| 150 | + (hg : AnalyticAt 𝕜 g x) (hg' : deriv g x ≠ 0) : |
| 151 | + analyticOrderAt (f ∘ g) x = analyticOrderAt f (g x) := by |
| 152 | + by_cases hf : AnalyticAt 𝕜 f (g x) |
| 153 | + · exact hf.analyticOrderAt_comp_of_deriv_ne_zero hg hg' |
| 154 | + · rw [analyticOrderAt_of_not_analyticAt hf, analyticOrderAt_of_not_analyticAt] |
| 155 | + contrapose! hf |
| 156 | + -- The remainder of this proof is showing that analytic functions with nonzero derivative |
| 157 | + -- have analytic inverses. TODO: extract this into a self-contained lemma. |
| 158 | + have hgd : HasStrictDerivAt g (deriv g x) x := by |
| 159 | + refine hasStrictDerivAt_iff_hasStrictFDerivAt.mpr ?_ |
| 160 | + convert hg.hasStrictFDerivAt using 1 |
| 161 | + ext |
| 162 | + simp |
| 163 | + have hgfd : HasStrictFDerivAt g |
| 164 | + (((ContinuousLinearEquiv.unitsEquivAut 𝕜) (Units.mk0 _ hg'))).toContinuousLinearMap |
| 165 | + x := hgd |
| 166 | + let R := hgfd.toOpenPartialHomeomorph _ |
| 167 | + have hx : x ∈ R.source := HasStrictFDerivAt.mem_toOpenPartialHomeomorph_source _ |
| 168 | + have hra : AnalyticAt 𝕜 R.symm (g x) := by |
| 169 | + refine (R.hasFPowerSeriesAt_symm hx hg.hasFPowerSeriesAt |
| 170 | + (i := (ContinuousLinearEquiv.unitsEquivAut 𝕜) (.mk0 _ hg')) ?_).analyticAt |
| 171 | + ext |
| 172 | + simp |
| 173 | + have hrne : deriv R.symm (g x) ≠ 0 := by |
| 174 | + simpa [(hgd.to_local_left_inverse hg' (R.eventually_left_inverse hx)).hasDerivAt.deriv] |
| 175 | + apply (((R.left_inv hx) ▸ hf).comp hra).congr |
| 176 | + exact .fun_comp (R.eventually_right_inverse' hx) f |
| 177 | + |
| 178 | +lemma meromorphicAt_smul_iff_of_ne_zero (hg : AnalyticAt 𝕜 g x) (hg' : g x ≠ 0) : |
| 179 | + MeromorphicAt (g • f) x ↔ MeromorphicAt f x := by |
| 180 | + refine ⟨fun hfg ↦ ?_, hg.meromorphicAt.smul⟩ |
| 181 | + refine (hg.inv hg').meromorphicAt.smul hfg |>.congr ?_ |
| 182 | + filter_upwards [(hg.continuousAt.mono_left nhdsWithin_le_nhds).eventually_ne hg'] with z hz |
| 183 | + simp [inv_smul_smul₀ hz] |
| 184 | + |
| 185 | +lemma meromorphicOrderAt_smul_of_ne_zero (hg : AnalyticAt 𝕜 g x) (hg' : g x ≠ 0) : |
| 186 | + meromorphicOrderAt (g • f) x = meromorphicOrderAt f x := by |
| 187 | + by_cases hf : MeromorphicAt f x |
| 188 | + · simp [meromorphicOrderAt_smul hg.meromorphicAt hf, hg.meromorphicOrderAt_eq, |
| 189 | + hg.analyticOrderAt_eq_zero.mpr hg'] |
| 190 | + · rw [meromorphicOrderAt_of_not_meromorphicAt hf, meromorphicOrderAt_of_not_meromorphicAt] |
| 191 | + rwa [meromorphicAt_smul_iff_of_ne_zero hg hg'] |
| 192 | + |
| 193 | + |
| 194 | +lemma meromorphicAt_mul_iff_of_ne_zero {f : 𝕜 → 𝕜} (hg : AnalyticAt 𝕜 g x) (hg' : g x ≠ 0) : |
| 195 | + MeromorphicAt (g * f) x ↔ MeromorphicAt f x := |
| 196 | + meromorphicAt_smul_iff_of_ne_zero hg hg' |
| 197 | + |
| 198 | +lemma meromorphicOrderAt_mul_of_ne_zero {f : 𝕜 → 𝕜} (hg : AnalyticAt 𝕜 g x) (hg' : g x ≠ 0) : |
| 199 | + meromorphicOrderAt (g * f) x = meromorphicOrderAt f x := |
| 200 | + meromorphicOrderAt_smul_of_ne_zero hg hg' |
| 201 | + |
| 202 | + |
114 | 203 | end comp |
0 commit comments