field_theory.ax_grothendieckMathlib.FieldTheory.AxGrothendieck

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)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(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
@@ -3,7 +3,7 @@ Copyright (c) 2023 Chris Hughes. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Chris Hughes
 -/
-import Data.MvPolynomial.Basic
+import Algebra.MvPolynomial.Basic
 import RingTheory.Algebraic
 import Data.Fintype.Card
 
Diff
@@ -65,7 +65,7 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K]
   have hres_inj : injective res := by
     intro x y hxy
     ext i
-    simp only [res, Subtype.ext_iff, funext_iff] at hxy 
+    simp only [res, Subtype.ext_iff, funext_iff] at hxy
     exact congr_fun (hinj (funext hxy)) i
   have hres_surj : surjective res := Finite.injective_iff_surjective.1 hres_inj
   cases' hres_surj fun i => ⟨v i, hv i⟩ with w hw
Diff
@@ -40,9 +40,37 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K]
   by
   have is_int : ∀ x : R, IsIntegral K x := fun x => isAlgebraic_iff_isIntegral.1 (alg x)
   classical
+  intro v
+  cases nonempty_fintype ι
+  /- `s` is the set of all coefficients of the polynomial, as well as all of
+    the coordinates of `v`, the point I am trying to find the preimage of. -/
+  let s : Finset R :=
+    (Finset.biUnion (univ : Finset ι) fun i => (ps i).support.image fun x => coeff x (ps i)) ∪
+      (univ : Finset ι).image v
+  have hv : ∀ i, v i ∈ Algebra.adjoin K (s : Set R) := fun j =>
+    Algebra.subset_adjoin (mem_union_right _ (mem_image.2 ⟨j, mem_univ _, rfl⟩))
+  have hs₁ :
+    ∀ (i : ι) (k : ι →₀ ℕ), k ∈ (ps i).support → coeff k (ps i) ∈ Algebra.adjoin K (s : Set R) :=
+    fun i k hk =>
+    Algebra.subset_adjoin (mem_union_left _ (mem_bUnion.2 ⟨i, mem_univ _, mem_image_of_mem _ hk⟩))
+  have hs : ∀ i, MvPolynomial.eval v (ps i) ∈ Algebra.adjoin K (s : Set R) := fun i =>
+    eval_mem (hs₁ _) hv
+  letI := isNoetherian_adjoin_finset s fun x _ => is_int x
+  letI := Module.IsNoetherian.finite K (Algebra.adjoin K (s : Set R))
+  letI : Finite (Algebra.adjoin K (s : Set R)) :=
+    FiniteDimensional.finite_of_finite K (Algebra.adjoin K (s : Set R))
+  -- The restriction of the polynomial map, `ps`, to the subalgebra generated by `s`
+  let res : (ι → Algebra.adjoin K (s : Set R)) → ι → Algebra.adjoin K (s : Set R) := fun x i =>
+    ⟨eval (fun j : ι => (x j : R)) (ps i), eval_mem (hs₁ _) fun i => (x i).2⟩
+  have hres_inj : injective res := by
+    intro x y hxy
+    ext i
+    simp only [res, Subtype.ext_iff, funext_iff] at hxy 
+    exact congr_fun (hinj (funext hxy)) i
+  have hres_surj : surjective res := Finite.injective_iff_surjective.1 hres_inj
+  cases' hres_surj fun i => ⟨v i, hv i⟩ with w hw
+  use fun i => w i
+  simpa only [res, Subtype.ext_iff, funext_iff] using hw
 #align ax_grothendieck_of_locally_finite ax_grothendieck_of_locally_finite
 -/
 
-/- `s` is the set of all coefficients of the polynomial, as well as all of
-  the coordinates of `v`, the point I am trying to find the preimage of. -/
--- The restriction of the polynomial map, `ps`, to the subalgebra generated by `s` 
Diff
@@ -40,37 +40,9 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K]
   by
   have is_int : ∀ x : R, IsIntegral K x := fun x => isAlgebraic_iff_isIntegral.1 (alg x)
   classical
