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

Commit bf78318

Browse files
feat(number_theory/number_field): add mem_roots_of_unity_of_norm_eq_one (#15143)
We prove that an algebraic integer whose conjugates are all of norm 1 is a root of unity. For that, we prove first that the set of algebraic integers (in a fixed number field) with bounded conjugates is finite. The counterpart of the result, that is roots of unity are of norm 1, is #16426 From flt-regular Co-authored-by: Alex J. Best [alex.j.best@gmail.com](mailto:alex.j.best@gmail.com) Co-authored-by: Riccardo Brasca <riccardo.brasca@gmail.com>
1 parent 7295c81 commit bf78318

File tree

2 files changed

+85
-4
lines changed

2 files changed

+85
-4
lines changed

src/field_theory/adjoin.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,14 @@ begin
678678
refl
679679
end
680680

681+
lemma _root_.minpoly.nat_degree_le {x : L} [finite_dimensional K L] (hx : is_integral K x) :
682+
(minpoly K x).nat_degree ≤ finrank K L :=
683+
le_of_eq_of_le (intermediate_field.adjoin.finrank hx).symm K⟮x⟯.to_submodule.finrank_le
684+
685+
lemma _root_.minpoly.degree_le {x : L} [finite_dimensional K L] (hx : is_integral K x) :
686+
(minpoly K x).degree ≤ finrank K L :=
687+
degree_le_of_nat_degree_le (minpoly.nat_degree_le hx)
688+
681689
end power_basis
682690

683691
/-- Algebra homomorphism `F⟮α⟯ →ₐ[F] K` are in bijection with the set of roots

src/number_theory/number_field.lean

Lines changed: 77 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Authors: Ashvni Narayanan, Anne Baanen
66

77
import ring_theory.dedekind_domain.integral_closure
88
import algebra.char_p.algebra
9+
import analysis.normed_space.basic
10+
import topology.algebra.polynomial
911

1012
/-!
1113
# Number fields
@@ -199,7 +201,7 @@ open set polynomial
199201

200202
/-- Let `A` an algebraically closed field and let `x ∈ K`, with `K` a number field. For `F`,
201203
subfield of `K`, the images of `x` by the `F`-algebra morphisms from `K` to `A` are exactly
202-
the roots in `A` of the minimal polynomial of `x` over `F` -/
204+
the roots in `A` of the minimal polynomial of `x` over `F`. -/
203205
lemma range_eq_roots (F K A : Type*) [field F] [number_field F] [field K] [number_field K]
204206
[field A] [is_alg_closed A] [algebra F K] [algebra F A] (x : K) :
205207
range (λ ψ : K →ₐ[F] A, ψ x) = (minpoly F x).root_set A :=
@@ -238,9 +240,8 @@ variables (K A : Type*) [field K] [number_field K] [field A] [char_zero A] [is_a
238240

239241
/-- Let `A` be an algebraically closed field and let `x ∈ K`, with `K` a number field.
240242
The images of `x` by the embeddings of `K` in `A` are exactly the roots in `A` of
241-
the minimal polynomial of `x` over `ℚ` -/
242-
lemma rat_range_eq_roots :
243-
range (λ φ : K →+* A, φ x) = (minpoly ℚ x).root_set A :=
243+
the minimal polynomial of `x` over `ℚ`. -/
244+
lemma rat_range_eq_roots : range (λ φ : K →+* A, φ x) = (minpoly ℚ x).root_set A :=
244245
begin
245246
convert range_eq_roots ℚ K A x using 1,
246247
ext a,
@@ -249,4 +250,76 @@ end
249250

250251
end roots
251252

253+
section bounded
254+
255+
open finite_dimensional polynomial set
256+
257+
variables {K : Type*} [field K] [number_field K]
258+
variables {A : Type*} [normed_field A] [is_alg_closed A] [normed_algebra ℚ A]
259+
260+
lemma coeff_bdd_of_norm_le {B : ℝ} {x : K} (h : ∀ φ : K →+* A, ∥φ x∥ ≤ B) (i : ℕ):
261+
∥(minpoly ℚ x).coeff i∥ ≤ (max B 1) ^ (finrank ℚ K) * (finrank ℚ K).choose ((finrank ℚ K) / 2) :=
262+
begin
263+
have hx : is_integral ℚ x := is_separable.is_integral _ _,
264+
rw (by rw [coeff_map, norm_algebra_map'] :
265+
∥(minpoly ℚ x).coeff i∥ = ∥(map (algebra_map ℚ A) (minpoly ℚ x)).coeff i∥),
266+
refine coeff_bdd_of_roots_le _ (minpoly.monic hx) (is_alg_closed.splits_codomain _)
267+
(minpoly.nat_degree_le hx) _ i,
268+
intros z hz,
269+
rsuffices ⟨φ, rfl⟩ : ∃ (φ : K →+* A), φ x = z, {exact h φ },
270+
letI : char_zero A := char_zero_of_injective_algebra_map (algebra_map ℚ _).injective,
271+
rw [← set.mem_range, rat_range_eq_roots, mem_root_set_iff, aeval_def],
272+
convert (mem_roots_map _).mp hz,
273+
repeat { exact monic.ne_zero (minpoly.monic hx), },
274+
end
275+
276+
variables (K A)
277+
278+
/-- Let `B` be a real number. The set of algebraic integers in `K` whose conjugates are all
279+
smaller in norm than `B` is finite. -/
280+
lemma finite_of_norm_le (B : ℝ) :
281+
{x : K | is_integral ℤ x ∧ ∀ φ : K →+* A, ∥φ x∥ ≤ B}.finite :=
282+
begin
283+
let C := nat.ceil ((max B 1) ^ (finrank ℚ K) * (finrank ℚ K).choose ((finrank ℚ K) / 2)),
284+
have := bUnion_roots_finite (algebra_map ℤ K) (finrank ℚ K) (finite_Icc (-C : ℤ) C),
285+
refine this.subset (λ x hx, _),
286+
have h_map_rat_minpoly := minpoly.gcd_domain_eq_field_fractions' ℚ hx.1,
287+
rw mem_Union,
288+
use minpoly ℤ x,
289+
rw [mem_Union, exists_prop],
290+
refine ⟨⟨_, λ i, _⟩, _⟩,
291+
{ rw [← nat_degree_map_eq_of_injective (algebra_map ℤ ℚ).injective_int _, ← h_map_rat_minpoly],
292+
exact minpoly.nat_degree_le (is_integral_of_is_scalar_tower _ hx.1), },
293+
{ rw [mem_Icc, ← abs_le, ← @int.cast_le ℝ],
294+
apply le_trans _ (nat.le_ceil _),
295+
convert coeff_bdd_of_norm_le hx.2 i,
296+
simp only [h_map_rat_minpoly, coeff_map, eq_int_cast, int.norm_cast_rat, int.norm_eq_abs,
297+
int.cast_abs], },
298+
{ rw [finset.mem_coe, multiset.mem_to_finset, mem_roots, is_root.def, ← eval₂_eq_eval_map,
299+
← aeval_def],
300+
{ exact minpoly.aeval ℤ x, },
301+
{ exact monic.ne_zero (monic.map (algebra_map ℤ K) (minpoly.monic hx.1)), }},
302+
end
303+
304+
/-- An algebraic integer whose conjugates are all of norm one is a root of unity. -/
305+
lemma pow_eq_one_of_norm_eq_one {x : K}
306+
(hxi : is_integral ℤ x) (hx : ∀ φ : K →+* A, ∥φ x∥ = 1) :
307+
∃ (n : ℕ) (hn : 0 < n), x ^ n = 1 :=
308+
begin
309+
obtain ⟨a, -, b, -, habne, h⟩ := @set.infinite.exists_ne_map_eq_of_maps_to _ _ _ _
310+
((^) x : ℕ → K) set.infinite_univ _ (finite_of_norm_le K A (1:ℝ)),
311+
{ replace habne := habne.lt_or_lt,
312+
wlog : a < b := habne using [a b],
313+
refine ⟨b - a, tsub_pos_of_lt habne, _⟩,
314+
have hxne : x ≠ 0,
315+
{ contrapose! hx,
316+
simp only [hx, norm_zero, ring_hom.map_zero, ne.def, not_false_iff, zero_ne_one],
317+
use (is_alg_closed.lift (number_field.is_algebraic K)).to_ring_hom, },
318+
{ rw [pow_sub₀ _ hxne habne.le, h, mul_inv_cancel (pow_ne_zero b hxne)], }},
319+
{ rw set.maps_univ_to,
320+
exact λ a, ⟨hxi.pow a, λ φ, by simp [hx φ, norm_pow, one_pow]⟩, },
321+
end
322+
323+
end bounded
324+
252325
end number_field.embeddings

0 commit comments

Comments
 (0)