File: Mathlib/RingTheory/AlgebraicIndependent.lean

full_name: AlgebraicIndependent
code: /-- `AlgebraicIndependent R x` states the family of elements `x`
  is algebraically independent over `R`, meaning that the canonical
  map out of the multivariable polynomial ring is injective. -/
def AlgebraicIndependent : Prop 
goal: Prop

full_name: algebraicIndependent_iff_ker_eq_bot
code: theorem algebraicIndependent_iff_ker_eq_bot :
    AlgebraicIndependent R x ↔
      RingHom.ker (MvPolynomial.aeval x : MvPolynomial ι R →ₐ[R] A).toRingHom = ⊥ 
goal: AlgebraicIndependent R x ↔ RingHom.ker (MvPolynomial.aeval x).toRingHom = ⊥

full_name: algebraicIndependent_iff
code: theorem algebraicIndependent_iff :
    AlgebraicIndependent R x ↔
      ∀ p : MvPolynomial ι R, MvPolynomial.aeval (x : ι → A) p = 0 → p = 0 
goal: AlgebraicIndependent R x ↔ ∀ (p : MvPolynomial ι R), (MvPolynomial.aeval x) p = 0 → p = 0

full_name: AlgebraicIndependent.eq_zero_of_aeval_eq_zero
code: theorem AlgebraicIndependent.eq_zero_of_aeval_eq_zero (h : AlgebraicIndependent R x) :
    ∀ p : MvPolynomial ι R, MvPolynomial.aeval (x : ι → A) p = 0 → p = 0 
goal: (MvPolynomial.aeval x) p = 0 → p = 0

full_name: algebraicIndependent_iff_injective_aeval
code: theorem algebraicIndependent_iff_injective_aeval :
    AlgebraicIndependent R x ↔ Injective (MvPolynomial.aeval x : MvPolynomial ι R →ₐ[R] A) 
goal: AlgebraicIndependent R x ↔ Function.Injective ⇑(MvPolynomial.aeval x)

full_name: algebraicIndependent_empty_type_iff
code: @[simp]
theorem algebraicIndependent_empty_type_iff [IsEmpty ι] :
    AlgebraicIndependent R x ↔ Injective (algebraMap R A) 
goal: AlgebraicIndependent R x ↔ Function.Injective ⇑(algebraMap R A)

full_name: AlgebraicIndependent.algebraMap_injective
code: theorem algebraMap_injective : Injective (algebraMap R A) 
goal: Function.Injective ⇑(algebraMap R A)

full_name: AlgebraicIndependent.linearIndependent
code: theorem linearIndependent : LinearIndependent R x 
goal: LinearIndependent R x

full_name: AlgebraicIndependent.injective
code: protected theorem injective [Nontrivial R] : Injective x 
goal: Function.Injective x

full_name: AlgebraicIndependent.ne_zero
code: theorem ne_zero [Nontrivial R] (i : ι) : x i ≠ 0 
goal: x i ≠ 0

