Skip to content

Commit af53ecf

Browse files
committed
feat(NumberField/CyclotomicField): first results about Galois theory (leanprover-community#34489)
This PR specializes the results of `Mathlib.NumberTheory.Cyclotomic.Gal` to the case of number fields. Main results: - Define the isomorphism between `Gal(ℚ(ζₙ)/ℚ)` and `(ℤ/nℤ)ˣ` - Let `m ∣ n`. Prove the following diagram commutes: ``` Gal(ℚ(ζₙ)/ℚ) ≃ (ℤ/nℤ)ˣ ↓ ↓ Gal(ℚ(ζₘ)/ℚ) ≃ (ℤ/mℤ)ˣ ```
1 parent b86322a commit af53ecf

3 files changed

Lines changed: 83 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5438,6 +5438,7 @@ public import Mathlib.NumberTheory.NumberField.ClassNumber
54385438
public import Mathlib.NumberTheory.NumberField.Completion
54395439
public import Mathlib.NumberTheory.NumberField.Cyclotomic.Basic
54405440
public import Mathlib.NumberTheory.NumberField.Cyclotomic.Embeddings
5441+
public import Mathlib.NumberTheory.NumberField.Cyclotomic.Galois
54415442
public import Mathlib.NumberTheory.NumberField.Cyclotomic.Ideal
54425443
public import Mathlib.NumberTheory.NumberField.Cyclotomic.PID
54435444
public import Mathlib.NumberTheory.NumberField.Cyclotomic.Three
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/-
2+
Copyright (c) 2026 Xavier Roblot. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Xavier Roblot
5+
-/
6+
module
7+
8+
public import Mathlib.Data.ZMod.Units
9+
public import Mathlib.NumberTheory.Cyclotomic.Gal
10+
11+
/-!
12+
# Galois theory for cyclotomic fields
13+
14+
In this file, we study the Galois theory of cyclotomic extensions of `ℚ`.
15+
16+
## Main definitions and results
17+
18+
- `IsCyclotomicExtension.Rat.galEquivZMod`: the isomorphism between `Gal(ℚ(ζₙ)/ℚ)` and `(ℤ/nℤ)ˣ`
19+
that sends `σ` to the class `a` such that `σ (ζₙ) = ζₙ ^ a`.
20+
21+
-/
22+
23+
@[expose] public section
24+
25+
namespace IsCyclotomicExtension.Rat
26+
27+
open NumberField IsCyclotomicExtension
28+
29+
variable (n : ℕ) [NeZero n] (K : Type*) [Field K] [NumberField K]
30+
[hK : IsCyclotomicExtension {n} ℚ K]
31+
32+
include hK in
33+
/--
34+
The isomorphism between `Gal(ℚ(ζₙ)/ℚ)` and `(ℤ/nℤ)ˣ` that sends `σ` to the class `a` such that
35+
`σ (ζₙ) = ζₙ ^ a`.
36+
-/
37+
noncomputable abbrev galEquivZMod : Gal(K/ℚ) ≃* (ZMod n)ˣ :=
38+
IsCyclotomicExtension.autEquivPow K <| Polynomial.cyclotomic.irreducible_rat (NeZero.pos n)
39+
40+
theorem galEquivZMod_apply_of_pow_eq (σ : Gal(K/ℚ)) {x : K} (hx : x ^ n = 1) :
41+
σ x = x ^ (galEquivZMod n K σ).val.val := by
42+
obtain ⟨a, -, rfl⟩ := (zeta_spec n ℚ K).eq_pow_of_pow_eq_one hx
43+
rw [map_pow, pow_right_comm, galEquivZMod, autEquivPow_apply, OneHom.toFun_eq_coe,
44+
MonoidHom.toOneHom_coe, IsPrimitiveRoot.autToPow_spec]
45+
46+
theorem galEquivZMod_smul_of_pow_eq (σ : Gal(K/ℚ)) {x : 𝓞 K} (hx : x ^ n = 1) :
47+
σ • x = x ^ (galEquivZMod n K σ).val.val := by
48+
apply FaithfulSMul.algebraMap_injective (𝓞 K) K
49+
apply galEquivZMod_apply_of_pow_eq n K σ <| by rw [← Subalgebra.coe_pow, hx, OneMemClass.coe_one]
50+
51+
section restrict
52+
53+
variable {m : ℕ} [NeZero m] (F : Type*) [Field F] [NumberField F]
54+
[hF : IsCyclotomicExtension {m} ℚ F] [Algebra F K] [IsGalois ℚ F]
55+
56+
/--
57+
Let `m ∣ n`. Then, the following diagram commutes:
58+
Gal(ℚ(ζₙ)/ℚ) → (ℤ/nℤ)ˣ
59+
↓ ↓
60+
Gal(ℚ(ζₘ)/ℚ) → (ℤ/mℤ)ˣ
61+
where the horizontal maps are `galEquivZMod`, the left map is the restriction map and the right map
62+
is the natural map.
63+
-/
64+
theorem galEquivZMod_restrictNormal_apply (h : m ∣ n) (σ : Gal(K/ℚ)) :
65+
galEquivZMod m F (σ.restrictNormal F) = ZMod.unitsMap h (galEquivZMod n K σ) := by
66+
have hζ := IsCyclotomicExtension.zeta_spec m ℚ F
67+
let ζ := IsCyclotomicExtension.zeta m ℚ F
68+
suffices ζ ^ (galEquivZMod m F (σ.restrictNormal F)).val.val = ζ ^ (galEquivZMod n K σ).val.val by
69+
rw [(hζ.isOfFinOrder (NeZero.ne _)).pow_inj_mod, ← hζ.eq_orderOf,
70+
← ZMod.natCast_eq_natCast_iff', ZMod.natCast_val, ZMod.natCast_val, ZMod.cast_id] at this
71+
rwa [Units.ext_iff]
72+
apply FaithfulSMul.algebraMap_injective F K
73+
rw [map_pow, map_pow, ← galEquivZMod_apply_of_pow_eq, ← AlgEquiv.restrictNormal_commutes,
74+
galEquivZMod_apply_of_pow_eq m _ _ hζ.pow_eq_one, map_pow]
75+
rw [← map_pow, (hζ.pow_eq_one_iff_dvd _).mpr h, map_one]
76+
77+
end restrict
78+
79+
end IsCyclotomicExtension.Rat

Mathlib/RingTheory/RootsOfUnity/PrimitiveRoots.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ theorem pow_eq_one_iff_dvd (h : IsPrimitiveRoot ζ k) (l : ℕ) : ζ ^ l = 1 ↔
124124
theorem isUnit (h : IsPrimitiveRoot ζ k) (h0 : k ≠ 0) : IsUnit ζ :=
125125
.of_mul_eq_one (ζ ^ (k - 1)) <| by rw [← pow_succ', Nat.sub_one_add_one h0, h.pow_eq_one]
126126

127+
theorem isOfFinOrder (h : IsPrimitiveRoot ζ k) (h0 : k ≠ 0) : IsOfFinOrder ζ :=
128+
⟨k, Nat.ne_zero_iff_zero_lt.mp h0, (isPeriodicPt_mul_iff_pow_eq_one _).mpr h.pow_eq_one⟩
129+
127130
theorem pow_ne_one_of_pos_of_lt (h : IsPrimitiveRoot ζ k) (h0 : l ≠ 0) (hl : l < k) : ζ ^ l ≠ 1 :=
128131
mt (Nat.le_of_dvd (Nat.pos_iff_ne_zero.mpr h0) ∘ h.dvd_of_pow_eq_one _) <| not_le_of_gt hl
129132

0 commit comments

Comments
 (0)