-  intro v
-  cases nonempty_fintype ι
-  /- `s` is the set of all coefficients of the polynomial, as well as all of
-    the coordinates of `v`, the point I am trying to find the preimage of. -/
-  let s : Finset R :=
-    (Finset.biUnion (univ : Finset ι) fun i => (ps i).support.image fun x => coeff x (ps i)) ∪
-      (univ : Finset ι).image v
-  have hv : ∀ i, v i ∈ Algebra.adjoin K (s : Set R) := fun j =>
-    Algebra.subset_adjoin (mem_union_right _ (mem_image.2 ⟨j, mem_univ _, rfl⟩))
-  have hs₁ :
-    ∀ (i : ι) (k : ι →₀ ℕ), k ∈ (ps i).support → coeff k (ps i) ∈ Algebra.adjoin K (s : Set R) :=
-    fun i k hk =>
-    Algebra.subset_adjoin (mem_union_left _ (mem_bUnion.2 ⟨i, mem_univ _, mem_image_of_mem _ hk⟩))
-  have hs : ∀ i, MvPolynomial.eval v (ps i) ∈ Algebra.adjoin K (s : Set R) := fun i =>
-    eval_mem (hs₁ _) hv
-  letI := isNoetherian_adjoin_finset s fun x _ => is_int x
-  letI := Module.IsNoetherian.finite K (Algebra.adjoin K (s : Set R))
-  letI : Finite (Algebra.adjoin K (s : Set R)) :=
-    FiniteDimensional.finite_of_finite K (Algebra.adjoin K (s : Set R))
-  -- The restriction of the polynomial map, `ps`, to the subalgebra generated by `s`
-  let res : (ι → Algebra.adjoin K (s : Set R)) → ι → Algebra.adjoin K (s : Set R) := fun x i =>
-    ⟨eval (fun j : ι => (x j : R)) (ps i), eval_mem (hs₁ _) fun i => (x i).2⟩
-  have hres_inj : injective res := by
-    intro x y hxy
-    ext i
-    simp only [res, Subtype.ext_iff, funext_iff] at hxy 
-    exact congr_fun (hinj (funext hxy)) i
-  have hres_surj : surjective res := Finite.injective_iff_surjective.1 hres_inj
-  cases' hres_surj fun i => ⟨v i, hv i⟩ with w hw
-  use fun i => w i
-  simpa only [res, Subtype.ext_iff, funext_iff] using hw
 #align ax_grothendieck_of_locally_finite ax_grothendieck_of_locally_finite
 -/
 
+/- `s` is the set of all coefficients of the polynomial, as well as all of
+  the coordinates of `v`, the point I am trying to find the preimage of. -/
+-- The restriction of the polynomial map, `ps`, to the subalgebra generated by `s` 
Diff
@@ -3,9 +3,9 @@ Copyright (c) 2023 Chris Hughes. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Chris Hughes
 -/
-import Mathbin.Data.MvPolynomial.Basic
-import Mathbin.RingTheory.Algebraic
-import Mathbin.Data.Fintype.Card
+import Data.MvPolynomial.Basic
+import RingTheory.Algebraic
+import Data.Fintype.Card
 
 #align_import field_theory.ax_grothendieck from "leanprover-community/mathlib"@"61db041ab8e4aaf8cb5c7dc10a7d4ff261997536"
 
Diff
@@ -2,16 +2,13 @@
 Copyright (c) 2023 Chris Hughes. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Chris Hughes
-
-! This file was ported from Lean 3 source module field_theory.ax_grothendieck
-! leanprover-community/mathlib commit 61db041ab8e4aaf8cb5c7dc10a7d4ff261997536
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.Data.MvPolynomial.Basic
 import Mathbin.RingTheory.Algebraic
 import Mathbin.Data.Fintype.Card
 
+#align_import field_theory.ax_grothendieck from "leanprover-community/mathlib"@"61db041ab8e4aaf8cb5c7dc10a7d4ff261997536"
+
 /-!
 # Ax-Grothendieck for algebraic extensions of `zmod p`
 
Diff
@@ -35,6 +35,7 @@ noncomputable section
 
 open MvPolynomial Finset Function
 
+#print ax_grothendieck_of_locally_finite /-
 /-- Any injective polynomial map over an algebraic extension of a finite field is surjective. -/
 theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K] [CommRing R]
     [Finite ι] [Algebra K R] (alg : Algebra.IsAlgebraic K R) (ps : ι → MvPolynomial ι R)
