field_theory.splitting_field.is_splitting_field
⟷
Mathlib.FieldTheory.SplittingField.IsSplittingField
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.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
@@ -45,7 +45,7 @@ variables [field K] [field L] [field F] [algebra K L]
/-- Typeclass characterising splitting fields. -/
class is_splitting_field (f : K[X]) : Prop :=
(splits [] : splits (algebra_map K L) f)
-(adjoin_roots [] : algebra.adjoin K (↑(f.map (algebra_map K L)).roots.to_finset : set L) = ⊤)
+(adjoin_root_set [] : algebra.adjoin K (f.root_set L) = ⊤)
variables {K L F}
@@ -59,16 +59,17 @@ instance map (f : F[X]) [is_splitting_field F L f] :
is_splitting_field K L (f.map $ algebra_map F K) :=
⟨by { rw [splits_map_iff, ← is_scalar_tower.algebra_map_eq], exact splits L f },
subalgebra.restrict_scalars_injective F $
- by { rw [map_map, ← is_scalar_tower.algebra_map_eq, subalgebra.restrict_scalars_top,
- eq_top_iff, ← adjoin_roots L f, algebra.adjoin_le_iff],
+ by { rw [root_set, map_map, ← is_scalar_tower.algebra_map_eq, subalgebra.restrict_scalars_top,
+ eq_top_iff, ← adjoin_root_set L f, algebra.adjoin_le_iff],
exact λ x hx, @algebra.subset_adjoin K _ _ _ _ _ _ hx }⟩
variables (L)
theorem splits_iff (f : K[X]) [is_splitting_field K L f] :
polynomial.splits (ring_hom.id K) f ↔ (⊤ : subalgebra K L) = ⊥ :=
-⟨λ h, eq_bot_iff.2 $ adjoin_roots L f ▸ (roots_map (algebra_map K L) h).symm ▸
+⟨λ h, eq_bot_iff.2 $ adjoin_root_set L f ▸
algebra.adjoin_le_iff.2 (λ y hy,
- let ⟨x, hxs, hxy⟩ := finset.mem_image.1 (by rwa multiset.to_finset_map at hy) in
+ let ⟨x, hxs, hxy⟩ := finset.mem_image.1
+ (by rwa [root_set, roots_map _ h, multiset.to_finset_map] at hy) in
hxy ▸ set_like.mem_coe.2 $ subalgebra.algebra_map_mem _ _),
λ h, @ring_equiv.to_ring_hom_refl K _ ▸
ring_equiv.self_trans_symm (ring_equiv.of_bijective _ $ algebra.bijective_algebra_map_iff.2 h) ▸
@@ -80,14 +81,15 @@ theorem mul (f g : F[X]) (hf : f ≠ 0) (hg : g ≠ 0) [is_splitting_field F K f
⟨(is_scalar_tower.algebra_map_eq F K L).symm ▸ splits_mul _
(splits_comp_of_splits _ _ (splits K f))
((splits_map_iff _ _).1 (splits L $ g.map $ algebra_map F K)),
- by rw [polynomial.map_mul, roots_mul (mul_ne_zero (map_ne_zero hf : f.map (algebra_map F L) ≠ 0)
+ by rw [root_set, polynomial.map_mul,
+ roots_mul (mul_ne_zero (map_ne_zero hf : f.map (algebra_map F L) ≠ 0)
(map_ne_zero hg)), multiset.to_finset_add, finset.coe_union,
algebra.adjoin_union_eq_adjoin_adjoin,
is_scalar_tower.algebra_map_eq F K L, ← map_map,
roots_map (algebra_map K L) ((splits_id_iff_splits $ algebra_map F K).2 $ splits K f),
- multiset.to_finset_map, finset.coe_image, algebra.adjoin_algebra_map, adjoin_roots,
- algebra.map_top, is_scalar_tower.adjoin_range_to_alg_hom, ← map_map, adjoin_roots,
- subalgebra.restrict_scalars_top]⟩
+ multiset.to_finset_map, finset.coe_image, algebra.adjoin_algebra_map, ←root_set,
+ adjoin_root_set, algebra.map_top, is_scalar_tower.adjoin_range_to_alg_hom, ← map_map,
+ ←root_set, adjoin_root_set, subalgebra.restrict_scalars_top]⟩
end scalar_tower
@@ -100,7 +102,7 @@ if hf0 : f = 0 then (algebra.of_id K F).comp $
(algebra.bot_equiv K L : (⊥ : subalgebra K L) →ₐ[K] K).comp $
by { rw ← (splits_iff L f).1 (show f.splits (ring_hom.id K), from hf0.symm ▸ splits_zero _),
exact algebra.to_top } else
-alg_hom.comp (by { rw ← adjoin_roots L f, exact classical.choice (lift_of_splits _ $ λ y hy,
+alg_hom.comp (by { rw ← adjoin_root_set L f, exact classical.choice (lift_of_splits _ $ λ y hy,
have aeval y f = 0, from (eval₂_eq_eval_map _).trans $
(mem_roots $ by exact map_ne_zero hf0).1 (multiset.mem_to_finset.mp hy),
⟨is_algebraic_iff_is_integral.1 ⟨f, hf0, this⟩,
@@ -108,10 +110,10 @@ alg_hom.comp (by { rw ← adjoin_roots L f, exact classical.choice (lift_of_spli
algebra.to_top
theorem finite_dimensional (f : K[X]) [is_splitting_field K L f] : finite_dimensional K L :=
-⟨@algebra.top_to_submodule K L _ _ _ ▸ adjoin_roots L f ▸
+⟨@algebra.top_to_submodule K L _ _ _ ▸ adjoin_root_set L f ▸
fg_adjoin_of_finite (finset.finite_to_set _) (λ y hy,
if hf : f = 0
- then by { rw [hf, polynomial.map_zero, roots_zero] at hy, cases hy }
+ then by { rw [hf, root_set_zero] at hy, cases hy }
else is_algebraic_iff_is_integral.1 ⟨f, hf, (eval₂_eq_eval_map _).trans $
(mem_roots $ by exact map_ne_zero hf).1 (multiset.mem_to_finset.mp hy)⟩)⟩
@@ -122,7 +124,7 @@ begin
{ rw ← f.to_alg_hom.comp_algebra_map,
exact splits_comp_of_splits _ _ (splits F p) },
{ rw [←(algebra.range_top_iff_surjective f.to_alg_hom).mpr f.surjective,
- ←root_set, adjoin_root_set_eq_range (splits F p), root_set, adjoin_roots F p] },
+ adjoin_root_set_eq_range (splits F p), adjoin_root_set F p] },
end
end is_splitting_field
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(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
@@ -85,7 +85,7 @@ theorem splits_iff (f : K[X]) [IsSplittingField K L f] :
adjoin_rootSet L f ▸
Algebra.adjoin_le_iff.2 fun y hy =>
let ⟨x, hxs, hxy⟩ :=
- Finset.mem_image.1 (by rwa [root_set, roots_map _ h, Multiset.toFinset_map] at hy )
+ Finset.mem_image.1 (by rwa [root_set, roots_map _ h, Multiset.toFinset_map] at hy)
hxy ▸ SetLike.mem_coe.2 <| Subalgebra.algebraMap_mem _ _,
fun h =>
@RingEquiv.toRingHom_refl K _ ▸
@@ -146,7 +146,7 @@ theorem finiteDimensional (f : K[X]) [IsSplittingField K L f] : FiniteDimensiona
⟨@Algebra.top_toSubmodule K L _ _ _ ▸
adjoin_rootSet L f ▸
fg_adjoin_of_finite (Finset.finite_toSet _) fun y hy =>
- if hf : f = 0 then by rw [hf, root_set_zero] at hy ; cases hy
+ if hf : f = 0 then by rw [hf, root_set_zero] at hy; cases hy
else
isAlgebraic_iff_isIntegral.1
⟨f, hf,
@@ -181,7 +181,7 @@ variable {K L} [Field K] [Field L] [Algebra K L] {p : K[X]}
theorem splits_of_splits {F : IntermediateField K L} (h : p.Splits (algebraMap K L))
(hF : ∀ x ∈ p.rootSet L, x ∈ F) : p.Splits (algebraMap K F) :=
by
- simp_rw [root_set, Finset.mem_coe, Multiset.mem_toFinset] at hF
+ simp_rw [root_set, Finset.mem_coe, Multiset.mem_toFinset] at hF
rw [splits_iff_exists_multiset]
refine' ⟨Multiset.pmap Subtype.mk _ hF, map_injective _ (algebraMap F L).Injective _⟩
conv_lhs =>
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -47,8 +47,8 @@ namespace Polynomial
variable [Field K] [Field L] [Field F] [Algebra K L]
#print Polynomial.IsSplittingField /-
-/- ./././Mathport/Syntax/Translate/Command.lean:404:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
-/- ./././Mathport/Syntax/Translate/Command.lean:404:30: infer kinds are unsupported in Lean 4: #[`adjoin_rootSet] [] -/
+/- ./././Mathport/Syntax/Translate/Command.lean:400:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
+/- ./././Mathport/Syntax/Translate/Command.lean:400:30: infer kinds are unsupported in Lean 4: #[`adjoin_rootSet] [] -/
/-- Typeclass characterising splitting fields. -/
class IsSplittingField (f : K[X]) : Prop where
Splits : Splits (algebraMap K L) f
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -47,8 +47,8 @@ namespace Polynomial
variable [Field K] [Field L] [Field F] [Algebra K L]
#print Polynomial.IsSplittingField /-
-/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
-/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`adjoin_rootSet] [] -/
+/- ./././Mathport/Syntax/Translate/Command.lean:404:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
+/- ./././Mathport/Syntax/Translate/Command.lean:404:30: infer kinds are unsupported in Lean 4: #[`adjoin_rootSet] [] -/
/-- Typeclass characterising splitting fields. -/
class IsSplittingField (f : K[X]) : Prop where
Splits : Splits (algebraMap K L) f
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -145,7 +145,7 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
theorem finiteDimensional (f : K[X]) [IsSplittingField K L f] : FiniteDimensional K L :=
⟨@Algebra.top_toSubmodule K L _ _ _ ▸
adjoin_rootSet L f ▸
- FG_adjoin_of_finite (Finset.finite_toSet _) fun y hy =>
+ fg_adjoin_of_finite (Finset.finite_toSet _) fun y hy =>
if hf : f = 0 then by rw [hf, root_set_zero] at hy ; cases hy
else
isAlgebraic_iff_isIntegral.1
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -131,7 +131,7 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
(by rw [← adjoin_root_set L f];
exact
Classical.choice
- (lift_of_splits _ fun y hy =>
+ (Polynomial.lift_of_splits _ fun y hy =>
have : aeval y f = 0 :=
(eval₂_eq_eval_map _).trans <|
(mem_roots <| map_ne_zero hf0).1 (multiset.mem_to_finset.mp hy)
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2018 Chris Hughes. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes
-/
-import Mathbin.Algebra.CharP.Algebra
-import Mathbin.FieldTheory.IntermediateField
-import Mathbin.RingTheory.Adjoin.Field
+import Algebra.CharP.Algebra
+import FieldTheory.IntermediateField
+import RingTheory.Adjoin.Field
#align_import field_theory.splitting_field.is_splitting_field from "leanprover-community/mathlib"@"9fb8964792b4237dac6200193a0d533f1b3f7423"
@@ -47,8 +47,8 @@ namespace Polynomial
variable [Field K] [Field L] [Field F] [Algebra K L]
#print Polynomial.IsSplittingField /-
-/- ./././Mathport/Syntax/Translate/Command.lean:393:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
-/- ./././Mathport/Syntax/Translate/Command.lean:393:30: infer kinds are unsupported in Lean 4: #[`adjoin_rootSet] [] -/
+/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
+/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`adjoin_rootSet] [] -/
/-- Typeclass characterising splitting fields. -/
class IsSplittingField (f : K[X]) : Prop where
Splits : Splits (algebraMap K L) f
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2018 Chris Hughes. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes
-
-! This file was ported from Lean 3 source module field_theory.splitting_field.is_splitting_field
-! leanprover-community/mathlib commit 9fb8964792b4237dac6200193a0d533f1b3f7423
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Algebra.CharP.Algebra
import Mathbin.FieldTheory.IntermediateField
import Mathbin.RingTheory.Adjoin.Field
+#align_import field_theory.splitting_field.is_splitting_field from "leanprover-community/mathlib"@"9fb8964792b4237dac6200193a0d533f1b3f7423"
+
/-!
# Splitting fields
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -50,8 +50,8 @@ namespace Polynomial
variable [Field K] [Field L] [Field F] [Algebra K L]
#print Polynomial.IsSplittingField /-
-/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
-/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`adjoin_rootSet] [] -/
+/- ./././Mathport/Syntax/Translate/Command.lean:393:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
+/- ./././Mathport/Syntax/Translate/Command.lean:393:30: infer kinds are unsupported in Lean 4: #[`adjoin_rootSet] [] -/
/-- Typeclass characterising splitting fields. -/
class IsSplittingField (f : K[X]) : Prop where
Splits : Splits (algebraMap K L) f
@@ -80,6 +80,7 @@ instance map (f : F[X]) [IsSplittingField F L f] : IsSplittingField K L (f.map <
variable (L)
+#print Polynomial.IsSplittingField.splits_iff /-
theorem splits_iff (f : K[X]) [IsSplittingField K L f] :
Polynomial.Splits (RingHom.id K) f ↔ (⊤ : Subalgebra K L) = ⊥ :=
⟨fun h =>
@@ -94,6 +95,7 @@ theorem splits_iff (f : K[X]) [IsSplittingField K L f] :
RingEquiv.self_trans_symm (RingEquiv.ofBijective _ <| Algebra.bijective_algebraMap_iff.2 h) ▸
by rw [RingEquiv.toRingHom_trans]; exact splits_comp_of_splits _ _ (splits L f)⟩
#align polynomial.is_splitting_field.splits_iff Polynomial.IsSplittingField.splits_iff
+-/
#print Polynomial.IsSplittingField.mul /-
theorem mul (f g : F[X]) (hf : f ≠ 0) (hg : g ≠ 0) [IsSplittingField F K f]
@@ -178,6 +180,7 @@ open Polynomial
variable {K L} [Field K] [Field L] [Algebra K L] {p : K[X]}
+#print IntermediateField.splits_of_splits /-
theorem splits_of_splits {F : IntermediateField K L} (h : p.Splits (algebraMap K L))
(hF : ∀ x ∈ p.rootSet L, x ∈ F) : p.Splits (algebraMap K F) :=
by
@@ -191,6 +194,7 @@ theorem splits_of_splits {F : IntermediateField K L} (h : p.Splits (algebraMap K
map_C, map_X]
rfl
#align intermediate_field.splits_of_splits IntermediateField.splits_of_splits
+-/
end IntermediateField
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes
! This file was ported from Lean 3 source module field_theory.splitting_field.is_splitting_field
-! leanprover-community/mathlib commit c20927220ef87bb4962ba08bf6da2ce3cf50a6dd
+! leanprover-community/mathlib commit 9fb8964792b4237dac6200193a0d533f1b3f7423
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -51,11 +51,11 @@ variable [Field K] [Field L] [Field F] [Algebra K L]
#print Polynomial.IsSplittingField /-
/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
-/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`adjoin_roots] [] -/
+/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`adjoin_rootSet] [] -/
/-- Typeclass characterising splitting fields. -/
class IsSplittingField (f : K[X]) : Prop where
Splits : Splits (algebraMap K L) f
- adjoin_roots : Algebra.adjoin K (↑(f.map (algebraMap K L)).roots.toFinset : Set L) = ⊤
+ adjoin_rootSet : Algebra.adjoin K (f.rootSet L) = ⊤
#align polynomial.is_splitting_field Polynomial.IsSplittingField
-/
@@ -72,8 +72,8 @@ instance map (f : F[X]) [IsSplittingField F L f] : IsSplittingField K L (f.map <
⟨by rw [splits_map_iff, ← IsScalarTower.algebraMap_eq]; exact splits L f,
Subalgebra.restrictScalars_injective F <|
by
- rw [map_map, ← IsScalarTower.algebraMap_eq, Subalgebra.restrictScalars_top, eq_top_iff, ←
- adjoin_roots L f, Algebra.adjoin_le_iff]
+ rw [root_set, map_map, ← IsScalarTower.algebraMap_eq, Subalgebra.restrictScalars_top,
+ eq_top_iff, ← adjoin_root_set L f, Algebra.adjoin_le_iff]
exact fun x hx => @Algebra.subset_adjoin K _ _ _ _ _ _ hx⟩
#align polynomial.is_splitting_field.map Polynomial.IsSplittingField.map
-/
@@ -84,11 +84,11 @@ theorem splits_iff (f : K[X]) [IsSplittingField K L f] :
Polynomial.Splits (RingHom.id K) f ↔ (⊤ : Subalgebra K L) = ⊥ :=
⟨fun h =>
eq_bot_iff.2 <|
- adjoin_roots L f ▸
- (roots_map (algebraMap K L) h).symm ▸
- Algebra.adjoin_le_iff.2 fun y hy =>
- let ⟨x, hxs, hxy⟩ := Finset.mem_image.1 (by rwa [Multiset.toFinset_map] at hy )
- hxy ▸ SetLike.mem_coe.2 <| Subalgebra.algebraMap_mem _ _,
+ adjoin_rootSet L f ▸
+ Algebra.adjoin_le_iff.2 fun y hy =>
+ let ⟨x, hxs, hxy⟩ :=
+ Finset.mem_image.1 (by rwa [root_set, roots_map _ h, Multiset.toFinset_map] at hy )
+ hxy ▸ SetLike.mem_coe.2 <| Subalgebra.algebraMap_mem _ _,
fun h =>
@RingEquiv.toRingHom_refl K _ ▸
RingEquiv.self_trans_symm (RingEquiv.ofBijective _ <| Algebra.bijective_algebraMap_iff.2 h) ▸
@@ -102,14 +102,14 @@ theorem mul (f g : F[X]) (hf : f ≠ 0) (hg : g ≠ 0) [IsSplittingField F K f]
splits_mul _ (splits_comp_of_splits _ _ (splits K f))
((splits_map_iff _ _).1 (splits L <| g.map <| algebraMap F K)),
by
- rw [Polynomial.map_mul,
+ rw [root_set, Polynomial.map_mul,
roots_mul (mul_ne_zero (map_ne_zero hf : f.map (algebraMap F L) ≠ 0) (map_ne_zero hg)),
Multiset.toFinset_add, Finset.coe_union, Algebra.adjoin_union_eq_adjoin_adjoin,
IsScalarTower.algebraMap_eq F K L, ← map_map,
roots_map (algebraMap K L) ((splits_id_iff_splits <| algebraMap F K).2 <| splits K f),
- Multiset.toFinset_map, Finset.coe_image, Algebra.adjoin_algebraMap, adjoin_roots,
- Algebra.map_top, IsScalarTower.adjoin_range_toAlgHom, ← map_map, adjoin_roots,
- Subalgebra.restrictScalars_top]⟩
+ Multiset.toFinset_map, Finset.coe_image, Algebra.adjoin_algebraMap, ← root_set,
+ adjoin_root_set, Algebra.map_top, IsScalarTower.adjoin_range_toAlgHom, ← map_map, ← root_set,
+ adjoin_root_set, Subalgebra.restrictScalars_top]⟩
#align polynomial.is_splitting_field.mul Polynomial.IsSplittingField.mul
-/
@@ -129,7 +129,7 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
exact Algebra.toTop
else
AlgHom.comp
- (by rw [← adjoin_roots L f];
+ (by rw [← adjoin_root_set L f];
exact
Classical.choice
(lift_of_splits _ fun y hy =>
@@ -145,9 +145,9 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
#print Polynomial.IsSplittingField.finiteDimensional /-
theorem finiteDimensional (f : K[X]) [IsSplittingField K L f] : FiniteDimensional K L :=
⟨@Algebra.top_toSubmodule K L _ _ _ ▸
- adjoin_roots L f ▸
+ adjoin_rootSet L f ▸
FG_adjoin_of_finite (Finset.finite_toSet _) fun y hy =>
- if hf : f = 0 then by rw [hf, Polynomial.map_zero, roots_zero] at hy ; cases hy
+ if hf : f = 0 then by rw [hf, root_set_zero] at hy ; cases hy
else
isAlgebraic_iff_isIntegral.1
⟨f, hf,
@@ -163,8 +163,8 @@ theorem of_algEquiv [Algebra K F] (p : K[X]) (f : F ≃ₐ[K] L) [IsSplittingFie
· rw [← f.to_alg_hom.comp_algebra_map]
exact splits_comp_of_splits _ _ (splits F p)
·
- rw [← (Algebra.range_top_iff_surjective f.to_alg_hom).mpr f.surjective, ← root_set,
- adjoin_root_set_eq_range (splits F p), root_set, adjoin_roots F p]
+ rw [← (Algebra.range_top_iff_surjective f.to_alg_hom).mpr f.surjective,
+ adjoin_root_set_eq_range (splits F p), adjoin_root_set F p]
#align polynomial.is_splitting_field.of_alg_equiv Polynomial.IsSplittingField.of_algEquiv
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/31c24aa72e7b3e5ed97a8412470e904f82b81004
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes
! This file was ported from Lean 3 source module field_theory.splitting_field.is_splitting_field
-! leanprover-community/mathlib commit df76f43357840485b9d04ed5dee5ab115d420e87
+! leanprover-community/mathlib commit c20927220ef87bb4962ba08bf6da2ce3cf50a6dd
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -15,6 +15,9 @@ import Mathbin.RingTheory.Adjoin.Field
/-!
# Splitting fields
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file introduces the notion of a splitting field of a polynomial and provides an embedding from
a splitting field to any field that splits the polynomial. A polynomial `f : K[X]` splits
over a field extension `L` of `K` if it is zero or all of its irreducible factors over `L` have
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3209ddf94136d36e5e5c624b10b2a347cc9d090
@@ -46,6 +46,7 @@ namespace Polynomial
variable [Field K] [Field L] [Field F] [Algebra K L]
+#print Polynomial.IsSplittingField /-
/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`Splits] [] -/
/- ./././Mathport/Syntax/Translate/Command.lean:394:30: infer kinds are unsupported in Lean 4: #[`adjoin_roots] [] -/
/-- Typeclass characterising splitting fields. -/
@@ -53,6 +54,7 @@ class IsSplittingField (f : K[X]) : Prop where
Splits : Splits (algebraMap K L) f
adjoin_roots : Algebra.adjoin K (↑(f.map (algebraMap K L)).roots.toFinset : Set L) = ⊤
#align polynomial.is_splitting_field Polynomial.IsSplittingField
+-/
variable {K L F}
@@ -62,6 +64,7 @@ section ScalarTower
variable [Algebra F K] [Algebra F L] [IsScalarTower F K L]
+#print Polynomial.IsSplittingField.map /-
instance map (f : F[X]) [IsSplittingField F L f] : IsSplittingField K L (f.map <| algebraMap F K) :=
⟨by rw [splits_map_iff, ← IsScalarTower.algebraMap_eq]; exact splits L f,
Subalgebra.restrictScalars_injective F <|
@@ -70,6 +73,7 @@ instance map (f : F[X]) [IsSplittingField F L f] : IsSplittingField K L (f.map <
adjoin_roots L f, Algebra.adjoin_le_iff]
exact fun x hx => @Algebra.subset_adjoin K _ _ _ _ _ _ hx⟩
#align polynomial.is_splitting_field.map Polynomial.IsSplittingField.map
+-/
variable (L)
@@ -88,6 +92,7 @@ theorem splits_iff (f : K[X]) [IsSplittingField K L f] :
by rw [RingEquiv.toRingHom_trans]; exact splits_comp_of_splits _ _ (splits L f)⟩
#align polynomial.is_splitting_field.splits_iff Polynomial.IsSplittingField.splits_iff
+#print Polynomial.IsSplittingField.mul /-
theorem mul (f g : F[X]) (hf : f ≠ 0) (hg : g ≠ 0) [IsSplittingField F K f]
[IsSplittingField K L (g.map <| algebraMap F K)] : IsSplittingField F L (f * g) :=
⟨(IsScalarTower.algebraMap_eq F K L).symm ▸
@@ -103,11 +108,13 @@ theorem mul (f g : F[X]) (hf : f ≠ 0) (hg : g ≠ 0) [IsSplittingField F K f]
Algebra.map_top, IsScalarTower.adjoin_range_toAlgHom, ← map_map, adjoin_roots,
Subalgebra.restrictScalars_top]⟩
#align polynomial.is_splitting_field.mul Polynomial.IsSplittingField.mul
+-/
end ScalarTower
variable (L)
+#print Polynomial.IsSplittingField.lift /-
/-- Splitting field of `f` embeds into any field that splits `f`. -/
def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
(hf : Polynomial.Splits (algebraMap K F) f) : L →ₐ[K] F :=
@@ -130,7 +137,9 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
splits_of_splits_of_dvd _ hf0 hf <| minpoly.dvd _ _ this⟩))
Algebra.toTop
#align polynomial.is_splitting_field.lift Polynomial.IsSplittingField.lift
+-/
+#print Polynomial.IsSplittingField.finiteDimensional /-
theorem finiteDimensional (f : K[X]) [IsSplittingField K L f] : FiniteDimensional K L :=
⟨@Algebra.top_toSubmodule K L _ _ _ ▸
adjoin_roots L f ▸
@@ -142,7 +151,9 @@ theorem finiteDimensional (f : K[X]) [IsSplittingField K L f] : FiniteDimensiona
(eval₂_eq_eval_map _).trans <|
(mem_roots <| map_ne_zero hf).1 (Multiset.mem_toFinset.mp hy)⟩⟩
#align polynomial.is_splitting_field.finite_dimensional Polynomial.IsSplittingField.finiteDimensional
+-/
+#print Polynomial.IsSplittingField.of_algEquiv /-
theorem of_algEquiv [Algebra K F] (p : K[X]) (f : F ≃ₐ[K] L) [IsSplittingField K F p] :
IsSplittingField K L p := by
constructor
@@ -152,6 +163,7 @@ theorem of_algEquiv [Algebra K F] (p : K[X]) (f : F ≃ₐ[K] L) [IsSplittingFie
rw [← (Algebra.range_top_iff_surjective f.to_alg_hom).mpr f.surjective, ← root_set,
adjoin_root_set_eq_range (splits F p), root_set, adjoin_roots F p]
#align polynomial.is_splitting_field.of_alg_equiv Polynomial.IsSplittingField.of_algEquiv
+-/
end IsSplittingField
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3209ddf94136d36e5e5c624b10b2a347cc9d090
@@ -3,7 +3,6 @@ Copyright (c) 2018 Chris Hughes. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes
-/
-import Mathlib.Algebra.CharP.Algebra
import Mathlib.FieldTheory.IntermediateField
import Mathlib.RingTheory.Adjoin.Field
generalize image_rootSet
, adjoin_rootSet_eq_range
and splits_comp_of_splits
in Data/Polynomial/Splits and use the last one to golf splits_of_algHom
, splits_of_isScalarTower
(introduced in # 8609).
add three new lemmas mem_range_x_of_minpoly_splits
to simplify the construction of IntermediateField.algHomEquivAlgHomOfIsAlgClosed
and Algebra.IsAlgebraic.algHomEquivAlgHomOfIsAlgClosed
, remove the IsAlgClosed
condition and rename. They could be moved to an earlier file but I refrain from doing that. (#find_home says it's already in the right place)
golf primitive_element_iff_algHom_eq_of_eval
from # 8609, using a new lemma IsIntegral.minpoly_splits_tower_top
for the last step.
make integralClosure_algEquiv_restrict
(from # 8714) computable and rename to AlgEquiv.mapIntegralClosure
to follow camelCase naming convention and enable dot notation.
Co-authored-by: Xavier-François Roblot <46200072+xroblot@users.noreply.github.com> Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -151,16 +151,16 @@ end IsSplittingField
end Polynomial
-namespace IntermediateField
-
open Polynomial
-variable {K L} [Field K] [Field L] [Algebra K L] {p : K[X]}
+variable {K L} [Field K] [Field L] [Algebra K L] {p : K[X]} {F : IntermediateField K L}
-theorem splits_of_splits {F : IntermediateField K L} (h : p.Splits (algebraMap K L))
+theorem IntermediateField.splits_of_splits (h : p.Splits (algebraMap K L))
(hF : ∀ x ∈ p.rootSet L, x ∈ F) : p.Splits (algebraMap K F) := by
simp_rw [← F.fieldRange_val, rootSet_def, Finset.mem_coe, Multiset.mem_toFinset] at hF
exact splits_of_comp _ F.val.toRingHom h hF
#align intermediate_field.splits_of_splits IntermediateField.splits_of_splits
-end IntermediateField
+theorem IsIntegral.mem_intermediateField_of_minpoly_splits {x : L} (int : IsIntegral K x)
+ {F : IntermediateField K L} (h : Splits (algebraMap K F) (minpoly K x)) : x ∈ F := by
+ rw [← F.fieldRange_val]; exact int.mem_range_algebraMap_of_minpoly_splits h
Initially I just wanted to add more dot notations for IsIntegral and IsAlgebraic (done in #8437); then I noticed near-duplicates
Algebra.isIntegral_of_finite [Field R] [Ring A]
and
RingHom.IsIntegral.of_finite [CommRing R] [CommRing A]
so I went on to generalize the latter to cover the former, and generalized everything in the IntegralClosure file to the noncommutative case whenever possible.
In the process I noticed more golfs, which result in this PR. Most notably, isIntegral_of_mem_of_FG is now proven using Cayley-Hamilton and doesn't depend on the Noetherian case isIntegral_of_noetherian; the latter is now proven using the former. In total the golfs makes mathlib 227 lines leaner (+487 -714).
The main changes are in the single file RingTheory/IntegralClosure:
Change the definition of Algebra.IsIntegral
which makes it unfold to IsIntegral
rather than RingHom.IsIntegralElem
because the former has much more APIs.
Fix lemma names involving is_integral
which are actually about IsIntegralElem
:
RingHom.is_integral_map
→ RingHom.isIntegralElem_map
RingHom.is_integral_of_mem_closure
→ RingHom.IsIntegralElem.of_mem_closure
RingHom.is_integral_zero/one
→ RingHom.isIntegralElem_zero/one
RingHom.is_integral_add/neg/sub/mul/of_mul_unit
→ RingHom.IsIntegralElem.add/neg/sub/mul/of_mul_unit
Add a lemma Algebra.IsIntegral.of_injective
.
Move isIntegral_of_(submodule_)noetherian
down and golf them.
Remove (Algebra.)isIntegral_of_finite
that work only over fields, in favor of the more general (Algebra.)isIntegral.of_finite
.
Merge duplicate lemmas isIntegral_of_isScalarTower
and isIntegral_tower_top_of_isIntegral
into IsIntegral.tower_top
.
Golf IsIntegral.of_mem_of_fg
by first proving IsIntegral.of_finite
using Cayley-Hamilton.
Add a docstring mentioning the Kurosh problem at Algebra.IsIntegral.finite
. The negative solution to the problem means the theorem doesn't generalize to noncommutative algebras.
Golf IsIntegral.tmul
and isField_of_isIntegral_of_isField(')
.
Combine isIntegral_trans_aux
into isIntegral_trans
and golf.
Add Algebra
namespace to isIntegral_sup
.
rename lemmas for dot notation:
RingHom.isIntegral_trans
→ RingHom.IsIntegral.trans
RingHom.isIntegral_quotient/tower_bot/top_of_isIntegral
→ RingHom.IsIntegral.quotient/tower_bot/top
isIntegral_of_mem_closure'
→ IsIntegral.of_mem_closure'
(and the '' version)
isIntegral_of_surjective
→ Algebra.isIntegral_of_surjective
The next changed file is RingTheory/Algebraic:
Rename:
of_larger_base
→ tower_top
(for consistency with IsIntegral
)
Algebra.isAlgebraic_of_finite
→ Algebra.IsAlgebraic.of_finite
Algebra.isAlgebraic_trans
→ Algebra.IsAlgebraic.trans
Add new lemmasAlgebra.IsIntegral.isAlgebraic
, isAlgebraic_algHom_iff
, and Algebra.IsAlgebraic.of_injective
to streamline some proofs.
The generalization from CommRing to Ring requires an additional lemma scaleRoots_eval₂_mul_of_commute
in Polynomial/ScaleRoots.
A lemma Algebra.lmul_injective
is added to Algebra/Bilinear (in order to golf the proof of IsIntegral.of_mem_of_fg
).
In all other files, I merely fix the changed names, or use newly available dot notations.
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -123,7 +123,7 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
exact Classical.choice (lift_of_splits _ fun y hy =>
have : aeval y f = 0 := (eval₂_eq_eval_map _).trans <|
(mem_roots <| map_ne_zero hf0).1 (Multiset.mem_toFinset.mp hy)
- ⟨isAlgebraic_iff_isIntegral.1 ⟨f, hf0, this⟩,
+ ⟨IsAlgebraic.isIntegral ⟨f, hf0, this⟩,
splits_of_splits_of_dvd _ hf0 hf <| minpoly.dvd _ _ this⟩)) Algebra.toTop
#align polynomial.is_splitting_field.lift Polynomial.IsSplittingField.lift
@@ -131,7 +131,7 @@ theorem finiteDimensional (f : K[X]) [IsSplittingField K L f] : FiniteDimensiona
⟨@Algebra.top_toSubmodule K L _ _ _ ▸
adjoin_rootSet L f ▸ fg_adjoin_of_finite (Finset.finite_toSet _) fun y hy ↦
if hf : f = 0 then by rw [hf, rootSet_zero] at hy; cases hy
- else isAlgebraic_iff_isIntegral.1 ⟨f, hf, (mem_rootSet'.mp hy).2⟩⟩
+ else IsAlgebraic.isIntegral ⟨f, hf, (mem_rootSet'.mp hy).2⟩⟩
#align polynomial.is_splitting_field.finite_dimensional Polynomial.IsSplittingField.finiteDimensional
theorem of_algEquiv [Algebra K F] (p : K[X]) (f : F ≃ₐ[K] L) [IsSplittingField K F p] :
This PR tests a string-based tool for renaming declarations.
Inspired by this Zulip thread, I am trying to reduce the diff of #8406.
This PR makes the following renames:
| From | To |
@@ -129,7 +129,7 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
theorem finiteDimensional (f : K[X]) [IsSplittingField K L f] : FiniteDimensional K L :=
⟨@Algebra.top_toSubmodule K L _ _ _ ▸
- adjoin_rootSet L f ▸ FG_adjoin_of_finite (Finset.finite_toSet _) fun y hy ↦
+ adjoin_rootSet L f ▸ fg_adjoin_of_finite (Finset.finite_toSet _) fun y hy ↦
if hf : f = 0 then by rw [hf, rootSet_zero] at hy; cases hy
else isAlgebraic_iff_isIntegral.1 ⟨f, hf, (mem_rootSet'.mp hy).2⟩⟩
#align polynomial.is_splitting_field.finite_dimensional Polynomial.IsSplittingField.finiteDimensional
Before: Construction only imports Normal, which transitively imports IsSplittingField
Now: Normal imports Construction, Construction only imports IsSplittingField
So no extra transitive import is added to any file other than Construction and Normal.
As a consequence, Polynomial.SplittingField.instNormal
is moved from Construction to Normal.
adjoin_rootSet_eq_range
is added to IsSplittingField.
splits_of_comp
in Splits is extracted from splits_of_splits
in IsSplittingField.
Source of proof: https://math.stackexchange.com/a/2585087/12932
Move Algebra.adjoin.liftSingleton
from IsAlgClosed/Basic to Adjoin/Field in order to speed up lift_of_splits
(renamed to add namespace Polynomial
).
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -79,7 +79,7 @@ instance map (f : F[X]) [IsSplittingField F L f] : IsSplittingField K L (f.map <
#align polynomial.is_splitting_field.map Polynomial.IsSplittingField.map
theorem splits_iff (f : K[X]) [IsSplittingField K L f] :
- Polynomial.Splits (RingHom.id K) f ↔ (⊤ : Subalgebra K L) = ⊥ :=
+ Splits (RingHom.id K) f ↔ (⊤ : Subalgebra K L) = ⊥ :=
⟨fun h => by -- Porting note: replaced term-mode proof
rw [eq_bot_iff, ← adjoin_rootSet L f, rootSet, aroots, roots_map (algebraMap K L) h,
Algebra.adjoin_le_iff]
@@ -112,7 +112,7 @@ end ScalarTower
/-- Splitting field of `f` embeds into any field that splits `f`. -/
def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
- (hf : Polynomial.Splits (algebraMap K F) f) : L →ₐ[K] F :=
+ (hf : Splits (algebraMap K F) f) : L →ₐ[K] F :=
if hf0 : f = 0 then
(Algebra.ofId K F).comp <|
(Algebra.botEquiv K L : (⊥ : Subalgebra K L) →ₐ[K] K).comp <| by
@@ -129,11 +129,9 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
theorem finiteDimensional (f : K[X]) [IsSplittingField K L f] : FiniteDimensional K L :=
⟨@Algebra.top_toSubmodule K L _ _ _ ▸
- adjoin_rootSet L f ▸ FG_adjoin_of_finite (Finset.finite_toSet _) fun y hy =>
+ adjoin_rootSet L f ▸ FG_adjoin_of_finite (Finset.finite_toSet _) fun y hy ↦
if hf : f = 0 then by rw [hf, rootSet_zero] at hy; cases hy
- else
- isAlgebraic_iff_isIntegral.1 ⟨f, hf, (eval₂_eq_eval_map _).trans <|
- (mem_roots <| map_ne_zero hf).1 (Multiset.mem_toFinset.mp hy)⟩⟩
+ else isAlgebraic_iff_isIntegral.1 ⟨f, hf, (mem_rootSet'.mp hy).2⟩⟩
#align polynomial.is_splitting_field.finite_dimensional Polynomial.IsSplittingField.finiteDimensional
theorem of_algEquiv [Algebra K F] (p : K[X]) (f : F ≃ₐ[K] L) [IsSplittingField K F p] :
@@ -145,6 +143,10 @@ theorem of_algEquiv [Algebra K F] (p : K[X]) (f : F ≃ₐ[K] L) [IsSplittingFie
adjoin_rootSet_eq_range (splits F p), adjoin_rootSet F p]
#align polynomial.is_splitting_field.of_alg_equiv Polynomial.IsSplittingField.of_algEquiv
+theorem adjoin_rootSet_eq_range [Algebra K F] (f : K[X]) [IsSplittingField K L f] (i : L →ₐ[K] F) :
+ Algebra.adjoin K (rootSet f F) = i.range :=
+ (Polynomial.adjoin_rootSet_eq_range (splits L f) i).mpr (adjoin_rootSet L f)
+
end IsSplittingField
end Polynomial
@@ -157,15 +159,8 @@ variable {K L} [Field K] [Field L] [Algebra K L] {p : K[X]}
theorem splits_of_splits {F : IntermediateField K L} (h : p.Splits (algebraMap K L))
(hF : ∀ x ∈ p.rootSet L, x ∈ F) : p.Splits (algebraMap K F) := by
- simp_rw [rootSet_def, Finset.mem_coe, Multiset.mem_toFinset] at hF
- rw [splits_iff_exists_multiset]
- refine' ⟨Multiset.pmap Subtype.mk _ hF, map_injective _ (algebraMap F L).injective _⟩
- conv_lhs =>
- rw [Polynomial.map_map, ← IsScalarTower.algebraMap_eq, eq_prod_roots_of_splits h, ←
- Multiset.pmap_eq_map _ _ _ hF]
- simp_rw [Polynomial.map_mul, Polynomial.map_multiset_prod, Multiset.map_pmap, Polynomial.map_sub,
- map_C, map_X]
- rfl
+ simp_rw [← F.fieldRange_val, rootSet_def, Finset.mem_coe, Multiset.mem_toFinset] at hF
+ exact splits_of_comp _ F.val.toRingHom h hF
#align intermediate_field.splits_of_splits IntermediateField.splits_of_splits
end IntermediateField
@@ -73,7 +73,7 @@ variable [Algebra F K] [Algebra F L] [IsScalarTower F K L]
instance map (f : F[X]) [IsSplittingField F L f] : IsSplittingField K L (f.map <| algebraMap F K) :=
⟨by rw [splits_map_iff, ← IsScalarTower.algebraMap_eq]; exact splits L f,
Subalgebra.restrictScalars_injective F <| by
- rw [rootSet, map_map, ← IsScalarTower.algebraMap_eq, Subalgebra.restrictScalars_top,
+ rw [rootSet, aroots, map_map, ← IsScalarTower.algebraMap_eq, Subalgebra.restrictScalars_top,
eq_top_iff, ← adjoin_rootSet L f, Algebra.adjoin_le_iff]
exact fun x hx => @Algebra.subset_adjoin K _ _ _ _ _ _ hx⟩
#align polynomial.is_splitting_field.map Polynomial.IsSplittingField.map
@@ -81,7 +81,7 @@ instance map (f : F[X]) [IsSplittingField F L f] : IsSplittingField K L (f.map <
theorem splits_iff (f : K[X]) [IsSplittingField K L f] :
Polynomial.Splits (RingHom.id K) f ↔ (⊤ : Subalgebra K L) = ⊥ :=
⟨fun h => by -- Porting note: replaced term-mode proof
- rw [eq_bot_iff, ← adjoin_rootSet L f, rootSet, roots_map (algebraMap K L) h,
+ rw [eq_bot_iff, ← adjoin_rootSet L f, rootSet, aroots, roots_map (algebraMap K L) h,
Algebra.adjoin_le_iff]
intro y hy
rw [Multiset.toFinset_map, Finset.mem_coe, Finset.mem_image] at hy
@@ -99,10 +99,9 @@ theorem mul (f g : F[X]) (hf : f ≠ 0) (hg : g ≠ 0) [IsSplittingField F K f]
⟨(IsScalarTower.algebraMap_eq F K L).symm ▸
splits_mul _ (splits_comp_of_splits _ _ (splits K f))
((splits_map_iff _ _).1 (splits L <| g.map <| algebraMap F K)), by
- rw [rootSet, Polynomial.map_mul,
- roots_mul (mul_ne_zero (map_ne_zero hf : f.map (algebraMap F L) ≠ 0) (map_ne_zero hg)),
+ rw [rootSet, aroots_mul (mul_ne_zero hf hg),
Multiset.toFinset_add, Finset.coe_union, Algebra.adjoin_union_eq_adjoin_adjoin,
- IsScalarTower.algebraMap_eq F K L, ← map_map,
+ aroots_def, aroots_def, IsScalarTower.algebraMap_eq F K L, ← map_map,
roots_map (algebraMap K L) ((splits_id_iff_splits <| algebraMap F K).2 <| splits K f),
Multiset.toFinset_map, Finset.coe_image, Algebra.adjoin_algebraMap, ← rootSet, adjoin_rootSet,
Algebra.map_top, IsScalarTower.adjoin_range_toAlgHom, ← map_map, ← rootSet, adjoin_rootSet,
@@ -2,16 +2,13 @@
Copyright (c) 2018 Chris Hughes. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes
-
-! This file was ported from Lean 3 source module field_theory.splitting_field.is_splitting_field
-! leanprover-community/mathlib commit 9fb8964792b4237dac6200193a0d533f1b3f7423
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Algebra.CharP.Algebra
import Mathlib.FieldTheory.IntermediateField
import Mathlib.RingTheory.Adjoin.Field
+#align_import field_theory.splitting_field.is_splitting_field from "leanprover-community/mathlib"@"9fb8964792b4237dac6200193a0d533f1b3f7423"
+
/-!
# Splitting fields
The important thing to forward-port here is the addition of [DecidableEq _]
to a handful of lemmas.
linear_algebra.eigenspace.minpoly
did not need anything forward-porting, as the proof which broke in mathlib3 did not break in mathlib4.
The nthRootsFinset_def
lemma was forgotten in the mathlib3 PR.
@@ -161,7 +161,7 @@ variable {K L} [Field K] [Field L] [Algebra K L] {p : K[X]}
theorem splits_of_splits {F : IntermediateField K L} (h : p.Splits (algebraMap K L))
(hF : ∀ x ∈ p.rootSet L, x ∈ F) : p.Splits (algebraMap K F) := by
- simp_rw [rootSet, Finset.mem_coe, Multiset.mem_toFinset] at hF
+ simp_rw [rootSet_def, Finset.mem_coe, Multiset.mem_toFinset] at hF
rw [splits_iff_exists_multiset]
refine' ⟨Multiset.pmap Subtype.mk _ hF, map_injective _ (algebraMap F L).injective _⟩
conv_lhs =>
Strangely, making one proof use fewer simp lemmas has made the proof slower (and the hearbeats have been bumped accordingly)
Co-authored-by: Scott Morrison <scott.morrison@anu.edu.au>
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes
! This file was ported from Lean 3 source module field_theory.splitting_field.is_splitting_field
-! leanprover-community/mathlib commit df76f43357840485b9d04ed5dee5ab115d420e87
+! leanprover-community/mathlib commit 9fb8964792b4237dac6200193a0d533f1b3f7423
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -49,7 +49,7 @@ variable [Field K] [Field L] [Field F] [Algebra K L]
/-- Typeclass characterising splitting fields. -/
class IsSplittingField (f : K[X]) : Prop where
splits' : Splits (algebraMap K L) f
- adjoin_roots' : Algebra.adjoin K (↑(f.map (algebraMap K L)).roots.toFinset : Set L) = ⊤
+ adjoin_rootSet' : Algebra.adjoin K (f.rootSet L : Set L) = ⊤
#align polynomial.is_splitting_field Polynomial.IsSplittingField
namespace IsSplittingField
@@ -63,11 +63,11 @@ theorem splits (f : K[X]) [IsSplittingField K L f] : Splits (algebraMap K L) f :
#align polynomial.is_splitting_field.splits Polynomial.IsSplittingField.splits
-- Porting note: infer kinds are unsupported
--- so we provide a version of `adjoin_roots'` with `f` explicit.
-theorem adjoin_roots (f : K[X]) [IsSplittingField K L f] :
- Algebra.adjoin K (↑(f.map (algebraMap K L)).roots.toFinset : Set L) = ⊤ :=
- adjoin_roots'
-#align polynomial.is_splitting_field.adjoin_roots Polynomial.IsSplittingField.adjoin_roots
+-- so we provide a version of `adjoin_rootSet'` with `f` explicit.
+theorem adjoin_rootSet (f : K[X]) [IsSplittingField K L f] :
+ Algebra.adjoin K (f.rootSet L : Set L) = ⊤ :=
+ adjoin_rootSet'
+#align polynomial.is_splitting_field.adjoin_root_set Polynomial.IsSplittingField.adjoin_rootSet
section ScalarTower
@@ -76,15 +76,16 @@ variable [Algebra F K] [Algebra F L] [IsScalarTower F K L]
instance map (f : F[X]) [IsSplittingField F L f] : IsSplittingField K L (f.map <| algebraMap F K) :=
⟨by rw [splits_map_iff, ← IsScalarTower.algebraMap_eq]; exact splits L f,
Subalgebra.restrictScalars_injective F <| by
- rw [map_map, ← IsScalarTower.algebraMap_eq, Subalgebra.restrictScalars_top, eq_top_iff, ←
- adjoin_roots L f, Algebra.adjoin_le_iff]
+ rw [rootSet, map_map, ← IsScalarTower.algebraMap_eq, Subalgebra.restrictScalars_top,
+ eq_top_iff, ← adjoin_rootSet L f, Algebra.adjoin_le_iff]
exact fun x hx => @Algebra.subset_adjoin K _ _ _ _ _ _ hx⟩
#align polynomial.is_splitting_field.map Polynomial.IsSplittingField.map
theorem splits_iff (f : K[X]) [IsSplittingField K L f] :
Polynomial.Splits (RingHom.id K) f ↔ (⊤ : Subalgebra K L) = ⊥ :=
⟨fun h => by -- Porting note: replaced term-mode proof
- rw [eq_bot_iff, ← adjoin_roots L f, roots_map (algebraMap K L) h, Algebra.adjoin_le_iff]
+ rw [eq_bot_iff, ← adjoin_rootSet L f, rootSet, roots_map (algebraMap K L) h,
+ Algebra.adjoin_le_iff]
intro y hy
rw [Multiset.toFinset_map, Finset.mem_coe, Finset.mem_image] at hy
obtain ⟨x : K, -, hxy : algebraMap K L x = y⟩ := hy
@@ -101,13 +102,13 @@ theorem mul (f g : F[X]) (hf : f ≠ 0) (hg : g ≠ 0) [IsSplittingField F K f]
⟨(IsScalarTower.algebraMap_eq F K L).symm ▸
splits_mul _ (splits_comp_of_splits _ _ (splits K f))
((splits_map_iff _ _).1 (splits L <| g.map <| algebraMap F K)), by
- rw [Polynomial.map_mul,
+ rw [rootSet, Polynomial.map_mul,
roots_mul (mul_ne_zero (map_ne_zero hf : f.map (algebraMap F L) ≠ 0) (map_ne_zero hg)),
Multiset.toFinset_add, Finset.coe_union, Algebra.adjoin_union_eq_adjoin_adjoin,
IsScalarTower.algebraMap_eq F K L, ← map_map,
roots_map (algebraMap K L) ((splits_id_iff_splits <| algebraMap F K).2 <| splits K f),
- Multiset.toFinset_map, Finset.coe_image, Algebra.adjoin_algebraMap, adjoin_roots,
- Algebra.map_top, IsScalarTower.adjoin_range_toAlgHom, ← map_map, adjoin_roots,
+ Multiset.toFinset_map, Finset.coe_image, Algebra.adjoin_algebraMap, ← rootSet, adjoin_rootSet,
+ Algebra.map_top, IsScalarTower.adjoin_range_toAlgHom, ← map_map, ← rootSet, adjoin_rootSet,
Subalgebra.restrictScalars_top]⟩
#align polynomial.is_splitting_field.mul Polynomial.IsSplittingField.mul
@@ -122,7 +123,7 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
rw [← (splits_iff L f).1 (show f.Splits (RingHom.id K) from hf0.symm ▸ splits_zero _)]
exact Algebra.toTop
else AlgHom.comp (by
- rw [← adjoin_roots L f];
+ rw [← adjoin_rootSet L f];
exact Classical.choice (lift_of_splits _ fun y hy =>
have : aeval y f = 0 := (eval₂_eq_eval_map _).trans <|
(mem_roots <| map_ne_zero hf0).1 (Multiset.mem_toFinset.mp hy)
@@ -132,8 +133,9 @@ def lift [Algebra K F] (f : K[X]) [IsSplittingField K L f]
theorem finiteDimensional (f : K[X]) [IsSplittingField K L f] : FiniteDimensional K L :=
⟨@Algebra.top_toSubmodule K L _ _ _ ▸
- adjoin_roots L f ▸ FG_adjoin_of_finite (Finset.finite_toSet _) fun y hy =>
- if hf : f = 0 then by rw [hf, Polynomial.map_zero, roots_zero] at hy; cases hy else
+ adjoin_rootSet L f ▸ FG_adjoin_of_finite (Finset.finite_toSet _) fun y hy =>
+ if hf : f = 0 then by rw [hf, rootSet_zero] at hy; cases hy
+ else
isAlgebraic_iff_isIntegral.1 ⟨f, hf, (eval₂_eq_eval_map _).trans <|
(mem_roots <| map_ne_zero hf).1 (Multiset.mem_toFinset.mp hy)⟩⟩
#align polynomial.is_splitting_field.finite_dimensional Polynomial.IsSplittingField.finiteDimensional
@@ -143,8 +145,8 @@ theorem of_algEquiv [Algebra K F] (p : K[X]) (f : F ≃ₐ[K] L) [IsSplittingFie
constructor
· rw [← f.toAlgHom.comp_algebraMap]
exact splits_comp_of_splits _ _ (splits F p)
- · rw [← (Algebra.range_top_iff_surjective f.toAlgHom).mpr f.surjective, ← rootSet,
- adjoin_rootSet_eq_range (splits F p), rootSet, adjoin_roots F p]
+ · rw [← (Algebra.range_top_iff_surjective f.toAlgHom).mpr f.surjective,
+ adjoin_rootSet_eq_range (splits F p), adjoin_rootSet F p]
#align polynomial.is_splitting_field.of_alg_equiv Polynomial.IsSplittingField.of_algEquiv
end IsSplittingField
The unported dependencies are