@@ -60,6 +60,9 @@ This shortens the overall argument, as the definition of submersions has the sam
6060* `IsImmersionAt.contMDiffAt`: if f is an immersion at `x`, it is `C^n` at `x`.
6161* `IsImmersion.contMDiff`: if f is a `C^n` immersion, it is automatically `C^n`
6262 in the sense of `ContMDiff`.
63+ * `ContMDiffAt.iff_comp_isImmersionAt` and `ContMDiff.iff_comp_isImmersion`: a function `f : M → N`
64+ is `C^n` (at `x`) if and only if it is continuous (at `x`) and its composition `φ ∘ f` with a
65+ `C^n` immersion `φ : N → P` (at `f x`) is `C^n`.
6366
6467 ## Implementation notes
6568
@@ -434,6 +437,70 @@ theorem contMDiffOn (h : IsImmersionAtOfComplement F I J n f x) :
434437theorem contMDiffAt (h : IsImmersionAtOfComplement F I J n f x) : CMDiffAt n f x :=
435438 h.contMDiffOn.contMDiffAt (h.domChart.open_source.mem_nhds (mem_domChart_source h))
436439
440+ /-- Let `f : M → N` be a function, and suppose `φ : N → N'` is a `C^n` immersion at `f x`, such
441+ that `φ ∘ f` is `C^n` at `x`. Let `x ∈ t ⊆ M` be contained in the slice chart at `f x`.
442+ Then `f` seen in the slice chart at `φ (f x)` and the preferred chart at `x`
443+ is `C^n` at (the image of) `x` within (the image of) `t`. -/
444+ private lemma aux {f : M → N} {φ : N → N'}
445+ (h : IsImmersionAtOfComplement F J J' n φ (f x)) (h' : CMDiffAt n (φ ∘ f) x)
446+ {t : Set M} (ht : t ⊆ f ⁻¹' h.domChart.source) (hxt : x ∈ t) :
447+ ContDiffWithinAt 𝕜 n ((h.domChart.extend J) ∘ f ∘ (extChartAt I x).symm)
448+ ((extChartAt I x).symm ⁻¹' t ∩ range I) ((extChartAt I x) x) := by
449+ -- Consider the local expressions of `f`, `φ`, `x` and `s'` in the charts we're considering.
450+ set f' := (h.domChart.extend J) ∘ f ∘ (extChartAt I x).symm
451+ set φ' := (h.codChart.extend J') ∘ φ ∘ (h.domChart.extend J).symm
452+ set x' := (extChartAt I x) x
453+ set s := (extChartAt I x).symm ⁻¹' t ∩ range I
454+ have hx' : extChartAt I x x ∈ s := ⟨by simp [mem_chart_source H x, hxt], mem_range_self _⟩
455+ have h'loc : ContDiffWithinAt 𝕜 n ((h.codChart.extend J') ∘ (φ ∘ f) ∘ (extChartAt I x).symm)
456+ ((extChartAt I x).symm ⁻¹' t ∩ range I) (extChartAt I x x) := by
457+ replace h' : CMDiffAt[t] n (φ ∘ f) x := h'.contMDiffWithinAt
458+ rw [contMDiffWithinAt_iff_of_mem_maximalAtlas' h.codChart_mem_maximalAtlas] at h'
459+ exacts [h'.2 , h.mem_codChart_source]
460+ -- By hypothesis, `φ ∘ f` (read in our charts) is `C^n` at `x'` within `s`.
461+ have h'' : ContDiffWithinAt 𝕜 n (φ' ∘ f') s x' := by
462+ apply h'loc.congr_of_mem (fun y hy ↦ ?_) hx'
463+ simp only [mfld_simps, φ', f']
464+ rw [h.domChart.left_inv]
465+ apply ht hy.1
466+ -- On the other hand, composing `f'` with the inclusion `u ↦ (u, 0)` is also `C^n`
467+ -- (as a composition of `C^n` functions); this locally equals `φ ∘ f` in coordinates
468+ -- (since `f` is an immersion).
469+ set f'' := (h.equiv ∘ fun x ↦ (x, 0 )) ∘ f'
470+ have h''' : ContDiffWithinAt 𝕜 n f'' s x' := by
471+ refine h''.congr_of_mem (fun y hy ↦ ?_) hx'
472+ simp only [f'', φ', f']
473+ nth_rw 2 [comp_apply]
474+ rw [Function.comp_apply, h.writtenInCharts]
475+ rw [h.domChart.extend_target_eq_image_source]
476+ exact ⟨(f ∘ (extChartAt I x).symm) y, ht hy.1 , by simp⟩
477+ -- Composing with a suitable projection to cancel the inclusion, we deduce that `f` is `C^n`.
478+ have h'''' : ContDiffWithinAt 𝕜 n ((Prod.fst ∘ h.equiv.symm) ∘ f'') s x' := by
479+ refine ContDiffWithinAt.comp x' ?_ h''' (mapsTo_univ _ _)
480+ rw [contDiffWithinAt_univ]
481+ exact contDiffAt_fst.comp _ h.equiv.symm.contDiff.contDiffAt
482+ exact h''''.congr_of_mem (fun y hy ↦ by simp [f'']) hx'
483+
484+ /-- A function `f : M → N` between `C^n` manifolds is `C^n` at `x` if and only if it is continuous
485+ at `x` and its composition `φ ∘ f` with a `C^n` immersion `φ : N → N'` at `f x` is `C^n` at `x`. -/
486+ lemma _root_.ContMDiffAt.iff_comp_isImmersionAtOfComplement
487+ {f : M → N} {φ : N → N'} (hφ : IsImmersionAtOfComplement F J J' n φ (f x)) :
488+ -- Note: `φ` need not be inducing, so continuity of `φ ∘ f` at `x`
489+ -- generally does not imply continuity of `f`
490+ CMDiffAt n f x ↔ ContinuousAt f x ∧ CMDiffAt n (φ ∘ f) x := by
491+ refine ⟨fun hf ↦ ⟨hf.continuousAt, hφ.contMDiffAt.comp x hf⟩, fun ⟨hf, h'⟩ ↦ ?_⟩
492+ -- Since `f` is continuous at `x`, some neighbourhood `t` of `x` is mapped
493+ -- into `hφ.domChart.source` under `f`. By restriction, we may assume `t` is open,
494+ -- so it suffices to test smoothness on `t`.
495+ have : hφ.domChart.source ∈ 𝓝 (f x) := hφ.domChart.open_source.mem_nhds hφ.mem_domChart_source
496+ obtain ⟨t, ht, htopen, hxt⟩ := mem_nhds_iff.mp (hf this)
497+ suffices CMDiffAt[t] n f x from this.contMDiffAt <| htopen.mem_nhds hxt
498+ -- We test smoothness of `f` on `t` in the preferred chart at `x` and `hφ.codChart`.
499+ rw [contMDiffWithinAt_iff_of_mem_maximalAtlas'
500+ hφ.domChart_mem_maximalAtlas hφ.mem_domChart_source]
501+ refine ⟨hf.continuousWithinAt, ?_⟩
502+ exact aux hφ h' ht hxt
503+
437504end IsImmersionAtOfComplement
438505
439506namespace IsImmersionAt
@@ -620,6 +687,15 @@ theorem contMDiffOn (h : IsImmersionAt I J n f x) : CMDiff[h.domChart.source] n
620687theorem contMDiffAt (h : IsImmersionAt I J n f x) : CMDiffAt n f x :=
621688 h.isImmersionAtOfComplement_complement.contMDiffAt
622689
690+ /-- A function `f : M → N` between `C^n` manifolds is `C^n` at `x` if and only if it is continuous
691+ at `x` and its composition `φ ∘ f` with a `C^n` immersion `φ : N → N'` at `f x` is `C^n` at `x`. -/
692+ lemma _root_.ContMDiffAt.iff_comp_isImmersionAt {f : M → N} {φ : N → N'}
693+ (hφ : IsImmersionAt J J' n φ (f x)) :
694+ -- Note: `φ` need not be inducing, so continuity of `φ ∘ f` at `x`
695+ -- generally does not imply continuity of `f`
696+ CMDiffAt n f x ↔ ContinuousAt f x ∧ CMDiffAt n (φ ∘ f) x := by
697+ rw [← ContMDiffAt.iff_comp_isImmersionAtOfComplement hφ.isImmersionAtOfComplement_complement]
698+
623699end IsImmersionAt
624700
625701variable (F I J n) in
@@ -748,10 +824,18 @@ lemma sumInr {M' : Type*} [TopologicalSpace M'] [ChartedSpace H M'] [IsManifold
748824@ [deprecated (since := "2025-12-16" )] alias ofOpen := of_opens
749825
750826/-- A `C^n` immersion is `C^n`. -/
751- theorem contMDiff
752- (h : IsImmersionOfComplement F I J n f) : CMDiff n f :=
827+ theorem contMDiff (h : IsImmersionOfComplement F I J n f) : CMDiff n f :=
753828 fun x ↦ (h x).contMDiffAt
754829
830+ /-- A function `f : M → N` between `C^n` manifolds is `C^n` if and only if it is continuous
831+ and its composition `φ ∘ f` with a `C^n` immersion `φ : N → N'` is `C^n`. -/
832+ lemma _root_.ContMDiff.iff_comp_isImmersionOfComplement {f : M → N} {φ : N → N'}
833+ (hφ : IsImmersionOfComplement F J J' n φ) :
834+ CMDiff n f ↔ Continuous f ∧ CMDiff n (φ ∘ f) := by
835+ refine ⟨fun h ↦ ⟨h.continuous, hφ.contMDiff.comp h⟩, fun ⟨h, h'⟩ x ↦ ?_⟩
836+ rw [ContMDiffAt.iff_comp_isImmersionAtOfComplement (hφ (f x))]
837+ exact ⟨h.continuousAt, h' x⟩
838+
755839end IsImmersionOfComplement
756840
757841namespace IsImmersion
@@ -825,6 +909,12 @@ theorem contMDiff
825909 (h : IsImmersion I J n f) : CMDiff n f :=
826910 h.isImmersionOfComplement_complement.contMDiff
827911
912+ /-- A function `f : M → N` between `C^n` manifolds is `C^n` if and only if it is continuous
913+ and its composition `φ ∘ f` with a `C^n` immersion `φ : N → N'` is `C^n`. -/
914+ lemma _root_.ContMDiff.iff_comp_isImmersion {f : M → N} {φ : N → N'} (hφ : IsImmersion J J' n φ) :
915+ CMDiff n f ↔ Continuous f ∧ CMDiff n (φ ∘ f) := by
916+ rw [ContMDiff.iff_comp_isImmersionOfComplement hφ.isImmersionOfComplement_complement]
917+
828918end IsImmersion
829919
830920end Manifold
0 commit comments