@@ -74,4 +75,5 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K]
   use fun i => w i
   simpa only [res, Subtype.ext_iff, funext_iff] using hw
 #align ax_grothendieck_of_locally_finite ax_grothendieck_of_locally_finite
+-/
 
Diff
@@ -42,36 +42,36 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K]
   by
   have is_int : ∀ x : R, IsIntegral K x := fun x => isAlgebraic_iff_isIntegral.1 (alg x)
   classical
-    intro v
-    cases nonempty_fintype ι
-    /- `s` is the set of all coefficients of the polynomial, as well as all of
-      the coordinates of `v`, the point I am trying to find the preimage of. -/
-    let s : Finset R :=
-      (Finset.biUnion (univ : Finset ι) fun i => (ps i).support.image fun x => coeff x (ps i)) ∪
-        (univ : Finset ι).image v
-    have hv : ∀ i, v i ∈ Algebra.adjoin K (s : Set R) := fun j =>
-      Algebra.subset_adjoin (mem_union_right _ (mem_image.2 ⟨j, mem_univ _, rfl⟩))
-    have hs₁ :
-      ∀ (i : ι) (k : ι →₀ ℕ), k ∈ (ps i).support → coeff k (ps i) ∈ Algebra.adjoin K (s : Set R) :=
-      fun i k hk =>
-      Algebra.subset_adjoin (mem_union_left _ (mem_bUnion.2 ⟨i, mem_univ _, mem_image_of_mem _ hk⟩))
-    have hs : ∀ i, MvPolynomial.eval v (ps i) ∈ Algebra.adjoin K (s : Set R) := fun i =>
-      eval_mem (hs₁ _) hv
-    letI := isNoetherian_adjoin_finset s fun x _ => is_int x
-    letI := Module.IsNoetherian.finite K (Algebra.adjoin K (s : Set R))
-    letI : Finite (Algebra.adjoin K (s : Set R)) :=
-      FiniteDimensional.finite_of_finite K (Algebra.adjoin K (s : Set R))
-    -- The restriction of the polynomial map, `ps`, to the subalgebra generated by `s`
-    let res : (ι → Algebra.adjoin K (s : Set R)) → ι → Algebra.adjoin K (s : Set R) := fun x i =>
-      ⟨eval (fun j : ι => (x j : R)) (ps i), eval_mem (hs₁ _) fun i => (x i).2⟩
-    have hres_inj : injective res := by
-      intro x y hxy
-      ext i
-      simp only [res, Subtype.ext_iff, funext_iff] at hxy 
-      exact congr_fun (hinj (funext hxy)) i
-    have hres_surj : surjective res := Finite.injective_iff_surjective.1 hres_inj
-    cases' hres_surj fun i => ⟨v i, hv i⟩ with w hw
-    use fun i => w i
-    simpa only [res, Subtype.ext_iff, funext_iff] using hw
+  intro v
+  cases nonempty_fintype ι
+  /- `s` is the set of all coefficients of the polynomial, as well as all of
+    the coordinates of `v`, the point I am trying to find the preimage of. -/
+  let s : Finset R :=
+    (Finset.biUnion (univ : Finset ι) fun i => (ps i).support.image fun x => coeff x (ps i)) ∪
+      (univ : Finset ι).image v
+  have hv : ∀ i, v i ∈ Algebra.adjoin K (s : Set R) := fun j =>
+    Algebra.subset_adjoin (mem_union_right _ (mem_image.2 ⟨j, mem_univ _, rfl⟩))
+  have hs₁ :
+    ∀ (i : ι) (k : ι →₀ ℕ), k ∈ (ps i).support → coeff k (ps i) ∈ Algebra.adjoin K (s : Set R) :=
+    fun i k hk =>
+    Algebra.subset_adjoin (mem_union_left _ (mem_bUnion.2 ⟨i, mem_univ _, mem_image_of_mem _ hk⟩))
+  have hs : ∀ i, MvPolynomial.eval v (ps i) ∈ Algebra.adjoin K (s : Set R) := fun i =>
+    eval_mem (hs₁ _) hv
+  letI := isNoetherian_adjoin_finset s fun x _ => is_int x
+  letI := Module.IsNoetherian.finite K (Algebra.adjoin K (s : Set R))
+  letI : Finite (Algebra.adjoin K (s : Set R)) :=
+    FiniteDimensional.finite_of_finite K (Algebra.adjoin K (s : Set R))
+  -- The restriction of the polynomial map, `ps`, to the subalgebra generated by `s`
+  let res : (ι → Algebra.adjoin K (s : Set R)) → ι → Algebra.adjoin K (s : Set R) := fun x i =>
+    ⟨eval (fun j : ι => (x j : R)) (ps i), eval_mem (hs₁ _) fun i => (x i).2⟩
+  have hres_inj : injective res := by
+    intro x y hxy
+    ext i
+    simp only [res, Subtype.ext_iff, funext_iff] at hxy 
+    exact congr_fun (hinj (funext hxy)) i
+  have hres_surj : surjective res := Finite.injective_iff_surjective.1 hres_inj
+  cases' hres_surj fun i => ⟨v i, hv i⟩ with w hw
+  use fun i => w i
+  simpa only [res, Subtype.ext_iff, funext_iff] using hw
 #align ax_grothendieck_of_locally_finite ax_grothendieck_of_locally_finite
 
