Skip to content

Commit c30c25b

Browse files
committed
feat(NumberField): specialized version of Kummer Dedekind for the splitting of prime numbers (part 1) (#26137)
First part of the Kummer-Dedekind isomorphism for the splitting of rational prime numbers in number fields. We define the `exponent` of an algebraic integer `θ` and define the isomorphism between `(ℤ / pℤ)[X] / (minpoly θ)` and `𝓞 K / p(𝓞 K)` for primes `p` which doesn't divide the exponent of `θ`.
1 parent 97e6e35 commit c30c25b

File tree

4 files changed

+131
-0
lines changed

4 files changed

+131
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4675,6 +4675,7 @@ import Mathlib.NumberTheory.NumberField.House
46754675
import Mathlib.NumberTheory.NumberField.Ideal
46764676
import Mathlib.NumberTheory.NumberField.Ideal.Asymptotics
46774677
import Mathlib.NumberTheory.NumberField.Ideal.Basic
4678+
import Mathlib.NumberTheory.NumberField.Ideal.KummerDedekind
46784679
import Mathlib.NumberTheory.NumberField.InfinitePlace.Basic
46794680
import Mathlib.NumberTheory.NumberField.InfinitePlace.Embeddings
46804681
import Mathlib.NumberTheory.NumberField.InfinitePlace.Ramification
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/-
2+
Copyright (c) 2025 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 Mathlib.NumberTheory.KummerDedekind
7+
import Mathlib.NumberTheory.NumberField.Basic
8+
import Mathlib.RingTheory.Ideal.Norm.AbsNorm
9+
import Mathlib.RingTheory.Ideal.Int
10+
11+
/-!
12+
# Kummer-Dedekind criterion for the splitting of prime numbers
13+
14+
In this file, we give a specialized version of the Kummer-Dedekind criterion for the case of the
15+
splitting of rational primes in number fields.
16+
17+
## Main definitions
18+
19+
* `RingOfIntegers.exponent`: the smallest positive integer `d` contained in the conductor of `θ`.
20+
It is the smallest integer such that `d • 𝓞 K ⊆ ℤ[θ]`, see `RingOfIntegers.exponent_eq_sInf`.
21+
22+
* `RingOfIntegers.ZModXQuotSpanEquivQuotSpan`: The isomorphism between `(ℤ / pℤ)[X] / (minpoly θ)`
23+
and `𝓞 K / p(𝓞 K)` for a prime `p` which doesn't divide the exponent of `θ`.
24+
25+
-/
26+
27+
noncomputable section
28+
29+
open Polynomial NumberField Ideal KummerDedekind UniqueFactorizationMonoid
30+
31+
variable {K : Type*} [Field K]
32+
33+
namespace RingOfIntegers
34+
35+
/--
36+
The smallest positive integer `d` contained in the conductor of `θ`. It is the smallest integer
37+
such that `d • 𝓞 K ⊆ ℤ[θ]`, see `exponent_eq_sInf`. It is set to `0` if `d` does not exists.
38+
-/
39+
def exponent (θ : 𝓞 K) : ℕ := absNorm (under ℤ (conductor ℤ θ))
40+
41+
variable {θ : 𝓞 K}
42+
43+
theorem exponent_eq_one_iff : exponent θ = 1 ↔ Algebra.adjoin ℤ {θ} = ⊤ := by
44+
rw [exponent, absNorm_eq_one_iff, comap_eq_top_iff, conductor_eq_top_iff_adjoin_eq_top]
45+
46+
theorem not_dvd_exponent_iff {p : ℕ} [Fact (Nat.Prime p)] :
47+
¬ p ∣ exponent θ ↔ comap (algebraMap ℤ (𝓞 K)) (conductor ℤ θ) ⊔ span {(p : ℤ)} = ⊤ := by
48+
rw [sup_comm, IsCoatom.sup_eq_top_iff, ← under_def, ← Ideal.dvd_iff_le,
49+
← Int.ideal_span_absNorm_eq_self (under ℤ (conductor ℤ θ)),
50+
span_singleton_dvd_span_singleton_iff_dvd, Int.natCast_dvd_natCast, exponent]
51+
exact isMaximal_def.mp <| Int.ideal_span_isMaximal_of_prime p
52+
53+
theorem exponent_eq_sInf : exponent θ = sInf {d : ℕ | 0 < d ∧ (d : 𝓞 K) ∈ conductor ℤ θ} := by
54+
rw [exponent, Int.absNorm_under_eq_sInf]
55+
56+
variable [NumberField K] {θ : 𝓞 K} {p : ℕ} [Fact p.Prime]
57+
58+
/--
59+
If `p` doesn't divide the exponent of `θ`, then `(ℤ / pℤ)[X] / (minpoly θ) ≃+* 𝓞 K / p(𝓞 K)`.
60+
-/
61+
def ZModXQuotSpanEquivQuotSpan (hp : ¬ p ∣ exponent θ) :
62+
(ZMod p)[X] ⧸ span {map (Int.castRingHom (ZMod p)) (minpoly ℤ θ)} ≃+*
63+
𝓞 K ⧸ span {(p : 𝓞 K)} :=
64+
(quotientEquivAlgOfEq ℤ (by simp [Ideal.map_span, Polynomial.map_map])).toRingEquiv.trans
65+
((quotientEquiv _ _ (mapEquiv (Int.quotientSpanNatEquivZMod p)) rfl).symm.trans
66+
((quotMapEquivQuotQuotMap (not_dvd_exponent_iff.mp hp) θ.isIntegral).symm.trans
67+
(quotientEquivAlgOfEq ℤ (by simp [map_span])).toRingEquiv))
68+
69+
theorem ZModXQuotSpanEquivQuotSpan_mk_apply (hp : ¬ p ∣ exponent θ) (Q : ℤ[X]) :
70+
(ZModXQuotSpanEquivQuotSpan hp)
71+
(Ideal.Quotient.mk (span {map (Int.castRingHom (ZMod p)) (minpoly ℤ θ)})
72+
(map (Int.castRingHom (ZMod p)) Q)) = Ideal.Quotient.mk (span {(p : 𝓞 K)}) (aeval θ Q) := by
73+
simp only [ZModXQuotSpanEquivQuotSpan, AlgEquiv.toRingEquiv_eq_coe, algebraMap_int_eq,
74+
RingEquiv.trans_apply, AlgEquiv.coe_ringEquiv, quotientEquivAlgOfEq_mk,
75+
quotientEquiv_symm_apply, quotientMap_mk, RingHom.coe_coe, mapEquiv_symm_apply,
76+
Polynomial.map_map, Int.quotientSpanNatEquivZMod_comp_castRingHom]
77+
exact congr_arg (quotientEquivAlgOfEq ℤ (by simp [map_span])) <|
78+
quotMapEquivQuotQuotMap_symm_apply (not_dvd_exponent_iff.mp hp) θ.isIntegral Q
79+
80+
variable (p θ) in
81+
/--
82+
The finite set of monic irreducible factors of `minpoly ℤ θ` modulo `p`.
83+
-/
84+
abbrev monicFactorsMod : Finset ((ZMod p)[X]) :=
85+
(normalizedFactors (map (Int.castRingHom (ZMod p)) (minpoly ℤ θ))).toFinset
86+
87+
/--
88+
If `p` does not divide `exponent θ` and `Q` is a lift of a monic irreducible factor of
89+
`minpoly ℤ θ` modulo `p`, then `(ℤ / pℤ)[X] / Q ≃+* 𝓞 K / (p, Q(θ))`.
90+
-/
91+
def ZModXQuotSpanEquivQuotSpanPair (hp : ¬ p ∣ exponent θ) {Q : ℤ[X]}
92+
(hQ : Q.map (Int.castRingHom (ZMod p)) ∈ monicFactorsMod θ p) :
93+
(ZMod p)[X] ⧸ span {Polynomial.map (Int.castRingHom (ZMod p)) Q} ≃+*
94+
𝓞 K ⧸ span {(p : 𝓞 K), (aeval θ) Q} :=
95+
have h₀ : map (Int.castRingHom (ZMod p)) (minpoly ℤ θ) ≠ 0 :=
96+
map_monic_ne_zero (minpoly.monic θ.isIntegral)
97+
have h_eq₁ : span {map (Int.castRingHom (ZMod p)) Q} =
98+
span {map (Int.castRingHom (ZMod p)) (minpoly ℤ θ)} ⊔
99+
span {map (Int.castRingHom (ZMod p)) Q} := by
100+
rw [← span_insert, span_pair_comm, span_pair_eq_span_left_iff_dvd.mpr]
101+
simp only [Multiset.mem_toFinset] at hQ
102+
exact ((Polynomial.mem_normalizedFactors_iff h₀).mp hQ).2.2
103+
have h_eq₂ : span {↑p} ⊔ span {(aeval θ) Q} = span {↑p, (aeval θ) Q} := by
104+
rw [span_insert]
105+
((Ideal.quotEquivOfEq h_eq₁).trans (DoubleQuot.quotQuotEquivQuotSup _ _).symm).trans <|
106+
(Ideal.quotientEquiv
107+
(Ideal.map (Ideal.Quotient.mk _) (span {(Polynomial.map (Int.castRingHom (ZMod p)) Q)}))
108+
(Ideal.map (Ideal.Quotient.mk _) (span {aeval θ Q})) (ZModXQuotSpanEquivQuotSpan hp) (by
109+
simp [map_span, ZModXQuotSpanEquivQuotSpan_mk_apply])).trans <|
110+
(DoubleQuot.quotQuotEquivQuotSup _ _).trans (Ideal.quotEquivOfEq h_eq₂)
111+
112+
end RingOfIntegers

Mathlib/Order/Atoms.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,16 @@ theorem IsCoatom.codisjoint_of_ne [SemilatticeSup α] [OrderTop α] {a b : α} (
265265
(hb : IsCoatom b) (hab : a ≠ b) : Codisjoint a b :=
266266
codisjoint_iff.mpr (ha.sup_eq_top_of_ne hb hab)
267267

268+
theorem IsAtom.inf_eq_bot_iff [SemilatticeInf α] [OrderBot α] {a b : α} (ha : IsAtom a) :
269+
a ⊓ b = ⊥ ↔ ¬ a ≤ b := by
270+
by_cases hb : b = ⊥
271+
· simpa [hb] using ha.1
272+
· exact ⟨fun h ↦ inf_lt_left.mp (h ▸ bot_lt ha), fun h ↦ ha.2 _ (inf_lt_left.mpr h)⟩
273+
274+
theorem IsCoatom.sup_eq_top_iff [SemilatticeSup α] [OrderTop α] {a b : α} (ha : IsCoatom a) :
275+
a ⊔ b = ⊤ ↔ ¬ b ≤ a :=
276+
ha.dual.inf_eq_bot_iff
277+
268278
end Pairwise
269279

270280
end Atoms

Mathlib/RingTheory/Ideal/Span.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,14 @@ theorem span_singleton_eq_span_singleton {α : Type u} [CommSemiring α] [IsDoma
211211
rw [← dvd_dvd_iff_associated, le_antisymm_iff, and_comm]
212212
apply and_congr <;> rw [span_singleton_le_span_singleton]
213213

214+
@[simp]
215+
theorem span_pair_eq_span_left_iff_dvd : span {a, b} = span {a} ↔ a ∣ b := by
216+
rw [Ideal.span_insert, sup_eq_left, span_singleton_le_span_singleton]
217+
218+
@[simp]
219+
theorem span_pair_eq_span_right_iff_dvd : span {a, b} = span {b} ↔ b ∣ a := by
220+
rw [Ideal.span_insert, sup_eq_right, span_singleton_le_span_singleton]
221+
214222
theorem span_singleton_mul_right_unit {a : α} (h2 : IsUnit a) (x : α) :
215223
span ({x * a} : Set α) = span {x} := by rw [mul_comm, span_singleton_mul_left_unit h2]
216224

0 commit comments

Comments
 (0)