Skip to content

Commit 77166ed

Browse files
committed
feat: Add norm_iteratedFDeriv_prod_le using Sym (#10022)
add (iterated) deriv for prod * Add `HasFDerivAt` + variants for `Finset.prod` (and `ContinuousMultilinearMap.mkPiAlgebra`) * Add missing `iteratedFDerivWithin` equivalents for zero, const (resolves a todo in `Analysis.Calculus.ContDiff.Basic`) * Add `iteratedFDeriv[Within]_sum` for symmetry * Add a couple of convenience lemmas for `Sym` and `Finset.{prod,sum}`
1 parent a984298 commit 77166ed

File tree

9 files changed

+407
-5
lines changed

9 files changed

+407
-5
lines changed

Mathlib/Algebra/BigOperators/Basic.lean

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2322,15 +2322,21 @@ theorem prod_subtype_mul_prod_subtype {α β : Type*} [Fintype α] [CommMonoid
23222322
end Fintype
23232323

23242324
namespace Finset
2325-
variable [Fintype ι] [CommMonoid α]
2325+
variable [CommMonoid α]
23262326

23272327
@[to_additive (attr := simp)]
2328-
lemma prod_attach_univ (f : {i // i ∈ @univ ι _} → α) :
2328+
lemma prod_attach_univ [Fintype ι] (f : {i // i ∈ @univ ι _} → α) :
23292329
∏ i in univ.attach, f i = ∏ i, f ⟨i, mem_univ _⟩ :=
23302330
Fintype.prod_equiv (Equiv.subtypeUnivEquiv mem_univ) _ _ $ by simp
23312331
#align finset.prod_attach_univ Finset.prod_attach_univ
23322332
#align finset.sum_attach_univ Finset.sum_attach_univ
23332333

2334+
@[to_additive]
2335+
theorem prod_erase_attach [DecidableEq ι] {s : Finset ι} (f : ι → α) (i : ↑s) :
2336+
∏ j in s.attach.erase i, f ↑j = ∏ j in s.erase ↑i, f j := by
2337+
rw [← Function.Embedding.coe_subtype, ← prod_map]
2338+
simp [attach_map_val]
2339+
23342340
end Finset
23352341

23362342
namespace List

Mathlib/Analysis/Calculus/ContDiff/Bounds.lean

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Sébastien Gouëzel, Floris van Doorn
55
-/
66
import Mathlib.Analysis.Calculus.ContDiff.Basic
7+
import Mathlib.Data.Finset.Sym
78
import Mathlib.Data.Nat.Choose.Cast
9+
import Mathlib.Data.Nat.Choose.Multinomial
810

911
#align_import analysis.calculus.cont_diff from "leanprover-community/mathlib"@"3bce8d800a6f2b8f63fe1e588fd76a9ff4adcebe"
1012

@@ -290,7 +292,8 @@ end
290292

291293
section
292294

293-
variable {A : Type*} [NormedRing A] [NormedAlgebra 𝕜 A]
295+
variable {ι : Type*} {A : Type*} [NormedRing A] [NormedAlgebra 𝕜 A] {A' : Type*} [NormedCommRing A']
296+
[NormedAlgebra 𝕜 A']
294297

295298
theorem norm_iteratedFDerivWithin_mul_le {f : E → A} {g : E → A} {N : ℕ∞} (hf : ContDiffOn 𝕜 N f s)
296299
(hg : ContDiffOn 𝕜 N g s) (hs : UniqueDiffOn 𝕜 s) {x : E} (hx : x ∈ s) {n : ℕ}
@@ -311,6 +314,62 @@ theorem norm_iteratedFDeriv_mul_le {f : E → A} {g : E → A} {N : ℕ∞} (hf
311314
hf.contDiffOn hg.contDiffOn uniqueDiffOn_univ (mem_univ x) hn
312315
#align norm_iterated_fderiv_mul_le norm_iteratedFDeriv_mul_le
313316

317+
-- TODO: Add `norm_iteratedFDeriv[Within]_list_prod_le` for non-commutative `NormedRing A`.
318+
319+
theorem norm_iteratedFDerivWithin_prod_le [DecidableEq ι] [NormOneClass A'] {u : Finset ι}
320+
{f : ι → E → A'} {N : ℕ∞} (hf : ∀ i ∈ u, ContDiffOn 𝕜 N (f i) s) (hs : UniqueDiffOn 𝕜 s) {x : E}
321+
(hx : x ∈ s) {n : ℕ} (hn : (n : ℕ∞) ≤ N) :
322+
‖iteratedFDerivWithin 𝕜 n (∏ j in u, f j ·) s x‖ ≤
323+
∑ p in u.sym n, (p : Multiset ι).multinomial *
324+
∏ j in u, ‖iteratedFDerivWithin 𝕜 (Multiset.count j p) (f j) s x‖ := by
325+
induction u using Finset.induction generalizing n with
326+
| empty =>
327+
cases n with
328+
| zero => simp [Sym.eq_nil_of_card_zero]
329+
| succ n => simp [iteratedFDerivWithin_succ_const _ _ hs hx]
330+
| @insert i u hi IH =>
331+
conv => lhs; simp only [Finset.prod_insert hi]
332+
simp only [Finset.mem_insert, forall_eq_or_imp] at hf
333+
refine le_trans (norm_iteratedFDerivWithin_mul_le hf.1 (contDiffOn_prod hf.2) hs hx hn) ?_
334+
rw [← Finset.sum_coe_sort (Finset.sym _ _)]
335+
rw [Finset.sum_equiv (Finset.symInsertEquiv hi) (t := Finset.univ)
336+
(g := (fun v ↦ v.multinomial *
337+
∏ j in insert i u, ‖iteratedFDerivWithin 𝕜 (v.count j) (f j) s x‖) ∘
338+
Sym.toMultiset ∘ Subtype.val ∘ (Finset.symInsertEquiv hi).symm)
339+
(by simp) (by simp only [← comp_apply (g := Finset.symInsertEquiv hi), comp.assoc]; simp)]
340+
rw [← Finset.univ_sigma_univ, Finset.sum_sigma, Finset.sum_range]
341+
simp only [comp_apply, Finset.symInsertEquiv_symm_apply_coe]
342+
refine Finset.sum_le_sum ?_
343+
intro m _
344+
specialize IH hf.2 (n := n - m) (le_trans (WithTop.coe_le_coe.mpr (n.sub_le m)) hn)
345+
refine le_trans (mul_le_mul_of_nonneg_left IH (by simp [mul_nonneg])) ?_
346+
rw [Finset.mul_sum, ← Finset.sum_coe_sort]
347+
refine Finset.sum_le_sum ?_
348+
simp only [Finset.mem_univ, forall_true_left, Subtype.forall, Finset.mem_sym_iff]
349+
intro p hp
350+
refine le_of_eq ?_
351+
rw [Finset.prod_insert hi]
352+
have hip : i ∉ p := mt (hp i) hi
353+
rw [Sym.count_coe_fill_self_of_not_mem hip, Sym.multinomial_coe_fill_of_not_mem hip]
354+
suffices ∏ j in u, ‖iteratedFDerivWithin 𝕜 (Multiset.count j p) (f j) s x‖ =
355+
∏ j in u, ‖iteratedFDerivWithin 𝕜 (Multiset.count j (Sym.fill i m p)) (f j) s x‖ by
356+
rw [this, Nat.cast_mul]
357+
ring
358+
refine Finset.prod_congr rfl ?_
359+
intro j hj
360+
have hji : j ≠ i := mt (· ▸ hj) hi
361+
rw [Sym.count_coe_fill_of_ne hji]
362+
363+
theorem norm_iteratedFDeriv_prod_le [DecidableEq ι] [NormOneClass A'] {u : Finset ι}
364+
{f : ι → E → A'} {N : ℕ∞} (hf : ∀ i ∈ u, ContDiff 𝕜 N (f i)) {x : E} {n : ℕ}
365+
(hn : (n : ℕ∞) ≤ N) :
366+
‖iteratedFDeriv 𝕜 n (∏ j in u, f j ·) x‖ ≤
367+
∑ p in u.sym n, (p : Multiset ι).multinomial *
368+
∏ j in u, ‖iteratedFDeriv 𝕜 ((p : Multiset ι).count j) (f j) x‖ := by
369+
simpa [iteratedFDerivWithin_univ] using
370+
norm_iteratedFDerivWithin_prod_le (fun i hi ↦ (hf i hi).contDiffOn) uniqueDiffOn_univ
371+
(mem_univ x) hn
372+
314373
end
315374

316375
/-- If the derivatives within a set of `g` at `f x` are bounded by `C`, and the `i`-th derivative

Mathlib/Analysis/Calculus/Deriv/Mul.lean

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,38 @@ theorem deriv_const_mul_field' (u : 𝕜') : (deriv fun x => u * v x) = fun x =>
283283

284284
end Mul
285285

286+
section Prod
287+
288+
variable {ι : Type*} [DecidableEq ι] {𝔸' : Type*} [NormedCommRing 𝔸'] [NormedAlgebra 𝕜 𝔸']
289+
{u : Finset ι} {f : ι → 𝕜 → 𝔸'} {f' : ι → 𝔸'}
290+
291+
theorem HasDerivAt.finset_prod (hf : ∀ i ∈ u, HasDerivAt (f i) (f' i) x) :
292+
HasDerivAt (∏ i in u, f i ·) (∑ i in u, (∏ j in u.erase i, f j x) • f' i) x := by
293+
simpa [ContinuousLinearMap.sum_apply, ContinuousLinearMap.smul_apply] using
294+
(HasFDerivAt.finset_prod (fun i hi ↦ (hf i hi).hasFDerivAt)).hasDerivAt
295+
296+
theorem HasDerivWithinAt.finset_prod (hf : ∀ i ∈ u, HasDerivWithinAt (f i) (f' i) s x) :
297+
HasDerivWithinAt (∏ i in u, f i ·) (∑ i in u, (∏ j in u.erase i, f j x) • f' i) s x := by
298+
simpa [ContinuousLinearMap.sum_apply, ContinuousLinearMap.smul_apply] using
299+
(HasFDerivWithinAt.finset_prod (fun i hi ↦ (hf i hi).hasFDerivWithinAt)).hasDerivWithinAt
300+
301+
theorem HasStrictDerivAt.finset_prod (hf : ∀ i ∈ u, HasStrictDerivAt (f i) (f' i) x) :
302+
HasStrictDerivAt (∏ i in u, f i ·) (∑ i in u, (∏ j in u.erase i, f j x) • f' i) x := by
303+
simpa [ContinuousLinearMap.sum_apply, ContinuousLinearMap.smul_apply] using
304+
(HasStrictFDerivAt.finset_prod (fun i hi ↦ (hf i hi).hasStrictFDerivAt)).hasStrictDerivAt
305+
306+
theorem deriv_finset_prod (hf : ∀ i ∈ u, DifferentiableAt 𝕜 (f i) x) :
307+
deriv (∏ i in u, f i ·) x = ∑ i in u, (∏ j in u.erase i, f j x) • deriv (f i) x :=
308+
(HasDerivAt.finset_prod fun i hi ↦ (hf i hi).hasDerivAt).deriv
309+
310+
theorem derivWithin_finset_prod (hxs : UniqueDiffWithinAt 𝕜 s x)
311+
(hf : ∀ i ∈ u, DifferentiableWithinAt 𝕜 (f i) s x) :
312+
derivWithin (∏ i in u, f i ·) s x =
313+
∑ i in u, (∏ j in u.erase i, f j x) • derivWithin (f i) s x :=
314+
(HasDerivWithinAt.finset_prod fun i hi ↦ (hf i hi).hasDerivWithinAt).derivWithin hxs
315+
316+
end Prod
317+
286318
section Div
287319

288320
variable {𝕜' : Type*} [NontriviallyNormedField 𝕜'] [NormedAlgebra 𝕜 𝕜'] {c d : 𝕜 → 𝕜'} {c' d' : 𝕜'}

0 commit comments

Comments
 (0)