|
| 1 | +/- |
| 2 | +Copyright (c) 2025 Chris Birkbeck. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Chris Birkbeck |
| 5 | +-/ |
| 6 | + |
| 7 | +import Mathlib.Algebra.BigOperators.Group.Finset.Interval |
| 8 | +import Mathlib.Algebra.Order.Ring.Star |
| 9 | +import Mathlib.Order.Filter.AtTopBot.Interval |
| 10 | +import Mathlib.Topology.Algebra.InfiniteSum.Defs |
| 11 | +import Mathlib.Topology.Algebra.Monoid.Defs |
| 12 | +import Mathlib.Tactic.FinCases |
| 13 | + |
| 14 | + |
| 15 | +/-! |
| 16 | +# Sums over symmetric integer intervals |
| 17 | +
|
| 18 | +This file contains some lemmas about sums over symmetric integer intervals `Ixx -N N` used, for |
| 19 | +example in the definition of the Eisenstein series `E2`. |
| 20 | +In particular we define `symmetricIcc`, `symmetricIco`, `symmetricIoc` and `symmetricIoo` as |
| 21 | +`SummationFilter`s corresponding to the intervals `Icc -N N`, `Ico -N N`, `Ioc -N N` respectively. |
| 22 | +We also prove that these filters are all `NeBot` and `LeAtTop`. |
| 23 | +
|
| 24 | +-/ |
| 25 | + |
| 26 | +open Finset Topology Function Filter SummationFilter |
| 27 | + |
| 28 | +namespace SummationFilter |
| 29 | + |
| 30 | +section IntervalFilters |
| 31 | + |
| 32 | +variable (G : Type*) [Neg G] [Preorder G] [LocallyFiniteOrder G] |
| 33 | + |
| 34 | +/-- The SummationFilter on a locally finite order `G` corresponding to the symmetric |
| 35 | +intervals `Icc (-N) N`· -/ |
| 36 | +@[simps] |
| 37 | +def symmetricIcc : SummationFilter G where |
| 38 | + filter := atTop.map (fun g ↦ Icc (-g) g) |
| 39 | + |
| 40 | +/-- The SummationFilter on a locally finite order `G` corresponding to the symmetric |
| 41 | +intervals `Ioo (-N) N`· Note that for `G = ℤ` this coincides with |
| 42 | +`symmetricIcc` so one should use that. See `symmetricIcc_eq_symmetricIoo_int`. -/ |
| 43 | +@[simps] |
| 44 | +def symmetricIoo : SummationFilter G where |
| 45 | + filter := atTop.map (fun g ↦ Ioo (-g) g) |
| 46 | + |
| 47 | +/-- The SummationFilter on a locally finite order `G` corresponding to the symmetric |
| 48 | +intervals `Ico (-N) N`· -/ |
| 49 | +@[simps] |
| 50 | +def symmetricIco : SummationFilter G where |
| 51 | + filter := atTop.map (fun N ↦ Ico (-N) N) |
| 52 | + |
| 53 | +/-- The SummationFilter on a locally finite order `G` corresponding to the symmetric |
| 54 | +intervals `Ioc (-N) N`· -/ |
| 55 | +@[simps] |
| 56 | +def symmetricIoc : SummationFilter G where |
| 57 | + filter := atTop.map (fun N ↦ Ioc (-N) N) |
| 58 | + |
| 59 | +variable [(atTop : Filter G).NeBot] |
| 60 | + |
| 61 | +instance : (symmetricIcc G).NeBot where |
| 62 | + ne_bot := by simp [symmetricIcc, Filter.NeBot.map] |
| 63 | + |
| 64 | +instance : (symmetricIco G).NeBot where |
| 65 | + ne_bot := by simp [symmetricIco, Filter.NeBot.map] |
| 66 | + |
| 67 | +instance : (symmetricIoc G).NeBot where |
| 68 | + ne_bot := by simp [symmetricIoc, Filter.NeBot.map] |
| 69 | + |
| 70 | +instance : (symmetricIoo G).NeBot where |
| 71 | + ne_bot := by simp [symmetricIoo, Filter.NeBot.map] |
| 72 | + |
| 73 | +section LeAtTop |
| 74 | + |
| 75 | +variable {G : Type*} [AddCommGroup G] [PartialOrder G] [IsOrderedAddMonoid G] [LocallyFiniteOrder G] |
| 76 | + |
| 77 | +lemma symmetricIcc_le_Conditional : |
| 78 | + (symmetricIcc G).filter ≤ (conditional G).filter := |
| 79 | + Filter.map_mono (tendsto_neg_atTop_atBot.prodMk tendsto_id) |
| 80 | + |
| 81 | +instance : (symmetricIcc G).LeAtTop where |
| 82 | + le_atTop := le_trans symmetricIcc_le_Conditional (conditional G).le_atTop |
| 83 | + |
| 84 | +variable [NoTopOrder G] [NoBotOrder G] |
| 85 | + |
| 86 | +instance : (symmetricIco G).LeAtTop where |
| 87 | + le_atTop := by |
| 88 | + rw [symmetricIco, map_le_iff_le_comap, ← @tendsto_iff_comap] |
| 89 | + exact tendsto_Ico_neg_atTop_atTop |
| 90 | + |
| 91 | +instance : (symmetricIoc G).LeAtTop where |
| 92 | + le_atTop := by |
| 93 | + rw [symmetricIoc, map_le_iff_le_comap, ← @tendsto_iff_comap] |
| 94 | + exact tendsto_Ioc_neg_atTop_atTop |
| 95 | + |
| 96 | +instance : (symmetricIoo G).LeAtTop where |
| 97 | + le_atTop := by |
| 98 | + rw [symmetricIoo, map_le_iff_le_comap, ← @tendsto_iff_comap] |
| 99 | + exact tendsto_Ioo_neg_atTop_atTop |
| 100 | + |
| 101 | +end LeAtTop |
| 102 | + |
| 103 | +end IntervalFilters |
| 104 | +section Int |
| 105 | + |
| 106 | +variable {α : Type*} {f : ℤ → α} [CommGroup α] [TopologicalSpace α] [ContinuousMul α] |
| 107 | + |
| 108 | +lemma symmetricIcc_eq_map_Icc_nat : |
| 109 | + (symmetricIcc ℤ).filter = atTop.map (fun N : ℕ ↦ Icc (-(N : ℤ)) N) := by |
| 110 | + simp [← Nat.map_cast_int_atTop, Function.comp_def] |
| 111 | + |
| 112 | +lemma symmetricIcc_eq_symmetricIoo_int : symmetricIcc ℤ = symmetricIoo ℤ := by |
| 113 | + simp only [symmetricIcc, symmetricIoo, mk.injEq] |
| 114 | + ext s |
| 115 | + simp only [← Nat.map_cast_int_atTop, Filter.map_map, Filter.mem_map, mem_atTop_sets, ge_iff_le, |
| 116 | + Set.mem_preimage, comp_apply] |
| 117 | + refine ⟨fun ⟨a, ha⟩ ↦ ⟨a + 1, fun b hb ↦ ?_⟩, fun ⟨a, ha⟩ ↦ ⟨a - 1, fun b hb ↦ ?_⟩⟩ <;> |
| 118 | + [ convert ha (b - 1) (by grind) using 1; convert ha (b + 1) (by grind) using 1 ] <;> |
| 119 | + simpa [Finset.ext_iff] using by grind |
| 120 | + |
| 121 | +@[to_additive] |
| 122 | +lemma HasProd.hasProd_symmetricIco_of_hasProd_symmetricIcc {a : α} |
| 123 | + (hf : HasProd f a (symmetricIcc ℤ)) (hf2 : Tendsto (fun N : ℕ ↦ (f N)⁻¹) atTop (𝓝 1)) : |
| 124 | + HasProd f a (symmetricIco ℤ) := by |
| 125 | + simp only [HasProd, tendsto_map'_iff, symmetricIcc_eq_map_Icc_nat, |
| 126 | + ← Nat.map_cast_int_atTop, symmetricIco] at * |
| 127 | + apply tendsto_of_div_tendsto_one _ hf |
| 128 | + simpa [Pi.div_def, fun N : ℕ ↦ prod_Icc_eq_prod_Ico_mul f (show (-N : ℤ) ≤ N by omega)] |
| 129 | + using hf2 |
| 130 | + |
| 131 | +@[to_additive] |
| 132 | +lemma multipliable_symmetricIco_of_multiplible_symmetricIcc |
| 133 | + (hf : Multipliable f (symmetricIcc ℤ)) (hf2 : Tendsto (fun N : ℕ ↦ (f N)⁻¹) atTop (𝓝 1)) : |
| 134 | + Multipliable f (symmetricIco ℤ) := |
| 135 | + (hf.hasProd.hasProd_symmetricIco_of_hasProd_symmetricIcc hf2).multipliable |
| 136 | + |
| 137 | +@[to_additive] |
| 138 | +lemma tprod_symmetricIcc_eq_tprod_symmetricIco [T2Space α] |
| 139 | + (hf : Multipliable f (symmetricIcc ℤ)) (hf2 : Tendsto (fun N : ℕ ↦ (f N)⁻¹) atTop (𝓝 1)) : |
| 140 | + ∏'[symmetricIco ℤ] b, f b = ∏'[symmetricIcc ℤ] b, f b := |
| 141 | + (hf.hasProd.hasProd_symmetricIco_of_hasProd_symmetricIcc hf2).tprod_eq |
| 142 | + |
| 143 | +@[to_additive] |
| 144 | +lemma hasProd_symmetricIcc_iff {α : Type*} [CommMonoid α] [TopologicalSpace α] |
| 145 | + {f : ℤ → α} {a : α} : HasProd f a (symmetricIcc ℤ) ↔ |
| 146 | + Tendsto (fun N : ℕ ↦ ∏ n ∈ Icc (-(N : ℤ)) N, f n) atTop (𝓝 a) := by |
| 147 | + simp [HasProd, symmetricIcc, ← Nat.map_cast_int_atTop, comp_def] |
| 148 | + |
| 149 | +@[to_additive] |
| 150 | +lemma hasProd_symmetricIco_int_iff {α : Type*} [CommMonoid α] [TopologicalSpace α] |
| 151 | + {f : ℤ → α} {a : α} : HasProd f a (symmetricIco ℤ) ↔ |
| 152 | + Tendsto (fun N : ℕ ↦ ∏ n ∈ Ico (-(N : ℤ)) (N : ℤ), f n) atTop (𝓝 a) := by |
| 153 | + simp [HasProd, symmetricIco, ← Nat.map_cast_int_atTop, comp_def] |
| 154 | + |
| 155 | +@[to_additive] |
| 156 | +lemma hasProd_symmetricIoc_int_iff {α : Type*} [CommMonoid α] [TopologicalSpace α] |
| 157 | + {f : ℤ → α} {a : α} : HasProd f a (symmetricIoc ℤ) ↔ |
| 158 | + Tendsto (fun N : ℕ ↦ ∏ n ∈ Ioc (-(N : ℤ)) (N : ℤ), f n) atTop (𝓝 a) := by |
| 159 | + simp [HasProd, symmetricIoc, ← Nat.map_cast_int_atTop, comp_def] |
| 160 | + |
| 161 | +end Int |
| 162 | + |
| 163 | +end SummationFilter |
0 commit comments