Diff
@@ -67,7 +67,7 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K]
     have hres_inj : injective res := by
       intro x y hxy
       ext i
-      simp only [res, Subtype.ext_iff, funext_iff] at hxy
+      simp only [res, Subtype.ext_iff, funext_iff] at hxy 
       exact congr_fun (hinj (funext hxy)) i
     have hres_surj : surjective res := Finite.injective_iff_surjective.1 hres_inj
     cases' hres_surj fun i => ⟨v i, hv i⟩ with w hw
Diff
@@ -35,9 +35,6 @@ noncomputable section
 
 open MvPolynomial Finset Function
 
-/- warning: ax_grothendieck_of_locally_finite -> ax_grothendieck_of_locally_finite is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align ax_grothendieck_of_locally_finite ax_grothendieck_of_locally_finiteₓ'. -/
 /-- Any injective polynomial map over an algebraic extension of a finite field is surjective. -/
 theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K] [CommRing R]
     [Finite ι] [Algebra K R] (alg : Algebra.IsAlgebraic K R) (ps : ι → MvPolynomial ι R)
Diff
@@ -36,10 +36,7 @@ noncomputable section
 open MvPolynomial Finset Function
 
 /- warning: ax_grothendieck_of_locally_finite -> ax_grothendieck_of_locally_finite is a dubious translation:
