Skip to content

Commit 89f768f

Browse files
committed
pointwise birkhoff theorem
1 parent b96cdeb commit 89f768f

8 files changed

Lines changed: 128 additions & 11 deletions

File tree

Mathlib/Data/EReal/Basic.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,14 @@ theorem coe_ennreal_mul : ∀ x y : ℝ≥0∞, ((x * y : ℝ≥0∞) : EReal) =
694694
theorem coe_ennreal_nsmul (n : ℕ) (x : ℝ≥0∞) : (↑(n • x) : EReal) = n • (x : EReal) :=
695695
map_nsmul (⟨⟨(↑), coe_ennreal_zero⟩, coe_ennreal_add⟩ : ℝ≥0∞ →+ EReal) _ _
696696

697+
@[simp, norm_cast]
698+
theorem coe_ennreal_iSup {ι : Sort*} [hι : Nonempty ι] (f : ι → ℝ≥0∞) :
699+
((⨆ i, f i : ℝ≥0∞) : EReal) = ⨆ i, (f i : EReal) := by
700+
refine le_antisymm ?_ (iSup_le fun i ↦ mod_cast le_iSup f i)
701+
refine le_iSup_iff.mpr fun b hb ↦ ?_
702+
lift b to ℝ≥0using hι.elim fun i ↦ (EReal.coe_ennreal_nonneg _).trans (hb i)
703+
exact mod_cast iSup_le fun i ↦ mod_cast hb i
704+
697705
/-! ### toENNReal -/
698706

699707
/-- `x.toENNReal` returns `x` if it is nonnegative, `0` otherwise. -/

Mathlib/Dynamics/BirkhoffSum/Average.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module
77

88
public import Mathlib.Dynamics.BirkhoffSum.Basic
99
public import Mathlib.Algebra.Module.Basic
10+
public import Mathlib.Analysis.Normed.Group.Defs
1011

1112
/-!
1213
# Birkhoff average

Mathlib/Dynamics/BirkhoffSum/NormedSpace.lean

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,27 @@ theorem tendsto_birkhoffAverage_apply_sub_birkhoffAverage' {g : α → E}
9898
Tendsto (fun n ↦ birkhoffAverage 𝕜 f g n (f x) - birkhoffAverage 𝕜 f g n x) atTop (𝓝 0) :=
9999
tendsto_birkhoffAverage_apply_sub_birkhoffAverage _ <| h.subset <| range_comp_subset_range _ _
100100

101+
section TriangleInequality
102+
103+
variable {f : α → α} {g : α → E} {n : ℕ} {x : α}
104+
105+
@[bound]
106+
lemma norm_birkhoffSum_le :
107+
‖birkhoffSum f g n x‖ ≤ birkhoffSum f (‖g ·‖) n x :=
108+
norm_sum_le _ _
109+
110+
@[bound]
111+
lemma norm_birkhoffAverage_le {R : Type*} [RCLike R] [NormedSpace R E] :
112+
‖birkhoffAverage R f g n x‖ ≤ birkhoffAverage ℝ f (‖g ·‖) n x := by
113+
by_cases! h : n = 0
114+
· simp [birkhoffAverage, h]
115+
apply Nat.zero_lt_of_ne_zero at h
116+
simp only [birkhoffAverage, norm_smul, norm_inv, RCLike.norm_natCast, smul_eq_mul]
117+
gcongr
118+
exact norm_birkhoffSum_le
119+
120+
end TriangleInequality
121+
101122
end
102123

