# mathlib3documentation

analysis.calculus.cont_diff

# Higher differentiability of usual operations #

THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.

We prove that the usual operations (addition, multiplication, difference, composition, and so on) preserve `C^n` functions. We also expand the API around `C^n` functions.

## Main results #

• `cont_diff.comp` states that the composition of two `C^n` functions is `C^n`.
• `norm_iterated_fderiv_comp_le` gives the bound `n! * C * D ^ n` for the `n`-th derivative of `g ∘ f` assuming that the derivatives of `g` are bounded by `C` and the `i`-th derivative of `f` is bounded by `D ^ i`.

Similar results are given for `C^n` functions on domains.

## Notations #

We use the notation `E [×n]→L[𝕜] F` for the space of continuous multilinear maps on `E^n` with values in `F`. This is the space in which the `n`-th derivative of a function from `E` to `F` lives.

In this file, we denote `⊤ : ℕ∞` with `∞`.

## Tags #

derivative, differentiability, higher derivative, `C^n`, multilinear, Taylor series, formal series

theorem finset.sum_choose_succ_mul {R : Type u_1} [semiring R] (f : R) (n : ) :
(finset.range (n + 2)).sum (λ (i : ), ((n + 1).choose i) * f i (n + 1 - i)) = (finset.range (n + 1)).sum (λ (i : ), (n.choose i) * f i (n + 1 - i)) + (finset.range (n + 1)).sum (λ (i : ), (n.choose i) * f (i + 1) (n - i))

The sum of `(n+1).choose i * f i (n+1-i)` can be split into two sums at rank `n`, respectively of `n.choose i * f i (n+1-i)` and `n.choose i * f (i+1) (n-i)`.

theorem finset.sum_antidiagonal_choose_succ_mul {R : Type u_1} [semiring R] (f : R) (n : ) :
(finset.nat.antidiagonal (n + 1)).sum (λ (ij : × ), ((n + 1).choose ij.fst) * f ij.fst ij.snd) = (λ (ij : × ), (n.choose ij.fst) * f ij.fst (ij.snd + 1)) + (λ (ij : × ), (n.choose ij.snd) * f (ij.fst + 1) ij.snd)

The sum along the antidiagonal of `(n+1).choose i * f i j` can be split into two sums along the antidiagonal at rank `n`, respectively of `n.choose i * f i (j+1)` and `n.choose j * f (i+1) j`.

### Constants #