-lean 3 declaration is
-  forall {ι : Type.{u1}} {K : Type.{u2}} {R : Type.{u3}} [_inst_1 : Field.{u2} K] [_inst_2 : Finite.{succ u2} K] [_inst_3 : CommRing.{u3} R] [_inst_4 : Finite.{succ u1} ι] [_inst_5 : Algebra.{u2, u3} K R (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (Ring.toSemiring.{u3} R (CommRing.toRing.{u3} R _inst_3))], (Algebra.IsAlgebraic.{u2, u3} K R (EuclideanDomain.toCommRing.{u2} K (Field.toEuclideanDomain.{u2} K _inst_1)) (CommRing.toRing.{u3} R _inst_3) _inst_5) -> (forall (ps : ι -> (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3))), (Function.Injective.{max (succ u1) (succ u3), max (succ u1) (succ u3)} (ι -> R) (ι -> R) (fun (v : ι -> R) (i : ι) => coeFn.{max (succ (max u1 u3)) (succ u3), max (succ (max u1 u3)) (succ u3)} (RingHom.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) (fun (_x : RingHom.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) => (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) -> R) (RingHom.hasCoeToFun.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) (MvPolynomial.eval.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3) v) (ps i))) -> (Function.Surjective.{max (succ u1) (succ u3), max (succ u1) (succ u3)} (ι -> R) (ι -> R) (fun (v : ι -> R) (i : ι) => coeFn.{max (succ (max u1 u3)) (succ u3), max (succ (max u1 u3)) (succ u3)} (RingHom.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) (fun (_x : RingHom.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) => (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) -> R) (RingHom.hasCoeToFun.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) (MvPolynomial.eval.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3) v) (ps i))))
-but is expected to have type
-  forall {ι : Type.{u3}} {K : Type.{u2}} {R : Type.{u1}} [_inst_1 : Field.{u2} K] [_inst_2 : Finite.{succ u2} K] [_inst_3 : CommRing.{u1} R] [_inst_4 : Finite.{succ u3} ι] [_inst_5 : Algebra.{u2, u1} K R (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))], (Algebra.IsAlgebraic.{u2, u1} K R (EuclideanDomain.toCommRing.{u2} K (Field.toEuclideanDomain.{u2} K _inst_1)) (CommRing.toRing.{u1} R _inst_3) _inst_5) -> (forall (ps : ι -> (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3))), (Function.Injective.{max (succ u3) (succ u1), max (succ u3) (succ u1)} (ι -> R) (forall (i : ι), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => R) (ps i)) (fun (v : ι -> R) (i : ι) => FunLike.coe.{max (succ u3) (succ u1), max (succ u3) (succ u1), succ u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (fun (_x : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => R) _x) (MulHomClass.toFunLike.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (NonUnitalNonAssocSemiring.toMul.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))))) (NonUnitalNonAssocSemiring.toMul.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))))) (NonUnitalRingHomClass.toMulHomClass.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3))))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (RingHomClass.toNonUnitalRingHomClass.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))) (RingHom.instRingHomClassRingHom.{max u3 u1, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))))))) (MvPolynomial.eval.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3) v) (ps i))) -> (Function.Surjective.{max (succ u3) (succ u1), max (succ u3) (succ u1)} (ι -> R) (forall (i : ι), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => R) (ps i)) (fun (v : ι -> R) (i : ι) => FunLike.coe.{max (succ u3) (succ u1), max (succ u3) (succ u1), succ u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (fun (_x : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => R) _x) (MulHomClass.toFunLike.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (NonUnitalNonAssocSemiring.toMul.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))))) (NonUnitalNonAssocSemiring.toMul.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))))) (NonUnitalRingHomClass.toMulHomClass.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3))))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (RingHomClass.toNonUnitalRingHomClass.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))) (RingHom.instRingHomClassRingHom.{max u3 u1, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))))))) (MvPolynomial.eval.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3) v) (ps i))))
+<too large>
 Case conversion may be inaccurate. Consider using '#align ax_grothendieck_of_locally_finite ax_grothendieck_of_locally_finiteₓ'. -/
 /-- Any injective polynomial map over an algebraic extension of a finite field is surjective. -/
 theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K] [CommRing R]
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Chris Hughes
 
 ! This file was ported from Lean 3 source module field_theory.ax_grothendieck
-! leanprover-community/mathlib commit 4e529b03dd62b7b7d13806c3fb974d9d4848910e
+! leanprover-community/mathlib commit 61db041ab8e4aaf8cb5c7dc10a7d4ff261997536
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -15,6 +15,9 @@ import Mathbin.Data.Fintype.Card
 /-!
 # Ax-Grothendieck for algebraic extensions of `zmod p`
 
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
 This file proves that if `R` is an algebraic extension of a finite field,
 then any injective polynomial map `R^n -> R^n` is also surjective.
 
Diff
@@ -32,6 +32,12 @@ noncomputable section
 
 open MvPolynomial Finset Function
 