full_name: AlgebraicIndependent.comp
code: theorem comp (f : ι' → ι) (hf : Function.Injective f) : AlgebraicIndependent R (x ∘ f) 
goal: AlgebraicIndependent R (x ∘ f)

full_name: AlgebraicIndependent.coe_range
code: theorem coe_range : AlgebraicIndependent R ((↑) : range x → A) 
goal: AlgebraicIndependent R Subtype.val

full_name: AlgebraicIndependent.map
code: theorem map {f : A →ₐ[R] A'} (hf_inj : Set.InjOn f (adjoin R (range x))) :
    AlgebraicIndependent R (f ∘ x) 
goal: AlgebraicIndependent R (⇑f ∘ x)

full_name: AlgebraicIndependent.map'
code: theorem map' {f : A →ₐ[R] A'} (hf_inj : Injective f) : AlgebraicIndependent R (f ∘ x) 
goal: AlgebraicIndependent R (⇑f ∘ x)

full_name: AlgebraicIndependent.of_comp
code: theorem of_comp (f : A →ₐ[R] A') (hfv : AlgebraicIndependent R (f ∘ x)) :
    AlgebraicIndependent R x 
goal: AlgebraicIndependent R x

full_name: AlgHom.algebraicIndependent_iff
code: theorem AlgHom.algebraicIndependent_iff (f : A →ₐ[R] A') (hf : Injective f) :
    AlgebraicIndependent R (f ∘ x) ↔ AlgebraicIndependent R x 
goal: AlgebraicIndependent R (⇑f ∘ x) ↔ AlgebraicIndependent R x

full_name: algebraicIndependent_of_subsingleton
code: @[nontriviality]
theorem algebraicIndependent_of_subsingleton [Subsingleton R] : AlgebraicIndependent R x 
goal: AlgebraicIndependent R x

full_name: algebraicIndependent_equiv
code: theorem algebraicIndependent_equiv (e : ι ≃ ι') {f : ι' → A} :
    AlgebraicIndependent R (f ∘ e) ↔ AlgebraicIndependent R f 
goal: AlgebraicIndependent R (f ∘ ⇑e) ↔ AlgebraicIndependent R f

full_name: algebraicIndependent_equiv'
code: theorem algebraicIndependent_equiv' (e : ι ≃ ι') {f : ι' → A} {g : ι → A} (h : f ∘ e = g) :
    AlgebraicIndependent R g ↔ AlgebraicIndependent R f 
goal: AlgebraicIndependent R g ↔ AlgebraicIndependent R f

full_name: algebraicIndependent_subtype_range
code: theorem algebraicIndependent_subtype_range {ι} {f : ι → A} (hf : Injective f) :
    AlgebraicIndependent R ((↑) : range f → A) ↔ AlgebraicIndependent R f 
goal: AlgebraicIndependent R Subtype.val ↔ AlgebraicIndependent R f

full_name: algebraicIndependent_image
code: theorem algebraicIndependent_image {ι} {s : Set ι} {f : ι → A} (hf : Set.InjOn f s) :
    (AlgebraicIndependent R fun x : s => f x) ↔ AlgebraicIndependent R fun x : f '' s => (x : A) 
goal: (AlgebraicIndependent R fun x => f ↑x) ↔ AlgebraicIndependent R fun x => ↑x

full_name: algebraicIndependent_adjoin
code: theorem algebraicIndependent_adjoin (hs : AlgebraicIndependent R x) :
    @AlgebraicIndependent ι R (adjoin R (range x))
      (fun i : ι => ⟨x i, subset_adjoin (mem_range_self i)⟩) _ _ _ 
goal: AlgebraicIndependent R fun i => ⟨x i, ⋯⟩

full_name: AlgebraicIndependent.restrictScalars
code: /-- A set of algebraically independent elements in an algebra `A` over a ring `K` is also
algebraically independent over a subring `R` of `K`. -/
theorem AlgebraicIndependent.restrictScalars {K : Type*} [CommRing K] [Algebra R K] [Algebra K A]
    [IsScalarTower R K A] (hinj : Function.Injective (algebraMap R K))
    (ai : AlgebraicIndependent K x) : AlgebraicIndependent R x 
goal: AlgebraicIndependent R x

full_name: algebraicIndependent_finset_map_embedding_subtype
code: /-- Every finite subset of an algebraically independent set is algebraically independent. -/
theorem algebraicIndependent_finset_map_embedding_subtype (s : Set A)
    (li : AlgebraicIndependent R ((↑) : s → A)) (t : Finset s) :
    AlgebraicIndependent R ((↑) : Finset.map (Embedding.subtype s) t → A) 
goal: AlgebraicIndependent R Subtype.val

full_name: algebraicIndependent_bounded_of_finset_algebraicIndependent_bounded
code: /-- If every finite set of algebraically independent element has cardinality at most `n`,
then the same is true for arbitrary sets of algebraically independent elements. -/
theorem algebraicIndependent_bounded_of_finset_algebraicIndependent_bounded {n : ℕ}
    (H : ∀ s : Finset A, (AlgebraicIndependent R fun i : s => (i : A)) → s.card ≤ n) :
    ∀ s : Set A, AlgebraicIndependent R ((↑) : s → A) → Cardinal.mk s ≤ n 
goal: AlgebraicIndependent R Subtype.val → Cardinal.mk ↑s ≤ ↑n

full_name: AlgebraicIndependent.restrict_of_comp_subtype
code: theorem AlgebraicIndependent.restrict_of_comp_subtype {s : Set ι}
    (hs : AlgebraicIndependent R (x ∘ (↑) : s → A)) : AlgebraicIndependent R (s.restrict x) 
goal: AlgebraicIndependent R (s.restrict x)

full_name: algebraicIndependent_empty_iff
code: theorem algebraicIndependent_empty_iff :
    AlgebraicIndependent R ((↑) : (∅ : Set A) → A) ↔ Injective (algebraMap R A) 
goal: AlgebraicIndependent R Subtype.val ↔ Function.Injective ⇑(algebraMap R A)

full_name: AlgebraicIndependent.mono
code: theorem AlgebraicIndependent.mono {t s : Set A} (h : t ⊆ s)
    (hx : AlgebraicIndependent R ((↑) : s → A)) : AlgebraicIndependent R ((↑) : t → A) 
goal: AlgebraicIndependent R Subtype.val

full_name: AlgebraicIndependent.to_subtype_range
code: theorem AlgebraicIndependent.to_subtype_range {ι} {f : ι → A} (hf : AlgebraicIndependent R f) :
    AlgebraicIndependent R ((↑) : range f → A) 
goal: AlgebraicIndependent R Subtype.val

full_name: AlgebraicIndependent.to_subtype_range'
code: theorem AlgebraicIndependent.to_subtype_range' {ι} {f : ι → A} (hf : AlgebraicIndependent R f) {t}
    (ht : range f = t) : AlgebraicIndependent R ((↑) : t → A) 
goal: AlgebraicIndependent R Subtype.val

full_name: algebraicIndependent_comp_subtype
code: theorem algebraicIndependent_comp_subtype {s : Set ι} :
    AlgebraicIndependent R (x ∘ (↑) : s → A) ↔
      ∀ p ∈ MvPolynomial.supported R s, aeval x p = 0 → p = 0 
goal: AlgebraicIndependent R (x ∘ Subtype.val) ↔ ∀ p ∈ MvPolynomial.supported R s, (MvPolynomial.aeval x) p = 0 → p = 0

full_name: algebraicIndependent_subtype
code: theorem algebraicIndependent_subtype {s : Set A} :
    AlgebraicIndependent R ((↑) : s → A) ↔
      ∀ p : MvPolynomial A R, p ∈ MvPolynomial.supported R s → aeval id p = 0 → p = 0 
goal: AlgebraicIndependent R Subtype.val ↔ ∀ p ∈ MvPolynomial.supported R s, (MvPolynomial.aeval id) p = 0 → p = 0

full_name: algebraicIndependent_of_finite
code: theorem algebraicIndependent_of_finite (s : Set A)
    (H : ∀ t ⊆ s, t.Finite → AlgebraicIndependent R ((↑) : t → A)) :
    AlgebraicIndependent R ((↑) : s → A) 
goal: AlgebraicIndependent R Subtype.val

full_name: AlgebraicIndependent.image_of_comp
code: theorem AlgebraicIndependent.image_of_comp {ι ι'} (s : Set ι) (f : ι → ι') (g : ι' → A)
    (hs : AlgebraicIndependent R fun x : s => g (f x)) :
    AlgebraicIndependent R fun x : f '' s => g x 
goal: AlgebraicIndependent R fun x => g ↑x

full_name: AlgebraicIndependent.image
code: theorem AlgebraicIndependent.image {ι} {s : Set ι} {f : ι → A}
    (hs : AlgebraicIndependent R fun x : s => f x) :
    AlgebraicIndependent R fun x : f '' s => (x : A) 
goal: AlgebraicIndependent R fun x => ↑x

full_name: algebraicIndependent_iUnion_of_directed
code: theorem algebraicIndependent_iUnion_of_directed {η : Type*} [Nonempty η] {s : η → Set A}
    (hs : Directed (· ⊆ ·) s) (h : ∀ i, AlgebraicIndependent R ((↑) : s i → A)) :
    AlgebraicIndependent R ((↑) : (⋃ i, s i) → A) 
goal: AlgebraicIndependent R Subtype.val

full_name: algebraicIndependent_sUnion_of_directed
code: theorem algebraicIndependent_sUnion_of_directed {s : Set (Set A)} (hsn : s.Nonempty)
    (hs : DirectedOn (· ⊆ ·) s) (h : ∀ a ∈ s, AlgebraicIndependent R ((↑) : a → A)) :
    AlgebraicIndependent R ((↑) : ⋃₀ s → A) 
goal: AlgebraicIndependent R Subtype.val

full_name: exists_maximal_algebraicIndependent
code: theorem exists_maximal_algebraicIndependent (s t : Set A) (hst : s ⊆ t)
    (hs : AlgebraicIndependent R ((↑) : s → A)) :
    ∃ u : Set A, AlgebraicIndependent R ((↑) : u → A) ∧ s ⊆ u ∧ u ⊆ t ∧
      ∀ x : Set A, AlgebraicIndependent R ((↑) : x → A) → u ⊆ x → x ⊆ t → x = u 
goal: ∃ u,
  AlgebraicIndependent R Subtype.val ∧
    s ⊆ u ∧ u ⊆ t ∧ ∀ (x : Set A), AlgebraicIndependent R Subtype.val → u ⊆ x → x ⊆ t → x = u

full_name: AlgebraicIndependent.aevalEquiv_apply_coe
code: /-- Canonical isomorphism between polynomials and the subalgebra generated by
  algebraically independent elements. -/
@[simps!]
def AlgebraicIndependent.aevalEquiv (hx : AlgebraicIndependent R x) :
    MvPolynomial ι R ≃ₐ[R] Algebra.adjoin R (range x) 
goal: ↑(hx.aevalEquiv a) = (MvPolynomial.aeval x) a

full_name: AlgebraicIndependent.aevalEquiv
code: /-- Canonical isomorphism between polynomials and the subalgebra generated by
  algebraically independent elements. -/
@[simps!]
def AlgebraicIndependent.aevalEquiv (hx : AlgebraicIndependent R x) :
    MvPolynomial ι R ≃ₐ[R] Algebra.adjoin R (range x) 
goal: MvPolynomial ι R ≃ₐ[R] ↥(Algebra.adjoin R (Set.range x))

full_name: AlgebraicIndependent.aevalEquiv_symm_apply
code: /-- Canonical isomorphism between polynomials and the subalgebra generated by
  algebraically independent elements. -/
@[simps!]
def AlgebraicIndependent.aevalEquiv (hx : AlgebraicIndependent R x) :
    MvPolynomial ι R ≃ₐ[R] Algebra.adjoin R (range x) 
goal: hx.aevalEquiv.symm b = Function.surjInv ⋯ b

full_name: AlgebraicIndependent.algebraMap_aevalEquiv
code: theorem AlgebraicIndependent.algebraMap_aevalEquiv (hx : AlgebraicIndependent R x)
    (p : MvPolynomial ι R) :
    algebraMap (Algebra.adjoin R (range x)) A (hx.aevalEquiv p) = aeval x p 
goal: (algebraMap (↥(Algebra.adjoin R (Set.range x))) A) (hx.aevalEquiv p) = (MvPolynomial.aeval x) p

full_name: AlgebraicIndependent.repr
code: /-- The canonical map from the subalgebra generated by an algebraic independent family
  into the polynomial ring. -/
def AlgebraicIndependent.repr (hx : AlgebraicIndependent R x) :
    Algebra.adjoin R (range x) →ₐ[R] MvPolynomial ι R 
goal: ↥(Algebra.adjoin R (Set.range x)) →ₐ[R] MvPolynomial ι R

full_name: AlgebraicIndependent.aeval_repr
code: @[simp]
theorem AlgebraicIndependent.aeval_repr (p) : aeval x (hx.repr p) = p 
goal: (MvPolynomial.aeval x) (hx.repr p) = ↑p

full_name: AlgebraicIndependent.aeval_comp_repr
code: theorem AlgebraicIndependent.aeval_comp_repr : (aeval x).comp hx.repr = Subalgebra.val _ 
goal: (MvPolynomial.aeval x).comp hx.repr = (Algebra.adjoin R (Set.range x)).val

full_name: AlgebraicIndependent.repr_ker
code: theorem AlgebraicIndependent.repr_ker :
    RingHom.ker (hx.repr : adjoin R (range x) →+* MvPolynomial ι R) = ⊥ 
goal: RingHom.ker ↑hx.repr = ⊥

full_name: AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin
code: /-- The isomorphism between `MvPolynomial (Option ι) R` and the polynomial ring over
the algebra generated by an algebraically independent family. -/
def AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin (hx : AlgebraicIndependent R x) :
    MvPolynomial (Option ι) R ≃+* Polynomial (adjoin R (Set.range x)) 
goal: MvPolynomial (Option ι) R ≃+* Polynomial ↥(Algebra.adjoin R (Set.range x))

full_name: AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin_apply
code: @[simp]
theorem AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin_apply
    (hx : AlgebraicIndependent R x) (y) :
    hx.mvPolynomialOptionEquivPolynomialAdjoin y =
      Polynomial.map (hx.aevalEquiv : MvPolynomial ι R →+* adjoin R (range x))
        (aeval (fun o : Option ι => o.elim Polynomial.X fun s : ι => Polynomial.C (X s)) y) 
goal: hx.mvPolynomialOptionEquivPolynomialAdjoin y =
  Polynomial.map (↑hx.aevalEquiv)
    ((MvPolynomial.aeval fun o => o.elim Polynomial.X fun s => Polynomial.C (MvPolynomial.X s)) y)

full_name: AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin_C
code: theorem AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin_C
    (hx : AlgebraicIndependent R x) (r) :
    hx.mvPolynomialOptionEquivPolynomialAdjoin (C r) = Polynomial.C (algebraMap _ _ r) 
goal: hx.mvPolynomialOptionEquivPolynomialAdjoin (MvPolynomial.C r) =
  Polynomial.C ((algebraMap R ↥(Algebra.adjoin R (Set.range x))) r)

full_name: AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin_X_none
code: theorem AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin_X_none
    (hx : AlgebraicIndependent R x) :
    hx.mvPolynomialOptionEquivPolynomialAdjoin (X none) = Polynomial.X 
goal: hx.mvPolynomialOptionEquivPolynomialAdjoin (MvPolynomial.X none) = Polynomial.X

full_name: AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin_X_some
code: theorem AlgebraicIndependent.mvPolynomialOptionEquivPolynomialAdjoin_X_some
    (hx : AlgebraicIndependent R x) (i) :
    hx.mvPolynomialOptionEquivPolynomialAdjoin (X (some i)) =
      Polynomial.C (hx.aevalEquiv (X i)) 
goal: hx.mvPolynomialOptionEquivPolynomialAdjoin (MvPolynomial.X (some i)) = Polynomial.C (hx.aevalEquiv (MvPolynomial.X i))

full_name: AlgebraicIndependent.aeval_comp_mvPolynomialOptionEquivPolynomialAdjoin
code: theorem AlgebraicIndependent.aeval_comp_mvPolynomialOptionEquivPolynomialAdjoin
    (hx : AlgebraicIndependent R x) (a : A) :
    RingHom.comp
        (↑(Polynomial.aeval a : Polynomial (adjoin R (Set.range x)) →ₐ[_] A) :
          Polynomial (adjoin R (Set.range x)) →+* A)
        hx.mvPolynomialOptionEquivPolynomialAdjoin.toRingHom =
      ↑(MvPolynomial.aeval fun o : Option ι => o.elim a x : MvPolynomial (Option ι) R →ₐ[R] A) 
goal: (↑(Polynomial.aeval a)).comp hx.mvPolynomialOptionEquivPolynomialAdjoin.toRingHom =
  ↑(MvPolynomial.aeval fun o => o.elim a x)

full_name: AlgebraicIndependent.option_iff
code: theorem AlgebraicIndependent.option_iff (hx : AlgebraicIndependent R x) (a : A) :
    (AlgebraicIndependent R fun o : Option ι => o.elim a x) ↔
      ¬IsAlgebraic (adjoin R (Set.range x)) a 
goal: (AlgebraicIndependent R fun o => o.elim a x) ↔ ¬IsAlgebraic (↥(Algebra.adjoin R (Set.range x))) a

full_name: IsTranscendenceBasis
code: /-- A family is a transcendence basis if it is a maximal algebraically independent subset. -/
def IsTranscendenceBasis (x : ι → A) : Prop 
goal: Prop

full_name: exists_isTranscendenceBasis
code: theorem exists_isTranscendenceBasis (h : Injective (algebraMap R A)) :
    ∃ s : Set A, IsTranscendenceBasis R ((↑) : s → A) 
goal: ∃ s, IsTranscendenceBasis R Subtype.val

full_name: AlgebraicIndependent.isTranscendenceBasis_iff
code: theorem AlgebraicIndependent.isTranscendenceBasis_iff {ι : Type w} {R : Type u} [CommRing R]
    [Nontrivial R] {A : Type v} [CommRing A] [Algebra R A] {x : ι → A}
    (i : AlgebraicIndependent R x) :
    IsTranscendenceBasis R x ↔
      ∀ (κ : Type v) (w : κ → A) (_ : AlgebraicIndependent R w) (j : ι → κ) (_ : w ∘ j = x),
        Surjective j 
goal: IsTranscendenceBasis R x ↔
  ∀ (κ : Type v) (w : κ → A), AlgebraicIndependent R w → ∀ (j : ι → κ), w ∘ j = x → Function.Surjective j

full_name: IsTranscendenceBasis.isAlgebraic
code: theorem IsTranscendenceBasis.isAlgebraic [Nontrivial R] (hx : IsTranscendenceBasis R x) :
    Algebra.IsAlgebraic (adjoin R (range x)) A 
goal: Algebra.IsAlgebraic (↥(Algebra.adjoin R (Set.range x))) A

full_name: algebraicIndependent_empty_type
code: theorem algebraicIndependent_empty_type [IsEmpty ι] [Nontrivial A] : AlgebraicIndependent K x 
goal: AlgebraicIndependent K x

full_name: algebraicIndependent_empty
code: theorem algebraicIndependent_empty [Nontrivial A] :
    AlgebraicIndependent K ((↑) : (∅ : Set A) → A) 
goal: AlgebraicIndependent K Subtype.val