|
| 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 |
0 commit comments