+/- warning: ax_grothendieck_of_locally_finite -> ax_grothendieck_of_locally_finite is a dubious translation:
+lean 3 declaration is
+  forall {ι : Type.{u1}} {K : Type.{u2}} {R : Type.{u3}} [_inst_1 : Field.{u2} K] [_inst_2 : Finite.{succ u2} K] [_inst_3 : CommRing.{u3} R] [_inst_4 : Finite.{succ u1} ι] [_inst_5 : Algebra.{u2, u3} K R (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (Ring.toSemiring.{u3} R (CommRing.toRing.{u3} R _inst_3))], (Algebra.IsAlgebraic.{u2, u3} K R (EuclideanDomain.toCommRing.{u2} K (Field.toEuclideanDomain.{u2} K _inst_1)) (CommRing.toRing.{u3} R _inst_3) _inst_5) -> (forall (ps : ι -> (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3))), (Function.Injective.{max (succ u1) (succ u3), max (succ u1) (succ u3)} (ι -> R) (ι -> R) (fun (v : ι -> R) (i : ι) => coeFn.{max (succ (max u1 u3)) (succ u3), max (succ (max u1 u3)) (succ u3)} (RingHom.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) (fun (_x : RingHom.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) => (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) -> R) (RingHom.hasCoeToFun.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) (MvPolynomial.eval.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3) v) (ps i))) -> (Function.Surjective.{max (succ u1) (succ u3), max (succ u1) (succ u3)} (ι -> R) (ι -> R) (fun (v : ι -> R) (i : ι) => coeFn.{max (succ (max u1 u3)) (succ u3), max (succ (max u1 u3)) (succ u3)} (RingHom.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) (fun (_x : RingHom.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) => (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) -> R) (RingHom.hasCoeToFun.{max u1 u3, u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u1, u3} ι R (CommRing.toCommSemiring.{u3} R _inst_3)) (MvPolynomial.commSemiring.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3)))) (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R (CommRing.toCommSemiring.{u3} R _inst_3)))) (MvPolynomial.eval.{u3, u1} R ι (CommRing.toCommSemiring.{u3} R _inst_3) v) (ps i))))
+but is expected to have type
+  forall {ι : Type.{u3}} {K : Type.{u2}} {R : Type.{u1}} [_inst_1 : Field.{u2} K] [_inst_2 : Finite.{succ u2} K] [_inst_3 : CommRing.{u1} R] [_inst_4 : Finite.{succ u3} ι] [_inst_5 : Algebra.{u2, u1} K R (Semifield.toCommSemiring.{u2} K (Field.toSemifield.{u2} K _inst_1)) (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))], (Algebra.IsAlgebraic.{u2, u1} K R (EuclideanDomain.toCommRing.{u2} K (Field.toEuclideanDomain.{u2} K _inst_1)) (CommRing.toRing.{u1} R _inst_3) _inst_5) -> (forall (ps : ι -> (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3))), (Function.Injective.{max (succ u3) (succ u1), max (succ u3) (succ u1)} (ι -> R) (forall (i : ι), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => R) (ps i)) (fun (v : ι -> R) (i : ι) => FunLike.coe.{max (succ u3) (succ u1), max (succ u3) (succ u1), succ u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (fun (_x : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => R) _x) (MulHomClass.toFunLike.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (NonUnitalNonAssocSemiring.toMul.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))))) (NonUnitalNonAssocSemiring.toMul.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))))) (NonUnitalRingHomClass.toMulHomClass.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3))))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (RingHomClass.toNonUnitalRingHomClass.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))) (RingHom.instRingHomClassRingHom.{max u3 u1, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))))))) (MvPolynomial.eval.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3) v) (ps i))) -> (Function.Surjective.{max (succ u3) (succ u1), max (succ u3) (succ u1)} (ι -> R) (forall (i : ι), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => R) (ps i)) (fun (v : ι -> R) (i : ι) => FunLike.coe.{max (succ u3) (succ u1), max (succ u3) (succ u1), succ u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (fun (_x : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) => R) _x) (MulHomClass.toFunLike.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (NonUnitalNonAssocSemiring.toMul.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))))) (NonUnitalNonAssocSemiring.toMul.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))))) (NonUnitalRingHomClass.toMulHomClass.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{max u3 u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3))))) (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (RingHomClass.toNonUnitalRingHomClass.{max u3 u1, max u3 u1, u1} (RingHom.{max u1 u3, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3)))) (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))) (RingHom.instRingHomClassRingHom.{max u3 u1, u1} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) R (Semiring.toNonAssocSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (CommSemiring.toSemiring.{max u1 u3} (MvPolynomial.{u3, u1} ι R (CommRing.toCommSemiring.{u1} R _inst_3)) (MvPolynomial.commSemiring.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3)))) (Semiring.toNonAssocSemiring.{u1} R (CommSemiring.toSemiring.{u1} R (CommRing.toCommSemiring.{u1} R _inst_3))))))) (MvPolynomial.eval.{u1, u3} R ι (CommRing.toCommSemiring.{u1} R _inst_3) v) (ps i))))
+Case conversion may be inaccurate. Consider using '#align ax_grothendieck_of_locally_finite ax_grothendieck_of_locally_finiteₓ'. -/
 /-- Any injective polynomial map over an algebraic extension of a finite field is surjective. -/
 theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K] [CommRing R]
     [Finite ι] [Algebra K R] (alg : Algebra.IsAlgebraic K R) (ps : ι → MvPolynomial ι R)
Diff
@@ -44,7 +44,7 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K]
     /- `s` is the set of all coefficients of the polynomial, as well as all of
       the coordinates of `v`, the point I am trying to find the preimage of. -/
     let s : Finset R :=
