-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFinsetAdeleRing.lean
386 lines (300 loc) · 16.4 KB
/
FinsetAdeleRing.lean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
/-
Copyright (c) 2024 Salvatore Mercuri. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Salvatore Mercuri
-/
import AdeleRingLocallyCompact.RingTheory.DedekindDomain.FiniteAdeleRing
import AdeleRingLocallyCompact.RingTheory.DedekindDomain.AdicValuation
import AdeleRingLocallyCompact.RingTheory.DedekindDomain.Factorization
import AdeleRingLocallyCompact.Algebra.Order.GroupWithZero.Canonical
/-!
# Finite S-adele ring
Let `R` be a Dedekind domain of Krull dimension 1, `K` its field of fractions and `S` a
finite set of finite places `v` of `K`. In this file we define the finite S-adele ring, whose
carrier is the set of all elements in `ProdAdicCompletions R K` which are in the `v`-adic ring
of integers outside of `S`, as `FinsetAdeleRing R K S` and we show that this is locally compact.
The finite S-adele ring has an open embedding into the regular finite adele ring and,
moreover, cover the finite adele ring. This allows us to show that the finite adele ring is also
locally compact.
## Main definitions
- `DedekindDomain.FinsetProd R K S` is the `DedekindDomain.ProdAdicCompletions R K`
split into a product along the predicate `v ∈ S`.
- `DedekindDomain.FinsetIntegralAdeles R K S` is the direct product whose left type
is the product of the `v`-adic completions of `K` over all `v ∈ S` and whose right type is
the product of the `v`-adic ring of integers over all `v ∉ S`.
- `DedekindDomain.FinsetIntegralAdeles.Subtype R K S` is
`DedekindDomain.FinsetIntegralAdeles R K S` as a subtype of `DedekindDomain.FinsetProd R K S`.
- `DedekindDomain.FinsetAdeleRing R K S` is the type of all finite S-adeles.
## Main results
- `DedekindDomain.FinsetAdeleRing.homeomorph_subtype` : the finite S-adele ring is
homeomorphic to `DedekindDomain.FiniteIntegralAdeles.Subtype`.
- `DedekindDomain.FinsetAdeleRing.algebraMap_inducing` : the map sending finite S-adeles to
finite adeles is inducing; equivalently, the topology of the finite S-adele ring when viewed as
a subspace of the finite adele ring is equal to the topology when viewed as a subspace of
`ProdAdicCompletions R K`.
- `DedekindDomain.FinsetAdeleRing.locallyCompactSpace` : the finite S-adele ring is locally
compact.
- `DedekindDomain.FiniteAdeleRing.locallyCompactSpace` : the finite adele ring is locally compact.
## Implementation notes
- There are two formalisations of the object `Π (v ∈ S), Kᵥ × Π (v ∉ S), Oᵥ`. These are
`DedekindDomain.FinsetIntegralAdeles` and `DedekindDomain.FinsetIntegralAdeles.Subtype`,
where the former is viewed as a type and the latter as a subtype of
`Π (v ∈ S), Kᵥ × Π (v ∉ S), Kᵥ`. The reason for this is that the former is easily shown to be
locally compact (its `fst` is a finite product of locally compact spaces and its `snd` is an
infinite product of compact spaces), but it is much easier to show that the latter is
homeomorphic to the finite S-adele ring, because we can just descend the natural homeomorphism
on parent types. Thus we need to show that these two formalisations are also homeomorphic, which
is found in `DedekindDomain.FinsetIntegralAdeles.homeomorph`.
## Tags
finite s-adele ring, dedekind domain
-/
noncomputable section
open IsDedekindDomain IsDedekindDomain.HeightOneSpectrum
open scoped Classical
namespace DedekindDomain
variable (R : Type*) [CommRing R] [IsDomain R] [IsDedekindDomain R] (K : Type*)
[Field K] [Algebra R K] [IsFractionRing R K] (S : Finset (HeightOneSpectrum R))
namespace ProdAdicCompletions
/-- The type `DedekindDomain.ProdAdicCompletions` split as a product along the predicate `v ∈ S`. -/
def FinsetProd :=
((v : S) → v.val.adicCompletion K) × ((v : {v // v ∉ S}) → v.val.adicCompletion K)
section DerivedInstances
instance : TopologicalSpace (FinsetProd R K S) := instTopologicalSpaceProd
instance : CommRing (FinsetProd R K S) := Prod.instCommRing
instance : Inhabited (FinsetProd R K S) := instInhabitedProd
end DerivedInstances
end ProdAdicCompletions
/-- Binary product split along the predicate `v ∈ S`, whose first element ranges over `v`-adic
completions of `K` and whose second element ranges over `v`-adic rings of integers. -/
def FinsetIntegralAdeles :=
((v : S) → v.val.adicCompletion K) × ((v : {v // v ∉ S}) → v.val.adicCompletionIntegers K)
namespace FinsetIntegralAdeles
open ProdAdicCompletions
/-- The subtype of `DedekindDomain.FinsetProd` whose second product ranges over
`v`-adic rings of integers. -/
def Subtype := {x : FinsetProd R K S // ∀ v, x.2 v ∈ v.val.adicCompletionIntegers K}
instance : Coe (FinsetIntegralAdeles R K S) (FinsetProd R K S) where
coe := fun x => (λ (v : S) => x.1 v, λ (v : {v // v ∉ S}) => (x.2 v : v.val.adicCompletion K))
theorem coe_injective :
(Coe.coe : FinsetIntegralAdeles R K S → FinsetProd R K S).Injective := by
refine fun x y hxy => Prod.ext (Prod.ext_iff.1 hxy).1 (funext <| fun v => SetLike.coe_eq_coe.1 ?_)
exact congrArg (fun x => x.2 v) hxy
instance : TopologicalSpace (FinsetIntegralAdeles R K S) :=
instTopologicalSpaceProd
instance topologicalSpaceSubtype : TopologicalSpace (Subtype R K S) :=
instTopologicalSpaceSubtype
instance : CommRing (FinsetIntegralAdeles R K S) := Prod.instCommRing
instance : Inhabited (FinsetIntegralAdeles R K S) := instInhabitedProd
/-- The type equivalence between the two formalisations of `Π (v ∈ S), Kᵥ × Π (v ∉ S), Oᵥ`. -/
def subtype_equiv :
Subtype R K S ≃ FinsetIntegralAdeles R K S where
toFun x := (x.val.1 , fun v => ⟨x.val.2 v, x.property v⟩)
invFun x := ⟨x, fun v => SetLike.coe_mem (x.2 v)⟩
left_inv _ := rfl
right_inv _ := rfl
/-- The homeomorphism between the two formalisations of `Π (v ∈ S), Kᵥ × Π (v ∉ S), Oᵥ`. -/
def subtype_homeomorph :
Subtype R K S ≃ₜ FinsetIntegralAdeles R K S where
toEquiv := subtype_equiv R K S
continuous_toFun := Continuous.prod_mk (by fun_prop) (by fun_prop)
continuous_invFun := Continuous.subtype_mk (by fun_prop) _
set_option synthInstance.maxHeartbeats 100000 in
/-- `Π (v ∈ S), Kᵥ × Π (v ∉ S), Oᵥ` is locally compact.
Note: instance search is slow because of the same issues for adicCompletionIntegers that we had
with RingOfIntegers when it was a subring. -/
instance : LocallyCompactSpace (FinsetIntegralAdeles R K S) := Prod.locallyCompactSpace _ _
/-- `Π (v ∈ S), Kᵥ × Π (v ∉ S), Oᵥ` as a subtype is locally compact. -/
instance : LocallyCompactSpace (Subtype R K S) :=
(subtype_homeomorph R K S).locallyCompactSpace_iff.2 inferInstance
end FinsetIntegralAdeles
variable {R K}
def IsFinsetAdele (x : ProdAdicCompletions R K) :=
∀ v ∉ S, x v ∈ v.adicCompletionIntegers K
variable {S}
namespace IsFinsetAdele
theorem mul {x y : ProdAdicCompletions R K} (hx : IsFinsetAdele S x) (hy : IsFinsetAdele S y) :
IsFinsetAdele S (x * y) := by
intros v hv
rw [mem_adicCompletionIntegers, Pi.mul_apply, Valued.v.map_mul]
exact mul_le_one' (hx v hv) (hy v hv)
theorem one : IsFinsetAdele S (1 : ProdAdicCompletions R K) :=
fun v _ => by rw [mem_adicCompletionIntegers]; exact le_of_eq Valued.v.map_one'
theorem add {x y : ProdAdicCompletions R K} (hx : IsFinsetAdele S x) (hy : IsFinsetAdele S y) :
IsFinsetAdele S (x + y) := by
intro v hv
rw [mem_adicCompletionIntegers, Pi.add_apply]
exact le_trans (Valued.v.map_add_le_max' (x v) (y v)) (max_le (hx v hv) (hy v hv))
theorem zero : IsFinsetAdele S (0 : ProdAdicCompletions R K) := by
intro v _
rw [mem_adicCompletionIntegers, Pi.zero_apply, Valued.v.map_zero]
exact zero_le_one
theorem neg {x : ProdAdicCompletions R K} (hx : IsFinsetAdele S x) :
IsFinsetAdele S (-x) := by
intro v hv
rw [mem_adicCompletionIntegers, Pi.neg_apply, Valuation.map_neg]
exact hx v hv
end IsFinsetAdele
variable (R K S)
/-- The finite S-adele ring. -/
def FinsetAdeleRing := {x : ProdAdicCompletions R K // IsFinsetAdele S x}
namespace FinsetAdeleRing
open FiniteAdeleRing
/-- The finite S-adele ring regarded as a subring of the product of local completions of K.
Note that the finite S-adele ring is not a subalgebra of the product of `∏ Kᵥ`, but it is a
subalgebra of `∏ (v ∈ S), Kᵥ × ∏ (v ∉ S), Oᵥ`.
-/
def subring : Subring (ProdAdicCompletions R K) where
carrier := {x | IsFinsetAdele S x}
mul_mem' hx hy := hx.mul hy
one_mem' := IsFinsetAdele.one
add_mem' hx hy := hx.add hy
zero_mem' := IsFinsetAdele.zero
neg_mem' hx := hx.neg
instance : CommRing (FinsetAdeleRing R K S) := (subring R K S).toCommRing
instance : TopologicalSpace (FinsetAdeleRing R K S) :=
inferInstanceAs (TopologicalSpace (subring R K S))
instance : TopologicalRing (FinsetAdeleRing R K S) :=
inferInstanceAs (TopologicalRing (subring R K S))
@[ext]
theorem ext {x y : FinsetAdeleRing R K S} (h : x.val = y.val) : x = y :=
Subtype.ext h
/-- The finite S-adele ring is homeomorphic to `Π (v ∈ S), Kᵥ × Π (v ∉ S), Oᵥ`. -/
def homeomorph_subtype :
FinsetAdeleRing R K S ≃ₜ FinsetIntegralAdeles.Subtype R K S :=
(Homeomorph.piEquivPiSubtypeProd _ _).subtype <| fun _ =>
⟨fun hx v => hx v.1 v.2, fun hx v hv => hx ⟨v, hv⟩⟩
/-- The finite S-adele ring is locally compact. -/
instance locallyCompactSpace : LocallyCompactSpace (FinsetAdeleRing R K S) :=
(homeomorph_subtype R K S).locallyCompactSpace_iff.2 inferInstance
variable {R K S}
/-- A finite S-adele is a finite adele. -/
theorem isFiniteAdele (x : FinsetAdeleRing R K S) :
x.1.IsFiniteAdele := by
rw [ProdAdicCompletions.IsFiniteAdele, Filter.eventually_cofinite]
refine Set.Finite.subset S.finite_toSet (fun v hv => ?_)
contrapose hv
rw [Set.mem_setOf_eq, not_not]
exact x.2 v hv
theorem isFinsetAdele_support (x : FiniteAdeleRing R K) :
IsFinsetAdele (support x) x.1 :=
fun v hv => by rwa [support, Set.Finite.mem_toFinset, Set.nmem_setOf_iff, not_not] at hv
def ofFiniteAdele_support (x : FiniteAdeleRing R K) : FinsetAdeleRing R K (support x) :=
⟨x, isFinsetAdele_support x⟩
variable (R K S)
instance : Algebra (FinsetAdeleRing R K S) (FiniteAdeleRing R K) where
toFun x := ⟨x.1, isFiniteAdele x⟩
map_add' _ _ := rfl
map_one' := rfl
map_zero' := rfl
map_mul' _ _ := rfl
smul x y := ⟨x.1, isFiniteAdele x⟩ * y
smul_def' _ _ := rfl
commutes' _ _ := by rw [mul_comm]
local notation "ι(" S ")" => algebraMap (FinsetAdeleRing R K S) (FiniteAdeleRing R K)
/-- The map sending finite S-adeles to finite adeles is injective. -/
theorem algebraMap_injective : Function.Injective ι(S) := by
intro x y hxy
simp only [algebraMap, Algebra.toRingHom, RingHom.coe_mk, MonoidHom.coe_mk,
OneHom.coe_mk] at hxy
rwa [Subtype.mk.injEq, Subtype.val_inj] at hxy
theorem algebraMap_range :
Set.range ι(S) = { x : FiniteAdeleRing R K | IsFinsetAdele S x.val } :=
(Set.range_eq_iff _ _).2 ⟨fun x => x.2, fun x hx => by {use ⟨x, hx⟩; rfl}⟩
variable {R K S}
theorem isFinsetAdele_mem_range {x : FiniteAdeleRing R K} (hx : x ∈ Set.range ι(S)) :
IsFinsetAdele S x.val := by
rwa [algebraMap_range R K S] at hx
def ofFiniteAdele_mem_range {x : FiniteAdeleRing R K} (hx : x ∈ Set.range ι(S)) :
FinsetAdeleRing R K S :=
⟨x, isFinsetAdele_mem_range hx⟩
variable (R K S)
/-- `Subtype.val` of the finite S-adele ring factors through the embedding into the
finite adele ring. -/
theorem subtype_val_algebraMap :
(Subtype.val : FinsetAdeleRing R K S → ProdAdicCompletions R K) = Subtype.val ∘ ι(S) := rfl
variable {R K S}
/-- Neighbourhoods of the finite S-adele ring. -/
theorem nhds_iff {x : FinsetAdeleRing R K S} {U : Set (FinsetAdeleRing R K S)} : U ∈ nhds x ↔
∃ (V : (v: HeightOneSpectrum R) → Set (v.adicCompletion K)) (I : Finset (HeightOneSpectrum R)),
(∀ v, V v ∈ nhds (x.val v)) ∧
Subtype.val ⁻¹' Set.pi (I.toSet) V ⊆ U := by
rw [nhds_induced, Filter.mem_comap, nhds_pi]
refine ⟨fun ⟨t, ht, h⟩ => ?_, fun ⟨V, I, hV, hVU⟩ => ?_⟩
· obtain ⟨I, V, hV⟩ := Filter.mem_pi'.1 ht
exact ⟨V, I, ⟨hV.1, Set.Subset.trans (fun _ hx => hV.2 hx) h⟩⟩
· exact ⟨I.toSet.pi V, Filter.mem_pi'.2 ⟨I, V, ⟨fun v => hV v, subset_rfl⟩⟩, hVU⟩
open Set Submodule in
/-- The embedding of the finite S-adele ring into the finite adele ring preserves neighbourhoods. -/
theorem algebraMap_image_mem_nhds (x : FinsetAdeleRing R K S)
{U : Set (FinsetAdeleRing R K S)} (h : U ∈ nhds x) :
ι(S) '' U ∈ nhds (ι(S) x) := by
simp only [(RingSubgroupsBasis.hasBasis_nhds _ _).mem_iff, true_and, coe_toAddSubgroup,
Subtype.exists, exists_prop]
obtain ⟨V, I, hV, hVU⟩ := nhds_iff.1 h
choose γ hγ using fun v => Valued.mem_nhds.1 <| hV v
choose y hy using exists_not_mem_of_finite_nhds I (fun v => (γ v)⁻¹) (ι(S) x)
choose r s hrs using sub_mul_nonZeroDivisor_mem_finiteIntegralAdeles (ι(S) x) y
refine ⟨r, r.2, fun z hz => ?_⟩
simp only [mem_toAddSubgroup, mem_span_singleton] at hz
rw [subtype_val_algebraMap, preimage_comp,
← image_subset_image_iff (algebraMap_injective R K S)] at hVU
apply hVU
simp only [image_preimage_eq_inter_range]
obtain ⟨b, hb⟩ := hz
rw [← add_eq_of_eq_sub hb, algebraMap_range]
refine ⟨fun v hv => hγ v ?_, ?_⟩
· simp only [mem_setOf_eq, smul_apply, Valued.v.map_mul, add_apply]
rw [subtype_val_algebraMap, Function.comp_apply, add_sub_cancel_right, Valued.v.map_mul]
apply lt_of_le_of_lt <| mul_le_mul_right' ((v.mem_adicCompletionIntegers R K).1 (b v).2) _
rw [one_mul, ← inv_mul_lt_one_iff₀ (Units.ne_zero _), ← Units.val_inv_eq_inv_val]
apply lt_of_lt_of_le <| mul_lt_right₀ _ (hy v hv) (v.algebraMap_valuation_ne_zero K r)
have := congrArg (fun x => x v) hrs
simp only [mul_integer_apply, sub_apply, ← Valued.v.map_mul] at this ⊢
exact this ▸ (s v).2
· exact fun v hv => add_mem (mul_mem (SetLike.coe_mem _) (v.coe_mem_adicCompletionIntegers r))
(x.2 v hv)
open Set Submodule Finset in
/-- The pullback of a neighbourhood in the finite adele ring is a neighbourhood in the
finite S-adele ring. -/
theorem mem_nhds_comap_algebraMap (x : FinsetAdeleRing R K S)
{U : Set (FinsetAdeleRing R K S)} (h : U ∈ Filter.comap ι(S) (nhds (ι(S) x))) :
U ∈ nhds x := by
simp only [nhds_iff, Valued.mem_nhds]
simp only [Filter.mem_comap, (RingSubgroupsBasis.hasBasis_nhds _ _).mem_iff] at h
obtain ⟨t, ⟨r, _, hrt⟩, htU⟩ := h
use fun (v : HeightOneSpectrum R) =>
{ y | Valued.v (y - ι(S) x v) < Valued.v (algebraMap _ (v.adicCompletion K) r.val) }
let I := S ∪ Ideal.factors_finset_of_nonZeroDivisor r
let γr (v : HeightOneSpectrum R) := (isUnit_iff_ne_zero.2 (v.algebraMap_valuation_ne_zero K r))
refine ⟨I, ⟨fun v => ⟨(γr v).unit, subset_rfl⟩, subset_trans (fun y hy => hrt ?_) htU⟩⟩
rw [mem_setOf_eq, mem_toAddSubgroup, mem_span_singleton]
exact dvd_of_valued_lt (fun v hv => mem_union.2 (Or.inr <| (Finite.mem_toFinset _).2 hv)) hy
(fun v hv => sub_mem (y.2 v (not_mem_union.1 hv).1) (x.2 v (not_mem_union.1 hv).1))
variable (R K S)
/-- The topologies of the finite S-adele ring when viewed as a subspace of
`ProdAdicCompletions R K` and as a subspace of the finite adele ring coincide. -/
theorem algebraMap_inducing : Inducing ι(S) := by
refine inducing_iff_nhds.2 (fun x => Filter.ext (fun U => ⟨fun hU => ⟨ι(S) '' U, ?_⟩,
mem_nhds_comap_algebraMap x⟩))
exact ⟨algebraMap_image_mem_nhds x hU, by rw [(algebraMap_injective R K S).preimage_image]⟩
end FinsetAdeleRing
namespace FiniteAdeleRing
open FinsetAdeleRing
local notation "ι(" S ")" => algebraMap (FinsetAdeleRing R K S) (FiniteAdeleRing R K)
variable {R K S}
theorem algebraMap_range_mem_nhds (x : FinsetAdeleRing R K S) :
Set.range ι(S) ∈ nhds (ι(S) x) :=
Set.image_univ ▸ algebraMap_image_mem_nhds x (Filter.univ_mem)
variable (R K S)
/-- The finite adele ring is locally compact. -/
theorem locallyCompactSpace : LocallyCompactSpace (FiniteAdeleRing R K) := by
refine LocallyCompactSpace.mk <| fun x N hN => let S := support x; ?_
have h := (algebraMap_inducing R K S).nhds_eq_comap (ofFiniteAdele_support x)
let ⟨M, hM⟩ := (FinsetAdeleRing.locallyCompactSpace R K S).local_compact_nhds
(ofFiniteAdele_support x) _ (h ▸ Filter.preimage_mem_comap hN)
refine ⟨ι(S) '' M, ?_, Set.image_subset_iff.2 hM.2.1,
(algebraMap_inducing R K S).isCompact_iff.1 hM.2.2⟩
have h := algebraMap_range_mem_nhds (ofFiniteAdele_support x)
exact (algebraMap_inducing R K S).map_nhds_of_mem _ h ▸ Filter.image_mem_map hM.1
end FiniteAdeleRing
end DedekindDomain