Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 60da01b

Browse files
YaelDilliesalexjbestxroblot
committed
feat(number_theory/number_field/canonical_embedding): add canonical embedding (#17783)
This PR defines the canonical embedding of a number field $K$ of signature $(r_1, r_2)$ into $\mathbb{R}^{r_1} × \mathbb{C}^{r_2}$ and prove various results about this embedding, including the fact that the image of the ring of integers of $K$ is discrete. Co-authored-by: Alex J Best <alex.j.best@gmail.com> Co-authored-by: Xavier-François Roblot <46200072+xroblot@users.noreply.github.com>
1 parent 5aa3c1d commit 60da01b

2 files changed

Lines changed: 178 additions & 2 deletions

File tree

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
/-
2+
Copyright (c) 2022 Xavier Roblot. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Xavier Roblot
5+
-/
6+
import number_theory.number_field.embeddings
7+
8+
/-!
9+
# Canonical embedding of a number field
10+
11+
The canonical embedding of a number field `K` of signature `(r₁, r₂)` is the ring homomorphism
12+
`K →+* ℝ^r₁ × ℂ^r₂` that sends `x ∈ K` to `(φ_₁(x),...,φ_r₁(x)) × (ψ_₁(x),..., ψ_r₂(x))` where
13+
`φ_₁,...,φ_r₁` are its real embeddings and `ψ_₁,..., ψ_r₂` are its complex embeddings (up to
14+
complex conjugation).
15+
16+
## Main definitions and results
17+
18+
* `number_field.canonical_embedding.ring_of_integers.inter_ball_finite`: the intersection of the
19+
image of the ring of integers by the canonical embedding and any ball centered at `0` of finite
20+
radius is finite.
21+
22+
## Tags
23+
24+
number field, infinite places
25+
-/
26+
27+
noncomputable theory
28+
29+
open function finite_dimensional finset fintype number_field number_field.infinite_place metric
30+
module
31+
open_locale classical number_field
32+
33+
variables (K : Type*) [field K]
34+
35+
namespace number_field.canonical_embedding
36+
37+
-- The ambient space `ℝ^r₁ × ℂ^r₂` with `(r₁, r₂)` the signature of `K`.
38+
localized "notation `E` :=
39+
({w : infinite_place K // is_real w} → ℝ) × ({w : infinite_place K // is_complex w} → ℂ)"
40+
in canonical_embedding
41+
42+
lemma space_rank [number_field K] :
43+
finrank ℝ E = finrank ℚ K :=
44+
begin
45+
haveI : module.free ℝ ℂ := infer_instance,
46+
rw [finrank_prod, finrank_pi, finrank_pi_fintype, complex.finrank_real_complex,
47+
finset.sum_const, finset.card_univ, ← card_real_embeddings, algebra.id.smul_eq_mul, mul_comm,
48+
← card_complex_embeddings, ← number_field.embeddings.card K ℂ, fintype.card_subtype_compl,
49+
nat.add_sub_of_le (fintype.card_subtype_le _)],
50+
end
51+
52+
lemma non_trivial_space [number_field K] : nontrivial E :=
53+
begin
54+
obtain ⟨w⟩ := infinite_place.nonempty K,
55+
obtain hw | hw := w.is_real_or_is_complex,
56+
{ haveI : nonempty {w : infinite_place K // is_real w} := ⟨⟨w, hw⟩⟩,
57+
exact nontrivial_prod_left },
58+
{ haveI : nonempty {w : infinite_place K // is_complex w} := ⟨⟨w, hw⟩⟩,
59+
exact nontrivial_prod_right }
60+
end
61+
62+
/-- The canonical embedding of a number field `K` of signature `(r₁, r₂)` into `ℝ^r₁ × ℂ^r₂`. -/
63+
def _root_.number_field.canonical_embedding : K →+* E :=
64+
ring_hom.prod (pi.ring_hom (λ w, w.prop.embedding)) (pi.ring_hom (λ w, w.val.embedding))
65+
66+
lemma _root_.number_field.canonical_embedding_injective [number_field K] :
67+
injective (number_field.canonical_embedding K) :=
68+
@ring_hom.injective _ _ _ _ (non_trivial_space K) _
69+
70+
open number_field
71+
72+
variable {K}
73+
74+
@[simp]
75+
lemma apply_at_real_infinite_place (w : {w : infinite_place K // is_real w}) (x : K) :
76+
(number_field.canonical_embedding K x).1 w = w.prop.embedding x :=
77+
by simp only [canonical_embedding, ring_hom.prod_apply, pi.ring_hom_apply]
78+
79+
@[simp]
80+
lemma apply_at_complex_infinite_place (w : { w : infinite_place K // is_complex w}) (x : K) :
81+
(number_field.canonical_embedding K x).2 w = embedding w.val x :=
82+
by simp only [canonical_embedding, ring_hom.prod_apply, pi.ring_hom_apply]
83+
84+
lemma nnnorm_eq [number_field K] (x : K) :
85+
‖canonical_embedding K x‖₊ = finset.univ.sup (λ w : infinite_place K, ⟨w x, map_nonneg w x⟩) :=
86+
begin
87+
rw [prod.nnnorm_def', pi.nnnorm_def, pi.nnnorm_def],
88+
rw ( _ : finset.univ = {w : infinite_place K | is_real w}.to_finset
89+
∪ {w : infinite_place K | is_complex w}.to_finset),
90+
{ rw [finset.sup_union, sup_eq_max],
91+
refine congr_arg2 _ _ _,
92+
{ convert (finset.univ.sup_map (function.embedding.subtype (λ w : infinite_place K, is_real w))
93+
(λ w, (⟨w x, map_nonneg w x⟩ : nnreal))).symm using 2,
94+
ext w,
95+
simp only [apply_at_real_infinite_place, coe_nnnorm, real.norm_eq_abs,
96+
function.embedding.coe_subtype, subtype.coe_mk, is_real.abs_embedding_apply], },
97+
{ convert (finset.univ.sup_map (function.embedding.subtype (λ w : infinite_place K,
98+
is_complex w)) (λ w, (⟨w x, map_nonneg w x⟩ : nnreal))).symm using 2,
99+
ext w,
100+
simp only [apply_at_complex_infinite_place, subtype.val_eq_coe, coe_nnnorm,
101+
complex.norm_eq_abs, function.embedding.coe_subtype, subtype.coe_mk, abs_embedding], }},
102+
{ ext w,
103+
simp only [w.is_real_or_is_complex, set.mem_set_of_eq, finset.mem_union, set.mem_to_finset,
104+
finset.mem_univ], },
105+
end
106+
107+
lemma norm_le_iff [number_field K] (x : K) (r : ℝ) :
108+
‖canonical_embedding K x‖ ≤ r ↔ ∀ w : infinite_place K, w x ≤ r :=
109+
begin
110+
obtain hr | hr := lt_or_le r 0,
111+
{ obtain ⟨w⟩ := infinite_place.nonempty K,
112+
exact iff_of_false (hr.trans_le $ norm_nonneg _).not_le
113+
(λ h, hr.not_le $ (map_nonneg w _).trans $ h _) },
114+
{ lift r to nnreal using hr,
115+
simp_rw [← coe_nnnorm, nnnorm_eq, nnreal.coe_le_coe, finset.sup_le_iff, finset.mem_univ,
116+
forall_true_left, ←nnreal.coe_le_coe, subtype.coe_mk] }
117+
end
118+
119+
variables (K)
120+
121+
/-- The image of `𝓞 K` as a subring of `ℝ^r₁ × ℂ^r₂`. -/
122+
def integer_lattice : subring E :=
123+
(ring_hom.range (algebra_map (𝓞 K) K)).map (canonical_embedding K)
124+
125+
/-- The linear equiv between `𝓞 K` and the integer lattice. -/
126+
def equiv_integer_lattice [number_field K] :
127+
𝓞 K ≃ₗ[ℤ] integer_lattice K :=
128+
linear_equiv.of_bijective
129+
{ to_fun := λ x, ⟨canonical_embedding K (algebra_map (𝓞 K) K x), algebra_map (𝓞 K) K x,
130+
by simp only [subring.mem_carrier, ring_hom.mem_range, exists_apply_eq_apply], rfl⟩,
131+
map_add' := λ x y, by simpa only [map_add],
132+
map_smul' := λ c x, by simpa only [zsmul_eq_mul, map_mul, map_int_cast] }
133+
begin
134+
refine ⟨λ _ _ h, _, λ ⟨_, _, ⟨a, rfl⟩, rfl⟩, ⟨a, rfl⟩⟩,
135+
rw [linear_map.coe_mk, subtype.mk_eq_mk] at h,
136+
exact is_fraction_ring.injective (𝓞 K) K (canonical_embedding_injective K h),
137+
end
138+
139+
lemma integer_lattice.inter_ball_finite [number_field K] (r : ℝ) :
140+
((integer_lattice K : set E) ∩ (closed_ball 0 r)).finite :=
141+
begin
142+
obtain hr | hr := lt_or_le r 0,
143+
{ simp [closed_ball_eq_empty.2 hr] },
144+
have heq :
145+
∀ x, canonical_embedding K x ∈ closed_ball (0 : E) r ↔ ∀ φ : K →+* ℂ, ‖φ x‖ ≤ r,
146+
{ simp only [← place_apply, ← infinite_place.coe_mk, mem_closed_ball_zero_iff, norm_le_iff],
147+
exact λ x, le_iff_le x r, },
148+
convert (embeddings.finite_of_norm_le K ℂ r).image (canonical_embedding K),
149+
ext, split,
150+
{ rintro ⟨⟨_, ⟨x, rfl⟩, rfl⟩, hx2⟩,
151+
exact ⟨x, ⟨set_like.coe_mem x, (heq x).mp hx2⟩, rfl⟩, },
152+
{ rintro ⟨x, ⟨hx1, hx2⟩, rfl⟩,
153+
exact ⟨⟨x, ⟨⟨x, hx1⟩, rfl⟩, rfl⟩, (heq x).mpr hx2⟩, }
154+
end
155+
156+
instance [number_field K] : countable (integer_lattice K) :=
157+
begin
158+
have : (⋃ n : ℕ, ((integer_lattice K : set E) ∩ (closed_ball 0 n))).countable,
159+
{ exact set.countable_Union (λ n, (integer_lattice.inter_ball_finite K n).countable) },
160+
refine (this.mono _).to_subtype,
161+
rintro _ ⟨x, hx, rfl⟩,
162+
rw set.mem_Union,
163+
exact ⟨⌈‖canonical_embedding K x‖⌉₊, ⟨x, hx, rfl⟩, mem_closed_ball_zero_iff.2 (nat.le_ceil _)⟩,
164+
end
165+
166+
end number_field.canonical_embedding

src/number_theory/number_field/embeddings.lean

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,15 @@ begin
338338
{ exact λ h, ⟨embedding w, h, mk_embedding w⟩, },
339339
end
340340

341-
lemma not_is_real_iff_is_complex {w : infinite_place K} :
342-
¬ is_real w ↔ is_complex w :=
341+
@[simp] lemma not_is_real_iff_is_complex {w : infinite_place K} : ¬ is_real w ↔ is_complex w :=
343342
by rw [is_complex_iff, is_real_iff]
344343

344+
@[simp] lemma not_is_complex_iff_is_real {w : infinite_place K} : ¬ is_complex w ↔ is_real w :=
345+
by rw [←not_is_real_iff_is_complex, not_not]
346+
347+
lemma is_real_or_is_complex (w : infinite_place K) : is_real w ∨ is_complex w :=
348+
by { rw ←not_is_real_iff_is_complex, exact em _ }
349+
345350
/-- For `w` a real infinite place, return the corresponding embedding as a morphism `K →+* ℝ`. -/
346351
noncomputable def is_real.embedding {w : infinite_place K} (hw : is_real w) : K →+* ℝ :=
347352
(is_real_iff.mp hw).embedding
@@ -354,6 +359,11 @@ begin
354359
exact congr_fun (congr_arg coe_fn (mk_embedding w)) x,
355360
end
356361

362+
@[simp]
363+
lemma is_real.abs_embedding_apply {w : infinite_place K} (hw : is_real w) (x : K) :
364+
|is_real.embedding hw x| = w x :=
365+
by { rw ← is_real.place_embedding_apply hw x, congr, }
366+
357367
variable (K)
358368

359369
/-- The map from real embeddings to real infinite places as an equiv -/

0 commit comments

Comments
 (0)