[GOAL]
T : ℝ
hT : 0 < T
t : ℝ
μ : autoParam (Measure ℝ) _auto✝
⊢ IsAddFundamentalDomain { x // x ∈ zmultiples T } (Ioc t (t + T))
[PROOFSTEP]
refine' IsAddFundamentalDomain.mk' measurableSet_Ioc.nullMeasurableSet fun x => _
[GOAL]
T : ℝ
hT : 0 < T
t : ℝ
μ : autoParam (Measure ℝ) _auto✝
x : ℝ
⊢ ∃! g, g +ᵥ x ∈ Ioc t (t + T)
[PROOFSTEP]
have : Bijective (codRestrict (fun n : ℤ => n • T) (AddSubgroup.zmultiples T) _) :=
  (Equiv.ofInjective (fun n : ℤ => n • T) (zsmul_strictMono_left hT).injective).bijective
[GOAL]
T : ℝ
hT : 0 < T
t : ℝ
μ : autoParam (Measure ℝ) _auto✝
x : ℝ
this : Bijective (codRestrict (fun n => n • T) ↑(zmultiples T) (_ : ∀ (x : ℤ), ∃ y, y • T = x • T))
⊢ ∃! g, g +ᵥ x ∈ Ioc t (t + T)
[PROOFSTEP]
refine' this.existsUnique_iff.2 _
[GOAL]
T : ℝ
hT : 0 < T
t : ℝ
μ : autoParam (Measure ℝ) _auto✝
x : ℝ
this : Bijective (codRestrict (fun n => n • T) ↑(zmultiples T) (_ : ∀ (x : ℤ), ∃ y, y • T = x • T))
⊢ ∃! x_1, codRestrict (fun n => n • T) ↑(zmultiples T) (_ : ∀ (x : ℤ), ∃ y, y • T = x • T) x_1 +ᵥ x ∈ Ioc t (t + T)
[PROOFSTEP]
simpa only [add_comm x] using existsUnique_add_zsmul_mem_Ioc hT x t
[GOAL]
T : ℝ
hT : 0 < T
t : ℝ
μ : autoParam (Measure ℝ) _auto✝
⊢ IsAddFundamentalDomain { x // x ∈ ↑opposite (zmultiples T) } (Ioc t (t + T))
[PROOFSTEP]
refine' IsAddFundamentalDomain.mk' measurableSet_Ioc.nullMeasurableSet fun x => _
[GOAL]
T : ℝ
hT : 0 < T
t : ℝ
μ : autoParam (Measure ℝ) _auto✝
x : ℝ
⊢ ∃! g, g +ᵥ x ∈ Ioc t (t + T)
[PROOFSTEP]
have : Bijective (codRestrict (fun n : ℤ => n • T) (AddSubgroup.zmultiples T) _) :=
  (Equiv.ofInjective (fun n : ℤ => n • T) (zsmul_strictMono_left hT).injective).bijective
[GOAL]
T : ℝ
hT : 0 < T
t : ℝ
μ : autoParam (Measure ℝ) _auto✝
x : ℝ
this : Bijective (codRestrict (fun n => n • T) ↑(zmultiples T) (_ : ∀ (x : ℤ), ∃ y, y • T = x • T))
⊢ ∃! g, g +ᵥ x ∈ Ioc t (t + T)
[PROOFSTEP]
refine' (AddSubgroup.oppositeEquiv _).bijective.comp this |>.existsUnique_iff.2 _
[GOAL]
T : ℝ
hT : 0 < T
t : ℝ
μ : autoParam (Measure ℝ) _auto✝
x : ℝ
this : Bijective (codRestrict (fun n => n • T) ↑(zmultiples T) (_ : ∀ (x : ℤ), ∃ y, y • T = x • T))
⊢ ∃! x_1,
    (↑(oppositeEquiv (zmultiples T)) ∘ codRestrict (fun n => n • T) ↑(zmultiples T) (_ : ∀ (x : ℤ), ∃ y, y • T = x • T))
          x_1 +ᵥ
        x ∈
      Ioc t (t + T)
[PROOFSTEP]
simpa using existsUnique_add_zsmul_mem_Ioc hT x t
[GOAL]
T : ℝ
hT : Fact (0 < T)
⊢ ↑↑volume univ = ENNReal.ofReal T
[PROOFSTEP]
dsimp [volume]
[GOAL]
T : ℝ
hT : Fact (0 < T)
⊢ ENNReal.ofReal T * ↑↑(addHaarMeasure ⊤) univ = ENNReal.ofReal T
[PROOFSTEP]
rw [← PositiveCompacts.coe_top]
[GOAL]
T : ℝ
hT : Fact (0 < T)
⊢ ENNReal.ofReal T * ↑↑(addHaarMeasure ⊤) ↑⊤ = ENNReal.ofReal T
[PROOFSTEP]
simp [addHaarMeasure_self (G := AddCircle T), -PositiveCompacts.coe_top]
[GOAL]
T : ℝ
hT : Fact (0 < T)
⊢ ENNReal.ofReal T ≠ 0
[PROOFSTEP]
simp [hT.out]
[GOAL]
T : ℝ
hT : Fact (0 < T)
⊢ ↑↑volume univ < ⊤
[PROOFSTEP]
simp
[GOAL]
T : ℝ
hT : Fact (0 < T)
t : ℝ
⊢ MeasurePreserving QuotientAddGroup.mk
[PROOFSTEP]
apply MeasurePreservingQuotientAddGroup.mk'
[GOAL]
case h𝓕
T : ℝ
hT : Fact (0 < T)
t : ℝ
⊢ IsAddFundamentalDomain { x // x ∈ ↑opposite (zmultiples T) } (Ioc t (t + T))
[PROOFSTEP]
exact isAddFundamentalDomain_Ioc' hT.out t
[GOAL]
case h𝓕_finite
T : ℝ
hT : Fact (0 < T)
t : ℝ
⊢ ↑↑volume (Ioc t (t + T)) < ⊤
[PROOFSTEP]
simp
[GOAL]
case h
T : ℝ
hT : Fact (0 < T)
t : ℝ
⊢ ↑↑volume (Ioc t (t + T) ∩ ↑(QuotientAddGroup.mk' (zmultiples T)) ⁻¹' ↑⊤) = ↑(Real.toNNReal T)
[PROOFSTEP]
haveI : CompactSpace (ℝ ⧸ zmultiples T) := inferInstanceAs (CompactSpace (AddCircle T))
[GOAL]
case h
T : ℝ
hT : Fact (0 < T)
t : ℝ
this : CompactSpace (ℝ ⧸ zmultiples T)
⊢ ↑↑volume (Ioc t (t + T) ∩ ↑(QuotientAddGroup.mk' (zmultiples T)) ⁻¹' ↑⊤) = ↑(Real.toNNReal T)
[PROOFSTEP]
simp [← ENNReal.ofReal_coe_nnreal, Real.coe_toNNReal T hT.out.le, -Real.coe_toNNReal']
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
⊢ ↑↑volume (Metric.closedBall x ε) = ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
have hT' : |T| = T := abs_eq_self.mpr hT.out.le
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
⊢ ↑↑volume (Metric.closedBall x ε) = ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
let I := Ioc (-(T / 2)) (T / 2)
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
⊢ ↑↑volume (Metric.closedBall x ε) = ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
have h₁ : ε < T / 2 → Metric.closedBall (0 : ℝ) ε ∩ I = Metric.closedBall (0 : ℝ) ε :=
  by
  intro hε
  rw [inter_eq_left_iff_subset, Real.closedBall_eq_Icc, zero_sub, zero_add]
  rintro y ⟨hy₁, hy₂⟩; constructor <;> linarith
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
⊢ ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
[PROOFSTEP]
intro hε
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
hε : ε < T / 2
⊢ Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
[PROOFSTEP]
rw [inter_eq_left_iff_subset, Real.closedBall_eq_Icc, zero_sub, zero_add]
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
hε : ε < T / 2
⊢ Icc (-ε) ε ⊆ I
[PROOFSTEP]
rintro y ⟨hy₁, hy₂⟩
[GOAL]
case intro
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
hε : ε < T / 2
y : ℝ
hy₁ : -ε ≤ y
hy₂ : y ≤ ε
⊢ y ∈ I
[PROOFSTEP]
constructor
[GOAL]
case intro.left
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
hε : ε < T / 2
y : ℝ
hy₁ : -ε ≤ y
hy₂ : y ≤ ε
⊢ -(T / 2) < y
[PROOFSTEP]
linarith
[GOAL]
case intro.right
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
hε : ε < T / 2
y : ℝ
hy₁ : -ε ≤ y
hy₂ : y ≤ ε
⊢ y ≤ T / 2
[PROOFSTEP]
linarith
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
⊢ ↑↑volume (Metric.closedBall x ε) = ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
have h₂ : (↑) ⁻¹' Metric.closedBall (0 : AddCircle T) ε ∩ I = if ε < T / 2 then Metric.closedBall (0 : ℝ) ε else I :=
  by
  conv_rhs => rw [← if_ctx_congr (Iff.rfl : ε < T / 2 ↔ ε < T / 2) h₁ fun _ => rfl, ← hT']
  apply coe_real_preimage_closedBall_inter_eq
  simpa only [hT', Real.closedBall_eq_Icc, zero_add, zero_sub] using Ioc_subset_Icc_self
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
⊢ QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < T / 2 then Metric.closedBall 0 ε else I
[PROOFSTEP]
conv_rhs => rw [← if_ctx_congr (Iff.rfl : ε < T / 2 ↔ ε < T / 2) h₁ fun _ => rfl, ← hT']
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
| if ε < T / 2 then Metric.closedBall 0 ε else I
[PROOFSTEP]
rw [← if_ctx_congr (Iff.rfl : ε < T / 2 ↔ ε < T / 2) h₁ fun _ => rfl, ← hT']
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
| if ε < T / 2 then Metric.closedBall 0 ε else I
[PROOFSTEP]
rw [← if_ctx_congr (Iff.rfl : ε < T / 2 ↔ ε < T / 2) h₁ fun _ => rfl, ← hT']
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
| if ε < T / 2 then Metric.closedBall 0 ε else I
[PROOFSTEP]
rw [← if_ctx_congr (Iff.rfl : ε < T / 2 ↔ ε < T / 2) h₁ fun _ => rfl, ← hT']
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
⊢ QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < |T| / 2 then Metric.closedBall 0 ε ∩ I else I
[PROOFSTEP]
apply coe_real_preimage_closedBall_inter_eq
[GOAL]
case hs
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
⊢ I ⊆ Metric.closedBall 0 (|T| / 2)
[PROOFSTEP]
simpa only [hT', Real.closedBall_eq_Icc, zero_add, zero_sub] using Ioc_subset_Icc_self
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
h₂ : QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < T / 2 then Metric.closedBall 0 ε else I
⊢ ↑↑volume (Metric.closedBall x ε) = ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
rw [addHaar_closedBall_center]
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
h₂ : QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < T / 2 then Metric.closedBall 0 ε else I
⊢ ↑↑volume (Metric.closedBall 0 ε) = ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
simp only [restrict_apply' measurableSet_Ioc, (by linarith : -(T / 2) + T = T / 2), h₂, ←
  (AddCircle.measurePreserving_mk T (-(T / 2))).measure_preimage measurableSet_closedBall]
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
h₂ : QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < T / 2 then Metric.closedBall 0 ε else I
⊢ -(T / 2) + T = T / 2
[PROOFSTEP]
linarith
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
h₂ : QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < T / 2 then Metric.closedBall 0 ε else I
⊢ ↑↑volume (if ε < T / 2 then Metric.closedBall 0 ε else Ioc (-(T / 2)) (T / 2)) = ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
by_cases hε : ε < T / 2
[GOAL]
case pos
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
h₂ : QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < T / 2 then Metric.closedBall 0 ε else I
hε : ε < T / 2
⊢ ↑↑volume (if ε < T / 2 then Metric.closedBall 0 ε else Ioc (-(T / 2)) (T / 2)) = ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
simp [hε, min_eq_right (by linarith : 2 * ε ≤ T)]
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
h₂ : QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < T / 2 then Metric.closedBall 0 ε else I
hε : ε < T / 2
⊢ 2 * ε ≤ T
[PROOFSTEP]
linarith
[GOAL]
case neg
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
h₂ : QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < T / 2 then Metric.closedBall 0 ε else I
hε : ¬ε < T / 2
⊢ ↑↑volume (if ε < T / 2 then Metric.closedBall 0 ε else Ioc (-(T / 2)) (T / 2)) = ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
simp [hε, min_eq_left (by linarith : T ≤ 2 * ε)]
[GOAL]
T : ℝ
hT : Fact (0 < T)
x : AddCircle T
ε : ℝ
hT' : |T| = T
I : Set ℝ := Ioc (-(T / 2)) (T / 2)
h₁ : ε < T / 2 → Metric.closedBall 0 ε ∩ I = Metric.closedBall 0 ε
h₂ : QuotientAddGroup.mk ⁻¹' Metric.closedBall 0 ε ∩ I = if ε < T / 2 then Metric.closedBall 0 ε else I
hε : ¬ε < T / 2
⊢ T ≤ 2 * ε
[PROOFSTEP]
linarith
[GOAL]
T : ℝ
hT : Fact (0 < T)
⊢ IsUnifLocDoublingMeasure volume
[PROOFSTEP]
refine' ⟨⟨Real.toNNReal 2, Filter.eventually_of_forall fun ε x => _⟩⟩
[GOAL]
T : ℝ
hT : Fact (0 < T)
ε : ℝ
x : AddCircle T
⊢ ↑↑volume (Metric.closedBall x (2 * ε)) ≤ ↑(Real.toNNReal 2) * ↑↑volume (Metric.closedBall x ε)
[PROOFSTEP]
simp only [volume_closedBall]
[GOAL]
T : ℝ
hT : Fact (0 < T)
ε : ℝ
x : AddCircle T
⊢ ENNReal.ofReal (min T (2 * (2 * ε))) ≤ ↑(Real.toNNReal 2) * ENNReal.ofReal (min T (2 * ε))
[PROOFSTEP]
erw [← ENNReal.ofReal_mul zero_le_two]
[GOAL]
T : ℝ
hT : Fact (0 < T)
ε : ℝ
x : AddCircle T
⊢ ENNReal.ofReal (min T (2 * (2 * ε))) ≤ ENNReal.ofReal (2 * min T (2 * ε))
[PROOFSTEP]
apply ENNReal.ofReal_le_ofReal
[GOAL]
case h
T : ℝ
hT : Fact (0 < T)
ε : ℝ
x : AddCircle T
⊢ min T (2 * (2 * ε)) ≤ 2 * min T (2 * ε)
[PROOFSTEP]
rw [mul_min_of_nonneg _ _ (zero_le_two : (0 : ℝ) ≤ 2)]
[GOAL]
case h
T : ℝ
hT : Fact (0 < T)
ε : ℝ
x : AddCircle T
⊢ min T (2 * (2 * ε)) ≤ min (2 * T) (2 * (2 * ε))
[PROOFSTEP]
exact min_le_min (by linarith [hT.out]) (le_refl _)
[GOAL]
T : ℝ
hT : Fact (0 < T)
ε : ℝ
x : AddCircle T
⊢ T ≤ 2 * T
[PROOFSTEP]
linarith [hT.out]
[GOAL]
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
⊢ ∫⁻ (a : ℝ) in Ioc t (t + T), f ↑a = ∫⁻ (b : AddCircle T), f b
[PROOFSTEP]
have m : MeasurableSet (Ioc t (t + T)) := measurableSet_Ioc
[GOAL]
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
⊢ ∫⁻ (a : ℝ) in Ioc t (t + T), f ↑a = ∫⁻ (b : AddCircle T), f b
[PROOFSTEP]
have := lintegral_map_equiv (μ := volume) f (measurableEquivIoc T t).symm
[GOAL]
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this :
  ∫⁻ (a : AddCircle T), f a ∂Measure.map (↑(MeasurableEquiv.symm (measurableEquivIoc T t))) volume =
    ∫⁻ (a : ↑(Ioc t (t + T))), f (↑(MeasurableEquiv.symm (measurableEquivIoc T t)) a)
⊢ ∫⁻ (a : ℝ) in Ioc t (t + T), f ↑a = ∫⁻ (b : AddCircle T), f b
[PROOFSTEP]
simp only [measurableEquivIoc, equivIoc, QuotientAddGroup.equivIocMod, MeasurableEquiv.symm_mk, MeasurableEquiv.coe_mk,
  Equiv.coe_fn_symm_mk] at this 
[GOAL]
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
⊢ ∫⁻ (a : ℝ) in Ioc t (t + T), f ↑a = ∫⁻ (b : AddCircle T), f b
[PROOFSTEP]
rw [← (AddCircle.measurePreserving_mk T t).map_eq]
[GOAL]
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
⊢ ∫⁻ (a : ℝ) in Ioc t (t + T), f ↑a =
    ∫⁻ (b : AddCircle T), f b ∂Measure.map QuotientAddGroup.mk (Measure.restrict volume (Ioc t (t + T)))
[PROOFSTEP]
convert this.symm using 1
[GOAL]
case h.e'_2
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
⊢ ∫⁻ (a : ℝ) in Ioc t (t + T), f ↑a = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
[PROOFSTEP]
rw [← map_comap_subtype_coe m _]
[GOAL]
case h.e'_2
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
⊢ ∫⁻ (a : ℝ), f ↑a ∂Measure.map Subtype.val (Measure.comap Subtype.val volume) = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
[PROOFSTEP]
exact MeasurableEmbedding.lintegral_map (MeasurableEmbedding.subtype_coe m) _
[GOAL]
case h.e'_3
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
⊢ ∫⁻ (b : AddCircle T), f b ∂Measure.map QuotientAddGroup.mk (Measure.restrict volume (Ioc t (t + T))) =
    ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume
[PROOFSTEP]
congr 1
[GOAL]
case h.e'_3.e_μ
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
⊢ Measure.map QuotientAddGroup.mk (Measure.restrict volume (Ioc t (t + T))) = Measure.map (fun x => ↑↑x) volume
[PROOFSTEP]
have : ((↑) : Ioc t (t + T) → AddCircle T) = ((↑) : ℝ → AddCircle T) ∘ ((↑) : _ → ℝ) := by ext1 x; rfl
[GOAL]
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
⊢ (fun x => ↑↑x) = QuotientAddGroup.mk ∘ Subtype.val
[PROOFSTEP]
ext1 x
[GOAL]
case h
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
x : ↑(Ioc t (t + T))
⊢ ↑↑x = (QuotientAddGroup.mk ∘ Subtype.val) x
[PROOFSTEP]
rfl
[GOAL]
case h.e'_3.e_μ
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this✝ : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
this : (fun x => ↑↑x) = QuotientAddGroup.mk ∘ Subtype.val
⊢ Measure.map QuotientAddGroup.mk (Measure.restrict volume (Ioc t (t + T))) = Measure.map (fun x => ↑↑x) volume
[PROOFSTEP]
simp_rw [this]
[GOAL]
case h.e'_3.e_μ
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this✝ : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
this : (fun x => ↑↑x) = QuotientAddGroup.mk ∘ Subtype.val
⊢ Measure.map QuotientAddGroup.mk (Measure.restrict volume (Ioc t (t + T))) =
    Measure.map (QuotientAddGroup.mk ∘ Subtype.val) volume
[PROOFSTEP]
rw [← map_map AddCircle.measurable_mk' measurable_subtype_coe, ← map_comap_subtype_coe m]
[GOAL]
case h.e'_3.e_μ
T : ℝ
hT : Fact (0 < T)
t : ℝ
f : AddCircle T → ℝ≥0∞
m : MeasurableSet (Ioc t (t + T))
this✝ : ∫⁻ (a : AddCircle T), f a ∂Measure.map (fun x => ↑↑x) volume = ∫⁻ (a : ↑(Ioc t (t + T))), f ↑↑a
this : (fun x => ↑↑x) = QuotientAddGroup.mk ∘ Subtype.val
⊢ Measure.map QuotientAddGroup.mk (Measure.map Subtype.val (Measure.comap Subtype.val volume)) =
    Measure.map QuotientAddGroup.mk (Measure.map Subtype.val volume)
[PROOFSTEP]
rfl
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
⊢ ∫ (a : ℝ) in Ioc t (t + T), f ↑a = ∫ (b : AddCircle T), f b
[PROOFSTEP]
have m : MeasurableSet (Ioc t (t + T)) := measurableSet_Ioc
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
m : MeasurableSet (Ioc t (t + T))
⊢ ∫ (a : ℝ) in Ioc t (t + T), f ↑a = ∫ (b : AddCircle T), f b
[PROOFSTEP]
have := integral_map_equiv (μ := volume) (measurableEquivIoc T t).symm f
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
m : MeasurableSet (Ioc t (t + T))
this :
  ∫ (y : AddCircle T), f y ∂Measure.map (↑(MeasurableEquiv.symm (measurableEquivIoc T t))) volume =
    ∫ (x : ↑(Ioc t (t + T))), f (↑(MeasurableEquiv.symm (measurableEquivIoc T t)) x)
⊢ ∫ (a : ℝ) in Ioc t (t + T), f ↑a = ∫ (b : AddCircle T), f b
[PROOFSTEP]
simp only [measurableEquivIoc, equivIoc, QuotientAddGroup.equivIocMod, MeasurableEquiv.symm_mk, MeasurableEquiv.coe_mk,
  Equiv.coe_fn_symm_mk] at this 
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
m : MeasurableSet (Ioc t (t + T))
this : ∫ (y : AddCircle T), f y ∂Measure.map (fun x => ↑↑x) volume = ∫ (x : ↑(Ioc t (t + T))), f ↑↑x
⊢ ∫ (a : ℝ) in Ioc t (t + T), f ↑a = ∫ (b : AddCircle T), f b
[PROOFSTEP]
rw [← (AddCircle.measurePreserving_mk T t).map_eq, set_integral_eq_subtype m, ← this]
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
m : MeasurableSet (Ioc t (t + T))
this : ∫ (y : AddCircle T), f y ∂Measure.map (fun x => ↑↑x) volume = ∫ (x : ↑(Ioc t (t + T))), f ↑↑x
⊢ ∫ (y : AddCircle T), f y ∂Measure.map (fun x => ↑↑x) volume =
    ∫ (b : AddCircle T), f b ∂Measure.map QuotientAddGroup.mk (Measure.restrict volume (Ioc t (t + T)))
[PROOFSTEP]
have : ((↑) : Ioc t (t + T) → AddCircle T) = ((↑) : ℝ → AddCircle T) ∘ ((↑) : _ → ℝ) := by ext1 x; rfl
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
m : MeasurableSet (Ioc t (t + T))
this : ∫ (y : AddCircle T), f y ∂Measure.map (fun x => ↑↑x) volume = ∫ (x : ↑(Ioc t (t + T))), f ↑↑x
⊢ (fun x => ↑↑x) = QuotientAddGroup.mk ∘ Subtype.val
[PROOFSTEP]
ext1 x
[GOAL]
case h
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
m : MeasurableSet (Ioc t (t + T))
this : ∫ (y : AddCircle T), f y ∂Measure.map (fun x => ↑↑x) volume = ∫ (x : ↑(Ioc t (t + T))), f ↑↑x
x : ↑(Ioc t (t + T))
⊢ ↑↑x = (QuotientAddGroup.mk ∘ Subtype.val) x
[PROOFSTEP]
rfl
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
m : MeasurableSet (Ioc t (t + T))
this✝ : ∫ (y : AddCircle T), f y ∂Measure.map (fun x => ↑↑x) volume = ∫ (x : ↑(Ioc t (t + T))), f ↑↑x
this : (fun x => ↑↑x) = QuotientAddGroup.mk ∘ Subtype.val
⊢ ∫ (y : AddCircle T), f y ∂Measure.map (fun x => ↑↑x) volume =
    ∫ (b : AddCircle T), f b ∂Measure.map QuotientAddGroup.mk (Measure.restrict volume (Ioc t (t + T)))
[PROOFSTEP]
simp_rw [this]
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
m : MeasurableSet (Ioc t (t + T))
this✝ : ∫ (y : AddCircle T), f y ∂Measure.map (fun x => ↑↑x) volume = ∫ (x : ↑(Ioc t (t + T))), f ↑↑x
this : (fun x => ↑↑x) = QuotientAddGroup.mk ∘ Subtype.val
⊢ ∫ (y : AddCircle T), f y ∂Measure.map (QuotientAddGroup.mk ∘ Subtype.val) volume =
    ∫ (y : AddCircle T), f y ∂Measure.map QuotientAddGroup.mk (Measure.restrict volume (Ioc t (t + T)))
[PROOFSTEP]
rw [← map_map AddCircle.measurable_mk' measurable_subtype_coe, ← map_comap_subtype_coe m]
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
m : MeasurableSet (Ioc t (t + T))
this✝ : ∫ (y : AddCircle T), f y ∂Measure.map (fun x => ↑↑x) volume = ∫ (x : ↑(Ioc t (t + T))), f ↑↑x
this : (fun x => ↑↑x) = QuotientAddGroup.mk ∘ Subtype.val
⊢ ∫ (y : AddCircle T), f y ∂Measure.map QuotientAddGroup.mk (Measure.map Subtype.val volume) =
    ∫ (y : AddCircle T),
      f y ∂Measure.map QuotientAddGroup.mk (Measure.map Subtype.val (Measure.comap Subtype.val volume))
[PROOFSTEP]
rfl
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
⊢ ∫ (a : ℝ) in t..t + T, f ↑a = ∫ (b : AddCircle T), f b
[PROOFSTEP]
rw [integral_of_le, AddCircle.integral_preimage T t f]
[GOAL]
T : ℝ
hT : Fact (0 < T)
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
t : ℝ
f : AddCircle T → E
⊢ t ≤ t + T
[PROOFSTEP]
linarith [hT.out]
[GOAL]
⊢ ↑↑volume univ = 1
[PROOFSTEP]
simp
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
hT : 0 < T
t s : ℝ
⊢ ∫ (x : ℝ) in t..t + T, f x = ∫ (x : ℝ) in s..s + T, f x
[PROOFSTEP]
simp only [integral_of_le, hT.le, le_add_iff_nonneg_right]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
hT : 0 < T
t s : ℝ
⊢ ∫ (x : ℝ) in Ioc t (t + T), f x = ∫ (x : ℝ) in Ioc s (s + T), f x
[PROOFSTEP]
haveI : VAddInvariantMeasure (AddSubgroup.zmultiples T) ℝ volume := ⟨fun c s _ => measure_preimage_add _ _ _⟩
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
hT : 0 < T
t s : ℝ
this : VAddInvariantMeasure { x // x ∈ zmultiples T } ℝ volume
⊢ ∫ (x : ℝ) in Ioc t (t + T), f x = ∫ (x : ℝ) in Ioc s (s + T), f x
[PROOFSTEP]
apply IsAddFundamentalDomain.set_integral_eq (G := AddSubgroup.zmultiples T)
[GOAL]
case hs
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
hT : 0 < T
t s : ℝ
this : VAddInvariantMeasure { x // x ∈ zmultiples T } ℝ volume
⊢ IsAddFundamentalDomain { x // x ∈ zmultiples T } (Ioc t (t + T))
case ht
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
hT : 0 < T
t s : ℝ
this : VAddInvariantMeasure { x // x ∈ zmultiples T } ℝ volume
⊢ IsAddFundamentalDomain { x // x ∈ zmultiples T } (Ioc s (s + T))
case hf
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
hT : 0 < T
t s : ℝ
this : VAddInvariantMeasure { x // x ∈ zmultiples T } ℝ volume
⊢ ∀ (g : { x // x ∈ zmultiples T }) (x : ℝ), f (g +ᵥ x) = f x
[PROOFSTEP]
exacts [isAddFundamentalDomain_Ioc hT t, isAddFundamentalDomain_Ioc hT s, hf.map_vadd_zmultiples]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t s : ℝ
⊢ ∫ (x : ℝ) in t..t + T, f x = ∫ (x : ℝ) in s..s + T, f x
[PROOFSTEP]
rcases lt_trichotomy (0 : ℝ) T with (hT | rfl | hT)
[GOAL]
case inl
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t s : ℝ
hT : 0 < T
⊢ ∫ (x : ℝ) in t..t + T, f x = ∫ (x : ℝ) in s..s + T, f x
[PROOFSTEP]
exact hf.intervalIntegral_add_eq_of_pos hT t s
[GOAL]
case inr.inl
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
t s : ℝ
hf : Periodic f 0
⊢ ∫ (x : ℝ) in t..t + 0, f x = ∫ (x : ℝ) in s..s + 0, f x
[PROOFSTEP]
simp
[GOAL]
case inr.inr
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t s : ℝ
hT : T < 0
⊢ ∫ (x : ℝ) in t..t + T, f x = ∫ (x : ℝ) in s..s + T, f x
[PROOFSTEP]
rw [← neg_inj, ← integral_symm, ← integral_symm]
[GOAL]
case inr.inr
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t s : ℝ
hT : T < 0
⊢ ∫ (x : ℝ) in t + T..t, f x = ∫ (x : ℝ) in s + T..s, f x
[PROOFSTEP]
simpa only [← sub_eq_add_neg, add_sub_cancel] using hf.neg.intervalIntegral_add_eq_of_pos (neg_pos.2 hT) (t + T) (s + T)
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t s : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
⊢ ∫ (x : ℝ) in t..s + T, f x = (∫ (x : ℝ) in t..s, f x) + ∫ (x : ℝ) in t..t + T, f x
[PROOFSTEP]
rw [hf.intervalIntegral_add_eq t s, integral_add_adjacent_intervals (h_int t s) (h_int s _)]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
n : ℤ
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
⊢ ∫ (x : ℝ) in t..t + n • T, f x = n • ∫ (x : ℝ) in t..t + T, f x
[PROOFSTEP]
suffices (∫ x in (0)..(n • T), f x) = n • ∫ x in (0)..T, f x by
  simp only [hf.intervalIntegral_add_eq t 0, (hf.zsmul n).intervalIntegral_add_eq t 0, zero_add, this]
    -- First prove it for natural numbers
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
n : ℤ
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∫ (x : ℝ) in 0 ..n • T, f x = n • ∫ (x : ℝ) in 0 ..T, f x
⊢ ∫ (x : ℝ) in t..t + n • T, f x = n • ∫ (x : ℝ) in t..t + T, f x
[PROOFSTEP]
simp only [hf.intervalIntegral_add_eq t 0, (hf.zsmul n).intervalIntegral_add_eq t 0, zero_add, this]
  -- First prove it for natural numbers
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
n : ℤ
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
⊢ ∫ (x : ℝ) in 0 ..n • T, f x = n • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
have : ∀ m : ℕ, (∫ x in (0)..m • T, f x) = m • ∫ x in (0)..T, f x := fun m ↦
  by
  induction' m with m ih
  · simp
  ·
    simp only [succ_nsmul', hf.intervalIntegral_add_eq_add 0 (m • T) h_int, ih, zero_add]
      -- Then prove it for all integers
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
n : ℤ
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
m : ℕ
⊢ ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
induction' m with m ih
[GOAL]
case zero
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
n : ℤ
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
⊢ ∫ (x : ℝ) in 0 ..Nat.zero • T, f x = Nat.zero • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
simp
[GOAL]
case succ
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
n : ℤ
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
m : ℕ
ih : ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
⊢ ∫ (x : ℝ) in 0 ..Nat.succ m • T, f x = Nat.succ m • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
simp only [succ_nsmul', hf.intervalIntegral_add_eq_add 0 (m • T) h_int, ih, zero_add]
  -- Then prove it for all integers
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
n : ℤ
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
⊢ ∫ (x : ℝ) in 0 ..n • T, f x = n • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
cases' n with n n
[GOAL]
case ofNat
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
⊢ ∫ (x : ℝ) in 0 ..Int.ofNat n • T, f x = Int.ofNat n • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
simp [← this n]
[GOAL]
case negSucc
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
⊢ ∫ (x : ℝ) in 0 ..Int.negSucc n • T, f x = Int.negSucc n • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
conv_rhs => rw [negSucc_zsmul]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
| Int.negSucc n • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
rw [negSucc_zsmul]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
| Int.negSucc n • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
rw [negSucc_zsmul]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
| Int.negSucc n • ∫ (x : ℝ) in 0 ..T, f x
[PROOFSTEP]
rw [negSucc_zsmul]
[GOAL]
case negSucc
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
⊢ ∫ (x : ℝ) in 0 ..Int.negSucc n • T, f x = -((n + 1) • ∫ (x : ℝ) in 0 ..T, f x)
[PROOFSTEP]
have h₀ : Int.negSucc n • T + (n + 1) • T = 0 := by simp; linarith
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
⊢ Int.negSucc n • T + (n + 1) • T = 0
[PROOFSTEP]
simp
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
⊢ (-1 + -↑n) * T + (↑n + 1) * T = 0
[PROOFSTEP]
linarith
[GOAL]
case negSucc
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
h₀ : Int.negSucc n • T + (n + 1) • T = 0
⊢ ∫ (x : ℝ) in 0 ..Int.negSucc n • T, f x = -((n + 1) • ∫ (x : ℝ) in 0 ..T, f x)
[PROOFSTEP]
rw [integral_symm, ← (hf.nsmul (n + 1)).funext, neg_inj]
[GOAL]
case negSucc
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
hf : Periodic f T
t : ℝ
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable f volume t₁ t₂
this : ∀ (m : ℕ), ∫ (x : ℝ) in 0 ..m • T, f x = m • ∫ (x : ℝ) in 0 ..T, f x
n : ℕ
h₀ : Int.negSucc n • T + (n + 1) • T = 0
⊢ ∫ (x : ℝ) in Int.negSucc n • T..0, (fun x => f (x + (n + 1) • T)) x =
    (n + 1) • ∫ (x : ℝ) in 0 ..T, (fun x => f (x + (n + 1) • T)) x
[PROOFSTEP]
simp_rw [integral_comp_add_right, h₀, zero_add, this (n + 1), add_comm T, hf.intervalIntegral_add_eq ((n + 1) • T) 0,
  zero_add]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
⊢ sInf ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T) + ⌊t / T⌋ • ∫ (x : ℝ) in 0 ..T, g x ≤ ∫ (x : ℝ) in 0 ..t, g x
[PROOFSTEP]
let ε := Int.fract (t / T) * T
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
⊢ sInf ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T) + ⌊t / T⌋ • ∫ (x : ℝ) in 0 ..T, g x ≤ ∫ (x : ℝ) in 0 ..t, g x
[PROOFSTEP]
conv_rhs =>
  rw [← Int.fract_div_mul_self_add_zsmul_eq T t (by linarith), ←
    integral_add_adjacent_intervals (h_int 0 ε) (h_int _ _)]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
| ∫ (x : ℝ) in 0 ..t, g x
[PROOFSTEP]
rw [← Int.fract_div_mul_self_add_zsmul_eq T t (by linarith), ← integral_add_adjacent_intervals (h_int 0 ε) (h_int _ _)]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
| ∫ (x : ℝ) in 0 ..t, g x
[PROOFSTEP]
rw [← Int.fract_div_mul_self_add_zsmul_eq T t (by linarith), ← integral_add_adjacent_intervals (h_int 0 ε) (h_int _ _)]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
| ∫ (x : ℝ) in 0 ..t, g x
[PROOFSTEP]
rw [← Int.fract_div_mul_self_add_zsmul_eq T t (by linarith), ← integral_add_adjacent_intervals (h_int 0 ε) (h_int _ _)]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
⊢ T ≠ 0
[PROOFSTEP]
linarith
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
⊢ sInf ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T) + ⌊t / T⌋ • ∫ (x : ℝ) in 0 ..T, g x ≤
    (∫ (x : ℝ) in 0 ..ε, g x) + ∫ (x : ℝ) in ε..Int.fract (t / T) * T + ⌊t / T⌋ • T, g x
[PROOFSTEP]
rw [hg.intervalIntegral_add_zsmul_eq ⌊t / T⌋ ε h_int, hg.intervalIntegral_add_eq ε 0, zero_add, add_le_add_iff_right]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
⊢ sInf ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T) ≤ ∫ (x : ℝ) in 0 ..ε, g x
[PROOFSTEP]
exact
  (continuous_primitive h_int 0).continuousOn.sInf_image_Icc_le <|
    mem_Icc_of_Ico (Int.fract_div_mul_self_mem_Ico T t hT)
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
⊢ ∫ (x : ℝ) in 0 ..t, g x ≤ sSup ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T) + ⌊t / T⌋ • ∫ (x : ℝ) in 0 ..T, g x
[PROOFSTEP]
let ε := Int.fract (t / T) * T
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
⊢ ∫ (x : ℝ) in 0 ..t, g x ≤ sSup ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T) + ⌊t / T⌋ • ∫ (x : ℝ) in 0 ..T, g x
[PROOFSTEP]
conv_lhs =>
  rw [← Int.fract_div_mul_self_add_zsmul_eq T t (by linarith), ←
    integral_add_adjacent_intervals (h_int 0 ε) (h_int _ _)]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
| ∫ (x : ℝ) in 0 ..t, g x
[PROOFSTEP]
rw [← Int.fract_div_mul_self_add_zsmul_eq T t (by linarith), ← integral_add_adjacent_intervals (h_int 0 ε) (h_int _ _)]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
| ∫ (x : ℝ) in 0 ..t, g x
[PROOFSTEP]
rw [← Int.fract_div_mul_self_add_zsmul_eq T t (by linarith), ← integral_add_adjacent_intervals (h_int 0 ε) (h_int _ _)]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
| ∫ (x : ℝ) in 0 ..t, g x
[PROOFSTEP]
rw [← Int.fract_div_mul_self_add_zsmul_eq T t (by linarith), ← integral_add_adjacent_intervals (h_int 0 ε) (h_int _ _)]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
⊢ T ≠ 0
[PROOFSTEP]
linarith
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
⊢ (∫ (x : ℝ) in 0 ..ε, g x) + ∫ (x : ℝ) in ε..Int.fract (t / T) * T + ⌊t / T⌋ • T, g x ≤
    sSup ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T) + ⌊t / T⌋ • ∫ (x : ℝ) in 0 ..T, g x
[PROOFSTEP]
rw [hg.intervalIntegral_add_zsmul_eq ⌊t / T⌋ ε h_int, hg.intervalIntegral_add_eq ε 0, zero_add, add_le_add_iff_right]
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
hT : 0 < T
t : ℝ
ε : ℝ := Int.fract (t / T) * T
⊢ ∫ (x : ℝ) in 0 ..ε, g x ≤ sSup ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T)
[PROOFSTEP]
exact
  (continuous_primitive h_int 0).continuousOn.le_sSup_image_Icc (mem_Icc_of_Ico (Int.fract_div_mul_self_mem_Ico T t hT))
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
h₀ : 0 < ∫ (x : ℝ) in 0 ..T, g x
hT : 0 < T
⊢ Tendsto (fun t => ∫ (x : ℝ) in 0 ..t, g x) atTop atTop
[PROOFSTEP]
apply tendsto_atTop_mono (hg.sInf_add_zsmul_le_integral_of_pos h_int hT)
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
h₀ : 0 < ∫ (x : ℝ) in 0 ..T, g x
hT : 0 < T
⊢ Tendsto (fun n => sInf ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T) + ⌊n / T⌋ • ∫ (x : ℝ) in 0 ..T, g x) atTop
    atTop
[PROOFSTEP]
apply atTop.tendsto_atTop_add_const_left (sInf <| (fun t => ∫ x in (0)..t, g x) '' Icc 0 T)
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
h₀ : 0 < ∫ (x : ℝ) in 0 ..T, g x
hT : 0 < T
⊢ Tendsto (fun x => ⌊x / T⌋ • ∫ (x : ℝ) in 0 ..T, g x) atTop atTop
[PROOFSTEP]
apply Tendsto.atTop_zsmul_const h₀
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
h₀ : 0 < ∫ (x : ℝ) in 0 ..T, g x
hT : 0 < T
⊢ Tendsto (fun x => ⌊x / T⌋) atTop atTop
[PROOFSTEP]
exact tendsto_floor_atTop.comp (tendsto_id.atTop_mul_const (inv_pos.mpr hT))
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
h₀ : 0 < ∫ (x : ℝ) in 0 ..T, g x
hT : 0 < T
⊢ Tendsto (fun t => ∫ (x : ℝ) in 0 ..t, g x) atBot atBot
[PROOFSTEP]
apply tendsto_atBot_mono (hg.integral_le_sSup_add_zsmul_of_pos h_int hT)
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
h₀ : 0 < ∫ (x : ℝ) in 0 ..T, g x
hT : 0 < T
⊢ Tendsto (fun n => sSup ((fun t => ∫ (x : ℝ) in 0 ..t, g x) '' Icc 0 T) + ⌊n / T⌋ • ∫ (x : ℝ) in 0 ..T, g x) atBot
    atBot
[PROOFSTEP]
apply atBot.tendsto_atBot_add_const_left (sSup <| (fun t => ∫ x in (0)..t, g x) '' Icc 0 T)
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
h₀ : 0 < ∫ (x : ℝ) in 0 ..T, g x
hT : 0 < T
⊢ Tendsto (fun x => ⌊x / T⌋ • ∫ (x : ℝ) in 0 ..T, g x) atBot atBot
[PROOFSTEP]
apply Tendsto.atBot_zsmul_const h₀
[GOAL]
E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : CompleteSpace E
f : ℝ → E
T : ℝ
g : ℝ → ℝ
hg : Periodic g T
h_int : ∀ (t₁ t₂ : ℝ), IntervalIntegrable g volume t₁ t₂
h₀ : 0 < ∫ (x : ℝ) in 0 ..T, g x
hT : 0 < T
⊢ Tendsto (fun x => ⌊x / T⌋) atBot atBot
[PROOFSTEP]
exact tendsto_floor_atBot.comp (tendsto_id.atBot_mul_const (inv_pos.mpr hT))
