field_theory.ax_grothendieck
⟷
Mathlib.FieldTheory.AxGrothendieck
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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`
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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`
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -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"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -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`
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -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
+-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -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)
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -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]
mathlib commit https://github.com/leanprover-community/mathlib/commit/ef95945cd48c932c9e034872bd25c3c220d9c946
@@ -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.
mathlib commit https://github.com/leanprover-community/mathlib/commit/75e7fca56381d056096ce5d05e938f63a6567828
@@ -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)
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -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⟩))
mathlib commit https://github.com/leanprover-community/mathlib/commit/738054fa93d43512da144ec45ce799d18fd44248
Data
(#11751)
Polynomial
and MvPolynomial
are algebraic objects, hence should be under Algebra
(or at least not under Data
)
@@ -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"
Initially I just wanted to add more dot notations for IsIntegral and IsAlgebraic (done in #8437); then I noticed near-duplicates
Algebra.isIntegral_of_finite [Field R] [Ring A]
and
RingHom.IsIntegral.of_finite [CommRing R] [CommRing A]
so I went on to generalize the latter to cover the former, and generalized everything in the IntegralClosure file to the noncommutative case whenever possible.
In the process I noticed more golfs, which result in this PR. Most notably, isIntegral_of_mem_of_FG is now proven using Cayley-Hamilton and doesn't depend on the Noetherian case isIntegral_of_noetherian; the latter is now proven using the former. In total the golfs makes mathlib 227 lines leaner (+487 -714).
The main changes are in the single file RingTheory/IntegralClosure:
Change the definition of Algebra.IsIntegral
which makes it unfold to IsIntegral
rather than RingHom.IsIntegralElem
because the former has much more APIs.
Fix lemma names involving is_integral
which are actually about IsIntegralElem
:
RingHom.is_integral_map
→ RingHom.isIntegralElem_map
RingHom.is_integral_of_mem_closure
→ RingHom.IsIntegralElem.of_mem_closure
RingHom.is_integral_zero/one
→ RingHom.isIntegralElem_zero/one
RingHom.is_integral_add/neg/sub/mul/of_mul_unit
→ RingHom.IsIntegralElem.add/neg/sub/mul/of_mul_unit
Add a lemma Algebra.IsIntegral.of_injective
.
Move isIntegral_of_(submodule_)noetherian
down and golf them.
Remove (Algebra.)isIntegral_of_finite
that work only over fields, in favor of the more general (Algebra.)isIntegral.of_finite
.
Merge duplicate lemmas isIntegral_of_isScalarTower
and isIntegral_tower_top_of_isIntegral
into IsIntegral.tower_top
.
Golf IsIntegral.of_mem_of_fg
by first proving IsIntegral.of_finite
using Cayley-Hamilton.
Add a docstring mentioning the Kurosh problem at Algebra.IsIntegral.finite
. The negative solution to the problem means the theorem doesn't generalize to noncommutative algebras.
Golf IsIntegral.tmul
and isField_of_isIntegral_of_isField(')
.
Combine isIntegral_trans_aux
into isIntegral_trans
and golf.
Add Algebra
namespace to isIntegral_sup
.
rename lemmas for dot notation:
RingHom.isIntegral_trans
→ RingHom.IsIntegral.trans
RingHom.isIntegral_quotient/tower_bot/top_of_isIntegral
→ RingHom.IsIntegral.quotient/tower_bot/top
isIntegral_of_mem_closure'
→ IsIntegral.of_mem_closure'
(and the '' version)
isIntegral_of_surjective
→ Algebra.isIntegral_of_surjective
The next changed file is RingTheory/Algebraic:
Rename:
of_larger_base
→ tower_top
(for consistency with IsIntegral
)
Algebra.isAlgebraic_of_finite
→ Algebra.IsAlgebraic.of_finite
Algebra.isAlgebraic_trans
→ Algebra.IsAlgebraic.trans
Add new lemmasAlgebra.IsIntegral.isAlgebraic
, isAlgebraic_algHom_iff
, and Algebra.IsAlgebraic.of_injective
to streamline some proofs.
The generalization from CommRing to Ring requires an additional lemma scaleRoots_eval₂_mul_of_commute
in Polynomial/ScaleRoots.
A lemma Algebra.lmul_injective
is added to Algebra/Bilinear (in order to golf the proof of IsIntegral.of_mem_of_fg
).
In all other files, I merely fix the changed names, or use newly available dot notations.
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -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))
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -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
@@ -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`
The unported dependencies are