Skip to content

Commit e38a194

Browse files
committed
feat: the composition of continuously polynomial functions is continuously polynomial (#30086)
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr>
1 parent e018b8d commit e38a194

File tree

1 file changed

+75
-1
lines changed

1 file changed

+75
-1
lines changed

Mathlib/Analysis/Analytic/Composition.lean

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Sébastien Gouëzel, Johan Commelin
55
-/
66
import Mathlib.Analysis.Analytic.Basic
7+
import Mathlib.Analysis.Analytic.CPolynomialDef
78
import Mathlib.Combinatorics.Enumerative.Composition
89

910
/-!
@@ -808,7 +809,7 @@ theorem HasFPowerSeriesWithinAt.comp {g : F → G} {f : E → F} {q : FormalMult
808809
exact E
809810

810811
/-- If two functions `g` and `f` have power series `q` and `p` respectively at `f x` and `x`,
811-
then `g ∘ f` admits the power series `q.comp p` at `x` within `s`. -/
812+
then `g ∘ f` admits the power series `q.comp p` at `x`. -/
812813
theorem HasFPowerSeriesAt.comp {g : F → G} {f : E → F} {q : FormalMultilinearSeries 𝕜 F G}
813814
{p : FormalMultilinearSeries 𝕜 E F} {x : E}
814815
(hg : HasFPowerSeriesAt g q (f x)) (hf : HasFPowerSeriesAt f p x) :
@@ -892,6 +893,79 @@ lemma AnalyticOnNhd.comp_analyticOn {f : F → G} {g : E → F} {s : Set F}
892893
AnalyticOn 𝕜 (f ∘ g) t :=
893894
fun x m ↦ (hf _ (h m)).comp_analyticWithinAt (hg x m)
894895

896+
/-- If two functions `g` and `f` have finite power series `q` and `p` respectively at `f x` and `x`,
897+
then `g ∘ f` admits the finite power series `q.comp p` at `x`. -/
898+
theorem HasFiniteFPowerSeriesAt.comp {m n : ℕ} {g : F → G} {f : E → F}
899+
{q : FormalMultilinearSeries 𝕜 F G} {p : FormalMultilinearSeries 𝕜 E F} {x : E}
900+
(hg : HasFiniteFPowerSeriesAt g q (f x) m) (hf : HasFiniteFPowerSeriesAt f p x n) (hn : 0 < n) :
901+
HasFiniteFPowerSeriesAt (g ∘ f) (q.comp p) x (m * n) := by
902+
rcases hg.hasFPowerSeriesAt.comp hf.hasFPowerSeriesAt with ⟨r, hr⟩
903+
refine ⟨r, hr, fun i hi ↦ ?_⟩
904+
apply Finset.sum_eq_zero
905+
rintro c -
906+
ext v
907+
simp only [compAlongComposition_apply, ContinuousMultilinearMap.zero_apply]
908+
rcases le_or_gt m c.length with hc | hc
909+
· simp [hg.finite _ hc]
910+
obtain ⟨j, hj⟩ : ∃ j, n ≤ c.blocksFun j := by
911+
contrapose! hi
912+
rw [← c.sum_blocksFun]
913+
rcases eq_zero_or_pos c.length with h'c | h'c
914+
· have : ∑ j : Fin c.length, c.blocksFun j = 0 := by
915+
apply Finset.sum_eq_zero (fun j hj ↦ ?_)
916+
have := j.2
917+
grind
918+
rw [this]
919+
exact mul_pos (by grind) hn
920+
· calc ∑ j : Fin c.length, c.blocksFun j
921+
_ < ∑ j : Fin c.length, n := by
922+
apply Finset.sum_lt_sum (fun j hj ↦ (hi j).le)
923+
exact ⟨⟨0, h'c⟩, Finset.mem_univ _, hi _⟩
924+
_ = c.length * n := by simp
925+
_ ≤ m * n := by gcongr
926+
apply ContinuousMultilinearMap.map_coord_zero _ j
927+
simp [applyComposition, hf.finite _ hj]
928+
929+
/-- If two functions `g` and `f` are continuously polynomial respectively at `f x` and `x`,
930+
then `g ∘ f` is continuously polynomial at `x`. -/
931+
theorem CPolynomialAt.comp {g : F → G} {f : E → F} {x : E}
932+
(hg : CPolynomialAt 𝕜 g (f x)) (hf : CPolynomialAt 𝕜 f x) :
933+
CPolynomialAt 𝕜 (g ∘ f) x := by
934+
rcases hg with ⟨q, m, hm⟩
935+
rcases hf with ⟨p, n, hn⟩
936+
refine ⟨q.comp p, m * (n + 1), ?_⟩
937+
exact hm.comp (hn.of_le (Nat.le_succ n)) (Nat.zero_lt_succ n)
938+
939+
/-- If two functions `g` and `f` are continuously polynomial respectively at `f x` and `x`,
940+
then `g ∘ f` is continuously polynomial at `x`. -/
941+
theorem CPolynomialAt.fun_comp {g : F → G} {f : E → F} {x : E}
942+
(hg : CPolynomialAt 𝕜 g (f x)) (hf : CPolynomialAt 𝕜 f x) :
943+
CPolynomialAt 𝕜 (fun z ↦ g (f z)) x :=
944+
hg.comp hf
945+
946+
/-- Version of `CPolynomialAt.comp` where point equality is a separate hypothesis. -/
947+
theorem CPolynomialAt.comp_of_eq {g : F → G} {f : E → F} {y : F} {x : E} (hg : CPolynomialAt 𝕜 g y)
948+
(hf : CPolynomialAt 𝕜 f x) (hy : f x = y) : CPolynomialAt 𝕜 (g ∘ f) x := by
949+
rw [← hy] at hg
950+
exact hg.comp hf
951+
952+
/-- Version of `CPolynomialAt.comp` where point equality is a separate hypothesis. -/
953+
theorem CPolynomialAt.fun_comp_of_eq {g : F → G} {f : E → F} {y : F} {x : E}
954+
(hg : CPolynomialAt 𝕜 g y) (hf : CPolynomialAt 𝕜 f x) (hy : f x = y) :
955+
CPolynomialAt 𝕜 (fun z ↦ g (f z)) x :=
956+
hg.comp_of_eq hf hy
957+
958+
/-- If two functions `g` and `f` are continuously polynomial respectively on `s.image f` and `s`,
959+
then `g ∘ f` is continuously polynomial on `s`. -/
960+
theorem CPolynomialOn.comp' {s : Set E} {g : F → G} {f : E → F} (hg : CPolynomialOn 𝕜 g (s.image f))
961+
(hf : CPolynomialOn 𝕜 f s) : CPolynomialOn 𝕜 (g ∘ f) s :=
962+
fun z hz => (hg (f z) (Set.mem_image_of_mem f hz)).comp (hf z hz)
963+
964+
theorem CPolynomialOn.comp {s : Set E} {t : Set F} {g : F → G} {f : E → F}
965+
(hg : CPolynomialOn 𝕜 g t) (hf : CPolynomialOn 𝕜 f s) (st : Set.MapsTo f s t) :
966+
CPolynomialOn 𝕜 (g ∘ f) s :=
967+
comp' (mono hg (Set.mapsTo_iff_image_subset.mp st)) hf
968+
895969
/-!
896970
### Associativity of the composition of formal multilinear series
897971

0 commit comments

Comments
 (0)