field_theory.abel_ruffini
⟷
Mathlib.FieldTheory.AbelRuffini
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)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -173,7 +173,7 @@ theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
have key : (σ b / b) ^ n = 1 := by rw [div_pow, ← σ.map_pow, hb, σ.commutes, div_self ha']
obtain ⟨c, hc⟩ := mem_range key
use c
- rw [hc, mul_div_cancel' (σ b) hb']
+ rw [hc, mul_div_cancel₀ (σ b) hb']
obtain ⟨c, hc⟩ := key σ
obtain ⟨d, hd⟩ := key τ
rw [σ.mul_apply, τ.mul_apply, hc, τ.map_mul, τ.commutes, hd, σ.map_mul, σ.commutes, hc]
@@ -217,7 +217,7 @@ theorem splits_X_pow_sub_one_of_X_pow_sub_C {F : Type _} [Field F] {E : Type _}
by
ext1 c
change (X - C c).comp (C b * X) = C b * (X - C (c / b))
- rw [sub_comp, X_comp, C_comp, mul_sub, ← C_mul, mul_div_cancel' c hb']
+ rw [sub_comp, X_comp, C_comp, mul_sub, ← C_mul, mul_div_cancel₀ c hb']
rw [key1, hs, multiset_prod_comp, Multiset.map_map, key2, Multiset.prod_map_mul,
Multiset.map_const, Multiset.prod_replicate, hs', ← C_pow, hb, ← mul_assoc, C_mul_C, one_mul]
all_goals exact field.to_nontrivial F
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -125,7 +125,7 @@ theorem gal_X_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).G
apply isSolvable_of_comm
intro σ τ
ext a ha
- simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_one, sub_eq_zero] at ha
+ simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_one, sub_eq_zero] at ha
have key : ∀ σ : (X ^ n - 1 : F[X]).Gal, ∃ m : ℕ, σ a = a ^ m :=
by
intro σ
@@ -162,10 +162,10 @@ theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
apply isSolvable_of_comm
intro σ τ
ext b hb
- simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_C, sub_eq_zero] at hb
+ simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_C, sub_eq_zero] at hb
have hb' : b ≠ 0 := by
intro hb'
- rw [hb', zero_pow hn'] at hb
+ rw [hb', zero_pow hn'] at hb
exact ha' hb.symm
have key : ∀ σ : (X ^ n - C a).Gal, ∃ c, σ b = b * algebraMap F _ c :=
by
@@ -194,14 +194,14 @@ theorem splits_X_pow_sub_one_of_X_pow_sub_C {F : Type _} [Field F] {E : Type _}
have hn'' : (X ^ n - C a).degree ≠ 0 :=
ne_of_eq_of_ne (degree_X_pow_sub_C hn' a) (mt with_bot.coe_eq_coe.mp hn)
obtain ⟨b, hb⟩ := exists_root_of_splits i h hn''
- rw [eval₂_sub, eval₂_X_pow, eval₂_C, sub_eq_zero] at hb
+ rw [eval₂_sub, eval₂_X_pow, eval₂_C, sub_eq_zero] at hb
have hb' : b ≠ 0 := by
intro hb'
- rw [hb', zero_pow hn'] at hb
+ rw [hb', zero_pow hn'] at hb
exact ha' hb.symm
let s := ((X ^ n - C a).map i).roots
have hs : _ = _ * (s.map _).Prod := eq_prod_roots_of_splits h
- rw [leading_coeff_X_pow_sub_C hn', RingHom.map_one, C_1, one_mul] at hs
+ rw [leading_coeff_X_pow_sub_C hn', RingHom.map_one, C_1, one_mul] at hs
have hs' : s.card = n := (nat_degree_eq_card_roots h).symm.trans nat_degree_X_pow_sub_C
apply @splits_of_exists_multiset F E _ _ i (X ^ n - 1) (s.map fun c : E => c / b)
rw [leading_coeff_X_pow_sub_one hn', RingHom.map_one, C_1, one_mul, Multiset.map_map]
@@ -237,7 +237,7 @@ theorem gal_X_pow_sub_C_isSolvable (n : ℕ) (x : F) : IsSolvable (X ^ n - C x).
apply gal_X_pow_sub_C_isSolvable_aux
have key := splitting_field.splits (X ^ n - 1 : F[X])
rwa [← splits_id_iff_splits, Polynomial.map_sub, Polynomial.map_pow, map_X,
- Polynomial.map_one] at key
+ Polynomial.map_one] at key
#align gal_X_pow_sub_C_is_solvable gal_X_pow_sub_C_isSolvable
-/
@@ -336,7 +336,7 @@ theorem isIntegral (α : solvableByRad F E) : IsIntegral F α :=
is_algebraic_iff_is_integral.mp
⟨p.comp (X ^ n),
⟨fun h => h1 (leading_coeff_eq_zero.mp _), by rw [aeval_comp, aeval_X_pow, h2]⟩⟩
- rwa [← leading_coeff_eq_zero, leading_coeff_comp, leading_coeff_X_pow, one_pow, mul_one] at h
+ rwa [← leading_coeff_eq_zero, leading_coeff_comp, leading_coeff_X_pow, one_pow, mul_one] at h
rwa [nat_degree_X_pow]
#align solvable_by_rad.is_integral solvableByRad.isIntegral
-/
@@ -371,9 +371,9 @@ theorem induction3 {α : solvableByRad F E} {n : ℕ} (hn : n ≠ 0) (hα : P (
rw [multiset_prod_comp]
apply gal_prod_isSolvable
intro q hq
- rw [Multiset.mem_map] at hq
+ rw [Multiset.mem_map] at hq
obtain ⟨q, hq, rfl⟩ := hq
- rw [Multiset.mem_map] at hq
+ rw [Multiset.mem_map] at hq
obtain ⟨q, hq, rfl⟩ := hq
rw [sub_comp, X_comp, C_comp]
exact gal_X_pow_sub_C_isSolvable n q
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -322,9 +322,9 @@ theorem isIntegral (α : solvableByRad F E) : IsIntegral F α :=
revert α
apply solvableByRad.induction
· exact fun _ => isIntegral_algebraMap
- · exact fun _ _ => isIntegral_add
- · exact fun _ => isIntegral_neg
- · exact fun _ _ => isIntegral_mul
+ · exact fun _ _ => IsIntegral.add
+ · exact fun _ => IsIntegral.neg
+ · exact fun _ _ => IsIntegral.mul
·
exact fun α hα =>
Subalgebra.inv_mem_of_algebraic (integralClosure F (solvableByRad F E))
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2020 Thomas Browning and Patrick Lutz. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
-/
-import Mathbin.GroupTheory.Solvable
-import Mathbin.FieldTheory.PolynomialGaloisGroup
-import Mathbin.RingTheory.RootsOfUnity.Basic
+import GroupTheory.Solvable
+import FieldTheory.PolynomialGaloisGroup
+import RingTheory.RootsOfUnity.Basic
#align_import field_theory.abel_ruffini from "leanprover-community/mathlib"@"30faa0c3618ce1472bf6305ae0e3fa56affa3f95"
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -268,7 +268,7 @@ def solvableByRad : IntermediateField F E
add_mem' := IsSolvableByRad.add
neg_mem' := IsSolvableByRad.neg
one_mem' := by convert IsSolvableByRad.base (1 : F); rw [RingHom.map_one]
- mul_mem' := IsSolvableByRad.mul
+ hMul_mem' := IsSolvableByRad.mul
inv_mem' := IsSolvableByRad.inv
algebraMap_mem' := IsSolvableByRad.base
#align solvable_by_rad solvableByRad
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2020 Thomas Browning and Patrick Lutz. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
-
-! This file was ported from Lean 3 source module field_theory.abel_ruffini
-! leanprover-community/mathlib commit 30faa0c3618ce1472bf6305ae0e3fa56affa3f95
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.GroupTheory.Solvable
import Mathbin.FieldTheory.PolynomialGaloisGroup
import Mathbin.RingTheory.RootsOfUnity.Basic
+#align_import field_theory.abel_ruffini from "leanprover-community/mathlib"@"30faa0c3618ce1472bf6305ae0e3fa56affa3f95"
+
/-!
# The Abel-Ruffini Theorem
mathlib commit https://github.com/leanprover-community/mathlib/commit/8b981918a93bc45a8600de608cde7944a80d92b9
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
! This file was ported from Lean 3 source module field_theory.abel_ruffini
-! leanprover-community/mathlib commit e3f4be1fcb5376c4948d7f095bec45350bfb9d1a
+! leanprover-community/mathlib commit 30faa0c3618ce1472bf6305ae0e3fa56affa3f95
! 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.RootsOfUnity.Basic
/-!
# The Abel-Ruffini Theorem
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file proves one direction of the Abel-Ruffini theorem, namely that if an element is solvable
by radicals, then its minimal polynomial has solvable Galois group.
mathlib commit https://github.com/leanprover-community/mathlib/commit/93f880918cb51905fd51b76add8273cbc27718ab
@@ -39,29 +39,44 @@ section AbelRuffini
variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E]
+#print gal_zero_isSolvable /-
theorem gal_zero_isSolvable : IsSolvable (0 : F[X]).Gal := by infer_instance
#align gal_zero_is_solvable gal_zero_isSolvable
+-/
+#print gal_one_isSolvable /-
theorem gal_one_isSolvable : IsSolvable (1 : F[X]).Gal := by infer_instance
#align gal_one_is_solvable gal_one_isSolvable
+-/
-theorem gal_c_isSolvable (x : F) : IsSolvable (C x).Gal := by infer_instance
-#align gal_C_is_solvable gal_c_isSolvable
+#print gal_C_isSolvable /-
+theorem gal_C_isSolvable (x : F) : IsSolvable (C x).Gal := by infer_instance
+#align gal_C_is_solvable gal_C_isSolvable
+-/
-theorem gal_x_isSolvable : IsSolvable (X : F[X]).Gal := by infer_instance
-#align gal_X_is_solvable gal_x_isSolvable
+#print gal_X_isSolvable /-
+theorem gal_X_isSolvable : IsSolvable (X : F[X]).Gal := by infer_instance
+#align gal_X_is_solvable gal_X_isSolvable
+-/
-theorem gal_x_sub_c_isSolvable (x : F) : IsSolvable (X - C x).Gal := by infer_instance
-#align gal_X_sub_C_is_solvable gal_x_sub_c_isSolvable
+#print gal_X_sub_C_isSolvable /-
+theorem gal_X_sub_C_isSolvable (x : F) : IsSolvable (X - C x).Gal := by infer_instance
+#align gal_X_sub_C_is_solvable gal_X_sub_C_isSolvable
+-/
-theorem gal_x_pow_isSolvable (n : ℕ) : IsSolvable (X ^ n : F[X]).Gal := by infer_instance
-#align gal_X_pow_is_solvable gal_x_pow_isSolvable
+#print gal_X_pow_isSolvable /-
+theorem gal_X_pow_isSolvable (n : ℕ) : IsSolvable (X ^ n : F[X]).Gal := by infer_instance
+#align gal_X_pow_is_solvable gal_X_pow_isSolvable
+-/
+#print gal_mul_isSolvable /-
theorem gal_mul_isSolvable {p q : F[X]} (hp : IsSolvable p.Gal) (hq : IsSolvable q.Gal) :
IsSolvable (p * q).Gal :=
solvable_of_solvable_injective (Gal.restrictProd_injective p q)
#align gal_mul_is_solvable gal_mul_isSolvable
+-/
+#print gal_prod_isSolvable /-
theorem gal_prod_isSolvable {s : Multiset F[X]} (hs : ∀ p ∈ s, IsSolvable (Gal p)) :
IsSolvable s.Prod.Gal := by
apply Multiset.induction_on' s
@@ -70,14 +85,18 @@ theorem gal_prod_isSolvable {s : Multiset F[X]} (hs : ∀ p ∈ s, IsSolvable (G
rw [Multiset.insert_eq_cons, Multiset.prod_cons]
exact gal_mul_isSolvable (hs p hps) ht
#align gal_prod_is_solvable gal_prod_isSolvable
+-/
+#print gal_isSolvable_of_splits /-
theorem gal_isSolvable_of_splits {p q : F[X]}
(hpq : Fact (p.Splits (algebraMap F q.SplittingField))) (hq : IsSolvable q.Gal) :
IsSolvable p.Gal :=
haveI : IsSolvable (q.splitting_field ≃ₐ[F] q.splitting_field) := hq
solvable_of_surjective (AlgEquiv.restrictNormalHom_surjective q.splitting_field)
#align gal_is_solvable_of_splits gal_isSolvable_of_splits
+-/
+#print gal_isSolvable_tower /-
theorem gal_isSolvable_tower (p q : F[X]) (hpq : p.Splits (algebraMap F q.SplittingField))
(hp : IsSolvable p.Gal) (hq : IsSolvable (q.map (algebraMap F p.SplittingField)).Gal) :
IsSolvable q.Gal := by
@@ -91,10 +110,12 @@ theorem gal_isSolvable_tower (p q : F[X]) (hpq : p.Splits (algebraMap F q.Splitt
haveI : IsSolvable (L ≃ₐ[K] L) := solvable_of_solvable_injective ϕ_inj
exact isSolvable_of_isScalarTower F p.splitting_field q.splitting_field
#align gal_is_solvable_tower gal_isSolvable_tower
+-/
section GalXPowSubC
-theorem gal_x_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).Gal :=
+#print gal_X_pow_sub_one_isSolvable /-
+theorem gal_X_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).Gal :=
by
by_cases hn : n = 0
· rw [hn, pow_zero, sub_self]
@@ -113,19 +134,21 @@ theorem gal_x_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).G
obtain ⟨c, hc⟩ := key σ
obtain ⟨d, hd⟩ := key τ
rw [σ.mul_apply, τ.mul_apply, hc, τ.map_pow, hd, σ.map_pow, hc, ← pow_mul, pow_mul']
-#align gal_X_pow_sub_one_is_solvable gal_x_pow_sub_one_isSolvable
+#align gal_X_pow_sub_one_is_solvable gal_X_pow_sub_one_isSolvable
+-/
-theorem gal_x_pow_sub_c_isSolvable_aux (n : ℕ) (a : F)
+#print gal_X_pow_sub_C_isSolvable_aux /-
+theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
(h : (X ^ n - 1 : F[X]).Splits (RingHom.id F)) : IsSolvable (X ^ n - C a).Gal :=
by
by_cases ha : a = 0
· rw [ha, C_0, sub_zero]
- exact gal_x_pow_isSolvable n
+ exact gal_X_pow_isSolvable n
have ha' : algebraMap F (X ^ n - C a).SplittingField a ≠ 0 :=
mt ((injective_iff_map_eq_zero _).mp (RingHom.injective _) a) ha
by_cases hn : n = 0
· rw [hn, pow_zero, ← C_1, ← C_sub]
- exact gal_c_isSolvable (1 - a)
+ exact gal_C_isSolvable (1 - a)
have hn' : 0 < n := pos_iff_ne_zero.mpr hn
have hn'' : X ^ n - C a ≠ 0 := X_pow_sub_C_ne_zero hn' a
have hn''' : (X ^ n - 1 : F[X]) ≠ 0 := X_pow_sub_C_ne_zero hn' 1
@@ -155,9 +178,11 @@ theorem gal_x_pow_sub_c_isSolvable_aux (n : ℕ) (a : F)
obtain ⟨d, hd⟩ := key τ
rw [σ.mul_apply, τ.mul_apply, hc, τ.map_mul, τ.commutes, hd, σ.map_mul, σ.commutes, hc]
rw [mul_assoc, mul_assoc, mul_right_inj' hb', mul_comm]
-#align gal_X_pow_sub_C_is_solvable_aux gal_x_pow_sub_c_isSolvable_aux
+#align gal_X_pow_sub_C_is_solvable_aux gal_X_pow_sub_C_isSolvable_aux
+-/
-theorem splits_x_pow_sub_one_of_x_pow_sub_c {F : Type _} [Field F] {E : Type _} [Field E]
+#print splits_X_pow_sub_one_of_X_pow_sub_C /-
+theorem splits_X_pow_sub_one_of_X_pow_sub_C {F : Type _} [Field F] {E : Type _} [Field E]
(i : F →+* E) (n : ℕ) {a : F} (ha : a ≠ 0) (h : (X ^ n - C a).Splits i) :
(X ^ n - 1).Splits i :=
by
@@ -196,27 +221,31 @@ theorem splits_x_pow_sub_one_of_x_pow_sub_c {F : Type _} [Field F] {E : Type _}
rw [key1, hs, multiset_prod_comp, Multiset.map_map, key2, Multiset.prod_map_mul,
Multiset.map_const, Multiset.prod_replicate, hs', ← C_pow, hb, ← mul_assoc, C_mul_C, one_mul]
all_goals exact field.to_nontrivial F
-#align splits_X_pow_sub_one_of_X_pow_sub_C splits_x_pow_sub_one_of_x_pow_sub_c
+#align splits_X_pow_sub_one_of_X_pow_sub_C splits_X_pow_sub_one_of_X_pow_sub_C
+-/
-theorem gal_x_pow_sub_c_isSolvable (n : ℕ) (x : F) : IsSolvable (X ^ n - C x).Gal :=
+#print gal_X_pow_sub_C_isSolvable /-
+theorem gal_X_pow_sub_C_isSolvable (n : ℕ) (x : F) : IsSolvable (X ^ n - C x).Gal :=
by
by_cases hx : x = 0
· rw [hx, C_0, sub_zero]
- exact gal_x_pow_isSolvable n
+ exact gal_X_pow_isSolvable n
apply gal_isSolvable_tower (X ^ n - 1) (X ^ n - C x)
- · exact splits_x_pow_sub_one_of_x_pow_sub_c _ n hx (splitting_field.splits _)
- · exact gal_x_pow_sub_one_isSolvable n
+ · exact splits_X_pow_sub_one_of_X_pow_sub_C _ n hx (splitting_field.splits _)
+ · exact gal_X_pow_sub_one_isSolvable n
· rw [Polynomial.map_sub, Polynomial.map_pow, map_X, map_C]
- apply gal_x_pow_sub_c_isSolvable_aux
+ apply gal_X_pow_sub_C_isSolvable_aux
have key := splitting_field.splits (X ^ n - 1 : F[X])
rwa [← splits_id_iff_splits, Polynomial.map_sub, Polynomial.map_pow, map_X,
Polynomial.map_one] at key
-#align gal_X_pow_sub_C_is_solvable gal_x_pow_sub_c_isSolvable
+#align gal_X_pow_sub_C_is_solvable gal_X_pow_sub_C_isSolvable
+-/
end GalXPowSubC
variable (F)
+#print IsSolvableByRad /-
/-- Inductive definition of solvable by radicals -/
inductive IsSolvableByRad : E → Prop
| base (α : F) : IsSolvableByRad (algebraMap F E α)
@@ -226,9 +255,11 @@ inductive IsSolvableByRad : E → Prop
| inv (α : E) : IsSolvableByRad α → IsSolvableByRad α⁻¹
| rad (α : E) (n : ℕ) (hn : n ≠ 0) : IsSolvableByRad (α ^ n) → IsSolvableByRad α
#align is_solvable_by_rad IsSolvableByRad
+-/
variable (E)
+#print solvableByRad /-
/-- The intermediate field of solvable-by-radicals elements -/
def solvableByRad : IntermediateField F E
where
@@ -241,11 +272,13 @@ def solvableByRad : IntermediateField F E
inv_mem' := IsSolvableByRad.inv
algebraMap_mem' := IsSolvableByRad.base
#align solvable_by_rad solvableByRad
+-/
namespace solvableByRad
variable {F} {E} {α : E}
+#print solvableByRad.induction /-
theorem induction (P : solvableByRad F E → Prop)
(base : ∀ α : F, P (algebraMap F (solvableByRad F E) α))
(add : ∀ α β : solvableByRad F E, P α → P β → P (α + β))
@@ -281,7 +314,9 @@ theorem induction (P : solvableByRad F E → Prop)
convert Pα
exact Subtype.ext (Eq.trans ((solvableByRad F E).val_pow_eq_pow_val _ n) hα₀.symm)
#align solvable_by_rad.induction solvableByRad.induction
+-/
+#print solvableByRad.isIntegral /-
theorem isIntegral (α : solvableByRad F E) : IsIntegral F α :=
by
revert α
@@ -304,12 +339,16 @@ theorem isIntegral (α : solvableByRad F E) : IsIntegral F α :=
rwa [← leading_coeff_eq_zero, leading_coeff_comp, leading_coeff_X_pow, one_pow, mul_one] at h
rwa [nat_degree_X_pow]
#align solvable_by_rad.is_integral solvableByRad.isIntegral
+-/
+#print solvableByRad.P /-
/-- The statement to be proved inductively -/
def P (α : solvableByRad F E) : Prop :=
IsSolvable (minpoly F α).Gal
#align solvable_by_rad.P solvableByRad.P
+-/
+#print solvableByRad.induction3 /-
/-- An auxiliary induction lemma, which is generalized by `solvable_by_rad.is_solvable`. -/
theorem induction3 {α : solvableByRad F E} {n : ℕ} (hn : n ≠ 0) (hα : P (α ^ n)) : P α :=
by
@@ -328,7 +367,7 @@ theorem induction3 {α : solvableByRad F E} {n : ℕ} (hn : n ≠ 0) (hα : P (
· exact gal.splits_in_splitting_field_of_comp _ _ (by rwa [nat_degree_X_pow])
· obtain ⟨s, hs⟩ := (splits_iff_exists_multiset _).1 (splitting_field.splits p)
rw [map_comp, Polynomial.map_pow, map_X, hs, mul_comp, C_comp]
- apply gal_mul_isSolvable (gal_c_isSolvable _)
+ apply gal_mul_isSolvable (gal_C_isSolvable _)
rw [multiset_prod_comp]
apply gal_prod_isSolvable
intro q hq
@@ -337,13 +376,15 @@ theorem induction3 {α : solvableByRad F E} {n : ℕ} (hn : n ≠ 0) (hα : P (
rw [Multiset.mem_map] at hq
obtain ⟨q, hq, rfl⟩ := hq
rw [sub_comp, X_comp, C_comp]
- exact gal_x_pow_sub_c_isSolvable n q
+ exact gal_X_pow_sub_C_isSolvable n q
#align solvable_by_rad.induction3 solvableByRad.induction3
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print solvableByRad.induction2 /-
/-- An auxiliary induction lemma, which is generalized by `solvable_by_rad.is_solvable`. -/
theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮⟯) (hα : P α) (hβ : P β) : P γ :=
by
@@ -376,18 +417,22 @@ theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮⟯) (hα :
refine' gal_isSolvable_of_splits ⟨_⟩ (gal_mul_isSolvable hα hβ)
exact Normal.splits (splitting_field.normal _) (f ⟨γ, hγ⟩)
#align solvable_by_rad.induction2 solvableByRad.induction2
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
+#print solvableByRad.induction1 /-
/-- An auxiliary induction lemma, which is generalized by `solvable_by_rad.is_solvable`. -/
theorem induction1 {α β : solvableByRad F E} (hβ : β ∈ F⟮⟯) (hα : P α) : P β :=
induction2 (adjoin.mono F _ _ (ge_of_eq (Set.pair_eq_singleton α)) hβ) hα hα
#align solvable_by_rad.induction1 solvableByRad.induction1
+-/
+#print solvableByRad.isSolvable /-
theorem isSolvable (α : solvableByRad F E) : IsSolvable (minpoly F α).Gal :=
by
revert α
apply solvableByRad.induction
- · exact fun α => by rw [minpoly.eq_X_sub_C]; exact gal_x_sub_c_isSolvable α
+ · exact fun α => by rw [minpoly.eq_X_sub_C]; exact gal_X_sub_C_isSolvable α
·
exact fun α β =>
induction2
@@ -402,10 +447,12 @@ theorem isSolvable (α : solvableByRad F E) : IsSolvable (minpoly F α).Gal :=
· exact fun α => induction1 (inv_mem (mem_adjoin_simple_self F α))
· exact fun α n => induction3
#align solvable_by_rad.is_solvable solvableByRad.isSolvable
+-/
+#print solvableByRad.isSolvable' /-
/-- **Abel-Ruffini Theorem** (one direction): An irreducible polynomial with an
`is_solvable_by_rad` root has solvable Galois group -/
-theorem is_solvable' {α : E} {q : F[X]} (q_irred : Irreducible q) (q_aeval : aeval α q = 0)
+theorem isSolvable' {α : E} {q : F[X]} (q_irred : Irreducible q) (q_aeval : aeval α q = 0)
(hα : IsSolvableByRad F α) : IsSolvable q.Gal :=
by
have : _root_.is_solvable (q * C q.leading_coeff⁻¹).Gal :=
@@ -417,7 +464,8 @@ theorem is_solvable' {α : E} {q : F[X]} (q_irred : Irreducible q) (q_aeval : ae
refine' solvable_of_surjective (gal.restrict_dvd_surjective ⟨C q.leading_coeff⁻¹, rfl⟩ _)
rw [mul_ne_zero_iff, Ne, Ne, C_eq_zero, inv_eq_zero]
exact ⟨q_irred.ne_zero, leading_coeff_ne_zero.mpr q_irred.ne_zero⟩
-#align solvable_by_rad.is_solvable' solvableByRad.is_solvable'
+#align solvable_by_rad.is_solvable' solvableByRad.isSolvable'
+-/
end solvableByRad
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -103,7 +103,7 @@ theorem gal_x_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).G
have hn'' : (X ^ n - 1 : F[X]) ≠ 0 := X_pow_sub_C_ne_zero hn' 1
apply isSolvable_of_comm
intro σ τ
- ext (a ha)
+ ext a ha
simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_one, sub_eq_zero] at ha
have key : ∀ σ : (X ^ n - 1 : F[X]).Gal, ∃ m : ℕ, σ a = a ^ m :=
by
@@ -138,7 +138,7 @@ theorem gal_x_pow_sub_c_isSolvable_aux (n : ℕ) (a : F)
(minpoly.dvd F c (by rwa [map_id, AlgHom.map_sub, sub_eq_zero, aeval_X_pow, aeval_one]))))
apply isSolvable_of_comm
intro σ τ
- ext (b hb)
+ ext b hb
simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_C, sub_eq_zero] at hb
have hb' : b ≠ 0 := by
intro hb'
mathlib commit https://github.com/leanprover-community/mathlib/commit/bf9bbbcf0c1c1ead18280b0d010e417b10abb1b6
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
! This file was ported from Lean 3 source module field_theory.abel_ruffini
-! leanprover-community/mathlib commit fbbd626e4e8fe4d1ce64903e26276ec2873f2976
+! leanprover-community/mathlib commit e3f4be1fcb5376c4948d7f095bec45350bfb9d1a
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -373,8 +373,8 @@ theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮⟯) (hα :
exact minpoly.aeval F γ)
(minpoly.monic (IsIntegral γ))
rw [P, key]
- exact
- gal_isSolvable_of_splits ⟨Normal.splits (splitting_field.normal _) _⟩ (gal_mul_isSolvable hα hβ)
+ refine' gal_isSolvable_of_splits ⟨_⟩ (gal_mul_isSolvable hα hβ)
+ exact Normal.splits (splitting_field.normal _) (f ⟨γ, hγ⟩)
#align solvable_by_rad.induction2 solvableByRad.induction2
/- ./././Mathport/Syntax/Translate/Expr.lean:192:11: unsupported (impossible) -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8efcf8022aac8e01df8d302dcebdbc25d6a886c8
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
! This file was ported from Lean 3 source module field_theory.abel_ruffini
-! leanprover-community/mathlib commit 7fdeecc0d03cd40f7a165e6cf00a4d2286db599f
+! leanprover-community/mathlib commit fbbd626e4e8fe4d1ce64903e26276ec2873f2976
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -219,8 +219,8 @@ variable (F)
/-- Inductive definition of solvable by radicals -/
inductive IsSolvableByRad : E → Prop
- | base (a : F) : IsSolvableByRad (algebraMap F E a)
- | add (a b : E) : IsSolvableByRad a → IsSolvableByRad b → IsSolvableByRad (a + b)
+ | base (α : F) : IsSolvableByRad (algebraMap F E α)
+ | add (α β : E) : IsSolvableByRad α → IsSolvableByRad β → IsSolvableByRad (α + β)
| neg (α : E) : IsSolvableByRad α → IsSolvableByRad (-α)
| mul (α β : E) : IsSolvableByRad α → IsSolvableByRad β → IsSolvableByRad (α * β)
| inv (α : E) : IsSolvableByRad α → IsSolvableByRad α⁻¹
mathlib commit https://github.com/leanprover-community/mathlib/commit/58a272265b5e05f258161260dd2c5d247213cbd3
@@ -109,7 +109,7 @@ theorem gal_x_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).G
by
intro σ
lift n to ℕ+ using hn'
- exact map_root_of_unity_eq_pow_self σ.to_alg_hom (rootsOfUnity.mkOfPowEq a ha)
+ exact map_rootsOfUnity_eq_pow_self σ.to_alg_hom (rootsOfUnity.mkOfPowEq a ha)
obtain ⟨c, hc⟩ := key σ
obtain ⟨d, hd⟩ := key τ
rw [σ.mul_apply, τ.mul_apply, hc, τ.map_pow, hd, σ.map_pow, hc, ← pow_mul, pow_mul']
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -4,13 +4,13 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
! This file was ported from Lean 3 source module field_theory.abel_ruffini
-! leanprover-community/mathlib commit f694c7dead66f5d4c80f446c796a5aad14707f0e
+! leanprover-community/mathlib commit 7fdeecc0d03cd40f7a165e6cf00a4d2286db599f
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.GroupTheory.Solvable
import Mathbin.FieldTheory.PolynomialGaloisGroup
-import Mathbin.RingTheory.RootsOfUnity
+import Mathbin.RingTheory.RootsOfUnity.Basic
/-!
# The Abel-Ruffini Theorem
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -104,7 +104,7 @@ theorem gal_x_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).G
apply isSolvable_of_comm
intro σ τ
ext (a ha)
- simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_one, sub_eq_zero] at ha
+ simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_one, sub_eq_zero] at ha
have key : ∀ σ : (X ^ n - 1 : F[X]).Gal, ∃ m : ℕ, σ a = a ^ m :=
by
intro σ
@@ -139,10 +139,10 @@ theorem gal_x_pow_sub_c_isSolvable_aux (n : ℕ) (a : F)
apply isSolvable_of_comm
intro σ τ
ext (b hb)
- simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_C, sub_eq_zero] at hb
+ simp only [mem_root_set_of_ne hn'', map_sub, aeval_X_pow, aeval_C, sub_eq_zero] at hb
have hb' : b ≠ 0 := by
intro hb'
- rw [hb', zero_pow hn'] at hb
+ rw [hb', zero_pow hn'] at hb
exact ha' hb.symm
have key : ∀ σ : (X ^ n - C a).Gal, ∃ c, σ b = b * algebraMap F _ c :=
by
@@ -169,14 +169,14 @@ theorem splits_x_pow_sub_one_of_x_pow_sub_c {F : Type _} [Field F] {E : Type _}
have hn'' : (X ^ n - C a).degree ≠ 0 :=
ne_of_eq_of_ne (degree_X_pow_sub_C hn' a) (mt with_bot.coe_eq_coe.mp hn)
obtain ⟨b, hb⟩ := exists_root_of_splits i h hn''
- rw [eval₂_sub, eval₂_X_pow, eval₂_C, sub_eq_zero] at hb
+ rw [eval₂_sub, eval₂_X_pow, eval₂_C, sub_eq_zero] at hb
have hb' : b ≠ 0 := by
intro hb'
- rw [hb', zero_pow hn'] at hb
+ rw [hb', zero_pow hn'] at hb
exact ha' hb.symm
let s := ((X ^ n - C a).map i).roots
have hs : _ = _ * (s.map _).Prod := eq_prod_roots_of_splits h
- rw [leading_coeff_X_pow_sub_C hn', RingHom.map_one, C_1, one_mul] at hs
+ rw [leading_coeff_X_pow_sub_C hn', RingHom.map_one, C_1, one_mul] at hs
have hs' : s.card = n := (nat_degree_eq_card_roots h).symm.trans nat_degree_X_pow_sub_C
apply @splits_of_exists_multiset F E _ _ i (X ^ n - 1) (s.map fun c : E => c / b)
rw [leading_coeff_X_pow_sub_one hn', RingHom.map_one, C_1, one_mul, Multiset.map_map]
@@ -210,7 +210,7 @@ theorem gal_x_pow_sub_c_isSolvable (n : ℕ) (x : F) : IsSolvable (X ^ n - C x).
apply gal_x_pow_sub_c_isSolvable_aux
have key := splitting_field.splits (X ^ n - 1 : F[X])
rwa [← splits_id_iff_splits, Polynomial.map_sub, Polynomial.map_pow, map_X,
- Polynomial.map_one] at key
+ Polynomial.map_one] at key
#align gal_X_pow_sub_C_is_solvable gal_x_pow_sub_c_isSolvable
end GalXPowSubC
@@ -301,7 +301,7 @@ theorem isIntegral (α : solvableByRad F E) : IsIntegral F α :=
is_algebraic_iff_is_integral.mp
⟨p.comp (X ^ n),
⟨fun h => h1 (leading_coeff_eq_zero.mp _), by rw [aeval_comp, aeval_X_pow, h2]⟩⟩
- rwa [← leading_coeff_eq_zero, leading_coeff_comp, leading_coeff_X_pow, one_pow, mul_one] at h
+ rwa [← leading_coeff_eq_zero, leading_coeff_comp, leading_coeff_X_pow, one_pow, mul_one] at h
rwa [nat_degree_X_pow]
#align solvable_by_rad.is_integral solvableByRad.isIntegral
@@ -332,9 +332,9 @@ theorem induction3 {α : solvableByRad F E} {n : ℕ} (hn : n ≠ 0) (hα : P (
rw [multiset_prod_comp]
apply gal_prod_isSolvable
intro q hq
- rw [Multiset.mem_map] at hq
+ rw [Multiset.mem_map] at hq
obtain ⟨q, hq, rfl⟩ := hq
- rw [Multiset.mem_map] at hq
+ rw [Multiset.mem_map] at hq
obtain ⟨q, hq, rfl⟩ := hq
rw [sub_comp, X_comp, C_comp]
exact gal_x_pow_sub_c_isSolvable n q
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -31,7 +31,7 @@ that is solvable by radicals has a solvable Galois group.
noncomputable section
-open Classical Polynomial
+open scoped Classical Polynomial
open Polynomial IntermediateField
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -233,14 +233,10 @@ variable (E)
def solvableByRad : IntermediateField F E
where
carrier := IsSolvableByRad F
- zero_mem' := by
- convert IsSolvableByRad.base (0 : F)
- rw [RingHom.map_zero]
+ zero_mem' := by convert IsSolvableByRad.base (0 : F); rw [RingHom.map_zero]
add_mem' := IsSolvableByRad.add
neg_mem' := IsSolvableByRad.neg
- one_mem' := by
- convert IsSolvableByRad.base (1 : F)
- rw [RingHom.map_one]
+ one_mem' := by convert IsSolvableByRad.base (1 : F); rw [RingHom.map_one]
mul_mem' := IsSolvableByRad.mul
inv_mem' := IsSolvableByRad.inv
algebraMap_mem' := IsSolvableByRad.base
@@ -269,28 +265,16 @@ theorem induction (P : solvableByRad F E → Prop)
· exact fun α => ⟨algebraMap F (solvableByRad F E) α, rfl, base α⟩
· intro α β hα hβ Pα Pβ
obtain ⟨⟨α₀, hα₀, Pα⟩, β₀, hβ₀, Pβ⟩ := Pα, Pβ
- exact
- ⟨α₀ + β₀, by
- rw [← hα₀, ← hβ₀]
- rfl, add α₀ β₀ Pα Pβ⟩
+ exact ⟨α₀ + β₀, by rw [← hα₀, ← hβ₀]; rfl, add α₀ β₀ Pα Pβ⟩
· intro α hα Pα
obtain ⟨α₀, hα₀, Pα⟩ := Pα
- exact
- ⟨-α₀, by
- rw [← hα₀]
- rfl, neg α₀ Pα⟩
+ exact ⟨-α₀, by rw [← hα₀]; rfl, neg α₀ Pα⟩
· intro α β hα hβ Pα Pβ
obtain ⟨⟨α₀, hα₀, Pα⟩, β₀, hβ₀, Pβ⟩ := Pα, Pβ
- exact
- ⟨α₀ * β₀, by
- rw [← hα₀, ← hβ₀]
- rfl, mul α₀ β₀ Pα Pβ⟩
+ exact ⟨α₀ * β₀, by rw [← hα₀, ← hβ₀]; rfl, mul α₀ β₀ Pα Pβ⟩
· intro α hα Pα
obtain ⟨α₀, hα₀, Pα⟩ := Pα
- exact
- ⟨α₀⁻¹, by
- rw [← hα₀]
- rfl, inv α₀ Pα⟩
+ exact ⟨α₀⁻¹, by rw [← hα₀]; rfl, inv α₀ Pα⟩
· intro α n hn hα Pα
obtain ⟨α₀, hα₀, Pα⟩ := Pα
refine' ⟨⟨α, IsSolvableByRad.rad α n hn hα⟩, rfl, rad _ n hn _⟩
@@ -403,10 +387,7 @@ theorem isSolvable (α : solvableByRad F E) : IsSolvable (minpoly F α).Gal :=
by
revert α
apply solvableByRad.induction
- ·
- exact fun α => by
- rw [minpoly.eq_X_sub_C]
- exact gal_x_sub_c_isSolvable α
+ · exact fun α => by rw [minpoly.eq_X_sub_C]; exact gal_x_sub_c_isSolvable α
·
exact fun α β =>
induction2
mathlib commit https://github.com/leanprover-community/mathlib/commit/75e7fca56381d056096ce5d05e938f63a6567828
@@ -405,7 +405,7 @@ theorem isSolvable (α : solvableByRad F E) : IsSolvable (minpoly F α).Gal :=
apply solvableByRad.induction
·
exact fun α => by
- rw [minpoly.eq_x_sub_c]
+ rw [minpoly.eq_X_sub_C]
exact gal_x_sub_c_isSolvable α
·
exact fun α β =>
mathlib commit https://github.com/leanprover-community/mathlib/commit/38f16f960f5006c6c0c2bac7b0aba5273188f4e5
@@ -45,16 +45,16 @@ theorem gal_zero_isSolvable : IsSolvable (0 : F[X]).Gal := by infer_instance
theorem gal_one_isSolvable : IsSolvable (1 : F[X]).Gal := by infer_instance
#align gal_one_is_solvable gal_one_isSolvable
-theorem gal_c_isSolvable (x : F) : IsSolvable (c x).Gal := by infer_instance
+theorem gal_c_isSolvable (x : F) : IsSolvable (C x).Gal := by infer_instance
#align gal_C_is_solvable gal_c_isSolvable
-theorem gal_x_isSolvable : IsSolvable (x : F[X]).Gal := by infer_instance
+theorem gal_x_isSolvable : IsSolvable (X : F[X]).Gal := by infer_instance
#align gal_X_is_solvable gal_x_isSolvable
-theorem gal_x_sub_c_isSolvable (x : F) : IsSolvable (x - c x).Gal := by infer_instance
+theorem gal_x_sub_c_isSolvable (x : F) : IsSolvable (X - C x).Gal := by infer_instance
#align gal_X_sub_C_is_solvable gal_x_sub_c_isSolvable
-theorem gal_x_pow_isSolvable (n : ℕ) : IsSolvable (x ^ n : F[X]).Gal := by infer_instance
+theorem gal_x_pow_isSolvable (n : ℕ) : IsSolvable (X ^ n : F[X]).Gal := by infer_instance
#align gal_X_pow_is_solvable gal_x_pow_isSolvable
theorem gal_mul_isSolvable {p q : F[X]} (hp : IsSolvable p.Gal) (hq : IsSolvable q.Gal) :
@@ -94,7 +94,7 @@ theorem gal_isSolvable_tower (p q : F[X]) (hpq : p.Splits (algebraMap F q.Splitt
section GalXPowSubC
-theorem gal_x_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (x ^ n - 1 : F[X]).Gal :=
+theorem gal_x_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).Gal :=
by
by_cases hn : n = 0
· rw [hn, pow_zero, sub_self]
@@ -116,7 +116,7 @@ theorem gal_x_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (x ^ n - 1 : F[X]).G
#align gal_X_pow_sub_one_is_solvable gal_x_pow_sub_one_isSolvable
theorem gal_x_pow_sub_c_isSolvable_aux (n : ℕ) (a : F)
- (h : (x ^ n - 1 : F[X]).Splits (RingHom.id F)) : IsSolvable (x ^ n - c a).Gal :=
+ (h : (X ^ n - 1 : F[X]).Splits (RingHom.id F)) : IsSolvable (X ^ n - C a).Gal :=
by
by_cases ha : a = 0
· rw [ha, C_0, sub_zero]
@@ -158,8 +158,8 @@ theorem gal_x_pow_sub_c_isSolvable_aux (n : ℕ) (a : F)
#align gal_X_pow_sub_C_is_solvable_aux gal_x_pow_sub_c_isSolvable_aux
theorem splits_x_pow_sub_one_of_x_pow_sub_c {F : Type _} [Field F] {E : Type _} [Field E]
- (i : F →+* E) (n : ℕ) {a : F} (ha : a ≠ 0) (h : (x ^ n - c a).Splits i) :
- (x ^ n - 1).Splits i :=
+ (i : F →+* E) (n : ℕ) {a : F} (ha : a ≠ 0) (h : (X ^ n - C a).Splits i) :
+ (X ^ n - 1).Splits i :=
by
have ha' : i a ≠ 0 := mt ((injective_iff_map_eq_zero i).mp i.injective a) ha
by_cases hn : n = 0
@@ -198,7 +198,7 @@ theorem splits_x_pow_sub_one_of_x_pow_sub_c {F : Type _} [Field F] {E : Type _}
all_goals exact field.to_nontrivial F
#align splits_X_pow_sub_one_of_X_pow_sub_C splits_x_pow_sub_one_of_x_pow_sub_c
-theorem gal_x_pow_sub_c_isSolvable (n : ℕ) (x : F) : IsSolvable (x ^ n - c x).Gal :=
+theorem gal_x_pow_sub_c_isSolvable (n : ℕ) (x : F) : IsSolvable (X ^ n - C x).Gal :=
by
by_cases hx : x = 0
· rw [hx, C_0, sub_zero]
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -130,7 +130,7 @@ theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
have hn''' : (X ^ n - 1 : F[X]) ≠ 0 := X_pow_sub_C_ne_zero hn' 1
have mem_range : ∀ {c : (X ^ n - C a).SplittingField},
(c ^ n = 1 → (∃ d, algebraMap F (X ^ n - C a).SplittingField d = c)) := fun {c} hc =>
- RingHom.mem_range.mp (minpoly.mem_range_of_degree_eq_one F c (h.def'.resolve_left hn'''
+ RingHom.mem_range.mp (minpoly.mem_range_of_degree_eq_one F c (h.def.resolve_left hn'''
(minpoly.irreducible ((SplittingField.instNormal (X ^ n - C a)).isIntegral c))
(minpoly.dvd F c (by rwa [map_id, AlgHom.map_sub, sub_eq_zero, aeval_X_pow, aeval_one]))))
apply isSolvable_of_comm
mul
-div
cancellation lemmas (#11530)
Lemma names around cancellation of multiplication and division are a mess.
This PR renames a handful of them according to the following table (each big row contains the multiplicative statement, then the three rows contain the GroupWithZero
lemma name, the Group
lemma, the AddGroup
lemma name).
| Statement | New name | Old name | |
@@ -146,7 +146,7 @@ theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
have key : (σ b / b) ^ n = 1 := by rw [div_pow, ← σ.map_pow, hb, σ.commutes, div_self ha']
obtain ⟨c, hc⟩ := mem_range key
use c
- rw [hc, mul_div_cancel' (σ b) hb']
+ rw [hc, mul_div_cancel₀ (σ b) hb']
obtain ⟨c, hc⟩ := key σ
obtain ⟨d, hd⟩ := key τ
rw [σ.mul_apply, τ.mul_apply, hc, τ.map_mul, τ.commutes, hd, σ.map_mul, σ.commutes, hc,
@@ -186,7 +186,7 @@ theorem splits_X_pow_sub_one_of_X_pow_sub_C {F : Type*} [Field F] {E : Type*} [F
C b * (X - C (c / b)) := by
ext1 c
dsimp only [Function.comp_apply]
- rw [sub_comp, X_comp, C_comp, mul_sub, ← C_mul, mul_div_cancel' c hb']
+ rw [sub_comp, X_comp, C_comp, mul_sub, ← C_mul, mul_div_cancel₀ c hb']
rw [key1, hs, multiset_prod_comp, Multiset.map_map, key2, Multiset.prod_map_mul,
-- Porting note: needed for `Multiset.map_const` to work
show (fun (_ : E) => C b) = Function.const E (C b) by rfl,
@@ -130,7 +130,7 @@ theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
have hn''' : (X ^ n - 1 : F[X]) ≠ 0 := X_pow_sub_C_ne_zero hn' 1
have mem_range : ∀ {c : (X ^ n - C a).SplittingField},
(c ^ n = 1 → (∃ d, algebraMap F (X ^ n - C a).SplittingField d = c)) := fun {c} hc =>
- RingHom.mem_range.mp (minpoly.mem_range_of_degree_eq_one F c (h.def.resolve_left hn'''
+ RingHom.mem_range.mp (minpoly.mem_range_of_degree_eq_one F c (h.def'.resolve_left hn'''
(minpoly.irreducible ((SplittingField.instNormal (X ^ n - C a)).isIntegral c))
(minpoly.dvd F c (by rwa [map_id, AlgHom.map_sub, sub_eq_zero, aeval_X_pow, aeval_one]))))
apply isSolvable_of_comm
These instances don't seem to be necessary (and there's evidence in a porting note that one of them used to be).
@@ -350,9 +350,6 @@ theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮α, β⟯) (
(minpoly.irreducible (isIntegral γ)) _ (minpoly.monic (isIntegral γ))
suffices aeval (⟨γ, hγ⟩ : F⟮α, β⟯) (minpoly F γ) = 0 by
rw [aeval_algHom_apply, this, AlgHom.map_zero]
- -- Porting note: this instance is needed for the following `apply`
- haveI := @IntermediateField.toAlgebra F (solvableByRad F E) _ _ _ F⟮α, β⟯
- (solvableByRad F E) _ (Algebra.id (solvableByRad F E))
apply (algebraMap (↥F⟮α, β⟯) (solvableByRad F E)).injective
simp only [map_zero, _root_.map_eq_zero]
-- Porting note: end of the proof was `exact minpoly.aeval F γ`.
@@ -341,11 +341,10 @@ theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮α, β⟯) (
let f : ↥F⟮α, β⟯ →ₐ[F] (p * q).SplittingField :=
Classical.choice <| nonempty_algHom_adjoin_of_splits <| by
intro x hx
- cases' hx with hx hx
- rw [hx]
- exact ⟨isIntegral α, hpq.1⟩
- cases hx
- exact ⟨isIntegral β, hpq.2⟩
+ simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hx
+ cases hx with rw [hx]
+ | inl hx => exact ⟨isIntegral α, hpq.1⟩
+ | inr hx => exact ⟨isIntegral β, hpq.2⟩
have key : minpoly F γ = minpoly F (f ⟨γ, hγ⟩) := by
refine' minpoly.eq_of_irreducible_of_monic
(minpoly.irreducible (isIntegral γ)) _ (minpoly.monic (isIntegral γ))
f ^ n
(#9617)
This involves moving lemmas from Algebra.GroupPower.Ring
to Algebra.GroupWithZero.Basic
and changing some 0 < n
assumptions to n ≠ 0
.
From LeanAPAP
@@ -139,7 +139,7 @@ theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
rw [mem_rootSet_of_ne hn'', map_sub, aeval_X_pow, aeval_C, sub_eq_zero] at hb
have hb' : b ≠ 0 := by
intro hb'
- rw [hb', zero_pow hn'] at hb
+ rw [hb', zero_pow hn] at hb
exact ha' hb.symm
have key : ∀ σ : (X ^ n - C a).Gal, ∃ c, σ b = b * algebraMap F _ c := by
intro σ
@@ -168,7 +168,7 @@ theorem splits_X_pow_sub_one_of_X_pow_sub_C {F : Type*} [Field F] {E : Type*} [F
rw [eval₂_sub, eval₂_X_pow, eval₂_C, sub_eq_zero] at hb
have hb' : b ≠ 0 := by
intro hb'
- rw [hb', zero_pow hn'] at hb
+ rw [hb', zero_pow hn] at hb
exact ha' hb.symm
let s := ((X ^ n - C a).map i).roots
have hs : _ = _ * (s.map _).prod := eq_prod_roots_of_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>
@@ -289,11 +289,10 @@ theorem isIntegral (α : solvableByRad F E) : IsIntegral F α := by
· exact fun _ _ => IsIntegral.mul
· intro α hα
exact Subalgebra.inv_mem_of_algebraic (integralClosure F (solvableByRad F E))
- (show IsAlgebraic F ↑(⟨α, hα⟩ : integralClosure F (solvableByRad F E)) from
- isAlgebraic_iff_isIntegral.mpr hα)
+ (show IsAlgebraic F ↑(⟨α, hα⟩ : integralClosure F (solvableByRad F E)) from hα.isAlgebraic)
· intro α n hn hα
- obtain ⟨p, h1, h2⟩ := isAlgebraic_iff_isIntegral.mpr hα
- refine' isAlgebraic_iff_isIntegral.mp ⟨p.comp (X ^ n),
+ obtain ⟨p, h1, h2⟩ := hα.isAlgebraic
+ refine' IsAlgebraic.isIntegral ⟨p.comp (X ^ n),
⟨fun h => h1 (leadingCoeff_eq_zero.mp _), by rw [aeval_comp, aeval_X_pow, h2]⟩⟩
rwa [← leadingCoeff_eq_zero, leadingCoeff_comp, leadingCoeff_X_pow, one_pow, mul_one] at h
rwa [natDegree_X_pow]
This is the supremum of
along with some minor fixes from failures on nightly-testing as Mathlib master
is merged into it.
Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.
I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0
branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.
In particular this includes adjustments for the Lean PRs
We can get rid of all the
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)
macros across Mathlib (and in any projects that want to write natural number powers of reals).
Changes the default behaviour of simp
to (config := {decide := false})
. This makes simp
(and consequentially norm_num
) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp
or norm_num
to decide
or rfl
, or adding (config := {decide := true})
.
This changed the behaviour of simp
so that simp [f]
will only unfold "fully applied" occurrences of f
. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true })
. We may in future add a syntax for this, e.g. simp [!f]
; please provide feedback! In the meantime, we have made the following changes:
(config := { unfoldPartialApp := true })
in some places, to recover the old behaviour@[eqns]
to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp
and Function.flip
.This change in Lean may require further changes down the line (e.g. adding the !f
syntax, and/or upstreaming the special treatment for Function.comp
and Function.flip
, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -28,8 +28,6 @@ that is solvable by radicals has a solvable Galois group.
noncomputable section
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
-
open scoped Classical Polynomial IntermediateField
open Polynomial IntermediateField
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 |
@@ -286,9 +286,9 @@ theorem isIntegral (α : solvableByRad F E) : IsIntegral F α := by
revert α
apply solvableByRad.induction
· exact fun _ => isIntegral_algebraMap
- · exact fun _ _ => isIntegral_add
- · exact fun _ => isIntegral_neg
- · exact fun _ _ => isIntegral_mul
+ · exact fun _ _ => IsIntegral.add
+ · exact fun _ => IsIntegral.neg
+ · exact fun _ _ => IsIntegral.mul
· intro α hα
exact Subalgebra.inv_mem_of_algebraic (integralClosure F (solvableByRad F E))
(show IsAlgebraic F ↑(⟨α, hα⟩ : integralClosure F (solvableByRad F E)) from
Inspired by the IsAlgClosed.lift.SubfieldWithHom counterpart:
Change Lifts
from a Sigma type to a structure with fields carrier
and emb
.
Change the definition of the partial order on Lifts
to use IntermediateField.inclusion
.
Use Subalgebra.iSupLift in the proof of Lifts.exists_upper_bound
.
Also:
Inline multiple auxiliary definitions for Lifts.exists_upper_bound
and Lifts.exists_lift_of_splits
into the proofs proper.
Move the Supremum
section much further up, in order to use the new lemma toSubalgebra_iSup_of_directed
to prove stuff about Lifts
(and golf a proof about CompactElement
). isAlgebraic_iSup
however can't be moved up, so I put it near adjoin.finiteDimensional
, the last lemma it depends on.
Co-authored-by: acmepjz <acme_pjz@hotmail.com>
@@ -341,13 +341,14 @@ theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮α, β⟯) (
have hpq := Polynomial.splits_of_splits_mul _
(mul_ne_zero (minpoly.ne_zero (isIntegral α)) (minpoly.ne_zero (isIntegral β)))
(SplittingField.splits (p * q))
- let f : ↥F⟮α, β⟯ →ₐ[F] (p * q).SplittingField := Classical.choice <| algHom_mk_adjoin_splits (by
- intro x hx
- cases' hx with hx hx
- rw [hx]
- exact ⟨isIntegral α, hpq.1⟩
- cases hx
- exact ⟨isIntegral β, hpq.2⟩)
+ let f : ↥F⟮α, β⟯ →ₐ[F] (p * q).SplittingField :=
+ Classical.choice <| nonempty_algHom_adjoin_of_splits <| by
+ intro x hx
+ cases' hx with hx hx
+ rw [hx]
+ exact ⟨isIntegral α, hpq.1⟩
+ cases hx
+ exact ⟨isIntegral β, hpq.2⟩
have key : minpoly F γ = minpoly F (f ⟨γ, hγ⟩) := by
refine' minpoly.eq_of_irreducible_of_monic
(minpoly.irreducible (isIntegral γ)) _ (minpoly.monic (isIntegral γ))
@@ -30,7 +30,7 @@ noncomputable section
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
-open scoped Classical Polynomial
+open scoped Classical Polynomial IntermediateField
open Polynomial IntermediateField
Due to recent changes in core we can reduce or remove many set_option maxHeartbeats
statements.
I have tried to be careful to not leave anything too close to the line, so don't be surprised if some of these can still be reduced further.
This reduces us from 96 maxHeartbeats
statements to 44
. (There are 10 false positives in meta or testing code.)
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -117,7 +117,6 @@ theorem gal_X_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).G
set_option linter.uppercaseLean3 false in
#align gal_X_pow_sub_one_is_solvable gal_X_pow_sub_one_isSolvable
-set_option maxHeartbeats 250000 in
theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
(h : (X ^ n - 1 : F[X]).Splits (RingHom.id F)) : IsSolvable (X ^ n - C a).Gal := by
by_cases ha : a = 0
@@ -157,7 +156,6 @@ theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
set_option linter.uppercaseLean3 false in
#align gal_X_pow_sub_C_is_solvable_aux gal_X_pow_sub_C_isSolvable_aux
-set_option maxHeartbeats 250000 in
theorem splits_X_pow_sub_one_of_X_pow_sub_C {F : Type*} [Field F] {E : Type*} [Field E]
(i : F →+* E) (n : ℕ) {a : F} (ha : a ≠ 0) (h : (X ^ n - C a).Splits i) :
(X ^ n - 1 : F[X]).Splits i := by
@@ -309,7 +307,6 @@ def P (α : solvableByRad F E) : Prop :=
set_option linter.uppercaseLean3 false in
#align solvable_by_rad.P solvableByRad.P
-set_option maxHeartbeats 400000 in
/-- An auxiliary induction lemma, which is generalized by `solvableByRad.isSolvable`. -/
theorem induction3 {α : solvableByRad F E} {n : ℕ} (hn : n ≠ 0) (hα : P (α ^ n)) : P α := by
let p := minpoly F (α ^ n)
@@ -363,7 +363,9 @@ theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮α, β⟯) (
simp only [map_zero, _root_.map_eq_zero]
-- Porting note: end of the proof was `exact minpoly.aeval F γ`.
apply Subtype.val_injective
- simp [Polynomial.aeval_subalgebra_coe (minpoly F γ)]
+ -- This used to be `simp`, but we need `erw` and `simp` after leanprover/lean4#2644
+ erw [Polynomial.aeval_subalgebra_coe (minpoly F γ)]
+ simp
rw [P, key]
refine' gal_isSolvable_of_splits ⟨Normal.splits _ (f ⟨γ, hγ⟩)⟩ (gal_mul_isSolvable hα hβ)
apply SplittingField.instNormal
@@ -363,9 +363,7 @@ theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮α, β⟯) (
simp only [map_zero, _root_.map_eq_zero]
-- Porting note: end of the proof was `exact minpoly.aeval F γ`.
apply Subtype.val_injective
- -- This used to be `simp`, but we need `erw` and `simp` after leanprover/lean4#2644
- erw [Polynomial.aeval_subalgebra_coe (minpoly F γ)]
- simp
+ simp [Polynomial.aeval_subalgebra_coe (minpoly F γ)]
rw [P, key]
refine' gal_isSolvable_of_splits ⟨Normal.splits _ (f ⟨γ, hγ⟩)⟩ (gal_mul_isSolvable hα hβ)
apply SplittingField.instNormal
@@ -363,7 +363,9 @@ theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮α, β⟯) (
simp only [map_zero, _root_.map_eq_zero]
-- Porting note: end of the proof was `exact minpoly.aeval F γ`.
apply Subtype.val_injective
- simp [Polynomial.aeval_subalgebra_coe (minpoly F γ)]
+ -- This used to be `simp`, but we need `erw` and `simp` after leanprover/lean4#2644
+ erw [Polynomial.aeval_subalgebra_coe (minpoly F γ)]
+ simp
rw [P, key]
refine' gal_isSolvable_of_splits ⟨Normal.splits _ (f ⟨γ, hγ⟩)⟩ (gal_mul_isSolvable hα hβ)
apply SplittingField.instNormal
minpoly.eq_of_algebraMap_eq
by algebraMap_eq
(#7228)
Also changes the repetitive names minpoly.minpoly_algHom/Equiv
to minpoly.algHom/Equiv_eq
@@ -394,7 +394,7 @@ theorem isSolvable' {α : E} {q : F[X]} (q_irred : Irreducible q) (q_aeval : aev
have : _root_.IsSolvable (q * C q.leadingCoeff⁻¹).Gal := by
rw [minpoly.eq_of_irreducible q_irred q_aeval, ←
show minpoly F (⟨α, hα⟩ : solvableByRad F E) = minpoly F α from
- minpoly.eq_of_algebraMap_eq (RingHom.injective _) (isIntegral ⟨α, hα⟩) rfl]
+ (minpoly.algebraMap_eq (RingHom.injective _) _).symm]
exact isSolvable ⟨α, hα⟩
refine' solvable_of_surjective (Gal.restrictDvd_surjective ⟨C q.leadingCoeff⁻¹, rfl⟩ _)
rw [mul_ne_zero_iff, Ne, Ne, C_eq_zero, inv_eq_zero]
@@ -117,7 +117,7 @@ theorem gal_X_pow_sub_one_isSolvable (n : ℕ) : IsSolvable (X ^ n - 1 : F[X]).G
set_option linter.uppercaseLean3 false in
#align gal_X_pow_sub_one_is_solvable gal_X_pow_sub_one_isSolvable
-set_option maxHeartbeats 300000 in
+set_option maxHeartbeats 250000 in
theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
(h : (X ^ n - 1 : F[X]).Splits (RingHom.id F)) : IsSolvable (X ^ n - C a).Gal := by
by_cases ha : a = 0
@@ -157,7 +157,7 @@ theorem gal_X_pow_sub_C_isSolvable_aux (n : ℕ) (a : F)
set_option linter.uppercaseLean3 false in
#align gal_X_pow_sub_C_is_solvable_aux gal_X_pow_sub_C_isSolvable_aux
-set_option maxHeartbeats 300000 in
+set_option maxHeartbeats 250000 in
theorem splits_X_pow_sub_one_of_X_pow_sub_C {F : Type*} [Field F] {E : Type*} [Field E]
(i : F →+* E) (n : ℕ) {a : F} (ha : a ≠ 0) (h : (X ^ n - C a).Splits i) :
(X ^ n - 1 : F[X]).Splits i := by
@@ -309,7 +309,7 @@ def P (α : solvableByRad F E) : Prop :=
set_option linter.uppercaseLean3 false in
#align solvable_by_rad.P solvableByRad.P
-set_option maxHeartbeats 500000 in
+set_option maxHeartbeats 400000 in
/-- An auxiliary induction lemma, which is generalized by `solvableByRad.isSolvable`. -/
theorem induction3 {α : solvableByRad F E} {n : ℕ} (hn : n ≠ 0) (hα : P (α ^ n)) : P α := by
let p := minpoly F (α ^ n)
@@ -237,7 +237,6 @@ def solvableByRad : IntermediateField F E where
change IsSolvableByRad F 0
convert IsSolvableByRad.base (E := E) (0 : F); rw [RingHom.map_zero]
add_mem' := by apply IsSolvableByRad.add
- neg_mem' := IsSolvableByRad.neg
one_mem' := by
change IsSolvableByRad F 1
convert IsSolvableByRad.base (E := E) (1 : F); rw [RingHom.map_one]
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -36,7 +36,7 @@ open Polynomial IntermediateField
section AbelRuffini
-variable {F : Type _} [Field F] {E : Type _} [Field E] [Algebra F E]
+variable {F : Type*} [Field F] {E : Type*} [Field E] [Algebra F E]
theorem gal_zero_isSolvable : IsSolvable (0 : F[X]).Gal := by infer_instance
#align gal_zero_is_solvable gal_zero_isSolvable
@@ -158,7 +158,7 @@ set_option linter.uppercaseLean3 false in
#align gal_X_pow_sub_C_is_solvable_aux gal_X_pow_sub_C_isSolvable_aux
set_option maxHeartbeats 300000 in
-theorem splits_X_pow_sub_one_of_X_pow_sub_C {F : Type _} [Field F] {E : Type _} [Field E]
+theorem splits_X_pow_sub_one_of_X_pow_sub_C {F : Type*} [Field F] {E : Type*} [Field E]
(i : F →+* E) (n : ℕ) {a : F} (ha : a ≠ 0) (h : (X ^ n - C a).Splits i) :
(X ^ n - 1 : F[X]).Splits i := by
have ha' : i a ≠ 0 := mt ((injective_iff_map_eq_zero i).mp i.injective a) ha
@@ -28,7 +28,7 @@ that is solvable by radicals has a solvable Galois group.
noncomputable section
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue #2220
+local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
open scoped Classical Polynomial
@@ -2,16 +2,13 @@
Copyright (c) 2020 Thomas Browning and Patrick Lutz. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning, Patrick Lutz
-
-! This file was ported from Lean 3 source module field_theory.abel_ruffini
-! leanprover-community/mathlib commit e3f4be1fcb5376c4948d7f095bec45350bfb9d1a
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.GroupTheory.Solvable
import Mathlib.FieldTheory.PolynomialGaloisGroup
import Mathlib.RingTheory.RootsOfUnity.Basic
+#align_import field_theory.abel_ruffini from "leanprover-community/mathlib"@"e3f4be1fcb5376c4948d7f095bec45350bfb9d1a"
+
/-!
# The Abel-Ruffini Theorem
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file