-      (Finset.bunionᵢ (univ : Finset ι) fun i => (ps i).support.image fun x => coeff x (ps i)) ∪
+      (Finset.biUnion (univ : Finset ι) fun i => (ps i).support.image fun x => coeff x (ps i)) ∪
         (univ : Finset ι).image v
     have hv : ∀ i, v i ∈ Algebra.adjoin K (s : Set R) := fun j =>
       Algebra.subset_adjoin (mem_union_right _ (mem_image.2 ⟨j, mem_univ _, rfl⟩))

Changes in mathlib4

mathlib3
mathlib4
move(Polynomial): Move out of Data (#11751)

Polynomial and MvPolynomial are algebraic objects, hence should be under Algebra (or at least not under Data)

Diff
@@ -3,9 +3,9 @@ Copyright (c) 2023 Chris Hughes. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Chris Hughes
 -/
-import Mathlib.Data.MvPolynomial.Basic
-import Mathlib.RingTheory.Algebraic
+import Mathlib.Algebra.MvPolynomial.Basic
 import Mathlib.Data.Fintype.Card
+import Mathlib.RingTheory.Algebraic
 
 #align_import field_theory.ax_grothendieck from "leanprover-community/mathlib"@"4e529b03dd62b7b7d13806c3fb974d9d4848910e"
 
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
@@ -34,7 +34,6 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type*} [Field K] [Finite K]
     [Finite ι] [Algebra K R] (alg : Algebra.IsAlgebraic K R) (ps : ι → MvPolynomial ι R)
     (hinj : Injective fun v i => MvPolynomial.eval v (ps i)) :
     Surjective fun v i => MvPolynomial.eval v (ps i) := by
-  have is_int : ∀ x : R, IsIntegral K x := fun x => isAlgebraic_iff_isIntegral.1 (alg x)
   classical
     intro v
     cases nonempty_fintype ι
@@ -49,7 +48,7 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type*} [Field K] [Finite K]
         k ∈ (ps i).support → coeff k (ps i) ∈ Algebra.adjoin K (s : Set R) :=
       fun i k hk => Algebra.subset_adjoin
         (mem_union_left _ (mem_biUnion.2 ⟨i, mem_univ _, mem_image_of_mem _ hk⟩))
-    letI := isNoetherian_adjoin_finset s fun x _ => is_int x
+    letI := isNoetherian_adjoin_finset s fun x _ => alg.isIntegral x
     letI := Module.IsNoetherian.finite K (Algebra.adjoin K (s : Set R))
     letI : Finite (Algebra.adjoin K (s : Set R)) :=
       FiniteDimensional.finite_of_finite K (Algebra.adjoin K (s : Set R))
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
@@ -30,7 +30,7 @@ noncomputable section
 open MvPolynomial Finset Function
 
 /-- Any injective polynomial map over an algebraic extension of a finite field is surjective. -/
-theorem ax_grothendieck_of_locally_finite {ι K R : Type _} [Field K] [Finite K] [CommRing R]
+theorem ax_grothendieck_of_locally_finite {ι K R : Type*} [Field K] [Finite K] [CommRing R]
     [Finite ι] [Algebra K R] (alg : Algebra.IsAlgebraic K R) (ps : ι → MvPolynomial ι R)
     (hinj : Injective fun v i => MvPolynomial.eval v (ps i)) :
     Surjective fun v i => MvPolynomial.eval v (ps i) := by
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) 2023 Chris Hughes. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Chris Hughes
-
-! This file was ported from Lean 3 source module field_theory.ax_grothendieck
-! leanprover-community/mathlib commit 4e529b03dd62b7b7d13806c3fb974d9d4848910e
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.Data.MvPolynomial.Basic
 import Mathlib.RingTheory.Algebraic
 import Mathlib.Data.Fintype.Card
 
+#align_import field_theory.ax_grothendieck from "leanprover-community/mathlib"@"4e529b03dd62b7b7d13806c3fb974d9d4848910e"
+
 /-!
 # Ax-Grothendieck for algebraic extensions of `ZMod p`
 
feat: port FieldTheory.AxGrothendieck (#4237)

Dependencies 10 + 628

629 files ported (98.4%)
264281 lines ported (98.7%)
Show graph

The unported dependencies are