diff --git a/Mathlib/Analysis/Analytic/Constructions.lean b/Mathlib/Analysis/Analytic/Constructions.lean index 8e4a7cb6769404..b0d3cf783d3c00 100644 --- a/Mathlib/Analysis/Analytic/Constructions.lean +++ b/Mathlib/Analysis/Analytic/Constructions.lean @@ -972,20 +972,14 @@ theorem analyticAt_iff_analytic_smul [Module ๐• F] [IsBoundedSMul ๐• F] [IsS analyticAt_iff_analytic_fun_smul hโ‚f hโ‚‚f /- A function is analytic at a point iff it is analytic after multiplication - with a non-vanishing analytic function. -/ -theorem analyticAt_iff_analytic_fun_mul {f g : E โ†’ ๐•} {z : E} (hโ‚f : AnalyticAt ๐•œ f z) +with a non-vanishing analytic function. -/ +@[to_fun analyticAt_iff_analytic_fun_mul] +theorem analyticAt_iff_analytic_mul {f g : E โ†’ ๐•} {z : E} (hโ‚f : AnalyticAt ๐•œ f z) (hโ‚‚f : f z โ‰  0) : - AnalyticAt ๐•œ g z โ†” AnalyticAt ๐•œ (fun z โ†ฆ f z * g z) z := by + AnalyticAt ๐•œ g z โ†” AnalyticAt ๐•œ (f * g) z := by simp_rw [โ† smul_eq_mul] exact analyticAt_iff_analytic_smul hโ‚f hโ‚‚f -/- A function is analytic at a point iff it is analytic after multiplication - with a non-vanishing analytic function. -/ -theorem analyticAt_iff_analytic_mul {f g : E โ†’ ๐•} {z : E} (hโ‚f : AnalyticAt ๐•œ f z) - (hโ‚‚f : f z โ‰  0) : - AnalyticAt ๐•œ g z โ†” AnalyticAt ๐•œ (f * g) z := - analyticAt_iff_analytic_fun_mul hโ‚f hโ‚‚f - /-- `f x / g x` is analytic away from `g x = 0` -/ theorem AnalyticWithinAt.div {f g : E โ†’ ๐•} {s : Set E} {x : E} (fa : AnalyticWithinAt ๐•œ f s x) (ga : AnalyticWithinAt ๐•œ g s x) (g0 : g x โ‰  0) : @@ -1016,9 +1010,10 @@ theorem AnalyticOnNhd.div {f g : E โ†’ ๐•} {s : Set E} -/ /-- Finite sums of analytic functions are analytic -/ -theorem Finset.analyticWithinAt_fun_sum {f : ฮฑ โ†’ E โ†’ F} {c : E} {s : Set E} +@[to_fun Finset.analyticWithinAt_fun_sum] +theorem Finset.analyticWithinAt_sum {f : ฮฑ โ†’ E โ†’ F} {c : E} {s : Set E} (N : Finset ฮฑ) (h : โˆ€ n โˆˆ N, AnalyticWithinAt ๐•œ (f n) s c) : - AnalyticWithinAt ๐•œ (fun z โ†ฆ โˆ‘ n โˆˆ N, f n z) s c := by + AnalyticWithinAt ๐•œ (โˆ‘ n โˆˆ N, f n) s c := by classical induction N using Finset.induction with | empty => @@ -1030,47 +1025,22 @@ theorem Finset.analyticWithinAt_fun_sum {f : ฮฑ โ†’ E โ†’ F} {c : E} {s : Set E} exact (h a (Or.inl rfl)).add (hB fun b m โ†ฆ h b (Or.inr m)) /-- Finite sums of analytic functions are analytic -/ -theorem Finset.analyticWithinAt_sum {f : ฮฑ โ†’ E โ†’ F} {c : E} {s : Set E} - (N : Finset ฮฑ) (h : โˆ€ n โˆˆ N, AnalyticWithinAt ๐•œ (f n) s c) : - AnalyticWithinAt ๐•œ (โˆ‘ n โˆˆ N, f n) s c := by - convert N.analyticWithinAt_fun_sum h - simp - -/-- Finite sums of analytic functions are analytic -/ -@[fun_prop] -theorem Finset.analyticAt_fun_sum {f : ฮฑ โ†’ E โ†’ F} {c : E} - (N : Finset ฮฑ) (h : โˆ€ n โˆˆ N, AnalyticAt ๐•œ (f n) c) : - AnalyticAt ๐•œ (fun z โ†ฆ โˆ‘ n โˆˆ N, f n z) c := by - simp_rw [โ† analyticWithinAt_univ] at h โŠข - exact N.analyticWithinAt_fun_sum h - -/-- Finite sums of analytic functions are analytic -/ -@[fun_prop] +@[to_fun (attr := fun_prop) Finset.analyticAt_fun_sum] theorem Finset.analyticAt_sum {f : ฮฑ โ†’ E โ†’ F} {c : E} (N : Finset ฮฑ) (h : โˆ€ n โˆˆ N, AnalyticAt ๐•œ (f n) c) : AnalyticAt ๐•œ (โˆ‘ n โˆˆ N, f n) c := by - convert N.analyticAt_fun_sum h - simp - -/-- Finite sums of analytic functions are analytic -/ -theorem Finset.analyticOn_fun_sum {f : ฮฑ โ†’ E โ†’ F} {s : Set E} - (N : Finset ฮฑ) (h : โˆ€ n โˆˆ N, AnalyticOn ๐•œ (f n) s) : - AnalyticOn ๐•œ (fun z โ†ฆ โˆ‘ n โˆˆ N, f n z) s := - fun z zs โ†ฆ N.analyticWithinAt_fun_sum (fun n m โ†ฆ h n m z zs) + simp_rw [โ† analyticWithinAt_univ] at h โŠข + exact N.analyticWithinAt_sum h /-- Finite sums of analytic functions are analytic -/ +@[to_fun Finset.analyticOn_fun_sum] theorem Finset.analyticOn_sum {f : ฮฑ โ†’ E โ†’ F} {s : Set E} (N : Finset ฮฑ) (h : โˆ€ n โˆˆ N, AnalyticOn ๐•œ (f n) s) : AnalyticOn ๐•œ (โˆ‘ n โˆˆ N, f n) s := fun z zs โ†ฆ N.analyticWithinAt_sum (fun n m โ†ฆ h n m z zs) /-- Finite sums of analytic functions are analytic -/ -theorem Finset.analyticOnNhd_fun_sum {f : ฮฑ โ†’ E โ†’ F} {s : Set E} - (N : Finset ฮฑ) (h : โˆ€ n โˆˆ N, AnalyticOnNhd ๐•œ (f n) s) : - AnalyticOnNhd ๐•œ (fun z โ†ฆ โˆ‘ n โˆˆ N, f n z) s := - fun z zs โ†ฆ N.analyticAt_fun_sum (fun n m โ†ฆ h n m z zs) - -/-- Finite sums of analytic functions are analytic -/ +@[to_fun Finset.analyticOnNhd_fun_sum] theorem Finset.analyticOnNhd_sum {f : ฮฑ โ†’ E โ†’ F} {s : Set E} (N : Finset ฮฑ) (h : โˆ€ n โˆˆ N, AnalyticOnNhd ๐•œ (f n) s) : AnalyticOnNhd ๐•œ (โˆ‘ n โˆˆ N, f n) s := diff --git a/Mathlib/Analysis/Calculus/Deriv/Pow.lean b/Mathlib/Analysis/Calculus/Deriv/Pow.lean index baaaa3d6c3c8ca..6978c360e8b7b4 100644 --- a/Mathlib/Analysis/Calculus/Deriv/Pow.lean +++ b/Mathlib/Analysis/Calculus/Deriv/Pow.lean @@ -105,33 +105,21 @@ theorem HasDerivWithinAt.fun_pow (h : HasDerivWithinAt f f' s x) (n : โ„•) : theorem HasDerivWithinAt.pow (h : HasDerivWithinAt f f' s x) (n : โ„•) : HasDerivWithinAt (f ^ n) (n * f x ^ (n - 1) * f') s x := h.fun_pow n -theorem HasDerivAt.fun_pow (h : HasDerivAt f f' x) (n : โ„•) : - HasDerivAt (fun x โ†ฆ f x ^ n) (n * f x ^ (n - 1) * f') x := by - simpa using h.hasFDerivAt.pow n |>.hasDerivAt - +@[to_fun] theorem HasDerivAt.pow (h : HasDerivAt f f' x) (n : โ„•) : - HasDerivAt (f ^ n) (n * f x ^ (n - 1) * f') x := h.fun_pow n + HasDerivAt (f ^ n) (n * f x ^ (n - 1) * f') x := by + simpa using h.hasFDerivAt.pow n |>.hasDerivAt -@[simp] -theorem derivWithin_fun_pow (h : DifferentiableWithinAt ๐•œ f s x) (n : โ„•) : - derivWithin (fun x => f x ^ n) s x = n * f x ^ (n - 1) * derivWithin f s x := by +@[to_fun (attr := simp) derivWithin_fun_pow] +theorem derivWithin_pow (h : DifferentiableWithinAt ๐•œ f s x) (n : โ„•) : + derivWithin (f ^ n) s x = n * f x ^ (n - 1) * derivWithin f s x := by by_cases hsx : UniqueDiffWithinAt ๐•œ s x ยท exact (h.hasDerivWithinAt.pow n).derivWithin hsx ยท simp [derivWithin_zero_of_not_uniqueDiffWithinAt hsx] -@[simp] -theorem derivWithin_pow (h : DifferentiableWithinAt ๐•œ f s x) (n : โ„•) : - derivWithin (f ^ n) s x = n * f x ^ (n - 1) * derivWithin f s x := - derivWithin_fun_pow h n - -@[simp] -theorem deriv_fun_pow (h : DifferentiableAt ๐•œ f x) (n : โ„•) : - deriv (fun x => f x ^ n) x = n * f x ^ (n - 1) * deriv f x := - (h.hasDerivAt.pow n).deriv - -@[simp] +@[to_fun (attr := simp) deriv_fun_pow] theorem deriv_pow (h : DifferentiableAt ๐•œ f x) (n : โ„•) : - deriv (f ^ n) x = n * f x ^ (n - 1) * deriv f x := deriv_fun_pow h n + deriv (f ^ n) x = n * f x ^ (n - 1) * deriv f x := (h.hasDerivAt.pow n).deriv end NormedCommRing diff --git a/Mathlib/Analysis/Calculus/FDeriv/Pow.lean b/Mathlib/Analysis/Calculus/FDeriv/Pow.lean index 89baf5759dbd1d..f8c00125370854 100644 --- a/Mathlib/Analysis/Calculus/FDeriv/Pow.lean +++ b/Mathlib/Analysis/Calculus/FDeriv/Pow.lean @@ -45,60 +45,51 @@ private theorem aux (f : E โ†’ ๐”ธ) (f' : E โ†’L[๐•œ] ๐”ธ) (x : E) (n : โ„•) simp only [Finset.mem_range, Nat.lt_succ_iff] at hx rw [tsub_add_eq_add_tsub hx] -theorem HasStrictFDerivAt.fun_pow' (h : HasStrictFDerivAt f f' x) (n : โ„•) : - HasStrictFDerivAt (fun x โ†ฆ f x ^ n) +@[to_fun] +theorem HasStrictFDerivAt.pow' (h : HasStrictFDerivAt f f' x) (n : โ„•) : + HasStrictFDerivAt (f ^ n) (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> f' <โ€ข f x ^ i) x := match n with | 0 => by simpa using hasStrictFDerivAt_const 1 x | 1 => by simpa using h | n + 1 + 1 => by - have := h.mul' (h.fun_pow' (n + 1)) + have := h.mul' (h.pow' (n + 1)) simp_rw [pow_succ' _ (n + 1)] refine this.congr_fderiv <| aux _ _ _ _ -theorem HasStrictFDerivAt.pow' (h : HasStrictFDerivAt f f' x) (n : โ„•) : - HasStrictFDerivAt (f ^ n) - (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> f' <โ€ข f x ^ i) x := h.fun_pow' n - theorem hasStrictFDerivAt_pow' (n : โ„•) {x : ๐”ธ} : HasStrictFDerivAt (๐•œ := ๐•œ) (fun x โ†ฆ x ^ n) (โˆ‘ i โˆˆ Finset.range n, x ^ (n.pred - i) โ€ข> ContinuousLinearMap.id ๐•œ _ <โ€ข x ^ i) x := hasStrictFDerivAt_id _ |>.pow' n -theorem HasFDerivWithinAt.fun_pow' (h : HasFDerivWithinAt f f' s x) (n : โ„•) : - HasFDerivWithinAt (fun x โ†ฆ f x ^ n) +@[to_fun] +theorem HasFDerivWithinAt.pow' (h : HasFDerivWithinAt f f' s x) (n : โ„•) : + HasFDerivWithinAt (f ^ n) (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> f' <โ€ข f x ^ i) s x := match n with | 0 => by simpa using hasFDerivWithinAt_const 1 x s | 1 => by simpa using h | n + 1 + 1 => by - have := h.mul' (h.fun_pow' (n + 1)) + have := h.mul' (h.pow' (n + 1)) simp_rw [pow_succ' _ (n + 1)] exact this.congr_fderiv <| aux _ _ _ _ -theorem HasFDerivWithinAt.pow' (h : HasFDerivWithinAt f f' s x) (n : โ„•) : - HasFDerivWithinAt (f ^ n) - (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> f' <โ€ข f x ^ i) s x := h.fun_pow' n - theorem hasFDerivWithinAt_pow' (n : โ„•) {x : ๐”ธ} {s : Set ๐”ธ} : HasFDerivWithinAt (๐•œ := ๐•œ) (fun x โ†ฆ x ^ n) (โˆ‘ i โˆˆ Finset.range n, x ^ (n.pred - i) โ€ข> ContinuousLinearMap.id ๐•œ _ <โ€ข x ^ i) s x := hasFDerivWithinAt_id _ _ |>.pow' n -theorem HasFDerivAt.fun_pow' (h : HasFDerivAt f f' x) (n : โ„•) : - HasFDerivAt (fun x โ†ฆ f x ^ n) (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> f' <โ€ข f x ^ i) x := +@[to_fun] +theorem HasFDerivAt.pow' (h : HasFDerivAt f f' x) (n : โ„•) : + HasFDerivAt (f ^ n) (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> f' <โ€ข f x ^ i) x := match n with | 0 => by simpa using hasFDerivAt_const 1 x | 1 => by simpa using h | n + 1 + 1 => by - have := h.mul' (h.fun_pow' (n + 1)) + have := h.mul' (h.pow' (n + 1)) simp_rw [pow_succ' _ (n + 1)] exact this.congr_fderiv <| aux _ _ _ _ -theorem HasFDerivAt.pow' (h : HasFDerivAt f f' x) (n : โ„•) : - HasFDerivAt (f ^ n) (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> f' <โ€ข f x ^ i) x := - h.fun_pow' n - theorem hasFDerivAt_pow' (n : โ„•) {x : ๐”ธ} : HasFDerivAt (๐•œ := ๐•œ) (fun x โ†ฆ x ^ n) (โˆ‘ i โˆˆ Finset.range n, x ^ (n.pred - i) โ€ข> ContinuousLinearMap.id ๐•œ _ <โ€ข x ^ i) x := @@ -118,67 +109,45 @@ theorem differentiableWithinAt_pow (n : โ„•) {x : ๐”ธ} {s : Set ๐”ธ} : DifferentiableWithinAt ๐•œ (fun x : ๐”ธ => x ^ n) s x := differentiableWithinAt_id.pow _ -@[simp, fun_prop] -theorem DifferentiableAt.fun_pow (hf : DifferentiableAt ๐•œ f x) (n : โ„•) : - DifferentiableAt ๐•œ (fun x => f x ^ n) x := - differentiableWithinAt_univ.mp <| hf.differentiableWithinAt.pow n - -@[simp, fun_prop] +@[to_fun (attr := simp, fun_prop)] theorem DifferentiableAt.pow (hf : DifferentiableAt ๐•œ f x) (n : โ„•) : - DifferentiableAt ๐•œ (f ^ n) x := hf.fun_pow n + DifferentiableAt ๐•œ (f ^ n) x := + differentiableWithinAt_univ.mp <| hf.differentiableWithinAt.pow n theorem differentiableAt_pow (n : โ„•) {x : ๐”ธ} : DifferentiableAt ๐•œ (fun x : ๐”ธ => x ^ n) x := differentiableAt_id.pow _ -@[fun_prop] -theorem DifferentiableOn.fun_pow (hf : DifferentiableOn ๐•œ f s) (n : โ„•) : - DifferentiableOn ๐•œ (fun x => f x ^ n) s := fun x h => (hf x h).pow n - -@[fun_prop] +@[to_fun (attr := fun_prop)] theorem DifferentiableOn.pow (hf : DifferentiableOn ๐•œ f s) (n : โ„•) : - DifferentiableOn ๐•œ (f ^ n) s := hf.fun_pow n + DifferentiableOn ๐•œ (f ^ n) s := fun x h => (hf x h).pow n theorem differentiableOn_pow (n : โ„•) {s : Set ๐”ธ} : DifferentiableOn ๐•œ (fun x : ๐”ธ => x ^ n) s := differentiableOn_id.pow n -@[simp, fun_prop] -theorem Differentiable.fun_pow (hf : Differentiable ๐•œ f) (n : โ„•) : - Differentiable ๐•œ fun x => f x ^ n := - fun x => (hf x).pow n - -@[simp, fun_prop] +@[to_fun (attr := simp, fun_prop)] theorem Differentiable.pow (hf : Differentiable ๐•œ f) (n : โ„•) : Differentiable ๐•œ (f ^ n) := - hf.fun_pow n + fun x => (hf x).pow n theorem differentiable_pow (n : โ„•) : Differentiable ๐•œ fun x : ๐”ธ => x ^ n := differentiable_id.pow _ -theorem fderiv_fun_pow' (n : โ„•) (hf : DifferentiableAt ๐•œ f x) : - fderiv ๐•œ (fun x โ†ฆ f x ^ n) x - = (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> fderiv ๐•œ f x <โ€ข f x ^ i) := - hf.hasFDerivAt.pow' n |>.fderiv - +@[to_fun fderiv_fun_pow'] theorem fderiv_pow' (n : โ„•) (hf : DifferentiableAt ๐•œ f x) : fderiv ๐•œ (f ^ n) x = (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> fderiv ๐•œ f x <โ€ข f x ^ i) := - fderiv_fun_pow' n hf + hf.hasFDerivAt.pow' n |>.fderiv theorem fderiv_pow_ring' {x : ๐”ธ} (n : โ„•) : fderiv ๐•œ (fun x : ๐”ธ โ†ฆ x ^ n) x = (โˆ‘ i โˆˆ Finset.range n, x ^ (n.pred - i) โ€ข> .id _ _ <โ€ข x ^ i) := by rw [fderiv_fun_pow' n differentiableAt_fun_id, fderiv_fun_id] -theorem fderivWithin_fun_pow' (hxs : UniqueDiffWithinAt ๐•œ s x) - (n : โ„•) (hf : DifferentiableWithinAt ๐•œ f s x) : - fderivWithin ๐•œ (fun x โ†ฆ f x ^ n) s x - = (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> fderivWithin ๐•œ f s x <โ€ข f x ^ i) := - hf.hasFDerivWithinAt.pow' n |>.fderivWithin hxs - +@[to_fun fderivWithin_fun_pow'] theorem fderivWithin_pow' (hxs : UniqueDiffWithinAt ๐•œ s x) (n : โ„•) (hf : DifferentiableWithinAt ๐•œ f s x) : fderivWithin ๐•œ (f ^ n) s x = (โˆ‘ i โˆˆ Finset.range n, f x ^ (n.pred - i) โ€ข> fderivWithin ๐•œ f s x <โ€ข f x ^ i) := - fderivWithin_fun_pow' hxs n hf + hf.hasFDerivWithinAt.pow' n |>.fderivWithin hxs theorem fderivWithin_pow_ring' {s : Set ๐”ธ} {x : ๐”ธ} (n : โ„•) (hxs : UniqueDiffWithinAt ๐•œ s x) : fderivWithin ๐•œ (fun x : ๐”ธ โ†ฆ x ^ n) s x @@ -228,27 +197,20 @@ theorem hasFDerivAt_pow (n : โ„•) {x : ๐”ธ} : (fun x : ๐”ธ โ†ฆ x ^ n) ((n โ€ข x ^ (n - 1)) โ€ข ContinuousLinearMap.id ๐•œ ๐”ธ) x := hasFDerivAt_id _ |>.pow n -theorem fderiv_fun_pow (n : โ„•) (hf : DifferentiableAt ๐•œ f x) : - fderiv ๐•œ (fun x โ†ฆ f x ^ n) x = (n โ€ข f x ^ (n - 1)) โ€ข fderiv ๐•œ f x := - hf.hasFDerivAt.pow n |>.fderiv - +@[to_fun fderiv_fun_pow] theorem fderiv_pow (n : โ„•) (hf : DifferentiableAt ๐•œ f x) : - fderiv ๐•œ (fun x โ†ฆ f x ^ n) x = (n โ€ข f x ^ (n - 1)) โ€ข fderiv ๐•œ f x := - fderiv_fun_pow n hf + fderiv ๐•œ (f ^ n) x = (n โ€ข f x ^ (n - 1)) โ€ข fderiv ๐•œ f x := + hf.hasFDerivAt.pow n |>.fderiv theorem fderiv_pow_ring {x : ๐”ธ} (n : โ„•) : fderiv ๐•œ (fun x : ๐”ธ โ†ฆ x ^ n) x = (n โ€ข x ^ (n - 1)) โ€ข .id _ _ := by rw [fderiv_fun_pow n differentiableAt_fun_id, fderiv_fun_id] -theorem fderivWithin_fun_pow (hxs : UniqueDiffWithinAt ๐•œ s x) - (n : โ„•) (hf : DifferentiableWithinAt ๐•œ f s x) : - fderivWithin ๐•œ (fun x โ†ฆ f x ^ n) s x = (n โ€ข f x ^ (n - 1)) โ€ข fderivWithin ๐•œ f s x := - hf.hasFDerivWithinAt.pow n |>.fderivWithin hxs - +@[to_fun fderivWithin_fun_pow] theorem fderivWithin_pow (hxs : UniqueDiffWithinAt ๐•œ s x) (n : โ„•) (hf : DifferentiableWithinAt ๐•œ f s x) : fderivWithin ๐•œ (f ^ n) s x = (n โ€ข f x ^ (n - 1)) โ€ข fderivWithin ๐•œ f s x := - fderivWithin_fun_pow hxs n hf + hf.hasFDerivWithinAt.pow n |>.fderivWithin hxs theorem fderivWithin_pow_ring {s : Set ๐”ธ} {x : ๐”ธ} (n : โ„•) (hxs : UniqueDiffWithinAt ๐•œ s x) : fderivWithin ๐•œ (fun x : ๐”ธ โ†ฆ x ^ n) s x = (n โ€ข x ^ (n - 1)) โ€ข .id _ _ := by diff --git a/Mathlib/Analysis/Calculus/IteratedDeriv/Lemmas.lean b/Mathlib/Analysis/Calculus/IteratedDeriv/Lemmas.lean index b6222afdfc6fd8..76933237667dd5 100644 --- a/Mathlib/Analysis/Calculus/IteratedDeriv/Lemmas.lean +++ b/Mathlib/Analysis/Calculus/IteratedDeriv/Lemmas.lean @@ -245,6 +245,7 @@ theorem iteratedDerivWithin_comp_const_sub (c : ๐•œ) : ext a simp [iteratedDerivWithin, iteratedFDerivWithin_comp_const_sub] +@[to_fun iteratedDerivWithin_fun_id] lemma iteratedDerivWithin_id : iteratedDerivWithin n id s x = if n = 0 then x else if n = 1 then 1 else 0 := by obtain (_ | n) := n @@ -253,10 +254,6 @@ lemma iteratedDerivWithin_id : ยท simp [iteratedDerivWithin_const] ยท exact fun y hy โ†ฆ derivWithin_id _ _ (h.uniqueDiffWithinAt hy) -lemma iteratedDerivWithin_fun_id : - iteratedDerivWithin n (ยท) s x = if n = 0 then x else if n = 1 then 1 else 0 := - iteratedDerivWithin_id hx h - lemma iteratedDerivWithin_smul {f : ๐•œ โ†’ ๐”ธ} {g : ๐•œ โ†’ F} (hf : ContDiffWithinAt ๐•œ (โ†‘n) f s x) (hg : ContDiffWithinAt ๐•œ (โ†‘n) g s x) : iteratedDerivWithin n (f โ€ข g) s x = โˆ‘ i โˆˆ .range (n + 1), @@ -313,16 +310,12 @@ protected lemma Filter.EventuallyEq.iteratedDeriv iteratedDeriv n fโ‚ =แถ [๐“ x] iteratedDeriv n fโ‚‚ := by simp_all [โ† nhdsWithin_univ, โ† iteratedDerivWithin_univ, EventuallyEq.iteratedDerivWithin] +@[to_fun iteratedDeriv_fun_add] lemma iteratedDeriv_add (hf : ContDiffAt ๐•œ n f x) (hg : ContDiffAt ๐•œ n g x) : iteratedDeriv n (f + g) x = iteratedDeriv n f x + iteratedDeriv n g x := by simpa only [iteratedDerivWithin_univ] using iteratedDerivWithin_add (Set.mem_univ _) uniqueDiffOn_univ hf hg --- TODO: `@[to_fun]` generates the wrong name. Same for the various lemmas below. -lemma iteratedDeriv_fun_add (hf : ContDiffAt ๐•œ n f x) (hg : ContDiffAt ๐•œ n g x) : - iteratedDeriv n (fun z โ†ฆ f z + g z) x = iteratedDeriv n f x + iteratedDeriv n g x := - iteratedDeriv_add hf hg - theorem iteratedDeriv_const_add (hn : 0 < n) (c : F) : iteratedDeriv n (fun z => c + f z) x = iteratedDeriv n f x := by simpa only [โ† iteratedDerivWithin_univ] using iteratedDerivWithin_const_add hn c @@ -331,35 +324,25 @@ theorem iteratedDeriv_const_sub (hn : 0 < n) (c : F) : iteratedDeriv n (fun z => c - f z) x = iteratedDeriv n (-f) x := by simpa only [โ† iteratedDerivWithin_univ] using iteratedDerivWithin_const_sub hn c -@[simp] -lemma iteratedDeriv_fun_neg (n : โ„•) (f : ๐•œ โ†’ F) (a : ๐•œ) : - iteratedDeriv n (fun x โ†ฆ -(f x)) a = -(iteratedDeriv n f a) := by - simpa only [โ† iteratedDerivWithin_univ] using iteratedDerivWithin_neg f - -@[simp] +@[simp, to_fun iteratedDeriv_fun_neg] lemma iteratedDeriv_neg (n : โ„•) (f : ๐•œ โ†’ F) (a : ๐•œ) : iteratedDeriv n (-f) a = -(iteratedDeriv n f a) := by simpa only [โ† iteratedDerivWithin_univ] using iteratedDerivWithin_neg f +attribute [simp] iteratedDeriv_fun_neg +@[to_fun iteratedDeriv_fun_sub] lemma iteratedDeriv_sub (hf : ContDiffAt ๐•œ n f x) (hg : ContDiffAt ๐•œ n g x) : iteratedDeriv n (f - g) x = iteratedDeriv n f x - iteratedDeriv n g x := by simpa only [iteratedDerivWithin_univ] using iteratedDerivWithin_sub (Set.mem_univ _) uniqueDiffOn_univ hf hg -lemma iteratedDeriv_fun_sub (hf : ContDiffAt ๐•œ n f x) (hg : ContDiffAt ๐•œ n g x) : - iteratedDeriv n (fun z โ†ฆ f z - g z) x = iteratedDeriv n f x - iteratedDeriv n g x := - iteratedDeriv_sub hf hg - +@[to_fun iteratedDeriv_fun_const_smul] theorem iteratedDeriv_const_smul {n : โ„•} {f : ๐•œ โ†’ F} (h : ContDiffAt ๐•œ n f x) (c : R) : iteratedDeriv n (c โ€ข f) x = c โ€ข iteratedDeriv n f x := by simpa only [iteratedDerivWithin_univ] using iteratedDerivWithin_const_smul (Set.mem_univ x) uniqueDiffOn_univ c (contDiffWithinAt_univ.mpr h) -theorem iteratedDeriv_fun_const_smul {n : โ„•} {f : ๐•œ โ†’ F} (h : ContDiffAt ๐•œ n f x) (c : R) : - iteratedDeriv n (c โ€ข f ยท) x = c โ€ข iteratedDeriv n f x := - iteratedDeriv_const_smul h c - /-- A variant of `iteratedDeriv_const_smul` without differentiability assumption when the scalar multiplication is by division ring elements. -/ @[simp] @@ -421,19 +404,17 @@ lemma iteratedDeriv_comp_neg (n : โ„•) (f : ๐•œ โ†’ F) (a : ๐•œ) : iteratedDeriv n (fun x โ†ฆ f (-x)) a = (-1 : ๐•œ) ^ n โ€ข iteratedDeriv n f (-a) := by simp [iteratedDeriv, โ† iteratedFDerivWithin_univ, iteratedFDerivWithin_comp_neg] +@[to_fun iteratedDeriv_fun_id] lemma iteratedDeriv_id {n : โ„•} {x : ๐•œ} : iteratedDeriv n id x = if n = 0 then x else if n = 1 then 1 else 0 := by obtain (_ | _ | n) := n <;> simp [iteratedDeriv_succ', iteratedDeriv_const] -lemma iteratedDeriv_fun_id {n : โ„•} {x : ๐•œ} : - iteratedDeriv n (fun a โ†ฆ a) x = if n = 0 then x else if n = 1 then 1 else 0 := - iteratedDeriv_id - lemma iteratedDeriv_fun_id_zero : iteratedDeriv n (fun a โ†ฆ a) (0 : ๐•œ) = if n = 1 then 1 else 0 := by simp +contextual [iteratedDeriv_fun_id] +@[to_fun iteratedDeriv_fun_mul] lemma iteratedDeriv_mul {f g : ๐•œ โ†’ ๐”ธ} (hf : ContDiffAt ๐•œ n f x) (hg : ContDiffAt ๐•œ n g x) : iteratedDeriv n (f * g) x = โˆ‘ i โˆˆ .range (n + 1), n.choose i * iteratedDeriv i f x * iteratedDeriv (n - i) g x := by @@ -445,11 +426,6 @@ theorem iteratedDeriv_pow (m : โ„•) (k : โ„•) : iteratedDeriv k (ยท ^ m) x = m.descFactorial k * x ^ (m - k) := by simpa using iteratedDerivWithin_pow (Set.mem_univ x) uniqueDiffOn_univ m k -lemma iteratedDeriv_fun_mul {f g : ๐•œ โ†’ ๐”ธ} (hf : ContDiffAt ๐•œ n f x) (hg : ContDiffAt ๐•œ n g x) : - iteratedDeriv n (fun x โ†ฆ f x * g x) x = โˆ‘ i โˆˆ .range (n + 1), - n.choose i * iteratedDeriv i f x * iteratedDeriv (n - i) g x := - iteratedDeriv_mul hf hg - lemma iteratedDeriv_fun_pow_zero {n m : โ„•} : iteratedDeriv n (ยท ^ m) (0 : ๐•œ) = if n = m then m.factorial else 0 := by obtain h | h | h := lt_trichotomy n m <;>