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

Commit 1e22525

Browse files
VierkantorPaul-Lezjcommelin
committed
feat(number_theory): Dedekind-Kummer theorem (#15000)
It's PR #15000! The Kummer-Dedekind theorem on the splitting of ideals in monogenic ring extensions. [Zulip thread](https://leanprover.zulipchat.com/#narrow/stream/144837-PR-reviews/topic/.2315000.3A.20the.20Kummer-Dedekind.20theorem) Co-Authored-By: Paul Lezeau <paul.lezeau@gmail.com> Co-authored-by: Paul-Lez <72892199+Paul-Lez@users.noreply.github.com> Co-authored-by: Johan Commelin <johan@commelin.net> Co-authored-by: Anne Baanen <t.baanen@vu.nl>
1 parent e763499 commit 1e22525

File tree

3 files changed

+184
-0
lines changed

3 files changed

+184
-0
lines changed

src/data/multiset/basic.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,9 @@ lemma attach_cons (a : α) (m : multiset α) :
11041104
quotient.induction_on m $ assume l, congr_arg coe $ congr_arg (list.cons _) $
11051105
by rw [list.map_pmap]; exact list.pmap_congr _ (λ _ _ _ _, subtype.eq rfl)
11061106

1107+
@[simp]
1108+
lemma attach_map_coe (m : multiset α) : multiset.map (coe : _ → α) m.attach = m := m.attach_map_val
1109+
11071110
section decidable_pi_exists
11081111
variables {m : multiset α}
11091112

@@ -1866,6 +1869,13 @@ begin
18661869
contradiction }
18671870
end
18681871

