|
8 | 8 | public import Mathlib.Analysis.Calculus.ContDiff.Bounds |
9 | 9 | public import Mathlib.Analysis.SpecialFunctions.JapaneseBracket |
10 | 10 | public import Mathlib.Analysis.InnerProductSpace.Calculus |
| 11 | +public import Mathlib.Tactic.MoveAdd |
11 | 12 |
|
12 | 13 |
|
13 | 14 | /-! # Functions and measures of temperate growth -/ |
@@ -115,6 +116,60 @@ lemma HasTemperateGrowth.const (c : F) : |
115 | 116 | Function.HasTemperateGrowth (fun _ : E ↦ c) := |
116 | 117 | .of_fderiv (by simpa using .zero) (differentiable_const c) (k := 0) (C := ‖c‖) (fun x ↦ by simp) |
117 | 118 |
|
| 119 | +/-- Composition of two temperate growth functions is of temperate growth. |
| 120 | +
|
| 121 | +Version where the outer function `g` is only of temperate growth on the image of inner function |
| 122 | +`f`. -/ |
| 123 | +theorem HasTemperateGrowth.comp' [NormedAddCommGroup D] [NormedSpace ℝ D] {g : E → F} {f : D → E} |
| 124 | + {t : Set E} (ht : Set.range f ⊆ t) (ht' : UniqueDiffOn ℝ t) (hg₁ : ContDiffOn ℝ ∞ g t) |
| 125 | + (hg₂ : ∀ N, ∃ k C, ∃ (_hC : 0 ≤ C), ∀ n ≤ N, ∀ x ∈ t, |
| 126 | + ‖iteratedFDerivWithin ℝ n g t x‖ ≤ C * (1 + ‖x‖) ^ k) |
| 127 | + (hf : f.HasTemperateGrowth) : (g ∘ f).HasTemperateGrowth := by |
| 128 | + refine ⟨hg₁.comp_contDiff hf.1 (ht ⟨·, rfl⟩), fun n ↦ ?_⟩ |
| 129 | + obtain ⟨k₁, C₁, hC₁, h₁⟩ := hf.norm_iteratedFDeriv_le_uniform n |
| 130 | + obtain ⟨k₂, C₂, hC₂, h₂⟩ := hg₂ n |
| 131 | + have h₁' : ∀ x, ‖f x‖ ≤ C₁ * (1 + ‖x‖) ^ k₁ := by simpa using h₁ 0 (zero_le _) |
| 132 | + set C₃ := ∑ k ∈ Finset.range (k₂ + 1), C₂ * (k₂.choose k : ℝ) * (C₁ ^ k) |
| 133 | + use k₁ * k₂ + k₁ * n, n ! * C₃ * (1 + C₁) ^ n |
| 134 | + intro x |
| 135 | + have hg' : ∀ i, i ≤ n → ‖iteratedFDerivWithin ℝ i g t (f x)‖ ≤ C₃ * (1 + ‖x‖) ^ (k₁ * k₂):= by |
| 136 | + intro i hi |
| 137 | + calc _ ≤ C₂ * (1 + ‖f x‖) ^ k₂ := h₂ i hi (f x) (ht ⟨x, rfl⟩) |
| 138 | + _ = ∑ i ∈ Finset.range (k₂ + 1), C₂ * (‖f x‖ ^ i * (k₂.choose i)) := by |
| 139 | + rw [add_comm, add_pow, Finset.mul_sum] |
| 140 | + simp |
| 141 | + _ ≤ ∑ i ∈ Finset.range (k₂ + 1), C₂ * (k₂.choose i) * C₁ ^ i * (1 + ‖x‖) ^ (k₁ * k₂) := by |
| 142 | + apply Finset.sum_le_sum |
| 143 | + intro i hi |
| 144 | + grw [h₁'] |
| 145 | + simp_rw [mul_pow, ← pow_mul] |
| 146 | + move_mul [← (k₂.choose _ : ℝ), C₂] |
| 147 | + gcongr |
| 148 | + · simp |
| 149 | + · grind |
| 150 | + _ = _ := by simp [C₃, Finset.sum_mul] |
| 151 | + have hf' : ∀ i, 1 ≤ i → i ≤ n → ‖iteratedFDeriv ℝ i f x‖ ≤ ((1 + C₁) * (1 + ‖x‖) ^ k₁) ^ i := by |
| 152 | + intro i hi hi' |
| 153 | + calc _ ≤ C₁ * (1 + ‖x‖) ^ k₁ := h₁ i hi' x |
| 154 | + _ ≤ (1 + C₁) * (1 + ‖x‖) ^ k₁ := by gcongr; simp |
| 155 | + _ ≤ _ := by |
| 156 | + apply le_self_pow₀ (one_le_mul_of_one_le_of_one_le (by simp [hC₁]) (by simp [one_le_pow₀])) |
| 157 | + grind |
| 158 | + calc _ ≤ n ! * (C₃ * (1 + ‖x‖) ^ (k₁ * k₂)) * ((1 + C₁) * (1 + ‖x‖) ^ k₁) ^ n := |
| 159 | + norm_iteratedFDeriv_comp_le' ht ht' hg₁ hf.1 (mod_cast le_top) x hg' hf' |
| 160 | + _ = _ := by rw [mul_pow, ← pow_mul, pow_add]; ring |
| 161 | + |
| 162 | +/-- Composition of two temperate growth functions is of temperate growth. -/ |
| 163 | +@[fun_prop] |
| 164 | +theorem HasTemperateGrowth.comp [NormedAddCommGroup D] [NormedSpace ℝ D] {g : E → F} {f : D → E} |
| 165 | + (hg : g.HasTemperateGrowth) (hf : f.HasTemperateGrowth) : (g ∘ f).HasTemperateGrowth := by |
| 166 | + apply hf.comp' (t := Set.univ) |
| 167 | + · simp |
| 168 | + · simp |
| 169 | + · rw [contDiffOn_univ] |
| 170 | + exact hg.1 |
| 171 | + · simpa [iteratedFDerivWithin_univ] using hg.norm_iteratedFDeriv_le_uniform |
| 172 | + |
118 | 173 | section Addition |
119 | 174 |
|
120 | 175 | variable {f g : E → F} |
|
0 commit comments