number_theory.kummer_dedekind
⟷
Mathlib.NumberTheory.KummerDedekind
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(last sync)
attach
and filter
lemmas (#18087)
Left commutativity and cardinality of list.filter
/multiset.filter
/finset.filter
. Interaction of count
/countp
and attach
.
@@ -294,7 +294,7 @@ begin
rw [multiset.count_map_eq_count' (λ f,
((normalized_factors_map_equiv_normalized_factors_min_poly_mk hI hI' hx hx').symm f
: ideal S)),
- multiset.attach_count_eq_count_coe],
+ multiset.count_attach],
{ exact subtype.coe_injective.comp (equiv.injective _) },
{ exact (normalized_factors_map_equiv_normalized_factors_min_poly_mk hI hI' hx hx' _).prop},
{ exact irreducible_of_normalized_factor _
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(first ported)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -115,9 +115,9 @@ theorem prod_mem_ideal_map_of_mem_conductor {p : R} {z : S}
(hp : p ∈ Ideal.comap (algebraMap R S) (conductor R x)) (hz' : z ∈ I.map (algebraMap R S)) :
algebraMap R S p * z ∈ algebraMap R<x> S '' ↑(I.map (algebraMap R R<x>)) :=
by
- rw [Ideal.map, Ideal.span, Finsupp.mem_span_image_iff_total] at hz'
+ rw [Ideal.map, Ideal.span, Finsupp.mem_span_image_iff_total] at hz'
obtain ⟨l, H, H'⟩ := hz'
- rw [Finsupp.total_apply] at H'
+ rw [Finsupp.total_apply] at H'
rw [← H', mul_comm, Finsupp.sum_mul]
have lem :
∀ {a : R},
@@ -172,7 +172,7 @@ theorem comap_map_eq_map_adjoin_of_coprime_conductor
obtain ⟨a, ha⟩ :=
(Set.mem_image _ _ _).mp
(prod_mem_ideal_map_of_mem_conductor hp
- (show z ∈ I.map (algebraMap R S) by rwa [Ideal.mem_comap] at hy ))
+ (show z ∈ I.map (algebraMap R S) by rwa [Ideal.mem_comap] at hy))
use a + algebraMap R R<x> q * ⟨z, hz⟩
refine'
⟨Ideal.add_mem (I.map (algebraMap R R<x>)) ha.left _, by
@@ -212,7 +212,7 @@ noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap
--this is contained in `I * R<x>`, which is the content of the previous lemma.
refine' RingHom.lift_injective_of_ker_le_ideal _ _ fun u hu => _
rwa [RingHom.mem_ker, RingHom.comp_apply, Ideal.Quotient.eq_zero_iff_mem, ← Ideal.mem_comap,
- comap_map_eq_map_adjoin_of_coprime_conductor hx h_alg] at hu
+ comap_map_eq_map_adjoin_of_coprime_conductor hx h_alg] at hu
· -- Surjectivity follows from the surjectivity of the canonical map `R<x> → S ⧸ (I * S)`,
-- which in turn follows from the fact that `I * S + (conductor R x) = S`.
refine' Ideal.Quotient.lift_surjective_of_surjective _ _ fun y => _
@@ -222,14 +222,14 @@ noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap
suffices conductor R x ⊔ I.map (algebraMap R S) = ⊤ by simp only [this]
rw [Ideal.eq_top_iff_one] at hx ⊢
replace hx := Ideal.mem_map_of_mem (algebraMap R S) hx
- rw [Ideal.map_sup, RingHom.map_one] at hx
+ rw [Ideal.map_sup, RingHom.map_one] at hx
exact
(sup_le_sup
(show ((conductor R x).comap (algebraMap R S)).map (algebraMap R S) ≤ conductor R x
from Ideal.map_comap_le)
(le_refl (I.map (algebraMap R S))))
hx
- rw [← Ideal.mem_quotient_iff_mem_sup, hz, Ideal.mem_map_iff_of_surjective] at this
+ rw [← Ideal.mem_quotient_iff_mem_sup, hz, Ideal.mem_map_iff_of_surjective] at this
obtain ⟨u, hu, hu'⟩ := this
use⟨u, conductor_subset_adjoin hu⟩
simpa only [← hu']
@@ -334,7 +334,7 @@ theorem normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map (hI : I
have := multiplicity_factors_map_eq_multiplicity hI hI' hx hx' hJ
rw [multiplicity_eq_count_normalized_factors, multiplicity_eq_count_normalized_factors,
UniqueFactorizationMonoid.normalize_normalized_factor _ hJ,
- UniqueFactorizationMonoid.normalize_normalized_factor, PartENat.natCast_inj] at this
+ UniqueFactorizationMonoid.normalize_normalized_factor, PartENat.natCast_inj] at this
refine' this.trans _
-- Get rid of the `map` by applying the equiv to both sides.
generalize hJ' :
@@ -381,7 +381,7 @@ theorem Ideal.irreducible_map_of_irreducible_minpoly (hI : IsMaximal I) (hI' : I
(show I.map (algebraMap R S) ≠ 0 by
rwa [← bot_eq_zero, Ne.def,
map_eq_bot_iff_of_injective (NoZeroSMulDivisors.algebraMap_injective R S)])
- rw [associated_iff_eq, hy, Multiset.prod_singleton] at h
+ rw [associated_iff_eq, hy, Multiset.prod_singleton] at h
rw [← h]
exact
irreducible_of_normalized_factor y
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -6,7 +6,7 @@ Authors: Anne Baanen, Paul Lezeau
import RingTheory.DedekindDomain.Ideal
import RingTheory.IsAdjoinRoot
-#align_import number_theory.kummer_dedekind from "leanprover-community/mathlib"@"f2ad3645af9effcdb587637dc28a6074edc813f9"
+#align_import number_theory.kummer_dedekind from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
/-!
# Kummer-Dedekind theorem
@@ -349,7 +349,7 @@ theorem normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map (hI : I
rw [Multiset.count_map_eq_count' fun f =>
((normalized_factors_map_equiv_normalized_factors_min_poly_mk hI hI' hx hx').symm f :
Ideal S),
- Multiset.attach_count_eq_count_coe]
+ Multiset.count_attach]
· exact subtype.coe_injective.comp (Equiv.injective _)
· exact (normalized_factors_map_equiv_normalized_factors_min_poly_mk hI hI' hx hx' _).Prop
·
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,8 +3,8 @@ Copyright (c) 2021 Anne Baanen. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Anne Baanen, Paul Lezeau
-/
-import Mathbin.RingTheory.DedekindDomain.Ideal
-import Mathbin.RingTheory.IsAdjoinRoot
+import RingTheory.DedekindDomain.Ideal
+import RingTheory.IsAdjoinRoot
#align_import number_theory.kummer_dedekind from "leanprover-community/mathlib"@"f2ad3645af9effcdb587637dc28a6074edc813f9"
mathlib commit https://github.com/leanprover-community/mathlib/commit/63721b2c3eba6c325ecf8ae8cca27155a4f6306f
@@ -231,7 +231,7 @@ noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap
hx
rw [← Ideal.mem_quotient_iff_mem_sup, hz, Ideal.mem_map_iff_of_surjective] at this
obtain ⟨u, hu, hu'⟩ := this
- use ⟨u, conductor_subset_adjoin hu⟩
+ use⟨u, conductor_subset_adjoin hu⟩
simpa only [← hu']
· exact Ideal.Quotient.mk_surjective)
#align quot_adjoin_equiv_quot_map quotAdjoinEquivQuotMap
@@ -387,12 +387,11 @@ theorem Ideal.irreducible_map_of_irreducible_minpoly (hI : IsMaximal I) (hI' : I
irreducible_of_normalized_factor y
(show y ∈ normalized_factors (I.map (algebraMap R S)) by simp [hy])
rw [normalized_factors_ideal_map_eq_normalized_factors_min_poly_mk_map hI hI' hx hx']
- use
- ((normalized_factors_map_equiv_normalized_factors_min_poly_mk hI hI' hx hx').symm
+ use((normalized_factors_map_equiv_normalized_factors_min_poly_mk hI hI' hx hx').symm
⟨normalize (map I.Quotient.mk (minpoly R x)), mem_norm_factors⟩ :
Ideal S)
rw [Multiset.map_eq_singleton]
- use ⟨normalize (map I.Quotient.mk (minpoly R x)), mem_norm_factors⟩
+ use⟨normalize (map I.Quotient.mk (minpoly R x)), mem_norm_factors⟩
refine' ⟨_, rfl⟩
apply Multiset.map_injective Subtype.coe_injective
rw [Multiset.attach_map_val, Multiset.map_singleton, Subtype.coe_mk]
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,15 +2,12 @@
Copyright (c) 2021 Anne Baanen. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Anne Baanen, Paul Lezeau
-
-! This file was ported from Lean 3 source module number_theory.kummer_dedekind
-! leanprover-community/mathlib commit f2ad3645af9effcdb587637dc28a6074edc813f9
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.RingTheory.DedekindDomain.Ideal
import Mathbin.RingTheory.IsAdjoinRoot
+#align_import number_theory.kummer_dedekind from "leanprover-community/mathlib"@"f2ad3645af9effcdb587637dc28a6074edc813f9"
+
/-!
# Kummer-Dedekind theorem
mathlib commit https://github.com/leanprover-community/mathlib/commit/d30d31261cdb4d2f5e612eabc3c4bf45556350d5
@@ -275,12 +275,10 @@ noncomputable def normalizedFactorsMapEquivNormalizedFactorsMinPolyMk (hI : IsMa
(by
apply NoZeroSMulDivisors.algebraMap_injective (Algebra.adjoin R {x}) S
exact Subalgebra.noZeroSMulDivisors_top (Algebra.adjoin R {x}))).symm.trans
- (((minpoly.Algebra.adjoin.powerBasis' hx').quotientEquivQuotientMinpolyMap
- I).toRingEquiv.trans
+ (((Algebra.adjoin.powerBasis' hx').quotientEquivQuotientMinpolyMap I).toRingEquiv.trans
(quotEquivOfEq
(show
- Ideal.span
- {(minpoly R (minpoly.Algebra.adjoin.powerBasis' hx').gen).map I.Quotient.mk} =
+ Ideal.span {(minpoly R (Algebra.adjoin.powerBasis' hx').gen).map I.Quotient.mk} =
Ideal.span {(minpoly R x).map I.Quotient.mk}
by rw [Algebra.adjoin.powerBasis'_minpoly_gen hx']))))
(--show that `I * S` ≠ ⊥
mathlib commit https://github.com/leanprover-community/mathlib/commit/f2ad3645af9effcdb587637dc28a6074edc813f9
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Anne Baanen, Paul Lezeau
! This file was ported from Lean 3 source module number_theory.kummer_dedekind
-! leanprover-community/mathlib commit f0c8bf9245297a541f468be517f1bde6195105e9
+! leanprover-community/mathlib commit f2ad3645af9effcdb587637dc28a6074edc813f9
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -14,6 +14,9 @@ import Mathbin.RingTheory.IsAdjoinRoot
/-!
# Kummer-Dedekind theorem
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file proves the monogenic version of the Kummer-Dedekind theorem on the splitting of prime
ideals in an extension of the ring of integers. This states that if `I` is a prime ideal of
Dedekind domain `R` and `S = R[α]` for some `α` that is integral over `R` with minimal polynomial
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -62,6 +62,7 @@ open Ideal Polynomial DoubleQuot UniqueFactorizationMonoid Algebra RingHom
local notation:max R "<" x ">" => adjoin R ({x} : Set S)
+#print conductor /-
/-- Let `S / R` be a ring extension and `x : S`, then the conductor of `R<x>` is the
biggest ideal of `S` contained in `R<x>`. -/
def conductor (x : S) : Ideal S
@@ -71,31 +72,43 @@ def conductor (x : S) : Ideal S
add_mem' a b ha hb c := by simpa only [add_mul] using Subalgebra.add_mem _ (ha c) (hb c)
smul_mem' c a ha b := by simpa only [smul_eq_mul, mul_left_comm, mul_assoc] using ha (c * b)
#align conductor conductor
+-/
variable {R} {x : S}
+#print conductor_eq_of_eq /-
theorem conductor_eq_of_eq {y : S} (h : (R<x> : Set S) = R<y>) : conductor R x = conductor R y :=
Ideal.ext fun a => forall_congr' fun b => Set.ext_iff.mp h _
#align conductor_eq_of_eq conductor_eq_of_eq
+-/
+#print conductor_subset_adjoin /-
theorem conductor_subset_adjoin : (conductor R x : Set S) ⊆ R<x> := fun y hy => by
simpa only [mul_one] using hy 1
#align conductor_subset_adjoin conductor_subset_adjoin
+-/
+#print mem_conductor_iff /-
theorem mem_conductor_iff {y : S} : y ∈ conductor R x ↔ ∀ b : S, y * b ∈ R<x> :=
⟨fun h => h, fun h => h⟩
#align mem_conductor_iff mem_conductor_iff
+-/
+#print conductor_eq_top_of_adjoin_eq_top /-
theorem conductor_eq_top_of_adjoin_eq_top (h : R<x> = ⊤) : conductor R x = ⊤ := by
simp only [Ideal.eq_top_iff_one, mem_conductor_iff, h, mem_top, forall_const]
#align conductor_eq_top_of_adjoin_eq_top conductor_eq_top_of_adjoin_eq_top
+-/
+#print conductor_eq_top_of_powerBasis /-
theorem conductor_eq_top_of_powerBasis (pb : PowerBasis R S) : conductor R pb.gen = ⊤ :=
conductor_eq_top_of_adjoin_eq_top pb.adjoin_gen_eq_top
#align conductor_eq_top_of_power_basis conductor_eq_top_of_powerBasis
+-/
variable {I : Ideal R}
+#print prod_mem_ideal_map_of_mem_conductor /-
/-- This technical lemma tell us that if `C` is the conductor of `R<x>` and `I` is an ideal of `R`
then `p * (I * S) ⊆ I * R<x>` for any `p` in `C ∩ R` -/
theorem prod_mem_ideal_map_of_mem_conductor {p : R} {z : S}
@@ -133,7 +146,9 @@ theorem prod_mem_ideal_map_of_mem_conductor {p : R} {z : S}
· intro y hy
exact lem ((Finsupp.mem_supported _ l).mp H hy)
#align prod_mem_ideal_map_of_mem_conductor prod_mem_ideal_map_of_mem_conductor
+-/
+#print comap_map_eq_map_adjoin_of_coprime_conductor /-
/-- A technical result telling us that `(I * S) ∩ R<x> = I * R<x>` for any ideal `I` of `R`. -/
theorem comap_map_eq_map_adjoin_of_coprime_conductor
(hx : (conductor R x).comap (algebraMap R S) ⊔ I = ⊤)
@@ -176,7 +191,9 @@ theorem comap_map_eq_map_adjoin_of_coprime_conductor
rw [this, ← Ideal.map_map]
apply Ideal.le_comap_map
#align comap_map_eq_map_adjoin_of_coprime_conductor comap_map_eq_map_adjoin_of_coprime_conductor
+-/
+#print quotAdjoinEquivQuotMap /-
/-- The canonical morphism of rings from `R<x> ⧸ (I*R<x>)` to `S ⧸ (I*S)` is an isomorphism
when `I` and `(conductor R x) ∩ R` are coprime. -/
noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap R S) ⊔ I = ⊤)
@@ -218,7 +235,9 @@ noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap
simpa only [← hu']
· exact Ideal.Quotient.mk_surjective)
#align quot_adjoin_equiv_quot_map quotAdjoinEquivQuotMap
+-/
+#print quotAdjoinEquivQuotMap_apply_mk /-
@[simp]
theorem quotAdjoinEquivQuotMap_apply_mk (hx : (conductor R x).comap (algebraMap R S) ⊔ I = ⊤)
(h_alg : Function.Injective (algebraMap R<x> S)) (a : R<x>) :
@@ -226,6 +245,7 @@ theorem quotAdjoinEquivQuotMap_apply_mk (hx : (conductor R x).comap (algebraMap
(I.map (algebraMap R S)).Quotient.mk ↑a :=
rfl
#align quot_adjoin_equiv_quot_map_apply_mk quotAdjoinEquivQuotMap_apply_mk
+-/
namespace KummerDedekind
@@ -239,6 +259,7 @@ variable [NoZeroSMulDivisors R S]
attribute [local instance] Ideal.Quotient.field
+#print KummerDedekind.normalizedFactorsMapEquivNormalizedFactorsMinPolyMk /-
/-- The first half of the **Kummer-Dedekind Theorem** in the monogenic case, stating that the prime
factors of `I*S` are in bijection with those of the minimal polynomial of the generator of `S`
over `R`, taken `mod I`.-/
@@ -273,7 +294,9 @@ noncomputable def normalizedFactorsMapEquivNormalizedFactorsMinPolyMk (hI : IsMa
(show map I.Quotient.mk (minpoly R x) ≠ 0 from
Polynomial.map_monic_ne_zero (minpoly.monic hx'))).symm
#align kummer_dedekind.normalized_factors_map_equiv_normalized_factors_min_poly_mk KummerDedekind.normalizedFactorsMapEquivNormalizedFactorsMinPolyMk
+-/
+#print KummerDedekind.multiplicity_factors_map_eq_multiplicity /-
/-- The second half of the **Kummer-Dedekind Theorem** in the monogenic case, stating that the
bijection `factors_equiv'` defined in the first half preserves multiplicities. -/
theorem multiplicity_factors_map_eq_multiplicity (hI : IsMaximal I) (hI' : I ≠ ⊥)
@@ -288,7 +311,9 @@ theorem multiplicity_factors_map_eq_multiplicity (hI : IsMaximal I) (hI' : I ≠
multiplicity_normalizedFactorsEquivSpanNormalizedFactors_symm_eq_multiplicity,
normalizedFactorsEquivOfQuotEquiv_multiplicity_eq_multiplicity]
#align kummer_dedekind.multiplicity_factors_map_eq_multiplicity KummerDedekind.multiplicity_factors_map_eq_multiplicity
+-/
+#print KummerDedekind.normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map /-
/-- The **Kummer-Dedekind Theorem**. -/
theorem normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map (hI : IsMaximal I)
(hI' : I ≠ ⊥) (hx : (conductor R x).comap (algebraMap R S) ⊔ I = ⊤) (hx' : IsIntegral R x) :
@@ -339,7 +364,9 @@ theorem normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map (hI : I
rwa [← bot_eq_zero, Ne.def,
map_eq_bot_iff_of_injective (NoZeroSMulDivisors.algebraMap_injective R S)]
#align kummer_dedekind.normalized_factors_ideal_map_eq_normalized_factors_min_poly_mk_map KummerDedekind.normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map
+-/
+#print KummerDedekind.Ideal.irreducible_map_of_irreducible_minpoly /-
theorem Ideal.irreducible_map_of_irreducible_minpoly (hI : IsMaximal I) (hI' : I ≠ ⊥)
(hx : (conductor R x).comap (algebraMap R S) ⊔ I = ⊤) (hx' : IsIntegral R x)
(hf : Irreducible (map I.Quotient.mk (minpoly R x))) : Irreducible (I.map (algebraMap R S)) :=
@@ -373,6 +400,7 @@ theorem Ideal.irreducible_map_of_irreducible_minpoly (hI : IsMaximal I) (hI' : I
rw [Multiset.attach_map_val, Multiset.map_singleton, Subtype.coe_mk]
exact normalized_factors_irreducible hf
#align kummer_dedekind.ideal.irreducible_map_of_irreducible_minpoly KummerDedekind.Ideal.irreducible_map_of_irreducible_minpoly
+-/
end KummerDedekind
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -251,10 +251,12 @@ noncomputable def normalizedFactorsMapEquivNormalizedFactorsMinPolyMk (hI : IsMa
(by
apply NoZeroSMulDivisors.algebraMap_injective (Algebra.adjoin R {x}) S
exact Subalgebra.noZeroSMulDivisors_top (Algebra.adjoin R {x}))).symm.trans
- (((Algebra.adjoin.powerBasis' hx').quotientEquivQuotientMinpolyMap I).toRingEquiv.trans
+ (((minpoly.Algebra.adjoin.powerBasis' hx').quotientEquivQuotientMinpolyMap
+ I).toRingEquiv.trans
(quotEquivOfEq
(show
- Ideal.span {(minpoly R (Algebra.adjoin.powerBasis' hx').gen).map I.Quotient.mk} =
+ Ideal.span
+ {(minpoly R (minpoly.Algebra.adjoin.powerBasis' hx').gen).map I.Quotient.mk} =
Ideal.span {(minpoly R x).map I.Quotient.mk}
by rw [Algebra.adjoin.powerBasis'_minpoly_gen hx']))))
(--show that `I * S` ≠ ⊥
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -60,7 +60,6 @@ variable (R : Type _) {S : Type _} [CommRing R] [CommRing S] [Algebra R S]
open Ideal Polynomial DoubleQuot UniqueFactorizationMonoid Algebra RingHom
--- mathport name: «expr < >»
local notation:max R "<" x ">" => adjoin R ({x} : Set S)
/-- Let `S / R` be a ring extension and `x : S`, then the conductor of `R<x>` is the
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -67,7 +67,7 @@ local notation:max R "<" x ">" => adjoin R ({x} : Set S)
biggest ideal of `S` contained in `R<x>`. -/
def conductor (x : S) : Ideal S
where
- carrier := { a | ∀ b : S, a * b ∈ R<x> }
+ carrier := {a | ∀ b : S, a * b ∈ R<x>}
zero_mem' b := by simpa only [MulZeroClass.zero_mul] using Subalgebra.zero_mem _
add_mem' a b ha hb c := by simpa only [add_mul] using Subalgebra.add_mem _ (ha c) (hb c)
smul_mem' c a ha b := by simpa only [smul_eq_mul, mul_left_comm, mul_assoc] using ha (c * b)
@@ -245,8 +245,8 @@ attribute [local instance] Ideal.Quotient.field
over `R`, taken `mod I`.-/
noncomputable def normalizedFactorsMapEquivNormalizedFactorsMinPolyMk (hI : IsMaximal I)
(hI' : I ≠ ⊥) (hx : (conductor R x).comap (algebraMap R S) ⊔ I = ⊤) (hx' : IsIntegral R x) :
- { J : Ideal S | J ∈ normalizedFactors (I.map (algebraMap R S)) } ≃
- { d : (R ⧸ I)[X] | d ∈ normalizedFactors (map I.Quotient.mk (minpoly R x)) } :=
+ {J : Ideal S | J ∈ normalizedFactors (I.map (algebraMap R S))} ≃
+ {d : (R ⧸ I)[X] | d ∈ normalizedFactors (map I.Quotient.mk (minpoly R x))} :=
(normalizedFactorsEquivOfQuotEquiv
((quotAdjoinEquivQuotMap hx
(by
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -103,9 +103,9 @@ theorem prod_mem_ideal_map_of_mem_conductor {p : R} {z : S}
(hp : p ∈ Ideal.comap (algebraMap R S) (conductor R x)) (hz' : z ∈ I.map (algebraMap R S)) :
algebraMap R S p * z ∈ algebraMap R<x> S '' ↑(I.map (algebraMap R R<x>)) :=
by
- rw [Ideal.map, Ideal.span, Finsupp.mem_span_image_iff_total] at hz'
+ rw [Ideal.map, Ideal.span, Finsupp.mem_span_image_iff_total] at hz'
obtain ⟨l, H, H'⟩ := hz'
- rw [Finsupp.total_apply] at H'
+ rw [Finsupp.total_apply] at H'
rw [← H', mul_comm, Finsupp.sum_mul]
have lem :
∀ {a : R},
@@ -121,7 +121,7 @@ theorem prod_mem_ideal_map_of_mem_conductor {p : R} {z : S}
_
· rw [mul_comm]
exact mem_conductor_iff.mp (ideal.mem_comap.mp hp) _
- refine' ⟨_, by simpa only [RingHom.map_mul, mul_comm (algebraMap R S p) (l a)] ⟩
+ refine' ⟨_, by simpa only [RingHom.map_mul, mul_comm (algebraMap R S p) (l a)]⟩
rw [mul_comm]
apply Ideal.mul_mem_left (I.map (algebraMap R R<x>)) _ (Ideal.mem_map_of_mem _ ha)
refine'
@@ -158,11 +158,11 @@ theorem comap_map_eq_map_adjoin_of_coprime_conductor
obtain ⟨a, ha⟩ :=
(Set.mem_image _ _ _).mp
(prod_mem_ideal_map_of_mem_conductor hp
- (show z ∈ I.map (algebraMap R S) by rwa [Ideal.mem_comap] at hy))
+ (show z ∈ I.map (algebraMap R S) by rwa [Ideal.mem_comap] at hy ))
use a + algebraMap R R<x> q * ⟨z, hz⟩
refine'
⟨Ideal.add_mem (I.map (algebraMap R R<x>)) ha.left _, by
- simpa only [ha.right, map_add, AlgHom.map_mul, add_right_inj] ⟩
+ simpa only [ha.right, map_add, AlgHom.map_mul, add_right_inj]⟩
rw [mul_comm]
exact Ideal.mul_mem_left (I.map (algebraMap R R<x>)) _ (Ideal.mem_map_of_mem _ hq)
refine'
@@ -196,7 +196,7 @@ noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap
--this is contained in `I * R<x>`, which is the content of the previous lemma.
refine' RingHom.lift_injective_of_ker_le_ideal _ _ fun u hu => _
rwa [RingHom.mem_ker, RingHom.comp_apply, Ideal.Quotient.eq_zero_iff_mem, ← Ideal.mem_comap,
- comap_map_eq_map_adjoin_of_coprime_conductor hx h_alg] at hu
+ comap_map_eq_map_adjoin_of_coprime_conductor hx h_alg] at hu
· -- Surjectivity follows from the surjectivity of the canonical map `R<x> → S ⧸ (I * S)`,
-- which in turn follows from the fact that `I * S + (conductor R x) = S`.
refine' Ideal.Quotient.lift_surjective_of_surjective _ _ fun y => _
@@ -204,16 +204,16 @@ noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap
have : z ∈ conductor R x ⊔ I.map (algebraMap R S) :=
by
suffices conductor R x ⊔ I.map (algebraMap R S) = ⊤ by simp only [this]
- rw [Ideal.eq_top_iff_one] at hx⊢
+ rw [Ideal.eq_top_iff_one] at hx ⊢
replace hx := Ideal.mem_map_of_mem (algebraMap R S) hx
- rw [Ideal.map_sup, RingHom.map_one] at hx
+ rw [Ideal.map_sup, RingHom.map_one] at hx
exact
(sup_le_sup
(show ((conductor R x).comap (algebraMap R S)).map (algebraMap R S) ≤ conductor R x
from Ideal.map_comap_le)
(le_refl (I.map (algebraMap R S))))
hx
- rw [← Ideal.mem_quotient_iff_mem_sup, hz, Ideal.mem_map_iff_of_surjective] at this
+ rw [← Ideal.mem_quotient_iff_mem_sup, hz, Ideal.mem_map_iff_of_surjective] at this
obtain ⟨u, hu, hu'⟩ := this
use ⟨u, conductor_subset_adjoin hu⟩
simpa only [← hu']
@@ -310,7 +310,7 @@ theorem normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map (hI : I
have := multiplicity_factors_map_eq_multiplicity hI hI' hx hx' hJ
rw [multiplicity_eq_count_normalized_factors, multiplicity_eq_count_normalized_factors,
UniqueFactorizationMonoid.normalize_normalized_factor _ hJ,
- UniqueFactorizationMonoid.normalize_normalized_factor, PartENat.natCast_inj] at this
+ UniqueFactorizationMonoid.normalize_normalized_factor, PartENat.natCast_inj] at this
refine' this.trans _
-- Get rid of the `map` by applying the equiv to both sides.
generalize hJ' :
@@ -355,7 +355,7 @@ theorem Ideal.irreducible_map_of_irreducible_minpoly (hI : IsMaximal I) (hI' : I
(show I.map (algebraMap R S) ≠ 0 by
rwa [← bot_eq_zero, Ne.def,
map_eq_bot_iff_of_injective (NoZeroSMulDivisors.algebraMap_injective R S)])
- rw [associated_iff_eq, hy, Multiset.prod_singleton] at h
+ rw [associated_iff_eq, hy, Multiset.prod_singleton] at h
rw [← h]
exact
irreducible_of_normalized_factor y
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -230,7 +230,7 @@ theorem quotAdjoinEquivQuotMap_apply_mk (hx : (conductor R x).comap (algebraMap
namespace KummerDedekind
-open BigOperators Polynomial Classical
+open scoped BigOperators Polynomial Classical
variable [IsDomain R] [IsIntegrallyClosed R]
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -173,10 +173,7 @@ theorem comap_map_eq_map_adjoin_of_coprime_conductor
simpa [hx₂]
rwa [← this]
· -- The converse inclusion is trivial
- have : algebraMap R S = (algebraMap _ S).comp (algebraMap R R<x>) :=
- by
- ext
- rfl
+ have : algebraMap R S = (algebraMap _ S).comp (algebraMap R R<x>) := by ext; rfl
rw [this, ← Ideal.map_map]
apply Ideal.le_comap_map
#align comap_map_eq_map_adjoin_of_coprime_conductor comap_map_eq_map_adjoin_of_coprime_conductor
@@ -190,10 +187,7 @@ noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap
(Ideal.Quotient.lift (I.map (algebraMap R R<x>))
((I.map (algebraMap R S)).Quotient.mk.comp (algebraMap R<x> S)) fun r hr =>
by
- have : algebraMap R S = (algebraMap R<x> S).comp (algebraMap R R<x>) :=
- by
- ext
- rfl
+ have : algebraMap R S = (algebraMap R<x> S).comp (algebraMap R R<x>) := by ext; rfl
rw [RingHom.comp_apply, Ideal.Quotient.eq_zero_iff_mem, this, ← Ideal.map_map]
exact Ideal.mem_map_of_mem _ hr)
(by
@@ -269,8 +263,7 @@ noncomputable def normalizedFactorsMapEquivNormalizedFactorsMinPolyMk (hI : IsMa
rwa [Ne.def, map_eq_bot_iff_of_injective (NoZeroSMulDivisors.algebraMap_injective R S), ←
Ne.def])
(--show that the ideal spanned by `(minpoly R pb.gen) mod I` is non-zero
- by
- by_contra
+ by by_contra;
exact
(show map I.Quotient.mk (minpoly R x) ≠ 0 from
Polynomial.map_monic_ne_zero (minpoly.monic hx'))
@@ -306,7 +299,7 @@ theorem normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map (hI : I
by
ext J
-- WLOG, assume J is a normalized factor
- by_cases hJ : J ∈ normalized_factors (I.map (algebraMap R S))
+ by_cases hJ : J ∈ normalized_factors (I.map (algebraMap R S));
swap
· rw [multiset.count_eq_zero.mpr hJ, eq_comm, Multiset.count_eq_zero, Multiset.mem_map]
simp only [Multiset.mem_attach, true_and_iff, not_exists]
mathlib commit https://github.com/leanprover-community/mathlib/commit/738054fa93d43512da144ec45ce799d18fd44248
@@ -4,11 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Anne Baanen, Paul Lezeau
! This file was ported from Lean 3 source module number_theory.kummer_dedekind
-! leanprover-community/mathlib commit f7fc89d5d5ff1db2d1242c7bb0e9062ce47ef47c
+! leanprover-community/mathlib commit f0c8bf9245297a541f468be517f1bde6195105e9
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
-import Mathbin.RingTheory.AlgebraTower
import Mathbin.RingTheory.DedekindDomain.Ideal
import Mathbin.RingTheory.IsAdjoinRoot
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -69,7 +69,7 @@ local notation:max R "<" x ">" => adjoin R ({x} : Set S)
def conductor (x : S) : Ideal S
where
carrier := { a | ∀ b : S, a * b ∈ R<x> }
- zero_mem' b := by simpa only [zero_mul] using Subalgebra.zero_mem _
+ zero_mem' b := by simpa only [MulZeroClass.zero_mul] using Subalgebra.zero_mem _
add_mem' a b ha hb c := by simpa only [add_mul] using Subalgebra.add_mem _ (ha c) (hb c)
smul_mem' c a ha b := by simpa only [smul_eq_mul, mul_left_comm, mul_assoc] using ha (c * b)
#align conductor conductor
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -140,9 +140,9 @@ theorem prod_mem_ideal_map_of_mem_conductor {p : R} {z : S}
rfl
refine Finset.sum_induction _ (fun u => u ∈ algebraMap R<x> S '' I.map (algebraMap R R<x>))
(fun a b => ?_) ?_ ?_
- rintro ⟨z, hz, rfl⟩ ⟨y, hy, rfl⟩
- rw [← RingHom.map_add]
- exact ⟨z + y, Ideal.add_mem _ (SetLike.mem_coe.mp hz) hy, rfl⟩
+ · rintro ⟨z, hz, rfl⟩ ⟨y, hy, rfl⟩
+ rw [← RingHom.map_add]
+ exact ⟨z + y, Ideal.add_mem _ (SetLike.mem_coe.mp hz) hy, rfl⟩
· exact ⟨0, SetLike.mem_coe.mpr <| Ideal.zero_mem _, RingHom.map_zero _⟩
· intro y hy
exact lem ((Finsupp.mem_supported _ l).mp H hy)
@@ -217,10 +217,10 @@ noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap
from Ideal.map_comap_le)
(le_refl (I.map (algebraMap R S)))) hx
rw [← Ideal.mem_quotient_iff_mem_sup, hz, Ideal.mem_map_iff_of_surjective] at this
- obtain ⟨u, hu, hu'⟩ := this
- use ⟨u, conductor_subset_adjoin hu⟩
- simp only [← hu']
- rfl
+ · obtain ⟨u, hu, hu'⟩ := this
+ use ⟨u, conductor_subset_adjoin hu⟩
+ simp only [← hu']
+ rfl
· exact Ideal.Quotient.mk_surjective
#align quot_adjoin_equiv_quot_map quotAdjoinEquivQuotMap
@@ -304,20 +304,20 @@ theorem normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map (hI : I
rw [multiplicity_eq_count_normalizedFactors, multiplicity_eq_count_normalizedFactors,
UniqueFactorizationMonoid.normalize_normalized_factor _ hJ,
UniqueFactorizationMonoid.normalize_normalized_factor, PartENat.natCast_inj] at this
- refine' this.trans _
- -- Get rid of the `map` by applying the equiv to both sides.
- generalize hJ' :
- (normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx') ⟨J, hJ⟩ = J'
- have : ((normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx').symm J' : Ideal S) =
- J :=
- by rw [← hJ', Equiv.symm_apply_apply _ _, Subtype.coe_mk]
- subst this
- -- Get rid of the `attach` by applying the subtype `coe` to both sides.
- rw [Multiset.count_map_eq_count' fun f =>
- ((normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx').symm f :
- Ideal S),
- Multiset.count_attach]
- · exact Subtype.coe_injective.comp (Equiv.injective _)
+ · refine' this.trans _
+ -- Get rid of the `map` by applying the equiv to both sides.
+ generalize hJ' :
+ (normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx') ⟨J, hJ⟩ = J'
+ have : ((normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx').symm J' : Ideal S) =
+ J :=
+ by rw [← hJ', Equiv.symm_apply_apply _ _, Subtype.coe_mk]
+ subst this
+ -- Get rid of the `attach` by applying the subtype `coe` to both sides.
+ rw [Multiset.count_map_eq_count' fun f =>
+ ((normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx').symm f :
+ Ideal S),
+ Multiset.count_attach]
+ · exact Subtype.coe_injective.comp (Equiv.injective _)
· exact (normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx' _).prop
· exact irreducible_of_normalized_factor _
(normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx' _).prop
These are changes from #11997, the latest adaptation PR for nightly-2024-04-07, which can be made directly on master.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com>
@@ -261,8 +261,7 @@ noncomputable def normalizedFactorsMapEquivNormalizedFactorsMinPolyMk (hI : IsMa
· exact NoZeroSMulDivisors.algebraMap_injective (Algebra.adjoin R {x}) S
· rw [Algebra.adjoin.powerBasis'_minpoly_gen hx']
refine (normalizedFactorsEquivOfQuotEquiv f ?_ ?_).trans ?_
- · rwa [Ne.def, map_eq_bot_iff_of_injective (NoZeroSMulDivisors.algebraMap_injective R S),
- ← Ne.def]
+ · rwa [Ne, map_eq_bot_iff_of_injective (NoZeroSMulDivisors.algebraMap_injective R S), ← Ne]
· by_contra h
exact (show Polynomial.map (Ideal.Quotient.mk I) (minpoly R x) ≠ 0 from
Polynomial.map_monic_ne_zero (minpoly.monic hx')) (span_singleton_eq_bot.mp h)
Purely automatic replacement. If this is in any way controversial; I'm happy to just close this PR.
@@ -245,7 +245,7 @@ attribute [local instance] Ideal.Quotient.field
/-- The first half of the **Kummer-Dedekind Theorem** in the monogenic case, stating that the prime
factors of `I*S` are in bijection with those of the minimal polynomial of the generator of `S`
- over `R`, taken `mod I`.-/
+ over `R`, taken `mod I`. -/
noncomputable def normalizedFactorsMapEquivNormalizedFactorsMinPolyMk (hI : IsMaximal I)
(hI' : I ≠ ⊥) (hx : (conductor R x).comap (algebraMap R S) ⊔ I = ⊤) (hx' : IsIntegral R x) :
{J : Ideal S | J ∈ normalizedFactors (I.map (algebraMap R S))} ≃
@@ -324,7 +324,7 @@ theorem normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map (hI : I
(normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx' _).prop
· exact Polynomial.map_monic_ne_zero (minpoly.monic hx')
· exact irreducible_of_normalized_factor _ hJ
- · rwa [← bot_eq_zero, Ne.def,
+ · rwa [← bot_eq_zero, Ne,
map_eq_bot_iff_of_injective (NoZeroSMulDivisors.algebraMap_injective R S)]
#align kummer_dedekind.normalized_factors_ideal_map_eq_normalized_factors_min_poly_mk_map KummerDedekind.normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map
@@ -338,7 +338,7 @@ theorem Ideal.irreducible_map_of_irreducible_minpoly (hI : IsMaximal I) (hI' : I
suffices ∃ y, normalizedFactors (I.map (algebraMap R S)) = {y} by
obtain ⟨y, hy⟩ := this
have h := normalizedFactors_prod (show I.map (algebraMap R S) ≠ 0 by
- rwa [← bot_eq_zero, Ne.def,
+ rwa [← bot_eq_zero, Ne,
map_eq_bot_iff_of_injective (NoZeroSMulDivisors.algebraMap_injective R S)])
rw [associated_iff_eq, hy, Multiset.prod_singleton] at h
rw [← h]
Probably because in mathlib4
the definition IsDedekindDomain
extends Domain
, and this was not the case in mathlib3
, there are unused hypothesis of the form
variable [IsDomain R] [IsDedekindDomain R]
and this PR removes the first one, that can be inferred by the second, both in variable declarations and in theorem/definition assumptions. A regex search has been performed on the library to search for all occurrences and none is left.
@@ -238,7 +238,7 @@ namespace KummerDedekind
open scoped BigOperators Polynomial Classical
variable [IsDomain R] [IsIntegrallyClosed R]
-variable [IsDomain S] [IsDedekindDomain S]
+variable [IsDedekindDomain S]
variable [NoZeroSMulDivisors R S]
attribute [local instance] Ideal.Quotient.field
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -238,9 +238,7 @@ namespace KummerDedekind
open scoped BigOperators Polynomial Classical
variable [IsDomain R] [IsIntegrallyClosed R]
-
variable [IsDomain S] [IsDedekindDomain S]
-
variable [NoZeroSMulDivisors R S]
attribute [local instance] Ideal.Quotient.field
@@ -90,6 +90,28 @@ theorem conductor_eq_top_of_powerBasis (pb : PowerBasis R S) : conductor R pb.ge
conductor_eq_top_of_adjoin_eq_top pb.adjoin_gen_eq_top
#align conductor_eq_top_of_power_basis conductor_eq_top_of_powerBasis
+open IsLocalization in
+lemma mem_coeSubmodule_conductor {L} [CommRing L] [Algebra S L] [Algebra R L]
+ [IsScalarTower R S L] [NoZeroSMulDivisors S L] {x : S} {y : L} :
+ y ∈ coeSubmodule L (conductor R x) ↔ ∀ z : S,
+ y * (algebraMap S L) z ∈ Algebra.adjoin R {algebraMap S L x} := by
+ cases subsingleton_or_nontrivial L
+ · rw [Subsingleton.elim (coeSubmodule L _) ⊤, Subsingleton.elim (Algebra.adjoin R _) ⊤]; simp
+ trans ∀ z, y * (algebraMap S L) z ∈ (Algebra.adjoin R {x}).map (IsScalarTower.toAlgHom R S L)
+ · simp only [coeSubmodule, Submodule.mem_map, Algebra.linearMap_apply, Subalgebra.mem_map,
+ IsScalarTower.coe_toAlgHom']
+ constructor
+ · rintro ⟨y, hy, rfl⟩ z
+ exact ⟨_, hy z, map_mul _ _ _⟩
+ · intro H
+ obtain ⟨y, _, e⟩ := H 1
+ rw [_root_.map_one, mul_one] at e
+ subst e
+ simp only [← _root_.map_mul, (NoZeroSMulDivisors.algebraMap_injective S L).eq_iff,
+ exists_eq_right] at H
+ exact ⟨_, H, rfl⟩
+ · rw [AlgHom.map_adjoin, Set.image_singleton]; rfl
+
variable {I : Ideal R}
/-- This technical lemma tell us that if `C` is the conductor of `R<x>` and `I` is an ideal of `R`
attach
and filter
lemmas (#1470)
Match https://github.com/leanprover-community/mathlib/pull/18087
@@ -6,7 +6,7 @@ Authors: Anne Baanen, Paul Lezeau
import Mathlib.RingTheory.DedekindDomain.Ideal
import Mathlib.RingTheory.IsAdjoinRoot
-#align_import number_theory.kummer_dedekind from "leanprover-community/mathlib"@"f0c8bf9245297a541f468be517f1bde6195105e9"
+#align_import number_theory.kummer_dedekind from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
/-!
# Kummer-Dedekind theorem
@@ -297,7 +297,7 @@ theorem normalizedFactors_ideal_map_eq_normalizedFactors_min_poly_mk_map (hI : I
rw [Multiset.count_map_eq_count' fun f =>
((normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx').symm f :
Ideal S),
- Multiset.attach_count_eq_count_coe]
+ Multiset.count_attach]
· exact Subtype.coe_injective.comp (Equiv.injective _)
· exact (normalizedFactorsMapEquivNormalizedFactorsMinPolyMk hI hI' hx hx' _).prop
· exact irreducible_of_normalized_factor _
@@ -144,7 +144,7 @@ theorem comap_map_eq_map_adjoin_of_coprime_conductor
(⟨z, hz⟩ : R<x>) ∈ I.map (algebraMap R R<x>) by
rw [← this, ← temp]
obtain ⟨a, ha⟩ := (Set.mem_image _ _ _).mp (prod_mem_ideal_map_of_mem_conductor hp
- (show z ∈ I.map (algebraMap R S) by rwa [Ideal.mem_comap] at hy ))
+ (show z ∈ I.map (algebraMap R S) by rwa [Ideal.mem_comap] at hy))
use a + algebraMap R R<x> q * ⟨z, hz⟩
refine ⟨Ideal.add_mem (I.map (algebraMap R R<x>)) ha.left ?_, by
simp only [ha.right, map_add, AlgHom.map_mul, add_right_inj]; rfl⟩
@@ -107,10 +107,11 @@ theorem prod_mem_ideal_map_of_mem_conductor {p : R} {z : S}
rw [Algebra.id.smul_eq_mul, mul_assoc, mul_comm, mul_assoc, Set.mem_image]
refine Exists.intro
(algebraMap R R<x> a * ⟨l a * algebraMap R S p,
- show l a * algebraMap R S p ∈ R<x> from ?_⟩) ?_
+ show l a * algebraMap R S p ∈ R<x> from ?h⟩) ?_
+ case h =>
+ rw [mul_comm]
+ exact mem_conductor_iff.mp (Ideal.mem_comap.mp hp) _
· refine ⟨?_, ?_⟩
- · rw [mul_comm]
- exact mem_conductor_iff.mp (Ideal.mem_comap.mp hp) _
· rw [mul_comm]
apply Ideal.mul_mem_left (I.map (algebraMap R R<x>)) _ (Ideal.mem_map_of_mem _ ha)
· simp only [RingHom.map_mul, mul_comm (algebraMap R S p) (l a)]
MulZeroClass.
in mul_zero
/zero_mul
(#6682)
Search&replace MulZeroClass.mul_zero
-> mul_zero
, MulZeroClass.zero_mul
-> zero_mul
.
These were introduced by Mathport, as the full name of mul_zero
is actually MulZeroClass.mul_zero
(it's exported with the short name).
@@ -63,7 +63,7 @@ local notation:max R "<" x:max ">" => adjoin R ({x} : Set S)
biggest ideal of `S` contained in `R<x>`. -/
def conductor (x : S) : Ideal S where
carrier := {a | ∀ b : S, a * b ∈ R<x>}
- zero_mem' b := by simpa only [MulZeroClass.zero_mul] using Subalgebra.zero_mem _
+ zero_mem' b := by simpa only [zero_mul] using Subalgebra.zero_mem _
add_mem' ha hb c := by simpa only [add_mul] using Subalgebra.add_mem _ (ha c) (hb c)
smul_mem' c a ha b := by simpa only [smul_eq_mul, mul_left_comm, mul_assoc] using ha (c * b)
#align conductor conductor
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -53,7 +53,7 @@ kummer, dedekind, kummer dedekind, dedekind-kummer, dedekind kummer
-/
-variable (R : Type _) {S : Type _} [CommRing R] [CommRing S] [Algebra R S]
+variable (R : Type*) {S : Type*} [CommRing R] [CommRing S] [Algebra R S]
open Ideal Polynomial DoubleQuot UniqueFactorizationMonoid Algebra RingHom
@@ -2,15 +2,12 @@
Copyright (c) 2021 Anne Baanen. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Anne Baanen, Paul Lezeau
-
-! This file was ported from Lean 3 source module number_theory.kummer_dedekind
-! leanprover-community/mathlib commit f0c8bf9245297a541f468be517f1bde6195105e9
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.RingTheory.DedekindDomain.Ideal
import Mathlib.RingTheory.IsAdjoinRoot
+#align_import number_theory.kummer_dedekind from "leanprover-community/mathlib"@"f0c8bf9245297a541f468be517f1bde6195105e9"
+
/-!
# Kummer-Dedekind theorem
@@ -248,7 +248,7 @@ noncomputable def normalizedFactorsMapEquivNormalizedFactorsMinPolyMk (hI : IsMa
· by_contra h
exact (show Polynomial.map (Ideal.Quotient.mk I) (minpoly R x) ≠ 0 from
Polynomial.map_monic_ne_zero (minpoly.monic hx')) (span_singleton_eq_bot.mp h)
- · refine (normalizedFactorsEquivSpanNormalizedFactors ?_).symm
+ · refine (normalizedFactorsEquivSpanNormalizedFactors ?_).symm
exact Polynomial.map_monic_ne_zero (minpoly.monic hx')
#align kummer_dedekind.normalized_factors_map_equiv_normalized_factors_min_poly_mk KummerDedekind.normalizedFactorsMapEquivNormalizedFactorsMinPolyMk
@@ -204,7 +204,7 @@ noncomputable def quotAdjoinEquivQuotMap (hx : (conductor R x).comap (algebraMap
· exact Ideal.Quotient.mk_surjective
#align quot_adjoin_equiv_quot_map quotAdjoinEquivQuotMap
--- Porting note: on-line linter fails with `failed to synthesize` instance
+-- Porting note: on-line linter fails with `failed to synthesize` instance
-- but #lint does not report any problem
@[simp, nolint simpNF]
theorem quotAdjoinEquivQuotMap_apply_mk (hx : (conductor R x).comap (algebraMap R S) ⊔ I = ⊤)
@@ -238,7 +238,7 @@ noncomputable def normalizedFactorsMapEquivNormalizedFactorsMinPolyMk (hI : IsMa
let f : S ⧸ map (algebraMap R S) I ≃+*
(R ⧸ I)[X] ⧸ span {Polynomial.map (Ideal.Quotient.mk I) (minpoly R x)} := by
refine (quotAdjoinEquivQuotMap hx ?_).symm.trans
- (((minpoly.Algebra.adjoin.powerBasis'
+ (((Algebra.adjoin.powerBasis'
hx').quotientEquivQuotientMinpolyMap I).toRingEquiv.trans (quotEquivOfEq ?_))
· exact NoZeroSMulDivisors.algebraMap_injective (Algebra.adjoin R {x}) S
· rw [Algebra.adjoin.powerBasis'_minpoly_gen hx']
The unported dependencies are