Skip to content

Commit

Permalink
feat(Mathlib/Analysis/Analytic): continuously polynomial functions (#…
Browse files Browse the repository at this point in the history
…9269)

This defines "continuously polynomial" (shortened to "cpolynomial") functions as a special cases of analytic functions: they are the functions that admit a development as a *finite* formal multilinear series. Then we prove their basic properties. The point of doing is this is that finite series are always summable, so we can remove the completeness assumptions in some results about analytic functions (differentiability for example). Examples of continuously polynomial functions include continuous multilinear maps, and functions defined by polynomials.



Co-authored-by: smorel394 <67864981+smorel394@users.noreply.github.com>
Co-authored-by: morel <smorel@math.princeton.edu>
  • Loading branch information
3 people committed Jan 10, 2024
1 parent 16a2a52 commit 2d16ed0
Show file tree
Hide file tree
Showing 4 changed files with 684 additions and 57 deletions.
1 change: 1 addition & 0 deletions Mathlib.lean
Expand Up @@ -566,6 +566,7 @@ import Mathlib.AlgebraicTopology.SingularSet
import Mathlib.AlgebraicTopology.SplitSimplicialObject
import Mathlib.AlgebraicTopology.TopologicalSimplex
import Mathlib.Analysis.Analytic.Basic
import Mathlib.Analysis.Analytic.CPolynomial
import Mathlib.Analysis.Analytic.Composition
import Mathlib.Analysis.Analytic.Constructions
import Mathlib.Analysis.Analytic.Inverse
Expand Down
27 changes: 14 additions & 13 deletions Mathlib/Analysis/Analytic/Basic.lean
Expand Up @@ -1192,7 +1192,7 @@ The forward map sends `(k, l, s)` to `(k + l, s)` and the inverse map sends `(n,
with non-definitional equalities. -/
@[simps]
def changeOriginIndexEquiv :
(Σk l : ℕ, { s : Finset (Fin (k + l)) // s.card = l }) ≃ Σn : ℕ, Finset (Fin n) where
(Σ k l : ℕ, { s : Finset (Fin (k + l)) // s.card = l }) ≃ Σ n : ℕ, Finset (Fin n) where
toFun s := ⟨s.1 + s.2.1, s.2.2
invFun s :=
⟨s.1 - s.2.card, s.2.card,
Expand All @@ -1216,6 +1216,16 @@ def changeOriginIndexEquiv :
simp [tsub_add_cancel_of_le (card_finset_fin_le s), Fin.castIso_to_equiv]
#align formal_multilinear_series.change_origin_index_equiv FormalMultilinearSeries.changeOriginIndexEquiv

lemma changeOriginSeriesTerm_changeOriginIndexEquiv_symm (n t) :
let s := changeOriginIndexEquiv.symm ⟨n, t⟩
p.changeOriginSeriesTerm s.1 s.2.1 s.2.2 s.2.2.2 (fun _ ↦ x) (fun _ ↦ y) =
p n (t.piecewise (fun _ ↦ x) fun _ ↦ y) := by
have : ∀ (m) (hm : n = m), p n (t.piecewise (fun _ ↦ x) fun _ ↦ y) =
p m ((t.map (Fin.castIso hm).toEmbedding).piecewise (fun _ ↦ x) fun _ ↦ y) := by
rintro m rfl
simp (config := { unfoldPartialApp := true }) [Finset.piecewise]
simp_rw [changeOriginSeriesTerm_apply, eq_comm]; apply this

theorem changeOriginSeries_summable_aux₁ {r r' : ℝ≥0} (hr : (r + r' : ℝ≥0∞) < p.radius) :
Summable fun s : Σk l : ℕ, { s : Finset (Fin (k + l)) // s.card = l } =>
‖p (s.1 + s.2.1)‖₊ * r ^ s.2.1 * r' ^ s.1 := by
Expand Down Expand Up @@ -1309,7 +1319,7 @@ theorem changeOrigin_eval (h : (‖x‖₊ + ‖y‖₊ : ℝ≥0∞) < p.radius
have x_add_y_mem_ball : x + y ∈ EMetric.ball (0 : E) p.radius := by
refine' mem_emetric_ball_zero_iff.2 (lt_of_le_of_lt _ h)
exact mod_cast nnnorm_add_le x y
set f : (Σk l : ℕ, { s : Finset (Fin (k + l)) // s.card = l }) → F := fun s =>
set f : (Σ k l : ℕ, { s : Finset (Fin (k + l)) // s.card = l }) → F := fun s =>
p.changeOriginSeriesTerm s.1 s.2.1 s.2.2 s.2.2.2 (fun _ => x) fun _ => y
have hsf : Summable f := by
refine' .of_nnnorm_bounded _ (p.changeOriginSeries_summable_aux₁ h) _
Expand All @@ -1333,17 +1343,8 @@ theorem changeOrigin_eval (h : (‖x‖₊ + ‖y‖₊ : ℝ≥0∞) < p.radius
refine' HasSum.sigma_of_hasSum
(p.hasSum x_add_y_mem_ball) (fun n => _) (changeOriginIndexEquiv.symm.summable_iff.2 hsf)
erw [(p n).map_add_univ (fun _ => x) fun _ => y]
-- porting note: added explicit function
convert hasSum_fintype (fun c : Finset (Fin n) => f (changeOriginIndexEquiv.symm ⟨n, c⟩))
rename_i s _
dsimp only [changeOriginSeriesTerm, (· ∘ ·), changeOriginIndexEquiv_symm_apply_fst,
changeOriginIndexEquiv_symm_apply_snd_fst, changeOriginIndexEquiv_symm_apply_snd_snd_coe]
rw [ContinuousMultilinearMap.curryFinFinset_apply_const]
have : ∀ (m) (hm : n = m), p n (s.piecewise (fun _ => x) fun _ => y) =
p m ((s.map (Fin.castIso hm).toEquiv.toEmbedding).piecewise (fun _ => x) fun _ => y) := by
rintro m rfl
simp (config := { unfoldPartialApp := true }) [Finset.piecewise]
apply this
simp_rw [← changeOriginSeriesTerm_changeOriginIndexEquiv_symm]
exact hasSum_fintype (fun c => f (changeOriginIndexEquiv.symm ⟨n, c⟩))
#align formal_multilinear_series.change_origin_eval FormalMultilinearSeries.changeOrigin_eval

/-- Power series terms are analytic as we vary the origin -/
Expand Down

0 comments on commit 2d16ed0

Please sign in to comment.