Skip to content

Commit ed84d14

Browse files
committed
feat: length of a path in a manifold (#26778)
Consider a manifold in which the tangent spaces have an enormed structure. Then one defines `pathELength γ a b` as the length of the path `γ : ℝ → M` between `a` and `b`, i.e., the integral of the norm of its manifold derivative. We develop a reasonable API around this notion We also define `riemannianEDist x y` as the infimum of the length of paths from `x` to `y`. We show that it is symmetric and satisfies the triangle inequality.
1 parent 5bc0c3f commit ed84d14

File tree

5 files changed

+416
-1
lines changed

5 files changed

+416
-1
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3733,6 +3733,7 @@ import Mathlib.Geometry.Manifold.MFDeriv.UniqueDifferential
37333733
import Mathlib.Geometry.Manifold.Metrizable
37343734
import Mathlib.Geometry.Manifold.PartitionOfUnity
37353735
import Mathlib.Geometry.Manifold.PoincareConjecture
3736+
import Mathlib.Geometry.Manifold.Riemannian.PathELength
37363737
import Mathlib.Geometry.Manifold.Sheaf.Basic
37373738
import Mathlib.Geometry.Manifold.Sheaf.LocallyRingedSpace
37383739
import Mathlib.Geometry.Manifold.Sheaf.Smooth

Mathlib/Analysis/Normed/MulAction.lean

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@ instance (priority := 100) NormMulClass.toNormSMulClass_op [SeminormedRing α] [
109109
NormSMulClass αᵐᵒᵖ α where
110110
norm_smul a b := mul_comm ‖b‖ ‖a‖ ▸ norm_mul b a.unop
111111

112+
/-- Mixin class for scalar-multiplication actions with a strictly multiplicative norm, i.e.
113+
`‖r • x‖ₑ = ‖r‖ₑ * ‖x‖ₑ`. -/
114+
class ENormSMulClass (α β : Type*) [ENorm α] [ENorm β] [SMul α β] : Prop where
115+
protected enorm_smul (r : α) (x : β) : ‖r • x‖ₑ = ‖r‖ₑ * ‖x‖ₑ
116+
117+
lemma enorm_smul [ENorm α] [ENorm β] [SMul α β] [ENormSMulClass α β] (r : α) (x : β) :
118+
‖r • x‖ₑ = ‖r‖ₑ * ‖x‖ₑ :=
119+
ENormSMulClass.enorm_smul r x
120+
112121
variable [SeminormedRing α] [SeminormedAddGroup β] [SMul α β]
113122

114123
theorem NormSMulClass.of_nnnorm_smul (h : ∀ (r : α) (x : β), ‖r • x‖₊ = ‖r‖₊ * ‖x‖₊) :
@@ -120,7 +129,8 @@ variable [NormSMulClass α β]
120129
theorem nnnorm_smul (r : α) (x : β) : ‖r • x‖₊ = ‖r‖₊ * ‖x‖₊ :=
121130
NNReal.eq <| norm_smul r x
122131

123-
lemma enorm_smul (r : α) (x : β) : ‖r • x‖ₑ = ‖r‖ₑ * ‖x‖ₑ := by simp [enorm, nnnorm_smul]
132+
instance (priority := 100) : ENormSMulClass α β where
133+
enorm_smul r x := by simp [enorm, nnnorm_smul]
124134

125135
instance Pi.instNormSMulClass {ι : Type*} {β : ι → Type*} [Fintype ι]
126136
[SeminormedRing α] [∀ i, SeminormedAddGroup (β i)] [∀ i, SMul α (β i)]

Mathlib/Dynamics/Ergodic/MeasurePreserving.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,11 @@ theorem exists_mem_iterate_mem [IsFiniteMeasure μ] (hf : MeasurePreserving f μ
214214

215215
end MeasurePreserving
216216

217+
lemma measurePreserving_subtype_coe {s : Set α} (hs : MeasurableSet s) :
218+
MeasurePreserving (Subtype.val : s → α) (μa.comap Subtype.val) (μa.restrict s) where
219+
measurable := measurable_subtype_coe
220+
map_eq := map_comap_subtype_coe hs _
221+
217222
namespace MeasurableEquiv
218223

219224
theorem measurePreserving_symm (μ : Measure α) (e : α ≃ᵐ β) :

Mathlib/Geometry/Manifold/ContMDiff/Basic.lean

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,39 @@ alias contMDiffAt_of_not_mem := contMDiffAt_of_notMem
259259
@[to_additive existing contMDiffAt_of_not_mem, deprecated (since := "2025-05-23")]
260260
alias contMDiffAt_of_not_mem_mulTSupport := contMDiffAt_of_notMem_mulTSupport
261261

262+
/-- Given two `C^n` functions `f` and `g` which coincide locally around the frontier of a set `s`,
263+
then the piecewise function defined using `f` on `s` and `g` elsewhere is `C^n`. -/
264+
lemma ContMDiff.piecewise
265+
{f g : M → M'} {s : Set M} [DecidablePred (· ∈ s)]
266+
(hf : ContMDiff I I' n f) (hg : ContMDiff I I' n g)
267+
(hfg : ∀ x ∈ frontier s, f =ᶠ[𝓝 x] g) :
268+
ContMDiff I I' n (piecewise s f g) := by
269+
intro x
270+
by_cases hx : x ∈ interior s
271+
· apply (hf x).congr_of_eventuallyEq
272+
filter_upwards [isOpen_interior.mem_nhds hx] with y hy
273+
rw [piecewise_eq_of_mem]
274+
apply interior_subset hy
275+
by_cases h'x : x ∈ closure s
276+
· have : x ∈ frontier s := ⟨h'x, hx⟩
277+
apply (hf x).congr_of_eventuallyEq
278+
filter_upwards [hfg x this] with y hy
279+
simp [Set.piecewise, hy]
280+
· apply (hg x).congr_of_eventuallyEq
281+
filter_upwards [isClosed_closure.isOpen_compl.mem_nhds h'x] with y hy
282+
rw [piecewise_eq_of_notMem]
283+
contrapose! hy
284+
simpa using subset_closure hy
285+
286+
/-- Given two `C^n` functions `f` and `g` from `ℝ` to a real manifold which coincide locally
287+
around a point `s`, then the piecewise function using `f` before `t` and `g` after is `C^n`. -/
288+
lemma ContMDiff.piecewise_Iic
289+
{E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] {H : Type*} [TopologicalSpace H]
290+
{I : ModelWithCorners ℝ E H} {M : Type*} [TopologicalSpace M] [ChartedSpace H M]
291+
{f g : ℝ → M} {s : ℝ}
292+
(hf : ContMDiff 𝓘(ℝ) I n f) (hg : ContMDiff 𝓘(ℝ) I n g) (hfg : f =ᶠ[𝓝 s] g) :
293+
ContMDiff 𝓘(ℝ) I n (Set.piecewise (Iic s) f g) :=
294+
hf.piecewise hg (by simpa using hfg)
262295

263296
/-! ### Being `C^k` on a union of open sets can be tested on each set -/
264297
section contMDiff_union

0 commit comments

Comments
 (0)