1872+
@[simp]
1873+
lemma attach_count_eq_count_coe (m : multiset α) (a) : m.attach.count a = m.count (a : α) :=
1874+
calc m.attach.count a
1875+
= (m.attach.map (coe : _ → α)).count (a : α) :
1876+
(multiset.count_map_eq_count' _ _ subtype.coe_injective _).symm
1877+
... = m.count (a : α) : congr_arg _ m.attach_map_coe
1878+
18691879
lemma filter_eq' (s : multiset α) (b : α) : s.filter (= b) = repeat b (count b s) :=
18701880
begin
18711881
ext a,
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
/-
2+
Copyright (c) 2021 Anne Baanen. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Anne Baanen, Paul Lezeau
5+
-/
6+
7+
import ring_theory.adjoin_root
8+
import ring_theory.dedekind_domain.ideal
9+
import ring_theory.algebra_tower
10+
11+
/-!
12+
# Kummer-Dedekind theorem
13+
14+
This file proves the monogenic version of the Kummer-Dedekind theorem on the splitting of prime
15+
ideals in an extension of the ring of integers. This states that if `I` is a prime ideal of
16+
Dedekind domain `R` and `S = R[α]` for some `α` that is integral over `R` with minimal polynomial
17+
`f`, then the prime factorisations of `I * S` and `f mod I` have the same shape, i.e. they have the
18+
same number of prime factors, and each prime factors of `I * S` can be paired with a prime factor
19+
of `f mod I` in a way that ensures multiplicities match (in fact, this pairing can be made explicit
20+
with a formula).
21+
22+
## Main definitions
23+
24+
* `normalized_factors_map_equiv_normalized_factors_min_poly_mk` : The bijection in the
25+
Kummer-Dedekind theorem. This is the pairing between the prime factors of `I * S` and the prime
26+
factors of `f mod I`.
27+
28+
## Main results
29+
30+
* `normalized_factors_ideal_map_eq_normalized_factors_min_poly_mk_map` : The Kummer-Dedekind
31+
theorem.
32+
* `ideal.irreducible_map_of_irreducible_minpoly` : `I.map (algebra_map R S)` is irreducible if
33+
`(map I^.quotient.mk (minpoly R pb.gen))` is irreducible, where `pb` is a power basis of `S`
34+
over `R`.
35+
36+
## TODO
37+
38+
* Define the conductor ideal and prove the Kummer-Dedekind theorem in full generality.
39+
40+
* Prove the converse of `ideal.irreducible_map_of_irreducible_minpoly`.
41+
42+
* Prove that `normalized_factors_map_equiv_normalized_factors_min_poly_mk` can be expressed as
43+
`normalized_factors_map_equiv_normalized_factors_min_poly_mk g = ⟨I, G(α)⟩` for `g` a prime
44+
factor of `f mod I` and `G` a lift of `g` to `R[X]`.
45+
46+
## References
47+
48+
* [J. Neukirch, *Algebraic Number Theory*][Neukirch1992]
49+
50+
## Tags
51+
52+
kummer, dedekind, kummer dedekind, dedekind-kummer, dedekind kummer
53+
-/
54+
55+
namespace kummer_dedekind
56+
57+
open_locale big_operators polynomial classical
58+
59+
open ideal polynomial double_quot unique_factorization_monoid
60+
61+
variables {R : Type*} [comm_ring R]
62+
variables {S : Type*} [comm_ring S] [is_domain S] [is_dedekind_domain S] [algebra R S]
63+
variables (pb : power_basis R S) {I : ideal R}
64+
65+
local attribute [instance] ideal.quotient.field
66+
67+
variables [is_domain R]
68+
69+
/-- The first half of the **Kummer-Dedekind Theorem** in the monogenic case, stating that the prime
70+
factors of `I*S` are in bijection with those of the minimal polynomial of the generator of `S`
71+
over `R`, taken `mod I`.-/
72+
noncomputable def normalized_factors_map_equiv_normalized_factors_min_poly_mk (hI : is_maximal I)
73+
(hI' : I ≠ ⊥) : {J : ideal S | J ∈ normalized_factors (I.map (algebra_map R S) )} ≃
74+
{d : (R ⧸ I)[X] | d ∈ normalized_factors (map I^.quotient.mk (minpoly R pb.gen)) } :=
75+
((normalized_factors_equiv_of_quot_equiv ↑(pb.quotient_equiv_quotient_minpoly_map I)
76+
--show that `I * S` ≠ ⊥
77+
(show I.map (algebra_map R S) ≠ ⊥,
78+
by rwa [ne.def, map_eq_bot_iff_of_injective pb.basis.algebra_map_injective, ← ne.def])
79+
--show that the ideal spanned by `(minpoly R pb.gen) mod I` is non-zero
80+
(by {by_contra, exact (show (map I^.quotient.mk (minpoly R pb.gen) ≠ 0), from
81+
polynomial.map_monic_ne_zero (minpoly.monic pb.is_integral_gen))
82+
(span_singleton_eq_bot.mp h) } )).trans
83+
(normalized_factors_equiv_span_normalized_factors
84+
(show (map I^.quotient.mk (minpoly R pb.gen)) ≠ 0, from
85+
polynomial.map_monic_ne_zero (minpoly.monic pb.is_integral_gen))).symm)
86+
87+
/-- The second half of the **Kummer-Dedekind Theorem** in the monogenic case, stating that the
88+
bijection `factors_equiv'` defined in the first half preserves multiplicities. -/
89+
theorem multiplicity_factors_map_eq_multiplicity (hI : is_maximal I) (hI' : I ≠ ⊥) {J : ideal S}
90+
(hJ : J ∈ normalized_factors (I.map (algebra_map R S))) :
91+
multiplicity J (I.map (algebra_map R S)) =
92+
multiplicity ↑(normalized_factors_map_equiv_normalized_factors_min_poly_mk pb hI hI' ⟨J, hJ⟩)
93+
(map I^.quotient.mk (minpoly R pb.gen)) :=
94+
by rw [normalized_factors_map_equiv_normalized_factors_min_poly_mk, equiv.coe_trans,
95+
function.comp_app,
96+
multiplicity_normalized_factors_equiv_span_normalized_factors_symm_eq_multiplicity,
97+
normalized_factors_equiv_of_quot_equiv_multiplicity_eq_multiplicity]
98+
99+
/-- The **Kummer-Dedekind Theorem**. -/
100+
theorem normalized_factors_ideal_map_eq_normalized_factors_min_poly_mk_map (hI : is_maximal I)
101+
(hI' : I ≠ ⊥) : normalized_factors (I.map (algebra_map R S)) = multiset.map
102+
(λ f, ((normalized_factors_map_equiv_normalized_factors_min_poly_mk pb hI hI').symm f : ideal S))
103+
(normalized_factors (polynomial.map I^.quotient.mk (minpoly R pb.gen))).attach :=
104+
begin
105+
ext J,
106+
-- WLOG, assume J is a normalized factor
107+
by_cases hJ : J ∈ normalized_factors (I.map (algebra_map R S)), swap,
108+
{ rw [multiset.count_eq_zero.mpr hJ, eq_comm, multiset.count_eq_zero, multiset.mem_map],
109+
simp only [multiset.mem_attach, true_and, not_exists],
110+
rintros J' rfl,
111+
exact hJ
112+
((normalized_factors_map_equiv_normalized_factors_min_poly_mk pb hI hI').symm J').prop },
113+
114+
-- Then we just have to compare the multiplicities, which we already proved are equal.
115+
have := multiplicity_factors_map_eq_multiplicity pb hI hI' hJ,
116+
rw [multiplicity_eq_count_normalized_factors, multiplicity_eq_count_normalized_factors,
117+
unique_factorization_monoid.normalize_normalized_factor _ hJ,
118+
unique_factorization_monoid.normalize_normalized_factor,
119+
part_enat.coe_inj]
120+
at this,
121+
refine this.trans _,
122+
-- Get rid of the `map` by applying the equiv to both sides.
123+
generalize hJ' : (normalized_factors_map_equiv_normalized_factors_min_poly_mk pb hI hI')
124+
⟨J, hJ⟩ = J',
125+
have : ((normalized_factors_map_equiv_normalized_factors_min_poly_mk pb hI hI').symm
126+
J' : ideal S) = J,
127+
{ rw [← hJ', equiv.symm_apply_apply _ _, subtype.coe_mk] },
128+
subst this,
129+
-- Get rid of the `attach` by applying the subtype `coe` to both sides.
130+
rw [multiset.count_map_eq_count' (λ f,
131+
((normalized_factors_map_equiv_normalized_factors_min_poly_mk pb hI hI').symm f
132+
: ideal S)),
133+
multiset.attach_count_eq_count_coe],
134+
{ exact subtype.coe_injective.comp (equiv.injective _) },
135+
{ exact (normalized_factors_map_equiv_normalized_factors_min_poly_mk pb hI hI' _).prop },
136+
{ exact irreducible_of_normalized_factor _
137+
(normalized_factors_map_equiv_normalized_factors_min_poly_mk pb hI hI' _).prop },
138+
{ exact polynomial.map_monic_ne_zero (minpoly.monic pb.is_integral_gen) },
139+
{ exact irreducible_of_normalized_factor _ hJ },
140+
{ rwa [← bot_eq_zero, ne.def, map_eq_bot_iff_of_injective pb.basis.algebra_map_injective] },
141+
end
142+
143+
theorem ideal.irreducible_map_of_irreducible_minpoly (hI : is_maximal I) (hI' : I ≠ ⊥)
144+
(hf : irreducible (map I^.quotient.mk (minpoly R pb.gen))) :
145+
irreducible (I.map (algebra_map R S)) :=
146+
begin
147+
have mem_norm_factors : normalize (map I^.quotient.mk (minpoly R pb.gen)) ∈ normalized_factors
148+
(map I^.quotient.mk (minpoly R pb.gen)) := by simp [normalized_factors_irreducible hf],
149+
suffices : ∃ x, normalized_factors (I.map (algebra_map R S)) = {x},
150+
{ obtain ⟨x, hx⟩ := this,
151+
have h := normalized_factors_prod (show I.map (algebra_map R S) ≠ 0, by
152+
rwa [← bot_eq_zero, ne.def, map_eq_bot_iff_of_injective pb.basis.algebra_map_injective]),
153+
rw [associated_iff_eq, hx, multiset.prod_singleton] at h,
154+
rw ← h,
155+
exact irreducible_of_normalized_factor x
156+
(show x ∈ normalized_factors (I.map (algebra_map R S)), by simp [hx]) },
157+
rw normalized_factors_ideal_map_eq_normalized_factors_min_poly_mk_map pb hI hI',
158+
use ((normalized_factors_map_equiv_normalized_factors_min_poly_mk pb hI hI').symm
159+
⟨normalize (map I^.quotient.mk (minpoly R pb.gen)), mem_norm_factors⟩ : ideal S),
160+
rw multiset.map_eq_singleton,
161+
use ⟨normalize (map I^.quotient.mk (minpoly R pb.gen)), mem_norm_factors⟩,
162+
refine ⟨_, rfl⟩,
163+
apply multiset.map_injective subtype.coe_injective,
164+
rw [multiset.attach_map_coe, multiset.map_singleton, subtype.coe_mk],
165+
exact normalized_factors_irreducible hf
166+
end
167+
168+
end kummer_dedekind

src/ring_theory/ideal/operations.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,6 +1530,7 @@ by { rw [set_like.ext'_iff, ker_eq, set.ext_iff], exact injective_iff_map_eq_zer
15301530

15311531
lemma ker_eq_bot_iff_eq_zero : ker f = ⊥ ↔ ∀ x, f x = 0 → x = 0 :=
15321532
by { rw [← injective_iff_map_eq_zero f, injective_iff_ker_eq_bot] }
1533+
15331534
omit rc
15341535

15351536
@[simp] lemma ker_coe_equiv (f : R ≃+* S) :
@@ -1677,6 +1678,11 @@ begin
16771678
abel },
16781679
exact (H.mem_or_mem this).imp (λ h, ha ▸ mem_map_of_mem f h) (λ h, hb ▸ mem_map_of_mem f h) }
16791680
end
1681+
1682+
lemma map_eq_bot_iff_of_injective {I : ideal R} {f : F} (hf : function.injective f) :
1683+
I.map f = ⊥ ↔ I = ⊥ :=
1684+
by rw [map_eq_bot_iff_le_ker, (ring_hom.injective_iff_ker_eq_bot f).mp hf, le_bot_iff]
1685+
16801686
omit rc
16811687

16821688
theorem map_is_prime_of_equiv {F' : Type*} [ring_equiv_class F' R S]

0 commit comments

Comments
 (0)