@@ -25,11 +25,11 @@ At the moment it contains several lemmas in this direction, for antitone or mono
2525## Main Results
2626
2727* `AntitoneOn.integral_le_sum`: The integral of an antitone function is at most the sum of its
28- values at integer steps aligning with the left-hand side of the interval
28+ values at integer steps aligning with the left-hand side of the interval.
2929* `AntitoneOn.sum_le_integral`: The sum of an antitone function along integer steps aligning with
3030 the right-hand side of the interval is at most the integral of the function along that interval
3131* `MonotoneOn.integral_le_sum`: The integral of a monotone function is at most the sum of its
32- values at integer steps aligning with the right-hand side of the interval
32+ values at integer steps aligning with the right-hand side of the interval.
3333* `MonotoneOn.sum_le_integral`: The sum of a monotone function along integer steps aligning with
3434 the left-hand side of the interval is at most the integral of the function along that interval
3535* `sum_mul_Ico_le_integral_of_monotone_antitone`: the sum of `f i * g i` on an interval is bounded
@@ -44,248 +44,132 @@ analysis, comparison, asymptotics
4444
4545public section
4646
47-
48- open Set MeasureTheory MeasureSpace
47+ open Set MeasureTheory MeasureSpace intervalIntegral
4948
5049variable {x₀ : ℝ} {a b : ℕ} {f g : ℝ → ℝ}
5150
52- lemma sum_Ico_le_integral_of_le
53- (hab : a ≤ b) (h : ∀ i ∈ Ico a b, ∀ x ∈ Ico (i : ℝ) (i + 1 : ℕ), f i ≤ g x)
54- (hg : IntegrableOn g (Set.Ico a b)) :
55- ∑ i ∈ Finset.Ico a b, f i ≤ ∫ x in a..b, g x := by
56- have A i (hi : i ∈ Finset.Ico a b) : IntervalIntegrable g volume i (i + 1 : ℕ) := by
51+ lemma sum_Ico_le_integral_of_le (hab : a ≤ b)
52+ (h : ∀ i ∈ Ico a b, ∀ x ∈ Ico (i : ℝ) ↑(i + 1 ), f i ≤ g x)
53+ (hg : IntegrableOn g (Ico a b)) : ∑ i ∈ .Ico a b, f i ≤ ∫ x in a..b, g x := by
54+ have A i (hi : i ∈ Finset.Ico a b) : IntervalIntegrable g volume i ↑(i + 1 ) := by
5755 rw [intervalIntegrable_iff_integrableOn_Ico_of_le (by simp)]
58- apply hg.mono _ le_rfl
59- rintro x ⟨hx, h'x⟩
60- simp only [Finset.mem_Ico, mem_Ico] at hi ⊢
61- exact ⟨le_trans (mod_cast hi.1 ) hx, h'x.trans_le (mod_cast hi.2 )⟩
56+ simp only [Finset.mem_Ico, ← Nat.add_one_le_iff] at hi
57+ rify at hi
58+ exact hg.mono (by grind) le_rfl
6259 calc
63- ∑ i ∈ Finset.Ico a b, f i
64- _ = ∑ i ∈ Finset.Ico a b, (∫ x in (i : ℝ)..(i + 1 : ℕ), f i) := by simp
65- _ ≤ ∑ i ∈ Finset.Ico a b, (∫ x in (i : ℝ)..(i + 1 : ℕ), g x) := by
60+ _ = ∑ i ∈ .Ico a b, (∫ x in (i : ℝ)..↑(i + 1 ), f i) := by simp
61+ _ ≤ ∑ i ∈ .Ico a b, (∫ x in (i : ℝ)..↑(i + 1 ), g x) := by
6662 gcongr with i hi
67- apply intervalIntegral. integral_mono_on_of_le_Ioo (by simp) (by simp) (A _ hi) (fun x hx ↦ ?_)
63+ apply integral_mono_on_of_le_Ioo (by simp) (by simp) (A _ hi) (fun x hx ↦ ?_)
6864 exact h _ (by simpa using hi) _ (Ioo_subset_Ico_self hx)
69- _ = ∫ x in a..b, g x := by
70- rw [intervalIntegral.sum_integral_adjacent_intervals_Ico (a := fun i ↦ i) hab]
71- intro i hi
72- exact A _ (by simpa using hi)
65+ _ = _ := by rw [sum_integral_adjacent_intervals_Ico (a := (↑·)) hab]; grind
66+
67+ lemma integral_le_sum_Ico_of_le (hab : a ≤ b)
68+ (h : ∀ i ∈ Ico a b, ∀ x ∈ Ico (i : ℝ) ↑(i + 1 ), g x ≤ f i)
69+ (hg : IntegrableOn g (Ico a b)) : ∫ x in a..b, g x ≤ ∑ i ∈ .Ico a b, f i := by
70+ convert! neg_le_neg (sum_Ico_le_integral_of_le (f := -f) (g := -g) hab
71+ (fun i hi x hx ↦ neg_le_neg (h i hi x hx)) hg.neg) <;> simp
7372
74- lemma integral_le_sum_Ico_of_le
75- (hab : a ≤ b) (h : ∀ i ∈ Ico a b, ∀ x ∈ Ico (i : ℝ) (i + 1 : ℕ), g x ≤ f i)
76- (hg : IntegrableOn g (Set.Ico a b)) :
77- ∫ x in a..b, g x ≤ ∑ i ∈ Finset.Ico a b, f i := by
78- convert!
79- neg_le_neg
80- (sum_Ico_le_integral_of_le (f := -f) (g := -g) hab (fun i hi x hx ↦ neg_le_neg (h i hi x hx))
81- hg.neg) <;> simp
73+ private theorem AntitoneOn.intervalIntegrable_subset (hf : AntitoneOn f (Icc x₀ (x₀ + a)))
74+ (k : ℕ) (hk : k + 1 ≤ a) : IntervalIntegrable f volume (x₀ + k) (x₀ + ↑(k + 1 )) := by
75+ refine (hf.mono ?_).intervalIntegrable
76+ rw [uIcc_of_le (by simp)]
77+ apply Icc_subset_Icc <;> simp [-Nat.cast_add, hk]
8278
8379theorem AntitoneOn.integral_le_sum (hf : AntitoneOn f (Icc x₀ (x₀ + a))) :
84- (∫ x in x₀..x₀ + a, f x) ≤ ∑ i ∈ Finset.range a, f (x₀ + i) := by
85- have hint : ∀ k : ℕ, k < a → IntervalIntegrable f volume (x₀ + k) (x₀ + (k + 1 : ℕ)) := by
86- intro k hk
87- refine (hf.mono ?_).intervalIntegrable
88- rw [uIcc_of_le]
89- · apply Icc_subset_Icc
90- · simp only [le_add_iff_nonneg_right, Nat.cast_nonneg]
91- · simp only [add_le_add_iff_left, Nat.cast_le, Nat.succ_le_of_lt hk]
92- · simp only [add_le_add_iff_left, Nat.cast_le, Nat.le_succ]
93- calc
94- ∫ x in x₀..x₀ + a, f x = ∑ i ∈ Finset.range a, ∫ x in x₀ + i..x₀ + (i + 1 : ℕ), f x := by
95- convert! (intervalIntegral.sum_integral_adjacent_intervals hint).symm
96- simp only [Nat.cast_zero, add_zero]
97- _ ≤ ∑ i ∈ Finset.range a, ∫ _ in x₀ + i..x₀ + (i + 1 : ℕ), f (x₀ + i) := by
98- gcongr with i hi
99- have ia : i < a := Finset.mem_range.1 hi
100- refine intervalIntegral.integral_mono_on (by simp) (hint _ ia) (by simp) fun x hx => ?_
101- apply hf _ _ hx.1
102- · simp only [ia.le, mem_Icc, le_add_iff_nonneg_right, Nat.cast_nonneg, add_le_add_iff_left,
103- Nat.cast_le, and_self_iff]
104- · refine mem_Icc.2 ⟨le_trans (by simp) hx.1 , le_trans hx.2 ?_⟩
105- simp only [add_le_add_iff_left, Nat.cast_le, Nat.succ_le_of_lt ia]
106- _ = ∑ i ∈ Finset.range a, f (x₀ + i) := by simp
80+ ∫ x in x₀..x₀ + a, f x ≤ ∑ i ∈ .range a, f (x₀ + i) := calc
81+ _ = ∑ i ∈ .range a, ∫ x in x₀ + i..x₀ + ↑(i + 1 ), f x := by
82+ convert! (sum_integral_adjacent_intervals hf.intervalIntegrable_subset).symm
83+ simp
84+ _ ≤ ∑ i ∈ .range a, ∫ _ in x₀ + i..x₀ + ↑(i + 1 ), f (x₀ + i) := by
85+ gcongr with i hi
86+ rw [Finset.mem_range, ← Nat.add_one_le_iff] at hi
87+ have := hf.intervalIntegrable_subset _ hi
88+ rify at hi this ⊢
89+ refine integral_mono_on (by simp) this (by simp) fun _ _ ↦ by apply hf <;> grind
90+ _ = _ := by simp
10791
10892theorem AntitoneOn.integral_le_sum_Ico (hab : a ≤ b) (hf : AntitoneOn f (Set.Icc a b)) :
109- (∫ x in a..b, f x) ≤ ∑ x ∈ Finset.Ico a b, f x := by
110- rw [(Nat.sub_add_cancel hab).symm, Nat.cast_add]
111- conv =>
112- congr
113- congr
114- · skip
115- · skip
116- rw [add_comm]
117- · skip
118- · skip
119- congr
120- congr
121- rw [← zero_add a]
93+ ∫ x in a..b, f x ≤ ∑ x ∈ .Ico a b, f x := by
94+ suffices ∫ x in a..a + ↑(b - a), f x ≤ ∑ x ∈ .Ico (0 + a) (b - a + a), f x by simp_all
12295 rw [← Finset.sum_Ico_add, Nat.Ico_zero_eq_range]
123- conv =>
124- rhs
125- congr
126- · skip
127- ext
128- rw [Nat.cast_add]
129- apply AntitoneOn.integral_le_sum
130- simp only [hf, hab, Nat.cast_sub, add_sub_cancel]
96+ suffices ∫ x in a..a + ↑(b - a), f x ≤ ∑ x ∈ .range (b - a), f (a + x) by simp_all
97+ exact AntitoneOn.integral_le_sum (by simp only [hf, hab, Nat.cast_sub, add_sub_cancel])
13198
13299theorem AntitoneOn.sum_le_integral (hf : AntitoneOn f (Icc x₀ (x₀ + a))) :
133- (∑ i ∈ Finset.range a, f (x₀ + (i + 1 : ℕ))) ≤ ∫ x in x₀..x₀ + a, f x := by
134- have hint : ∀ k : ℕ, k < a → IntervalIntegrable f volume (x₀ + k) (x₀ + (k + 1 : ℕ)) := by
135- intro k hk
136- refine (hf.mono ?_).intervalIntegrable
137- rw [uIcc_of_le]
138- · apply Icc_subset_Icc
139- · simp only [le_add_iff_nonneg_right, Nat.cast_nonneg]
140- · simp only [add_le_add_iff_left, Nat.cast_le, Nat.succ_le_of_lt hk]
141- · simp only [add_le_add_iff_left, Nat.cast_le, Nat.le_succ]
142- calc
143- (∑ i ∈ Finset.range a, f (x₀ + (i + 1 : ℕ))) =
144- ∑ i ∈ Finset.range a, ∫ _ in x₀ + i..x₀ + (i + 1 : ℕ), f (x₀ + (i + 1 : ℕ)) := by simp
145- _ ≤ ∑ i ∈ Finset.range a, ∫ x in x₀ + i..x₀ + (i + 1 : ℕ), f x := by
146- apply Finset.sum_le_sum fun i hi => ?_
147- have ia : i + 1 ≤ a := Finset.mem_range.1 hi
148- refine intervalIntegral.integral_mono_on (by simp) (by simp) (hint _ ia) fun x hx => ?_
149- apply hf _ _ hx.2
150- · refine mem_Icc.2 ⟨le_trans (le_add_of_nonneg_right (Nat.cast_nonneg _)) hx.1 ,
151- le_trans hx.2 ?_⟩
152- simp only [Nat.cast_le, add_le_add_iff_left, ia]
153- · refine mem_Icc.2 ⟨le_add_of_nonneg_right (Nat.cast_nonneg _), ?_⟩
154- simp only [add_le_add_iff_left, Nat.cast_le, ia]
155- _ = ∫ x in x₀..x₀ + a, f x := by
156- convert! intervalIntegral.sum_integral_adjacent_intervals hint
157- simp only [Nat.cast_zero, add_zero]
158-
159- theorem AntitoneOn.sum_le_integral_Ico (hab : a ≤ b) (hf : AntitoneOn f (Set.Icc a b)) :
160- (∑ i ∈ Finset.Ico a b, f (i + 1 : ℕ)) ≤ ∫ x in a..b, f x := by
161- rw [(Nat.sub_add_cancel hab).symm, Nat.cast_add]
162- conv =>
163- congr
164- congr
165- congr
166- rw [← zero_add a]
167- · skip
168- · skip
169- · skip
170- rw [add_comm]
171- rw [← Finset.sum_Ico_add, Nat.Ico_zero_eq_range]
172- conv =>
173- lhs
174- congr
175- congr
176- · skip
177- ext
178- rw [add_assoc, Nat.cast_add]
179- apply AntitoneOn.sum_le_integral
180- simp only [hf, hab, Nat.cast_sub, add_sub_cancel]
100+ ∑ i ∈ .range a, f (x₀ + ↑(i + 1 )) ≤ ∫ x in x₀..x₀ + a, f x := calc
101+ _ = ∑ i ∈ .range a, ∫ _ in x₀ + i..x₀ + ↑(i + 1 ), f (x₀ + ↑(i + 1 )) := by simp
102+ _ ≤ ∑ i ∈ .range a, ∫ x in x₀ + i..x₀ + ↑(i + 1 ), f x := by
103+ gcongr with i hi
104+ rw [Finset.mem_range, ← Nat.add_one_le_iff] at hi
105+ have := hf.intervalIntegrable_subset _ hi
106+ rify at hi this ⊢
107+ exact integral_mono_on (by simp) (by simp) this fun _ _ ↦ by apply hf <;> grind
108+ _ = _ := by
109+ convert! sum_integral_adjacent_intervals hf.intervalIntegrable_subset
110+ simp [-Nat.cast_add]
111+
112+ theorem AntitoneOn.sum_le_integral_Ico (hab : a ≤ b) (hf : AntitoneOn f (Icc a b)) :
113+ ∑ i ∈ .Ico a b, f ↑(i + 1 ) ≤ ∫ x in a..b, f x := by
114+ suffices ∑ i ∈ .Ico (0 + a) (b - a + a), f ↑(i + 1 ) ≤ ∫ x in a..a + ↑(b - a), f x by simp_all
115+ simp_rw [← Finset.sum_Ico_add, Nat.Ico_zero_eq_range, add_assoc]
116+ suffices ∑ x ∈ .range (b - a), f (a + ↑(x + 1 )) ≤ ∫ x in a..a + ↑(b - a), f x by simp_all
117+ exact AntitoneOn.sum_le_integral (by simp [hf, hab])
181118
182119theorem MonotoneOn.sum_le_integral (hf : MonotoneOn f (Icc x₀ (x₀ + a))) :
183- ( ∑ i ∈ Finset .range a, f (x₀ + i) ) ≤ ∫ x in x₀..x₀ + a, f x := by
120+ ∑ i ∈ .range a, f (x₀ + i) ≤ ∫ x in x₀..x₀ + a, f x := by
184121 rw [← neg_le_neg_iff, ← Finset.sum_neg_distrib, ← intervalIntegral.integral_neg]
185122 exact hf.neg.integral_le_sum
186123
187124theorem MonotoneOn.sum_le_integral_Ico (hab : a ≤ b) (hf : MonotoneOn f (Set.Icc a b)) :
188- ∑ x ∈ Finset .Ico a b, f x ≤ ∫ x in a..b, f x := by
125+ ∑ x ∈ .Ico a b, f x ≤ ∫ x in a..b, f x := by
189126 rw [← neg_le_neg_iff, ← Finset.sum_neg_distrib, ← intervalIntegral.integral_neg]
190127 exact hf.neg.integral_le_sum_Ico hab
191128
192129theorem MonotoneOn.integral_le_sum (hf : MonotoneOn f (Icc x₀ (x₀ + a))) :
193- ( ∫ x in x₀..x₀ + a, f x) ≤ ∑ i ∈ Finset .range a, f (x₀ + (i + 1 : ℕ )) := by
130+ ∫ x in x₀..x₀ + a, f x ≤ ∑ i ∈ .range a, f (x₀ + ↑ (i + 1 )) := by
194131 rw [← neg_le_neg_iff, ← Finset.sum_neg_distrib, ← intervalIntegral.integral_neg]
195132 exact hf.neg.sum_le_integral
196133
197134theorem MonotoneOn.integral_le_sum_Ico (hab : a ≤ b) (hf : MonotoneOn f (Set.Icc a b)) :
198- ( ∫ x in a..b, f x) ≤ ∑ i ∈ Finset .Ico a b, f (i + 1 : ℕ ) := by
135+ ∫ x in a..b, f x ≤ ∑ i ∈ .Ico a b, f ↑ (i + 1 ) := by
199136 rw [← neg_le_neg_iff, ← Finset.sum_neg_distrib, ← intervalIntegral.integral_neg]
200137 exact hf.neg.sum_le_integral_Ico hab
201138
202139lemma sum_mul_Ico_le_integral_of_monotone_antitone
203140 (hab : a ≤ b) (hf : MonotoneOn f (Icc a b)) (hg : AntitoneOn g (Icc (a - 1 ) (b - 1 )))
204141 (fpos : 0 ≤ f a) (gpos : 0 ≤ g (b - 1 )) :
205- ∑ i ∈ Finset .Ico a b, f i * g i ≤ ∫ x in a..b, f x * g (x - 1 ) := by
142+ ∑ i ∈ .Ico a b, f i * g i ≤ ∫ x in a..b, f x * g (x - 1 ) := by
206143 apply sum_Ico_le_integral_of_le (f := fun x ↦ f x * g x) hab
207144 · intro i hi x hx
208- simp only [Nat.cast_add, Nat.cast_one, mem_Ico] at hx hi
209- have I0 : (i : ℝ) ≤ b - 1 := by
210- simp only [le_sub_iff_add_le]
211- norm_cast
212- lia
213- have I1 : (i : ℝ) ∈ Icc (a - 1 : ℝ) (b - 1 ) := by
214- simp only [mem_Icc, tsub_le_iff_right]
215- exact ⟨by norm_cast; lia, I0⟩
216- have I2 : x ∈ Icc (a : ℝ) b := by
217- refine ⟨le_trans (mod_cast hi.1 ) hx.1 , hx.2 .le.trans ?_⟩
218- norm_cast
219- lia
220- apply mul_le_mul
221- · apply hf
222- · simp only [mem_Icc, Nat.cast_le]
223- exact ⟨hi.1 , hi.2 .le⟩
224- · exact I2
225- · exact hx.1
226- · apply hg
227- · simp only [mem_Icc, tsub_le_iff_right, sub_add_cancel]
228- refine ⟨le_trans (mod_cast hi.1 ) hx.1 , hx.2 .le.trans ?_⟩
229- norm_cast
230- lia
231- · exact I1
232- · simpa [sub_le_iff_le_add] using hx.2 .le
233- · apply gpos.trans
234- apply hg I1 (by simp [hab]) I0
235- · apply fpos.trans
236- apply hf (by simp [hab]) I2
237- exact le_trans (mod_cast hi.1 ) hx.1
238- · apply Integrable.mono_measure _ (Measure.restrict_mono_set _ Ico_subset_Icc_self)
239- apply Integrable.mul_of_top_left
240- · exact hf.integrableOn_isCompact isCompact_Icc
241- · apply AntitoneOn.memLp_isCompact isCompact_Icc
242- intro x hx y hy hxy
243- apply hg
244- · simpa using hx
245- · simpa using hy
246- · simpa using hxy
145+ simp only [Nat.cast_add, Nat.cast_one, mem_Ico, ← Nat.add_one_le_iff] at hx hi
146+ rify at hi
147+ gcongr
148+ · grw [gpos]; apply hg <;> grind
149+ · grw [fpos]; apply hf <;> grind
150+ · apply hf <;> grind
151+ · apply hg <;> grind
152+ · apply Integrable.mono_measure _ (volume.restrict_mono_set Ico_subset_Icc_self)
153+ apply (hf.integrableOn_isCompact isCompact_Icc).mul_of_top_left
154+ apply AntitoneOn.memLp_isCompact isCompact_Icc
155+ intro _ _ _ _ _
156+ apply hg <;> grind
247157
248158lemma integral_le_sum_mul_Ico_of_antitone_monotone
249159 (hab : a ≤ b) (hf : AntitoneOn f (Icc a b)) (hg : MonotoneOn g (Icc (a - 1 ) (b - 1 )))
250160 (fpos : 0 ≤ f b) (gpos : 0 ≤ g (a - 1 )) :
251- ∫ x in a..b, f x * g (x - 1 ) ≤ ∑ i ∈ Finset .Ico a b, f i * g i := by
161+ ∫ x in a..b, f x * g (x - 1 ) ≤ ∑ i ∈ .Ico a b, f i * g i := by
252162 apply integral_le_sum_Ico_of_le (f := fun x ↦ f x * g x) hab
253163 · intro i hi x hx
254- simp only [Nat.cast_add, Nat.cast_one, mem_Ico] at hx hi
255- have I0 : (i : ℝ) ≤ b - 1 := by
256- simp only [le_sub_iff_add_le]
257- norm_cast
258- lia
259- have I1 : (i : ℝ) ∈ Icc (a - 1 : ℝ) (b - 1 ) := by
260- simp only [mem_Icc, tsub_le_iff_right]
261- exact ⟨by norm_cast; lia, I0⟩
262- have I2 : x ∈ Icc (a : ℝ) b := by
263- refine ⟨le_trans (mod_cast hi.1 ) hx.1 , hx.2 .le.trans ?_⟩
264- norm_cast
265- lia
266- apply mul_le_mul
267- · apply hf
268- · simp only [mem_Icc, Nat.cast_le]
269- exact ⟨hi.1 , hi.2 .le⟩
270- · exact I2
271- · exact hx.1
272- · apply hg
273- · simp only [mem_Icc, tsub_le_iff_right, sub_add_cancel]
274- refine ⟨le_trans (mod_cast hi.1 ) hx.1 , hx.2 .le.trans ?_⟩
275- norm_cast
276- lia
277- · exact I1
278- · simpa [sub_le_iff_le_add] using hx.2 .le
279- · apply gpos.trans
280- apply hg (by simp [hab]) (by simpa using I2) (by simpa using I2.1 )
281- · apply fpos.trans
282- apply hf ⟨mod_cast hi.1 , mod_cast hi.2 .le⟩ (by simpa using hab) (mod_cast hi.2 .le)
283- · apply Integrable.mono_measure _ (Measure.restrict_mono_set _ Ico_subset_Icc_self)
284- apply Integrable.mul_of_top_left
285- · exact hf.integrableOn_isCompact isCompact_Icc
286- · apply MonotoneOn.memLp_isCompact isCompact_Icc
287- intro x hx y hy hxy
288- apply hg
289- · simpa using hx
290- · simpa using hy
291- · simpa using hxy
164+ simp only [Nat.cast_add, Nat.cast_one, mem_Ico, ← Nat.add_one_le_iff] at hx hi
165+ rify at hi
166+ gcongr
167+ · grw [gpos]; apply hg <;> grind
168+ · grw [fpos]; apply hf <;> grind
169+ · apply hf <;> grind
170+ · apply hg <;> grind
171+ · apply Integrable.mono_measure _ (volume.restrict_mono_set Ico_subset_Icc_self)
172+ apply (hf.integrableOn_isCompact isCompact_Icc).mul_of_top_left
173+ apply MonotoneOn.memLp_isCompact isCompact_Icc
174+ intro _ _ _ _ _
175+ apply hg <;> grind
0 commit comments