@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44Authors: Sébastien Gouëzel, Johan Commelin
55-/
66import Mathlib.Analysis.Analytic.Basic
7+ import Mathlib.Analysis.Analytic.CPolynomialDef
78import 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`. -/
812813theorem 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