103124
variable (𝕜 : Type*) {X E : Type*}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/-
2+
Copyright (c) 2025 Lua Viana Reis. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Lua Viana Reis
5+
-/
6+
module
7+
8+
import Mathlib.Analysis.Oscillation
9+
import Mathlib.Dynamics.BirkhoffSum.Maximal
10+
import Mathlib.Dynamics.BirkhoffSum.NormedSpace
11+
import Mathlib.Analysis.InnerProductSpace.MeanErgodic
12+
13+
open MeasureTheory Measure MeasurableSpace Filter Topology Module
14+
open scoped NNReal ENNReal
15+
16+
variable {α R M : Type*} {f : α → α} {g : α → M} {n : ℕ} [RCLike R]
17+
[MeasurableSpace α] (μ : Measure α) (hf : MeasurePreserving f μ μ)
18+
[NormedAddCommGroup M] (hg : Integrable g μ) [IsFiniteMeasure μ] [NormedSpace R M]
19+
20+
variable {μ} (R M) in
21+
abbrev koopman (p) : End R (Lp M p μ) := Lp.compMeasurePreservingₗ R f hf
22+
23+
variable (R M f) in
24+
def convergenceSet := {g : Lp M 1 μ | ∀ᵐ x ∂μ, oscillation (birkhoffAverage R f g · x) atTop = 0}
25+
26+
lemma mem_convergenceSet_of_mem_coboundary {g : Lp M 1 μ}
27+
(hg : g ∈ End.coboundaries (koopman R M hf 1)) : g ∈ convergenceSet R M f μ := by
28+
rcases hg with ⟨h, hh⟩
29+
simp at hh
30+
31+
sorry
32+
33+
lemma ENNReal.forall_pos_of_forall_mul {motive : ℝ≥0∞ → Prop} (k : ℝ≥0∞)
34+
(h : ∀ ε > 0, motive (k * ε)) (hk₀ : k ≠ 0 := by positivity) (hk : k ≠ ∞ := by finiteness) :
35+
∀ ε > 0, motive ε := fun ε hε ↦
36+
ENNReal.mul_div_cancel (a := k) (b := ε) hk₀ hk ▸ h (ε / k) (ENNReal.div_pos hε.ne_zero hk)
37+
38+
omit [IsFiniteMeasure μ] in
39+
lemma foo {f : α → ℝ≥0∞} (h : ∀ ε > 0, ∀ᵐ x ∂μ, f x ≤ ε) : ∀ᵐ x ∂μ, f x ≤ 0 := by
40+
have H : ∀ᵐ x ∂μ, ∀ n : ℕ, f x ≤ (n : ℝ≥0∞)⁻¹ :=
41+
ae_all_iff.mpr fun n ↦ h _ (ENNReal.inv_pos.mpr (by finiteness))
42+
filter_upwards [H] with x hx
43+
refine le_of_forall_pos_le_add fun ε hε => ?_
44+
obtain ⟨n, hn⟩ := ENNReal.exists_inv_nat_lt hε.ne_zero
45+
exact (hx n).trans (by simp [hn.le])
46+
47+
include hf in
48+
theorem closed_convergenceSet : IsClosed (convergenceSet R M f μ) := by
49+
refine isClosed_of_closure_subset (fun g hg ↦ ?_)
50+
rw [EMetric.mem_closure_iff] at hg
51+
simp only [convergenceSet, ← nonpos_iff_eq_zero, Set.mem_setOf_eq]
52+
apply foo
53+
refine ENNReal.forall_pos_of_forall_mul 2 fun δ hδ ↦ ?_
54+
by_cases! hδ' : δ = ∞; · bound
55+
apply ae_iff.mpr <| nonpos_iff_eq_zero.mp _
56+
push Not
57+
have (h : Lp M 1 μ) (hh : h ∈ convergenceSet R M f μ) :
58+
∀ᵐ x ∂μ, 2 * δ < oscillation (birkhoffAverage R f g · x) atTop →
59+
δ < birkhoffAverageSup f (‖(⇑g - ⇑h) ·‖) x := by
60+
filter_upwards [hh] with x hosc hx
61+
have := hx.trans_le <| oscillation_le_add_sub (f₂ := (birkhoffAverage R f h · x)) ..
62+
rw [hosc] at this
63+
grw [oscillation_le_two_mul_iSup_enorm] at this
64+
simp only [Pi.sub_apply, zero_add, ne_eq, OfNat.ofNat_ne_zero, not_false_eq_true,
65+
ENNReal.ofNat_ne_top, ENNReal.mul_lt_mul_iff_right] at this
66+
change _ < ⨆ n, ‖(birkhoffAverage R f g - _) n x‖ₑ at this
67+
rw [← birkhoffAverage_sub] at this
68+
simp_rw [← EReal.coe_ennreal_lt_coe_ennreal_iff, EReal.coe_ennreal_iSup] at this
69+
exact this.trans_le (iSup_mono fun _ ↦ EReal.coe_le_coe norm_birkhoffAverage_le)
70+
refine le_of_forall_gt fun c hc ↦ ?_
71+
rcases hg (δ * c) (by positivity) with ⟨h, hh, hh'⟩
72+
apply measure_mono_ae (this h hh) |>.trans_lt
73+
74+
apply iSup_distribution_birkhoffAverageSup_le_norm' μ hf (by fun_prop) δ |>.trans_lt
75+
rw [Integrable.toL1_sub g h (by fun_prop) (by fun_prop), ← edist_eq_enorm_sub,
76+
Integrable.toL1_coeFn, Integrable.toL1_coeFn]
77+
apply ENNReal.mul_lt_mul_right (ENNReal.inv_ne_zero.mpr hδ') (by finiteness) hh' |>.trans_le
78+
rw [ENNReal.inv_mul_cancel_left (by positivity) hδ']

Mathlib/MeasureTheory/Function/L1Space/AEEqFun.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ end AEEqFun
100100

101101
namespace L1
102102

103+
103104
@[fun_prop]
104105
theorem integrable_coeFn (f : α →₁[μ] β) : Integrable f μ := by
105106
rw [← memLp_one_iff_integrable]

Mathlib/Order/Closure.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,12 @@ section SemilatticeSup
237237

238238
variable [SemilatticeSup α] (c : ClosureOperator α)
239239

240+
theorem sup_closure_le (x y : α) : x ⊔ c y ≤ c (x ⊔ y) :=
241+
sup_le (le_sup_left.trans (c.le_closure _)) (c.monotone le_sup_right)
242+
243+
theorem closure_sup_le (x y : α) : c x ⊔ y ≤ c (x ⊔ y) :=
244+
sup_le (c.monotone le_sup_left) (le_sup_right.trans (c.le_closure _))
245+
240246
theorem closure_sup_closure_le (x y : α) : c x ⊔ c y ≤ c (x ⊔ y) :=
241247
c.monotone.le_map_sup _ _
242248

Mathlib/Order/LiminfLimsup.lean

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -815,17 +815,17 @@ section ConditionallyCompleteLinearOrder
815815
variable [ConditionallyCompleteLinearOrder α]
816816

817817
/-- If `Filter.limsup u atTop ≤ x`, then for all `ε > 0`, eventually we have `u b < x + ε`. -/
818-
theorem eventually_lt_add_pos_of_limsup_le [Preorder β] [AddZeroClass α] [AddLeftStrictMono α]
819-
{x ε : α} {u : β → α} (hu_bdd : IsBoundedUnder LE.le atTop u) (hu : Filter.limsup u atTop ≤ x)
820-
(hε : 0 < ε) :
821-
∀ᶠ b : β in atTop, u b < x + ε :=
818+
theorem eventually_lt_add_pos_of_limsup_le [AddZeroClass α] [AddLeftStrictMono α]
819+
{x ε : α} {u : β → α} {f : Filter β} (hu_bdd : IsBoundedUnder LE.le f u)
820+
(hu : Filter.limsup u f ≤ x) (hε : 0 < ε) :
821+
∀ᶠ b : β in f, u b < x + ε :=
822822
eventually_lt_of_limsup_lt (lt_of_le_of_lt hu (lt_add_of_pos_right x hε)) hu_bdd
823823

824824
/-- If `x ≤ Filter.liminf u atTop`, then for all `ε < 0`, eventually we have `x + ε < u b`. -/
825-
theorem eventually_add_neg_lt_of_le_liminf [Preorder β] [AddZeroClass α] [AddLeftStrictMono α]
826-
{x ε : α} {u : β → α} (hu_bdd : IsBoundedUnder GE.ge atTop u) (hu : x ≤ Filter.liminf u atTop)
827-
(hε : ε < 0) :
828-
∀ᶠ b : β in atTop, x + ε < u b :=
825+
theorem eventually_add_neg_lt_of_le_liminf [AddZeroClass α] [AddLeftStrictMono α]
826+
{x ε : α} {u : β → α} {f : Filter β} (hu_bdd : IsBoundedUnder GE.ge f u)
827+
(hu : x ≤ Filter.liminf u f) (hε : ε < 0) :
828+
∀ᶠ b : β in f, x + ε < u b :=
829829
eventually_lt_of_lt_liminf (lt_of_lt_of_le (add_lt_of_neg_right x hε) hu) hu_bdd
830830

831831
/-- If `Filter.limsup u atTop ≤ x`, then for all `ε > 0`, there exists a positive natural

Mathlib/Topology/Algebra/Module/Basic.lean

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,11 @@ variable [ContinuousAdd M]
154154

155155
/-- The (topological-space) closure of a submodule of a topological `R`-module `M` is itself
156156
a submodule. -/
157-
def Submodule.topologicalClosure (s : Submodule R M) : Submodule R M :=
158-
{ s.toAddSubmonoid.topologicalClosure with
159-
smul_mem' := s.mapsTo_smul_closure }
157+
def Submodule.topologicalClosure : ClosureOperator (Submodule R M) :=
158+
.mk' (fun s ↦ { s.toAddSubmonoid.topologicalClosure with smul_mem' := s.mapsTo_smul_closure })
159+
(fun _ _ hst ↦ closure_mono hst)
160+
(fun _ ↦ subset_closure)
161+
(fun _ ↦ closure_closure.le)
160162

161163
@[simp, norm_cast]
162164
theorem Submodule.topologicalClosure_coe (s : Submodule R M) :

0 commit comments

Comments
 (0)