field_theory.abel_ruffiniMathlib.FieldTheory.AbelRuffini

This file has been ported!

Changes since the initial port

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.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(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)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -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
Diff
@@ -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
Diff
@@ -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))
Diff
@@ -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"
 
Diff
@@ -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
Diff
@@ -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
 
Diff
@@ -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.
 
Diff
@@ -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
 
Diff
@@ -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'
Diff
@@ -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) -/
Diff
@@ -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 α⁻¹
Diff
@@ -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']
Diff
@@ -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
Diff
@@ -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
Diff
@@ -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
 
Diff
@@ -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
Diff
@@ -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 α β =>
Diff
@@ -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]

Changes in mathlib4

mathlib3
mathlib4
chore: rename IsRoot.definition back to IsRoot.def (#11999)

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
chore: Rename 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 | |

Diff
@@ -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,
chore: rename away from 'def' (#11548)

This will become an error in 2024-03-16 nightly, possibly not permanently.

Co-authored-by: Scott Morrison <scott@tqft.net>

Diff
@@ -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
fix: remove an unnecessary instance or two (#10116)

These instances don't seem to be necessary (and there's evidence in a porting note that one of them used to be).

Diff
@@ -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 γ`.
chore: tidy various files (#10362)
Diff
@@ -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 γ))
feat: The support of 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

Diff
@@ -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
chore(IntegralClosure): noncommutative generalizations and golfs (#8406)

Zulip

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_mapRingHom.isIntegralElem_map RingHom.is_integral_of_mem_closureRingHom.IsIntegralElem.of_mem_closure RingHom.is_integral_zero/oneRingHom.isIntegralElem_zero/one RingHom.is_integral_add/neg/sub/mul/of_mul_unitRingHom.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_transRingHom.IsIntegral.trans RingHom.isIntegral_quotient/tower_bot/top_of_isIntegralRingHom.IsIntegral.quotient/tower_bot/top isIntegral_of_mem_closure'IsIntegral.of_mem_closure' (and the '' version) isIntegral_of_surjectiveAlgebra.isIntegral_of_surjective

The next changed file is RingTheory/Algebraic:

  • Rename: of_larger_basetower_top (for consistency with IsIntegral) Algebra.isAlgebraic_of_finiteAlgebra.IsAlgebraic.of_finite Algebra.isAlgebraic_transAlgebra.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>

Diff
@@ -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]
chore: bump to v4.3.0-rc2 (#8366)

PR contents

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.

Lean PRs involved in this bump

In particular this includes adjustments for the Lean PRs

leanprover/lean4#2778

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).

leanprover/lean4#2722

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}).

leanprover/lean4#2783

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:

  • switching to using explicit lemmas that have the intended level of application
  • (config := { unfoldPartialApp := true }) in some places, to recover the old behaviour
  • Using @[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>

Diff
@@ -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
chore(RingTheory/{Algebraic, Localization/Integral}): rename decls to use dot notation (#8437)

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 |

Diff
@@ -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
refactor: golf IntermediateField.Lifts (#8221)

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>

Diff
@@ -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 γ))
chore: Scope the adjoin element notation (#7938)
Diff
@@ -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
 
chore: removing unneeded maxHeartbeats (#7761)

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>

Diff
@@ -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)
Revert "chore: revert #7703 (#7710)"

This reverts commit f3695eb2.

Diff
@@ -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
chore: revert #7703 (#7710)

This reverts commit 26eb2b0a.

Diff
@@ -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
chore: bump toolchain to v4.2.0-rc2 (#7703)

This includes all the changes from #7606.

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
chore: replace minpoly.eq_of_algebraMap_eq by algebraMap_eq (#7228)

Also changes the repetitive names minpoly.minpoly_algHom/Equiv to minpoly.algHom/Equiv_eq

Diff
@@ -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]
chore: update/remove heart beat bumps (#6860)

We clean up heart beat bumps after #6474.

Diff
@@ -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)
refactor(FieldTheory): remove redundant axiom neg_mem' from IntermediateField (#6669)
Diff
@@ -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]
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -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
chore: regularize HPow.hPow porting notes (#6465)
Diff
@@ -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
 
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
 
feat: port FieldTheory.AbelRuffini (#5424)

Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com> Co-authored-by: Riccardo Brasca <riccardo.brasca@gmail.com> Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>

Dependencies 12 + 1151

1152 files ported (99.0%)
509567 lines ported (98.9%)
Show graph

The unported dependencies are

The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file