@[simp]
theorem iterated_fderiv_zero_fun {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : } :
(λ (x : E), 0) = 0
theorem cont_diff_zero_fun {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} :
n (λ (x : E), 0)
theorem cont_diff_const {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {c : F} :
n (λ (x : E), c)

Constants are `C^∞`.

theorem cont_diff_on_const {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {c : F} {s : set E} :
n (λ (x : E), c) s
theorem cont_diff_at_const {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {n : ℕ∞} {c : F} :
n (λ (x : E), c) x
theorem cont_diff_within_at_const {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {s : set E} {x : E} {n : ℕ∞} {c : F} :
(λ (x : E), c) s x
theorem cont_diff_of_subsingleton {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {f : E F} {n : ℕ∞} [subsingleton F] :
n f
theorem cont_diff_at_of_subsingleton {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {f : E F} {x : E} {n : ℕ∞} [subsingleton F] :
n f x
theorem cont_diff_within_at_of_subsingleton {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {s : set E} {f : E F} {x : E} {n : ℕ∞} [subsingleton F] :
f s x
theorem cont_diff_on_of_subsingleton {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {s : set E} {f : E F} {n : ℕ∞} [subsingleton F] :
n f s
theorem iterated_fderiv_succ_const {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] (n : ) (c : F) :
(n + 1) (λ (y : E), c) = 0
theorem iterated_fderiv_const_of_ne {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : } (hn : n 0) (c : F) :
(λ (y : E), c) = 0

### Smoothness of linear functions #

theorem is_bounded_linear_map.cont_diff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {f : E F} {n : ℕ∞} (hf : f) :
n f

Unbundled bounded linear functions are `C^∞`.

theorem continuous_linear_map.cont_diff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} (f : E →L[𝕜] F) :
n f
theorem continuous_linear_equiv.cont_diff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} (f : E ≃L[𝕜] F) :
n f
theorem linear_isometry.cont_diff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} (f : E →ₗᵢ[𝕜] F) :
n f
theorem linear_isometry_equiv.cont_diff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} (f : E ≃ₗᵢ[𝕜] F) :
n f
theorem cont_diff_id {𝕜 : Type u_1} {E : Type uE} [ E] {n : ℕ∞} :
n id

The identity is `C^∞`.

theorem cont_diff_within_at_id {𝕜 : Type u_1} {E : Type uE} [ E] {n : ℕ∞} {s : set E} {x : E} :
s x
theorem cont_diff_at_id {𝕜 : Type u_1} {E : Type uE} [ E] {n : ℕ∞} {x : E} :
n id x
theorem cont_diff_on_id {𝕜 : Type u_1} {E : Type uE} [ E] {n : ℕ∞} {s : set E} :
n id s
theorem is_bounded_bilinear_map.cont_diff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {b : E × F G} {n : ℕ∞} (hb : b) :
n b

Bilinear functions are `C^∞`.

theorem has_ftaylor_series_up_to_on.continuous_linear_map_comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {n : ℕ∞} {p : E } (g : F →L[𝕜] G) (hf : s) :
(g f) (λ (x : E) (k : ), g.comp_continuous_multilinear_map (p x k)) s

If `f` admits a Taylor series `p` in a set `s`, and `g` is linear, then `g ∘ f` admits a Taylor series whose `k`-th term is given by `g ∘ (p k)`.

theorem cont_diff_within_at.continuous_linear_map_comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {x : E} {n : ℕ∞} (g : F →L[𝕜] G) (hf : f s x) :
(g f) s x

Composition by continuous linear maps on the left preserves `C^n` functions in a domain at a point.

theorem cont_diff_at.continuous_linear_map_comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E F} {x : E} {n : ℕ∞} (g : F →L[𝕜] G) (hf : n f x) :
n (g f) x

Composition by continuous linear maps on the left preserves `C^n` functions in a domain at a point.

theorem cont_diff_on.continuous_linear_map_comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {n : ℕ∞} (g : F →L[𝕜] G) (hf : n f s) :
n (g f) s

Composition by continuous linear maps on the left preserves `C^n` functions on domains.

theorem cont_diff.continuous_linear_map_comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F} (g : F →L[𝕜] G) (hf : n f) :
n (λ (x : E), g (f x))

Composition by continuous linear maps on the left preserves `C^n` functions.

theorem continuous_linear_map.iterated_fderiv_within_comp_left {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {x : E} {n : ℕ∞} {f : E F} (g : F →L[𝕜] G) (hf : n f s) (hs : s) (hx : x s) {i : } (hi : i n) :

The iterated derivative within a set of the composition with a linear map on the left is obtained by applying the linear map to the iterated derivative.

theorem continuous_linear_map.iterated_fderiv_comp_left {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F} (g : F →L[𝕜] G) (hf : n f) (x : E) {i : } (hi : i n) :

The iterated derivative of the composition with a linear map on the left is obtained by applying the linear map to the iterated derivative.

theorem continuous_linear_equiv.iterated_fderiv_within_comp_left {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {x : E} (g : F ≃L[𝕜] G) (f : E F) (hs : s) (hx : x s) (i : ) :

The iterated derivative within a set of the composition with a linear equiv on the left is obtained by applying the linear equiv to the iterated derivative. This is true without differentiability assumptions.

theorem linear_isometry.norm_iterated_fderiv_within_comp_left {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {x : E} {n : ℕ∞} {f : E F} (g : F →ₗᵢ[𝕜] G) (hf : n f s) (hs : s) (hx : x s) {i : } (hi : i n) :
(g f) s x = s x

Composition with a linear isometry on the left preserves the norm of the iterated derivative within a set.

theorem linear_isometry.norm_iterated_fderiv_comp_left {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F} (g : F →ₗᵢ[𝕜] G) (hf : n f) (x : E) {i : } (hi : i n) :
(g f) x = f x

Composition with a linear isometry on the left preserves the norm of the iterated derivative.

theorem linear_isometry_equiv.norm_iterated_fderiv_within_comp_left {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {x : E} (g : F ≃ₗᵢ[𝕜] G) (f : E F) (hs : s) (hx : x s) (i : ) :
(g f) s x = s x

Composition with a linear isometry equiv on the left preserves the norm of the iterated derivative within a set.

theorem linear_isometry_equiv.norm_iterated_fderiv_comp_left {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] (g : F ≃ₗᵢ[𝕜] G) (f : E F) (x : E) (i : ) :
(g f) x = f x

Composition with a linear isometry equiv on the left preserves the norm of the iterated derivative.

theorem continuous_linear_equiv.comp_cont_diff_within_at_iff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {x : E} {n : ℕ∞} (e : F ≃L[𝕜] G) :
(e f) s x f s x

Composition by continuous linear equivs on the left respects higher differentiability at a point in a domain.

theorem continuous_linear_equiv.comp_cont_diff_at_iff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E F} {x : E} {n : ℕ∞} (e : F ≃L[𝕜] G) :
n (e f) x n f x

Composition by continuous linear equivs on the left respects higher differentiability at a point.

theorem continuous_linear_equiv.comp_cont_diff_on_iff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {n : ℕ∞} (e : F ≃L[𝕜] G) :
n (e f) s n f s

Composition by continuous linear equivs on the left respects higher differentiability on domains.

theorem continuous_linear_equiv.comp_cont_diff_iff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E F} {n : ℕ∞} (e : F ≃L[𝕜] G) :
n (e f) n f

Composition by continuous linear equivs on the left respects higher differentiability.

theorem has_ftaylor_series_up_to_on.comp_continuous_linear_map {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {n : ℕ∞} {p : E } (hf : s) (g : G →L[𝕜] E) :
(f g) (λ (x : G) (k : ), (p (g x) k).comp_continuous_linear_map (λ (_x : fin k), g)) (g ⁻¹' s)

If `f` admits a Taylor series `p` in a set `s`, and `g` is linear, then `f ∘ g` admits a Taylor series in `g ⁻¹' s`, whose `k`-th term is given by `p k (g v₁, ..., g vₖ)` .

theorem cont_diff_within_at.comp_continuous_linear_map {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {n : ℕ∞} {x : G} (g : G →L[𝕜] E) (hf : f s (g x)) :
(f g) (g ⁻¹' s) x

Composition by continuous linear maps on the right preserves `C^n` functions at a point on a domain.

theorem cont_diff_on.comp_continuous_linear_map {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {n : ℕ∞} (hf : n f s) (g : G →L[𝕜] E) :
n (f g) (g ⁻¹' s)

Composition by continuous linear maps on the right preserves `C^n` functions on domains.

theorem cont_diff.comp_continuous_linear_map {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F} {g : G →L[𝕜] E} (hf : n f) :
n (f g)

Composition by continuous linear maps on the right preserves `C^n` functions.

theorem continuous_linear_map.iterated_fderiv_within_comp_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {n : ℕ∞} {f : E F} (g : G →L[𝕜] E) (hf : n f s) (hs : s) (h's : (g ⁻¹' s)) {x : G} (hx : g x s) {i : } (hi : i n) :
(f g) (g ⁻¹' s) x = f s (g x)).comp_continuous_linear_map (λ (_x : fin i), g)

The iterated derivative within a set of the composition with a linear map on the right is obtained by composing the iterated derivative with the linear map.

theorem continuous_linear_equiv.iterated_fderiv_within_comp_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} (g : G ≃L[𝕜] E) (f : E F) (hs : s) {x : G} (hx : g x s) (i : ) :
(f g) (g ⁻¹' s) x = f s (g x)).comp_continuous_linear_map (λ (_x : fin i), g)

The iterated derivative within a set of the composition with a linear equiv on the right is obtained by composing the iterated derivative with the linear equiv.

theorem continuous_linear_map.iterated_fderiv_comp_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} (g : G →L[𝕜] E) {f : E F} (hf : n f) (x : G) {i : } (hi : i n) :
(f g) x = i f (g x)).comp_continuous_linear_map (λ (_x : fin i), g)

The iterated derivative of the composition with a linear map on the right is obtained by composing the iterated derivative with the linear map.

theorem linear_isometry_equiv.norm_iterated_fderiv_within_comp_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} (g : G ≃ₗᵢ[𝕜] E) (f : E F) (hs : s) {x : G} (hx : g x s) (i : ) :
(f g) (g ⁻¹' s) x = s (g x)

Composition with a linear isometry on the right preserves the norm of the iterated derivative within a set.

theorem linear_isometry_equiv.norm_iterated_fderiv_comp_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] (g : G ≃ₗᵢ[𝕜] E) (f : E F) (x : G) (i : ) :
(f g) x = f (g x)

Composition with a linear isometry on the right preserves the norm of the iterated derivative within a set.

theorem continuous_linear_equiv.cont_diff_within_at_comp_iff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {x : E} {n : ℕ∞} (e : G ≃L[𝕜] E) :
(f e) (e ⁻¹' s) ((e.symm) x) f s x

Composition by continuous linear equivs on the right respects higher differentiability at a point in a domain.

theorem continuous_linear_equiv.cont_diff_at_comp_iff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E F} {x : E} {n : ℕ∞} (e : G ≃L[𝕜] E) :
n (f e) ((e.symm) x) n f x

Composition by continuous linear equivs on the right respects higher differentiability at a point.

theorem continuous_linear_equiv.cont_diff_on_comp_iff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {n : ℕ∞} (e : G ≃L[𝕜] E) :
n (f e) (e ⁻¹' s) n f s

Composition by continuous linear equivs on the right respects higher differentiability on domains.

theorem continuous_linear_equiv.cont_diff_comp_iff {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E F} {n : ℕ∞} (e : G ≃L[𝕜] E) :
n (f e) n f

Composition by continuous linear equivs on the right respects higher differentiability.

theorem has_ftaylor_series_up_to_on.prod {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {n : ℕ∞} {p : E } (hf : s) {g : E G} {q : E } (hg : s) :
(λ (y : E), (f y, g y)) (λ (y : E) (k : ), (p y k).prod (q y k)) s

If two functions `f` and `g` admit Taylor series `p` and `q` in a set `s`, then the cartesian product of `f` and `g` admits the cartesian product of `p` and `q` as a Taylor series.

theorem cont_diff_within_at.prod {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {x : E} {n : ℕ∞} {s : set E} {f : E F} {g : E G} (hf : f s x) (hg : g s x) :
(λ (x : E), (f x, g x)) s x

The cartesian product of `C^n` functions at a point in a domain is `C^n`.

theorem cont_diff_on.prod {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {s : set E} {f : E F} {g : E G} (hf : n f s) (hg : n g s) :
n (λ (x : E), (f x, g x)) s

The cartesian product of `C^n` functions on domains is `C^n`.

theorem cont_diff_at.prod {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {x : E} {n : ℕ∞} {f : E F} {g : E G} (hf : n f x) (hg : n g x) :
n (λ (x : E), (f x, g x)) x

The cartesian product of `C^n` functions at a point is `C^n`.

theorem cont_diff.prod {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F} {g : E G} (hf : n f) (hg : n g) :
n (λ (x : E), (f x, g x))

The cartesian product of `C^n` functions is `C^n`.

### Composition of `C^n` functions #

We show that the composition of `C^n` functions is `C^n`. One way to prove it would be to write the `n`-th derivative of the composition (this is Faà di Bruno's formula) and check its continuity, but this is very painful. Instead, we go for a simple inductive proof. Assume it is done for `n`. Then, to check it for `n+1`, one needs to check that the derivative of `g ∘ f` is `C^n`, i.e., that `Dg(f x) ⬝ Df(x)` is `C^n`. The term `Dg (f x)` is the composition of two `C^n` functions, so it is `C^n` by the inductive assumption. The term `Df(x)` is also `C^n`. Then, the matrix multiplication is the application of a bilinear map (which is `C^∞`, and therefore `C^n`) to `x ↦ (Dg(f x), Df x)`. As the composition of two `C^n` maps, it is again `C^n`, and we are done.

There is a subtlety in this argument: we apply the inductive assumption to functions on other Banach spaces. In maths, one would say: prove by induction over `n` that, for all `C^n` maps between all pairs of Banach spaces, their composition is `C^n`. In Lean, this is fine as long as the spaces stay in the same universe. This is not the case in the above argument: if `E` lives in universe `u` and `F` lives in universe `v`, then linear maps from `E` to `F` (to which the derivative of `f` belongs) is in universe `max u v`. If one could quantify over finitely many universes, the above proof would work fine, but this is not the case. One could still write the proof considering spaces in any universe in `u, v, w, max u v, max v w, max u v w`, but it would be extremely tedious and lead to a lot of duplication. Instead, we formulate the above proof when all spaces live in the same universe (where everything is fine), and then we deduce the general result by lifting all our spaces to a common universe. We use the trick that any space `H` is isomorphic through a continuous linear equiv to `continuous_multilinear_map (λ (i : fin 0), E × F × G) H` to change the universe level, and then argue that composing with such a linear equiv does not change the fact of being `C^n`, which we have already proved previously.

theorem cont_diff_on.comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {s : set E} {t : set F} {g : F G} {f : E F} (hg : n g t) (hf : n f s) (st : s f ⁻¹' t) :
n (g f) s

The composition of `C^n` functions on domains is `C^n`.

theorem cont_diff_on.comp' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {s : set E} {t : set F} {g : F G} {f : E F} (hg : n g t) (hf : n f s) :
n (g f) (s f ⁻¹' t)

The composition of `C^n` functions on domains is `C^n`.

theorem cont_diff.comp_cont_diff_on {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {s : set E} {g : F G} {f : E F} (hg : n g) (hf : n f s) :
n (g f) s

The composition of a `C^n` function on a domain with a `C^n` function is `C^n`.

theorem cont_diff.comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {g : F G} {f : E F} (hg : n g) (hf : n f) :
n (g f)

The composition of `C^n` functions is `C^n`.

theorem cont_diff_within_at.comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {s : set E} {t : set F} {g : F G} {f : E F} (x : E) (hg : g t (f x)) (hf : f s x) (st : s f ⁻¹' t) :
(g f) s x

The composition of `C^n` functions at points in domains is `C^n`.

theorem cont_diff_within_at.comp_of_mem {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {s : set E} {t : set F} {g : F G} {f : E F} (x : E) (hg : g t (f x)) (hf : f s x) (hs : t nhds_within (f x) (f '' s)) :
(g f) s x

The composition of `C^n` functions at points in domains is `C^n`, with a weaker condition on `s` and `t`.

theorem cont_diff_within_at.comp' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {s : set E} {t : set F} {g : F G} {f : E F} (x : E) (hg : g t (f x)) (hf : f s x) :
(g f) (s f ⁻¹' t) x

The composition of `C^n` functions at points in domains is `C^n`.

theorem cont_diff_at.comp_cont_diff_within_at {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F} {g : F G} {n : ℕ∞} (x : E) (hg : n g (f x)) (hf : f s x) :
(g f) s x
theorem cont_diff_at.comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E F} {g : F G} {n : ℕ∞} (x : E) (hg : n g (f x)) (hf : n f x) :
n (g f) x

The composition of `C^n` functions at points is `C^n`.

theorem cont_diff.comp_cont_diff_within_at {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {t : set E} {x : E} {n : ℕ∞} {g : F G} {f : E F} (h : n g) (hf : f t x) :
(g f) t x
theorem cont_diff.comp_cont_diff_at {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {g : F G} {f : E F} (x : E) (hg : n g) (hf : n f x) :
n (g f) x

### Smoothness of projections #

theorem cont_diff_fst {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} :

The first projection in a product is `C^∞`.

theorem cont_diff.fst {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F × G} (hf : n f) :
n (λ (x : E), (f x).fst)

Postcomposing `f` with `prod.fst` is `C^n`

theorem cont_diff.fst' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E G} (hf : n f) :
n (λ (x : E × F), f x.fst)

Precomposing `f` with `prod.fst` is `C^n`

theorem cont_diff_on_fst {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {s : set (E × F)} :
s

The first projection on a domain in a product is `C^∞`.

theorem cont_diff_on.fst {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F × G} {s : set E} (hf : n f s) :
n (λ (x : E), (f x).fst) s
theorem cont_diff_at_fst {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {p : E × F} :
p

The first projection at a point in a product is `C^∞`.

theorem cont_diff_at.fst {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F × G} {x : E} (hf : n f x) :
n (λ (x : E), (f x).fst) x

Postcomposing `f` with `prod.fst` is `C^n` at `(x, y)`

theorem cont_diff_at.fst' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E G} {x : E} {y : F} (hf : n f x) :
n (λ (x : E × F), f x.fst) (x, y)

Precomposing `f` with `prod.fst` is `C^n` at `(x, y)`

theorem cont_diff_at.fst'' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E G} {x : E × F} (hf : n f x.fst) :
n (λ (x : E × F), f x.fst) x

Precomposing `f` with `prod.fst` is `C^n` at `x : E × F`

theorem cont_diff_within_at_fst {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {s : set (E × F)} {p : E × F} :
p

The first projection within a domain at a point in a product is `C^∞`.

theorem cont_diff_snd {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} :

The second projection in a product is `C^∞`.

theorem cont_diff.snd {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F × G} (hf : n f) :
n (λ (x : E), (f x).snd)

Postcomposing `f` with `prod.snd` is `C^n`

theorem cont_diff.snd' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : F G} (hf : n f) :
n (λ (x : E × F), f x.snd)

Precomposing `f` with `prod.snd` is `C^n`

theorem cont_diff_on_snd {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {s : set (E × F)} :
s

The second projection on a domain in a product is `C^∞`.

theorem cont_diff_on.snd {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F × G} {s : set E} (hf : n f s) :
n (λ (x : E), (f x).snd) s
theorem cont_diff_at_snd {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {p : E × F} :
p

The second projection at a point in a product is `C^∞`.

theorem cont_diff_at.snd {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : E F × G} {x : E} (hf : n f x) :
n (λ (x : E), (f x).snd) x

Postcomposing `f` with `prod.snd` is `C^n` at `x`

theorem cont_diff_at.snd' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : F G} {x : E} {y : F} (hf : n f y) :
n (λ (x : E × F), f x.snd) (x, y)

Precomposing `f` with `prod.snd` is `C^n` at `(x, y)`

theorem cont_diff_at.snd'' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {f : F G} {x : E × F} (hf : n f x.snd) :
n (λ (x : E × F), f x.snd) x

Precomposing `f` with `prod.snd` is `C^n` at `x : E × F`

theorem cont_diff_within_at_snd {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {s : set (E × F)} {p : E × F} :
p

The second projection within a domain at a point in a product is `C^∞`.

theorem cont_diff.comp₂ {𝕜 : Type u_1} {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {E₁ : Type u_3} {E₂ : Type u_4} [ E₁] [ E₂] {g : E₁ × E₂ G} {f₁ : F E₁} {f₂ : F E₂} (hg : n g) (hf₁ : n f₁) (hf₂ : n f₂) :
n (λ (x : F), g (f₁ x, f₂ x))
theorem cont_diff.comp₃ {𝕜 : Type u_1} {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {E₁ : Type u_3} {E₂ : Type u_4} {E₃ : Type u_5} [ E₁] [ E₂] [ E₃] {g : E₁ × E₂ × E₃ G} {f₁ : F E₁} {f₂ : F E₂} {f₃ : F E₃} (hg : n g) (hf₁ : n f₁) (hf₂ : n f₂) (hf₃ : n f₃) :
n (λ (x : F), g (f₁ x, f₂ x, f₃ x))
theorem cont_diff.comp_cont_diff_on₂ {𝕜 : Type u_1} {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {E₁ : Type u_3} {E₂ : Type u_4} [ E₁] [ E₂] {g : E₁ × E₂ G} {f₁ : F E₁} {f₂ : F E₂} {s : set F} (hg : n g) (hf₁ : n f₁ s) (hf₂ : n f₂ s) :
n (λ (x : F), g (f₁ x, f₂ x)) s
theorem cont_diff.comp_cont_diff_on₃ {𝕜 : Type u_1} {F : Type uF} [ F] {G : Type uG} [ G] {n : ℕ∞} {E₁ : Type u_3} {E₂ : Type u_4} {E₃ : Type u_5} [ E₁] [ E₂] [ E₃] {g : E₁ × E₂ × E₃ G} {f₁ : F E₁} {f₂ : F E₂} {f₃ : F E₃} {s : set F} (hg : n g) (hf₁ : n f₁ s) (hf₂ : n f₂ s) (hf₃ : n f₃ s) :
n (λ (x : F), g (f₁ x, f₂ x, f₃ x)) s
theorem cont_diff.clm_comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {X : Type u_2} [ X] {n : ℕ∞} {g : X (F →L[𝕜] G)} {f : X (E →L[𝕜] F)} (hg : n g) (hf : n f) :
n (λ (x : X), (g x).comp (f x))
theorem cont_diff_on.clm_comp {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {X : Type u_2} [ X] {n : ℕ∞} {g : X (F →L[𝕜] G)} {f : X (E →L[𝕜] F)} {s : set X} (hg : n g s) (hf : n f s) :
n (λ (x : X), (g x).comp (f x)) s
theorem cont_diff.clm_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E (F →L[𝕜] G)} {g : E F} {n : ℕ∞} (hf : n f) (hg : n g) :
n (λ (x : E), (f x) (g x))
theorem cont_diff_on.clm_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E (F →L[𝕜] G)} {g : E F} {n : ℕ∞} (hf : n f s) (hg : n g s) :
n (λ (x : E), (f x) (g x)) s
theorem cont_diff.smul_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E (F →L[𝕜] 𝕜)} {g : E G} {n : ℕ∞} (hf : n f) (hg : n g) :
n (λ (x : E), (f x).smul_right (g x))
theorem cont_diff_prod_assoc {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] :
F G)

The natural equivalence `(E × F) × G ≃ E × (F × G)` is smooth.

Warning: if you think you need this lemma, it is likely that you can simplify your proof by reformulating the lemma that you're applying next using the tips in Note [continuity lemma statement]

theorem cont_diff_prod_assoc_symm {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] :
F G).symm)

The natural equivalence `E × (F × G) ≃ (E × F) × G` is smooth.

Warning: see remarks attached to `cont_diff_prod_assoc`

### Bundled derivatives are smooth #

theorem cont_diff_within_at.has_fderiv_within_at_nhds {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {f : E F G} {g : E F} {t : set F} {n : } {x₀ : E} (hf : (n + 1) s ×ˢ t) (x₀, g x₀)) (hg : g s x₀) (hgt : t nhds_within (g x₀) (g '' s)) :
(v : set E) (H : v s)), v (f' : E (F →L[𝕜] G)), ( (x : E), x v has_fderiv_within_at (f x) (f' x) t (g x)) (λ (x : E), f' x) s x₀

One direction of `cont_diff_within_at_succ_iff_has_fderiv_within_at`, but where all derivatives are taken within the same set. Version for partial derivatives / functions with parameters. If `f x` is a `C^n+1` family of functions and `g x` is a `C^n` family of points, then the derivative of `f x` at `g x` depends in a `C^n` way on `x`. We give a general version of this fact relative to sets which may not have unique derivatives, in the following form. If `f : E × F → G` is `C^n+1` at `(x₀, g(x₀))` in `(s ∪ {x₀}) × t ⊆ E × F` and `g : E → F` is `C^n` at `x₀` within some set `s ⊆ E`, then there is a function `f' : E → F →L[𝕜] G` that is `C^n` at `x₀` within `s` such that for all `x` sufficiently close to `x₀` within `s ∪ {x₀}` the function `y ↦ f x y` has derivative `f' x` at `g x` within `t ⊆ F`. For convenience, we return an explicit set of `x`'s where this holds that is a subset of `s ∪ {x₀}`. We need one additional condition, namely that `t` is a neighborhood of `g(x₀)` within `g '' s`.

theorem cont_diff_within_at.fderiv_within'' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {x₀ : E} {m : ℕ∞} {f : E F G} {g : E F} {t : set F} {n : ℕ∞} (hf : s ×ˢ t) (x₀, g x₀)) (hg : g s x₀) (ht : ∀ᶠ (x : E) in s), (g x)) (hmn : m + 1 n) (hgt : t nhds_within (g x₀) (g '' s)) :
(λ (x : E), (f x) t (g x)) s x₀

The most general lemma stating that `x ↦ fderiv_within 𝕜 (f x) t (g x)` is `C^n` at a point within a set. To show that `x ↦ D_yf(x,y)g(x)` (taken within `t`) is `C^m` at `x₀` within `s`, we require that

• `f` is `C^n` at `(x₀, g(x₀))` within `(s ∪ {x₀}) × t` for `n ≥ m+1`.
• `g` is `C^m` at `x₀` within `s`;
• Derivatives are unique at `g(x)` within `t` for `x` sufficiently close to `x₀` within `s ∪ {x₀}`;
• `t` is a neighborhood of `g(x₀)` within `g '' s`;
theorem cont_diff_within_at.fderiv_within' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {x₀ : E} {m : ℕ∞} {f : E F G} {g : E F} {t : set F} {n : ℕ∞} (hf : s ×ˢ t) (x₀, g x₀)) (hg : g s x₀) (ht : ∀ᶠ (x : E) in s), (g x)) (hmn : m + 1 n) (hst : s g ⁻¹' t) :
(λ (x : E), (f x) t (g x)) s x₀

A special case of `cont_diff_within_at.fderiv_within''` where we require that `s ⊆ g⁻¹(t)`.

theorem cont_diff_within_at.fderiv_within {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {x₀ : E} {m : ℕ∞} {f : E F G} {g : E F} {t : set F} {n : ℕ∞} (hf : (s ×ˢ t) (x₀, g x₀)) (hg : g s x₀) (ht : t) (hmn : m + 1 n) (hx₀ : x₀ s) (hst : s g ⁻¹' t) :
(λ (x : E), (f x) t (g x)) s x₀

A special case of `cont_diff_within_at.fderiv_within'` where we require that `x₀ ∈ s` and there are unique derivatives everywhere within `t`.

theorem cont_diff_within_at.fderiv_within_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {s : set E} {x₀ : E} {m : ℕ∞} {f : E F G} {g k : E F} {t : set F} {n : ℕ∞} (hf : (s ×ˢ t) (x₀, g x₀)) (hg : g s x₀) (hk : k s x₀) (ht : t) (hmn : m + 1 n) (hx₀ : x₀ s) (hst : s g ⁻¹' t) :
(λ (x : E), (f x) t (g x)) (k x)) s x₀

`x ↦ fderiv_within 𝕜 (f x) t (g x) (k x)` is smooth at a point within a set.

theorem cont_diff_within_at.fderiv_within_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {s : set E} {f : E F} {x₀ : E} {m n : ℕ∞} (hf : f s x₀) (hs : s) (hmn : m + 1 n) (hx₀s : x₀ s) :
f s) s x₀

`fderiv_within 𝕜 f s` is smooth at `x₀` within `s`.

theorem cont_diff_at.fderiv {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {x₀ : E} {m : ℕ∞} {f : E F G} {g : E F} {n : ℕ∞} (hf : n (x₀, g x₀)) (hg : m g x₀) (hmn : m + 1 n) :
m (λ (x : E), (f x) (g x)) x₀

`x ↦ fderiv 𝕜 (f x) (g x)` is smooth at `x₀`.

theorem cont_diff_at.fderiv_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {f : E F} {x₀ : E} {m n : ℕ∞} (hf : n f x₀) (hmn : m + 1 n) :
m (fderiv 𝕜 f) x₀

`fderiv 𝕜 f` is smooth at `x₀`.

theorem cont_diff.fderiv {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E F G} {g : E F} {n m : ℕ∞} (hf : m ) (hg : n g) (hnm : n + 1 m) :
n (λ (x : E), (f x) (g x))

`x ↦ fderiv 𝕜 (f x) (g x)` is smooth.

theorem cont_diff.fderiv_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {f : E F} {m n : ℕ∞} (hf : n f) (hmn : m + 1 n) :
m (fderiv 𝕜 f)

`fderiv 𝕜 f` is smooth.

theorem continuous.fderiv {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E F G} {g : E F} {n : ℕ∞} (hf : n ) (hg : continuous g) (hn : 1 n) :
continuous (λ (x : E), (f x) (g x))

`x ↦ fderiv 𝕜 (f x) (g x)` is continuous.

theorem cont_diff.fderiv_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {G : Type uG} [ G] {f : E F G} {g k : E F} {n m : ℕ∞} (hf : m ) (hg : n g) (hk : n k) (hnm : n + 1 m) :
n (λ (x : E), (fderiv 𝕜 (f x) (g x)) (k x))

`x ↦ fderiv 𝕜 (f x) (g x) (k x)` is smooth.

theorem cont_diff_on_fderiv_within_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {m n : ℕ∞} {s : set E} {f : E F} (hf : n f s) (hs : s) (hmn : m + 1 n) :
m (λ (p : E × E), f s p.fst) p.snd) (s ×ˢ set.univ)

The bundled derivative of a `C^{n+1}` function is `C^n`.

theorem cont_diff_on.continuous_on_fderiv_within_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {s : set E} {f : E F} {n : ℕ∞} (hf : n f s) (hs : s) (hn : 1 n) :
continuous_on (λ (p : E × E), f s p.fst) p.snd) (s ×ˢ set.univ)

If a function is at least `C^1`, its bundled derivative (mapping `(x, v)` to `Df(x) v`) is continuous.

theorem cont_diff.cont_diff_fderiv_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {m n : ℕ∞} {f : E F} (hf : n f) (hmn : m + 1 n) :
m (λ (p : E × E), (fderiv 𝕜 f p.fst) p.snd)

The bundled derivative of a `C^{n+1}` function is `C^n`.

### Smoothness of functions `f : E → Π i, F' i`#

theorem has_ftaylor_series_up_to_on_pi {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {n : ℕ∞} {ι : Type u_3} [fintype ι] {F' : ι Type u_5} [Π (i : ι), normed_add_comm_group (F' i)] [Π (i : ι), (F' i)] {φ : Π (i : ι), E F' i} {p' : Π (i : ι), E (F' i)} :
(λ (x : E) (i : ι), φ i x) (λ (x : E) (m : ), continuous_multilinear_map.pi (λ (i : ι), p' i x m)) s (i : ι), (φ i) (p' i) s
@[simp]
theorem has_ftaylor_series_up_to_on_pi' {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {n : ℕ∞} {ι : Type u_3} [fintype ι] {F' : ι Type u_5} [Π (i : ι), normed_add_comm_group (F' i)] [Π (i : ι), (F' i)] {Φ : E Π (i : ι), F' i} {P' : E (Π (i : ι), F' i)} :
s (i : ι), (λ (x : E), Φ x i) (λ (x : E) (m : ), s
theorem cont_diff_within_at_pi {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {x : E} {n : ℕ∞} {ι : Type u_3} [fintype ι] {F' : ι Type u_5} [Π (i : ι), normed_add_comm_group (F' i)] [Π (i : ι), (F' i)] {Φ : E Π (i : ι), F' i} :
Φ s x (i : ι), (λ (x : E), Φ x i) s x
theorem cont_diff_on_pi {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {n : ℕ∞} {ι : Type u_3} [fintype ι] {F' : ι Type u_5} [Π (i : ι), normed_add_comm_group (F' i)] [Π (i : ι), (F' i)] {Φ : E Π (i : ι), F' i} :
n Φ s (i : ι), n (λ (x : E), Φ x i) s
theorem cont_diff_at_pi {𝕜 : Type u_1} {E : Type uE} [ E] {x : E} {n : ℕ∞} {ι : Type u_3} [fintype ι] {F' : ι Type u_5} [Π (i : ι), normed_add_comm_group (F' i)] [Π (i : ι), (F' i)] {Φ : E Π (i : ι), F' i} :
n Φ x (i : ι), n (λ (x : E), Φ x i) x
theorem cont_diff_pi {𝕜 : Type u_1} {E : Type uE} [ E] {n : ℕ∞} {ι : Type u_3} [fintype ι] {F' : ι Type u_5} [Π (i : ι), normed_add_comm_group (F' i)] [Π (i : ι), (F' i)] {Φ : E Π (i : ι), F' i} :
n Φ (i : ι), n (λ (x : E), Φ x i)
theorem cont_diff_apply (𝕜 : Type u_1) (E : Type uE) [ E] {n : ℕ∞} {ι : Type u_3} [fintype ι] (i : ι) :
n (λ (f : ι E), f i)
theorem cont_diff_apply_apply (𝕜 : Type u_1) (E : Type uE) [ E] {n : ℕ∞} {ι : Type u_3} {ι' : Type u_4} [fintype ι] [fintype ι'] (i : ι) (j : ι') :
n (λ (f : ι ι' E), f i j)

### Sum of two functions #

theorem cont_diff_add {𝕜 : Type u_1} {F : Type uF} [ F] {n : ℕ∞} :
n (λ (p : F × F), p.fst + p.snd)
theorem cont_diff_within_at.add {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {n : ℕ∞} {s : set E} {f g : E F} (hf : f s x) (hg : g s x) :
(λ (x : E), f x + g x) s x

The sum of two `C^n` functions within a set at a point is `C^n` within this set at this point.

theorem cont_diff_at.add {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {n : ℕ∞} {f g : E F} (hf : n f x) (hg : n g x) :
n (λ (x : E), f x + g x) x

The sum of two `C^n` functions at a point is `C^n` at this point.

theorem cont_diff.add {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {f g : E F} (hf : n f) (hg : n g) :
n (λ (x : E), f x + g x)

The sum of two `C^n`functions is `C^n`.

theorem cont_diff_on.add {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {s : set E} {f g : E F} (hf : n f s) (hg : n g s) :
n (λ (x : E), f x + g x) s

The sum of two `C^n` functions on a domain is `C^n`.

theorem iterated_fderiv_within_add_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {s : set E} {x : E} {i : } {f g : E F} (hf : f s) (hg : g s) (hu : s) (hx : x s) :
(f + g) s x = s x + s x

The iterated derivative of the sum of two functions is the sum of the iterated derivatives. See also `iterated_fderiv_within_add_apply'`, which uses the spelling `(λ x, f x + g x)` instead of `f + g`.

theorem iterated_fderiv_within_add_apply' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {s : set E} {x : E} {i : } {f g : E F} (hf : f s) (hg : g s) (hu : s) (hx : x s) :
(λ (x : E), f x + g x) s x = s x + s x

The iterated derivative of the sum of two functions is the sum of the iterated derivatives. This is the same as `iterated_fderiv_within_add_apply`, but using the spelling `(λ x, f x + g x)` instead of `f + g`, which can be handy for some rewrites. TODO: use one form consistently.

theorem iterated_fderiv_add_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {i : } {f g : E F} (hf : i f) (hg : i g) :
(f + g) x = f x + g x
theorem iterated_fderiv_add_apply' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {i : } {f g : E F} (hf : i f) (hg : i g) :
(λ (x : E), f x + g x) x = f x + g x

### Negative #

theorem cont_diff_neg {𝕜 : Type u_1} {F : Type uF} [ F] {n : ℕ∞} :
n (λ (p : F), -p)
theorem cont_diff_within_at.neg {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {n : ℕ∞} {s : set E} {f : E F} (hf : f s x) :
(λ (x : E), -f x) s x

The negative of a `C^n` function within a domain at a point is `C^n` within this domain at this point.

theorem cont_diff_at.neg {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {n : ℕ∞} {f : E F} (hf : n f x) :
n (λ (x : E), -f x) x

The negative of a `C^n` function at a point is `C^n` at this point.

theorem cont_diff.neg {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {f : E F} (hf : n f) :
n (λ (x : E), -f x)

The negative of a `C^n`function is `C^n`.

theorem cont_diff_on.neg {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {s : set E} {f : E F} (hf : n f s) :
n (λ (x : E), -f x) s

The negative of a `C^n` function on a domain is `C^n`.

theorem iterated_fderiv_within_neg_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {s : set E} {x : E} {i : } {f : E F} (hu : s) (hx : x s) :
(-f) s x = - s x
theorem iterated_fderiv_neg_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {i : } {f : E F} :
(-f) x = - f x

### Subtraction #

theorem cont_diff_within_at.sub {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {n : ℕ∞} {s : set E} {f g : E F} (hf : f s x) (hg : g s x) :
(λ (x : E), f x - g x) s x

The difference of two `C^n` functions within a set at a point is `C^n` within this set at this point.

theorem cont_diff_at.sub {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {n : ℕ∞} {f g : E F} (hf : n f x) (hg : n g x) :
n (λ (x : E), f x - g x) x

The difference of two `C^n` functions at a point is `C^n` at this point.

theorem cont_diff_on.sub {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {s : set E} {f g : E F} (hf : n f s) (hg : n g s) :
n (λ (x : E), f x - g x) s

The difference of two `C^n` functions on a domain is `C^n`.

theorem cont_diff.sub {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {f g : E F} (hf : n f) (hg : n g) :
n (λ (x : E), f x - g x)

The difference of two `C^n` functions is `C^n`.

### Sum of finitely many functions #

theorem cont_diff_within_at.sum {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {ι : Type u_2} {f : ι E F} {s : finset ι} {t : set E} {x : E} (h : (i : ι), i s (λ (x : E), f i x) t x) :
(λ (x : E), s.sum (λ (i : ι), f i x)) t x
theorem cont_diff_at.sum {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {ι : Type u_2} {f : ι E F} {s : finset ι} {x : E} (h : (i : ι), i s n (λ (x : E), f i x) x) :
n (λ (x : E), s.sum (λ (i : ι), f i x)) x
theorem cont_diff_on.sum {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {ι : Type u_2} {f : ι E F} {s : finset ι} {t : set E} (h : (i : ι), i s n (λ (x : E), f i x) t) :
n (λ (x : E), s.sum (λ (i : ι), f i x)) t
theorem cont_diff.sum {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {ι : Type u_2} {f : ι E F} {s : finset ι} (h : (i : ι), i s n (λ (x : E), f i x)) :
n (λ (x : E), s.sum (λ (i : ι), f i x))

### Product of two functions #

theorem cont_diff_mul {𝕜 : Type u_1} {n : ℕ∞} {𝔸 : Type u_3} [normed_ring 𝔸] [ 𝔸] :
n (λ (p : 𝔸 × 𝔸), p.fst * p.snd)
theorem cont_diff_within_at.mul {𝕜 : Type u_1} {E : Type uE} [ E] {x : E} {n : ℕ∞} {𝔸 : Type u_3} [normed_ring 𝔸] [ 𝔸] {s : set E} {f g : E 𝔸} (hf : f s x) (hg : g s x) :
(λ (x : E), f x * g x) s x

The product of two `C^n` functions within a set at a point is `C^n` within this set at this point.

theorem cont_diff_at.mul {𝕜 : Type u_1} {E : Type uE} [ E] {x : E} {n : ℕ∞} {𝔸 : Type u_3} [normed_ring 𝔸] [ 𝔸] {f g : E 𝔸} (hf : n f x) (hg : n g x) :
n (λ (x : E), f x * g x) x

The product of two `C^n` functions at a point is `C^n` at this point.

theorem cont_diff_on.mul {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {n : ℕ∞} {𝔸 : Type u_3} [normed_ring 𝔸] [ 𝔸] {f g : E 𝔸} (hf : n f s) (hg : n g s) :
n (λ (x : E), f x * g x) s

The product of two `C^n` functions on a domain is `C^n`.

theorem cont_diff.mul {𝕜 : Type u_1} {E : Type uE} [ E] {n : ℕ∞} {𝔸 : Type u_3} [normed_ring 𝔸] [ 𝔸] {f g : E 𝔸} (hf : n f) (hg : n g) :
n (λ (x : E), f x * g x)

The product of two `C^n`functions is `C^n`.

theorem cont_diff_within_at_prod' {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {x : E} {n : ℕ∞} {𝔸' : Type u_4} {ι : Type u_5} [normed_comm_ring 𝔸'] [ 𝔸'] {t : finset ι} {f : ι E 𝔸'} (h : (i : ι), i t (f i) s x) :
(t.prod (λ (i : ι), f i)) s x
theorem cont_diff_within_at_prod {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {x : E} {n : ℕ∞} {𝔸' : Type u_4} {ι : Type u_5} [normed_comm_ring 𝔸'] [ 𝔸'] {t : finset ι} {f : ι E 𝔸'} (h : (i : ι), i t (f i) s x) :
(λ (y : E), t.prod (λ (i : ι), f i y)) s x
theorem cont_diff_at_prod' {𝕜 : Type u_1} {E : Type uE} [ E] {x : E} {n : ℕ∞} {𝔸' : Type u_4} {ι : Type u_5} [normed_comm_ring 𝔸'] [ 𝔸'] {t : finset ι} {f : ι E 𝔸'} (h : (i : ι), i t n (f i) x) :
n (t.prod (λ (i : ι), f i)) x
theorem cont_diff_at_prod {𝕜 : Type u_1} {E : Type uE} [ E] {x : E} {n : ℕ∞} {𝔸' : Type u_4} {ι : Type u_5} [normed_comm_ring 𝔸'] [ 𝔸'] {t : finset ι} {f : ι E 𝔸'} (h : (i : ι), i t n (f i) x) :
n (λ (y : E), t.prod (λ (i : ι), f i y)) x
theorem cont_diff_on_prod' {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {n : ℕ∞} {𝔸' : Type u_4} {ι : Type u_5} [normed_comm_ring 𝔸'] [ 𝔸'] {t : finset ι} {f : ι E 𝔸'} (h : (i : ι), i t n (f i) s) :
n (t.prod (λ (i : ι), f i)) s
theorem cont_diff_on_prod {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {n : ℕ∞} {𝔸' : Type u_4} {ι : Type u_5} [normed_comm_ring 𝔸'] [ 𝔸'] {t : finset ι} {f : ι E 𝔸'} (h : (i : ι), i t n (f i) s) :
n (λ (y : E), t.prod (λ (i : ι), f i y)) s
theorem cont_diff_prod' {𝕜 : Type u_1} {E : Type uE} [ E] {n : ℕ∞} {𝔸' : Type u_4} {ι : Type u_5} [normed_comm_ring 𝔸'] [ 𝔸'] {t : finset ι} {f : ι E 𝔸'} (h : (i : ι), i t n (f i)) :
n (t.prod (λ (i : ι), f i))
theorem cont_diff_prod {𝕜 : Type u_1} {E : Type uE} [ E] {n : ℕ∞} {𝔸' : Type u_4} {ι : Type u_5} [normed_comm_ring 𝔸'] [ 𝔸'] {t : finset ι} {f : ι E 𝔸'} (h : (i : ι), i t n (f i)) :
n (λ (y : E), t.prod (λ (i : ι), f i y))
theorem cont_diff.pow {𝕜 : Type u_1} {E : Type uE} [ E] {n : ℕ∞} {𝔸 : Type u_3} [normed_ring 𝔸] [ 𝔸] {f : E 𝔸} (hf : n f) (m : ) :
n (λ (x : E), f x ^ m)
theorem cont_diff_within_at.pow {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {x : E} {n : ℕ∞} {𝔸 : Type u_3} [normed_ring 𝔸] [ 𝔸] {f : E 𝔸} (hf : f s x) (m : ) :
(λ (y : E), f y ^ m) s x
theorem cont_diff_at.pow {𝕜 : Type u_1} {E : Type uE} [ E] {x : E} {n : ℕ∞} {𝔸 : Type u_3} [normed_ring 𝔸] [ 𝔸] {f : E 𝔸} (hf : n f x) (m : ) :
n (λ (y : E), f y ^ m) x
theorem cont_diff_on.pow {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {n : ℕ∞} {𝔸 : Type u_3} [normed_ring 𝔸] [ 𝔸] {f : E 𝔸} (hf : n f s) (m : ) :
n (λ (y : E), f y ^ m) s
theorem cont_diff_within_at.div_const {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {x : E} {𝕜' : Type u_6} [normed_field 𝕜'] [ 𝕜'] {f : E 𝕜'} {n : ℕ∞} (hf : f s x) (c : 𝕜') :
(λ (x : E), f x / c) s x
theorem cont_diff_at.div_const {𝕜 : Type u_1} {E : Type uE} [ E] {x : E} {𝕜' : Type u_6} [normed_field 𝕜'] [ 𝕜'] {f : E 𝕜'} {n : ℕ∞} (hf : n f x) (c : 𝕜') :
n (λ (x : E), f x / c) x
theorem cont_diff_on.div_const {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {𝕜' : Type u_6} [normed_field 𝕜'] [ 𝕜'] {f : E 𝕜'} {n : ℕ∞} (hf : n f s) (c : 𝕜') :
n (λ (x : E), f x / c) s
theorem cont_diff.div_const {𝕜 : Type u_1} {E : Type uE} [ E] {𝕜' : Type u_6} [normed_field 𝕜'] [ 𝕜'] {f : E 𝕜'} {n : ℕ∞} (hf : n f) (c : 𝕜') :
n (λ (x : E), f x / c)

### Scalar multiplication #

theorem cont_diff_smul {𝕜 : Type u_1} {F : Type uF} [ F] {n : ℕ∞} :
n (λ (p : 𝕜 × F), p.fst p.snd)
theorem cont_diff_within_at.smul {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {n : ℕ∞} {s : set E} {f : E 𝕜} {g : E F} (hf : f s x) (hg : g s x) :
(λ (x : E), f x g x) s x

The scalar multiplication of two `C^n` functions within a set at a point is `C^n` within this set at this point.

theorem cont_diff_at.smul {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {x : E} {n : ℕ∞} {f : E 𝕜} {g : E F} (hf : n f x) (hg : n g x) :
n (λ (x : E), f x g x) x

The scalar multiplication of two `C^n` functions at a point is `C^n` at this point.

theorem cont_diff.smul {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {f : E 𝕜} {g : E F} (hf : n f) (hg : n g) :
n (λ (x : E), f x g x)

The scalar multiplication of two `C^n` functions is `C^n`.

theorem cont_diff_on.smul {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {s : set E} {f : E 𝕜} {g : E F} (hf : n f s) (hg : n g s) :
n (λ (x : E), f x g x) s

The scalar multiplication of two `C^n` functions on a domain is `C^n`.

### Constant scalar multiplication #

theorem cont_diff_const_smul {𝕜 : Type u_1} {F : Type uF} [ F] {n : ℕ∞} {R : Type u_3} [semiring R] [ F] [ F] (c : R) :
n (λ (p : F), c p)
theorem cont_diff_within_at.const_smul {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {R : Type u_3} [semiring R] [ F] [ F] {s : set E} {f : E F} {x : E} (c : R) (hf : f s x) :
(λ (y : E), c f y) s x

The scalar multiplication of a constant and a `C^n` function within a set at a point is `C^n` within this set at this point.

theorem cont_diff_at.const_smul {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {R : Type u_3} [semiring R] [ F] [ F] {f : E F} {x : E} (c : R) (hf : n f x) :
n (λ (y : E), c f y) x

The scalar multiplication of a constant and a `C^n` function at a point is `C^n` at this point.

theorem cont_diff.const_smul {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {R : Type u_3} [semiring R] [ F] [ F] {f : E F} (c : R) (hf : n f) :
n (λ (y : E), c f y)

The scalar multiplication of a constant and a `C^n` function is `C^n`.

theorem cont_diff_on.const_smul {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {R : Type u_3} [semiring R] [ F] [ F] {s : set E} {f : E F} (c : R) (hf : n f s) :
n (λ (y : E), c f y) s

The scalar multiplication of a constant and a `C^n` on a domain is `C^n`.

theorem iterated_fderiv_within_const_smul_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {s : set E} {f : E F} {x : E} {R : Type u_3} [semiring R] [ F] [ F] {i : } {a : R} (hf : f s) (hu : s) (hx : x s) :
(a f) s x = a s x
theorem iterated_fderiv_const_smul_apply {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {f : E F} {R : Type u_3} [semiring R] [ F] [ F] {i : } {a : R} {x : E} (hf : i f) :
(a f) x = a f x

### Cartesian product of two functions #

theorem cont_diff_within_at.prod_map' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {E' : Type u_3} [ E'] {F' : Type u_4} [ F'] {s : set E} {t : set E'} {f : E F} {g : E' F'} {p : E × E'} (hf : f s p.fst) (hg : g t p.snd) :
(prod.map f g) (s ×ˢ t) p

The product map of two `C^n` functions within a set at a point is `C^n` within the product set at the product point.

theorem cont_diff_within_at.prod_map {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {E' : Type u_3} [ E'] {F' : Type u_4} [ F'] {s : set E} {t : set E'} {f : E F} {g : E' F'} {x : E} {y : E'} (hf : f s x) (hg : g t y) :
(prod.map f g) (s ×ˢ t) (x, y)
theorem cont_diff_on.prod_map {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {E' : Type u_2} [ E'] {F' : Type u_3} [ F'] {s : set E} {t : set E'} {f : E F} {g : E' F'} (hf : n f s) (hg : n g t) :
n (prod.map f g) (s ×ˢ t)

The product map of two `C^n` functions on a set is `C^n` on the product set.

theorem cont_diff_at.prod_map {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {E' : Type u_3} [ E'] {F' : Type u_4} [ F'] {f : E F} {g : E' F'} {x : E} {y : E'} (hf : n f x) (hg : n g y) :
n (prod.map f g) (x, y)

The product map of two `C^n` functions within a set at a point is `C^n` within the product set at the product point.

theorem cont_diff_at.prod_map' {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {E' : Type u_3} [ E'] {F' : Type u_4} [ F'] {f : E F} {g : E' F'} {p : E × E'} (hf : n f p.fst) (hg : n g p.snd) :
n (prod.map f g) p

The product map of two `C^n` functions within a set at a point is `C^n` within the product set at the product point.

theorem cont_diff.prod_map {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} {E' : Type u_3} [ E'] {F' : Type u_4} [ F'] {f : E F} {g : E' F'} (hf : n f) (hg : n g) :
n (prod.map f g)

The product map of two `C^n` functions is `C^n`.

theorem cont_diff_prod_mk_left {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} (f₀ : F) :
n (λ (e : E), (e, f₀))
theorem cont_diff_prod_mk_right {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} (e₀ : E) :
n (λ (f : F), (e₀, f))

### Inversion in a complete normed algebra #

theorem cont_diff_at_ring_inverse (𝕜 : Type u_1) {n : ℕ∞} {R : Type u_3} [normed_ring R] [ R] (x : Rˣ) :

In a complete normed algebra, the operation of inversion is `C^n`, for all `n`, at each invertible element. The proof is by induction, bootstrapping using an identity expressing the derivative of inversion as a bilinear map of inversion itself.

theorem cont_diff_at_inv (𝕜 : Type u_1) {𝕜' : Type u_4} [normed_field 𝕜'] [ 𝕜'] [complete_space 𝕜'] {x : 𝕜'} (hx : x 0) {n : ℕ∞} :
x
theorem cont_diff_on_inv (𝕜 : Type u_1) {𝕜' : Type u_4} [normed_field 𝕜'] [ 𝕜'] [complete_space 𝕜'] {n : ℕ∞} :
{0}
theorem cont_diff_within_at.inv {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {x : E} {𝕜' : Type u_4} [normed_field 𝕜'] [ 𝕜'] [complete_space 𝕜'] {f : E 𝕜'} {n : ℕ∞} (hf : f s x) (hx : f x 0) :
(λ (x : E), (f x)⁻¹) s x
theorem cont_diff_on.inv {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {𝕜' : Type u_4} [normed_field 𝕜'] [ 𝕜'] [complete_space 𝕜'] {f : E 𝕜'} {n : ℕ∞} (hf : n f s) (h : (x : E), x s f x 0) :
n (λ (x : E), (f x)⁻¹) s
theorem cont_diff_at.inv {𝕜 : Type u_1} {E : Type uE} [ E] {x : E} {𝕜' : Type u_4} [normed_field 𝕜'] [ 𝕜'] [complete_space 𝕜'] {f : E 𝕜'} {n : ℕ∞} (hf : n f x) (hx : f x 0) :
n (λ (x : E), (f x)⁻¹) x
theorem cont_diff.inv {𝕜 : Type u_1} {E : Type uE} [ E] {𝕜' : Type u_4} [normed_field 𝕜'] [ 𝕜'] [complete_space 𝕜'] {f : E 𝕜'} {n : ℕ∞} (hf : n f) (h : (x : E), f x 0) :
n (λ (x : E), (f x)⁻¹)
theorem cont_diff_within_at.div {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {x : E} {f g : E 𝕜} {n : ℕ∞} (hf : f s x) (hg : g s x) (hx : g x 0) :
(λ (x : E), f x / g x) s x
theorem cont_diff_on.div {𝕜 : Type u_1} {E : Type uE} [ E] {s : set E} {f g : E 𝕜} {n : ℕ∞} (hf : n f s) (hg : n g s) (h₀ : (x : E), x s g x 0) :
n (f / g) s
theorem cont_diff_at.div {𝕜 : Type u_1} {E : Type uE} [ E] {x : E} {f g : E 𝕜} {n : ℕ∞} (hf : n f x) (hg : n g x) (hx : g x 0) :
n (λ (x : E), f x / g x) x
theorem cont_diff.div {𝕜 : Type u_1} {E : Type uE} [ E] {f g : E 𝕜} {n : ℕ∞} (hf : n f) (hg : n g) (h0 : (x : E), g x 0) :
n (λ (x : E), f x / g x)

### Inversion of continuous linear maps between Banach spaces #

theorem cont_diff_at_map_inverse {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} (e : E ≃L[𝕜] F) :

At a continuous linear equivalence `e : E ≃L[𝕜] F` between Banach spaces, the operation of inversion is `C^n`, for all `n`.

theorem local_homeomorph.cont_diff_at_symm {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} (f : F) {f₀' : E ≃L[𝕜] F} {a : F} (ha : a f.to_local_equiv.target) (hf₀' : f₀' ((f.symm) a)) (hf : n f ((f.symm) a)) :
n (f.symm) a

If `f` is a local homeomorphism and the point `a` is in its target, and if `f` is `n` times continuously differentiable at `f.symm a`, and if the derivative at `f.symm a` is a continuous linear equivalence, then `f.symm` is `n` times continuously differentiable at the point `a`.

This is one of the easy parts of the inverse function theorem: it assumes that we already have an inverse function.

theorem homeomorph.cont_diff_symm {𝕜 : Type u_1} {E : Type uE} [ E] {F : Type uF} [ F] {n : ℕ∞} (f : E ≃ₜ F) {f₀' : E (E ≃L[𝕜] F)} (hf₀' : (a : E), (f₀' a) a) (hf : n f) :
n (f.symm)

If `f` is an `n` times continuously differentiable homeomorphism, and if the derivative of `f` at each point is a continuous linear equivalence, then `f.symm` is `n` times continuously differentiable.

This is one of the easy parts of the inverse function theorem: it assumes that we already have an inverse function.

theorem local_homeomorph.cont_diff_at_symm_deriv {𝕜 : Type u_1} {n : ℕ∞} (f : 𝕜) {f₀' a : 𝕜} (h₀ : f₀' 0) (ha : a f.to_local_equiv.target) (hf₀' : f₀' ((f.symm) a)) (hf : n f ((f.symm) a)) :
n (f.symm) a

Let `f` be a local homeomorphism of a nontrivially normed field, let `a` be a point in its target. if `f` is `n` times continuously differentiable at `f.symm a`, and if the derivative at `f.symm a` is nonzero, then `f.symm` is `n` times continuously differentiable at the point `a`.

This is one of the easy parts of the inverse function theorem: it assumes that we already have an inverse function.

<