File: Mathlib/FieldTheory/Minpoly/Basic.lean

full_name: minpoly
code: /-- Suppose `x : B`, where `B` is an `A`-algebra.

The minimal polynomial `minpoly A x` of `x`
is a monic polynomial with coefficients in `A` of smallest degree that has `x` as its root,
if such exists (`IsIntegral A x`) or zero otherwise.

For example, if `V` is a `𝕜`-vector space for some field `𝕜` and `f : V →ₗ[𝕜] V` then
the minimal polynomial of `f` is `minpoly 𝕜 f`.
-/
noncomputable def minpoly (x : B) : A[X] 
goal: A[X]

full_name: minpoly.monic
code: /-- A minimal polynomial is monic. -/
theorem monic (hx : IsIntegral A x) : Monic (minpoly A x) 
goal: (minpoly A x).Monic

full_name: minpoly.ne_zero
code: /-- A minimal polynomial is nonzero. -/
theorem ne_zero [Nontrivial A] (hx : IsIntegral A x) : minpoly A x ≠ 0 
goal: minpoly A x ≠ 0

full_name: minpoly.eq_zero
code: theorem eq_zero (hx : ¬IsIntegral A x) : minpoly A x = 0 
goal: minpoly A x = 0

full_name: minpoly.algHom_eq
code: theorem algHom_eq (f : B →ₐ[A] B') (hf : Function.Injective f) (x : B) :
    minpoly A (f x) = minpoly A x 
goal: minpoly A (f x) = minpoly A x

full_name: minpoly.algebraMap_eq
code: theorem algebraMap_eq {B} [CommRing B] [Algebra A B] [Algebra B B'] [IsScalarTower A B B']
    (h : Function.Injective (algebraMap B B')) (x : B) :
    minpoly A (algebraMap B B' x) = minpoly A x 
goal: minpoly A ((algebraMap B B') x) = minpoly A x

full_name: minpoly.algEquiv_eq
code: @[simp]
theorem algEquiv_eq (f : B ≃ₐ[A] B') (x : B) : minpoly A (f x) = minpoly A x 
goal: minpoly A (f x) = minpoly A x

full_name: minpoly.aeval
code: /-- An element is a root of its minimal polynomial. -/
@[simp]
theorem aeval : aeval x (minpoly A x) = 0 
goal: (Polynomial.aeval x) (minpoly A x) = 0

full_name: minpoly.aeval_algHom
code: /-- Given any `f : B →ₐ[A] B'` and any `x : L`, the minimal polynomial of `x` vanishes at `f x`. -/
@[simp]
theorem aeval_algHom (f : B →ₐ[A] B') (x : B) : (Polynomial.aeval (f x)) (minpoly A x) = 0 
goal: (Polynomial.aeval (f x)) (minpoly A x) = 0

full_name: minpoly.ne_one
code: /-- A minimal polynomial is not `1`. -/
theorem ne_one [Nontrivial B] : minpoly A x ≠ 1 
goal: minpoly A x ≠ 1

full_name: minpoly.map_ne_one
code: theorem map_ne_one [Nontrivial B] {R : Type*} [Semiring R] [Nontrivial R] (f : A →+* R) :
    (minpoly A x).map f ≠ 1 
goal: Polynomial.map f (minpoly A x) ≠ 1

full_name: minpoly.not_isUnit
code: /-- A minimal polynomial is not a unit. -/
theorem not_isUnit [Nontrivial B] : ¬IsUnit (minpoly A x) 
goal: ¬IsUnit (minpoly A x)

full_name: minpoly.mem_range_of_degree_eq_one
code: theorem mem_range_of_degree_eq_one (hx : (minpoly A x).degree = 1) :
    x ∈ (algebraMap A B).range 
goal: x ∈ (algebraMap A B).range

full_name: minpoly.min
code: /-- The defining property of the minimal polynomial of an element `x`:
it is the monic polynomial with smallest degree that has `x` as its root. -/
theorem min {p : A[X]} (pmonic : p.Monic) (hp : Polynomial.aeval x p = 0) :
    degree (minpoly A x) ≤ degree p 
goal: (minpoly A x).degree ≤ p.degree

full_name: minpoly.unique'
code: theorem unique' {p : A[X]} (hm : p.Monic) (hp : Polynomial.aeval x p = 0)
    (hl : ∀ q : A[X], degree q < degree p → q = 0 ∨ Polynomial.aeval x q ≠ 0) :
    p = minpoly A x 
goal: p = minpoly A x

full_name: minpoly.subsingleton
code: @[nontriviality]
theorem subsingleton [Subsingleton B] : minpoly A x = 1 
goal: minpoly A x = 1

full_name: minpoly.natDegree_pos
code: /-- The degree of a minimal polynomial, as a natural number, is positive. -/
theorem natDegree_pos [Nontrivial B] (hx : IsIntegral A x) : 0 < natDegree (minpoly A x) 
goal: 0 < (minpoly A x).natDegree

full_name: minpoly.degree_pos
code: /-- The degree of a minimal polynomial is positive. -/
theorem degree_pos [Nontrivial B] (hx : IsIntegral A x) : 0 < degree (minpoly A x) 
goal: 0 < (minpoly A x).degree

full_name: minpoly.degree_eq_one_iff
code: theorem degree_eq_one_iff : (minpoly A x).degree = 1 ↔ x ∈ (algebraMap A B).range 
goal: (minpoly A x).degree = 1 ↔ x ∈ (algebraMap A B).range

full_name: minpoly.natDegree_eq_one_iff
code: theorem natDegree_eq_one_iff :
    (minpoly A x).natDegree = 1 ↔ x ∈ (algebraMap A B).range 
goal: (minpoly A x).natDegree = 1 ↔ x ∈ (algebraMap A B).range

full_name: minpoly.two_le_natDegree_iff
code: theorem two_le_natDegree_iff (int : IsIntegral A x) :
    2 ≤ (minpoly A x).natDegree ↔ x ∉ (algebraMap A B).range 
goal: 2 ≤ (minpoly A x).natDegree ↔ x ∉ (algebraMap A B).range

full_name: minpoly.two_le_natDegree_subalgebra
code: theorem two_le_natDegree_subalgebra {B} [CommRing B] [Algebra A B] [Nontrivial B]
    {S : Subalgebra A B} {x : B} (int : IsIntegral S x) : 2 ≤ (minpoly S x).natDegree ↔ x ∉ S 
goal: 2 ≤ (minpoly (↥S) x).natDegree ↔ x ∉ S

full_name: minpoly.eq_X_sub_C_of_algebraMap_inj
code: /-- If `B/A` is an injective ring extension, and `a` is an element of `A`,
then the minimal polynomial of `algebraMap A B a` is `X - C a`. -/
theorem eq_X_sub_C_of_algebraMap_inj (a : A) (hf : Function.Injective (algebraMap A B)) :
    minpoly A (algebraMap A B a) = X - C a 
goal: minpoly A ((algebraMap A B) a) = Polynomial.X - Polynomial.C a

full_name: minpoly.aeval_ne_zero_of_dvdNotUnit_minpoly
code: /-- If `a` strictly divides the minimal polynomial of `x`, then `x` cannot be a root for `a`. -/
theorem aeval_ne_zero_of_dvdNotUnit_minpoly {a : A[X]} (hx : IsIntegral A x) (hamonic : a.Monic)
    (hdvd : DvdNotUnit a (minpoly A x)) : Polynomial.aeval x a ≠ 0 
goal: (Polynomial.aeval x) a ≠ 0

full_name: minpoly.irreducible
code: /-- A minimal polynomial is irreducible. -/
theorem irreducible (hx : IsIntegral A x) : Irreducible (minpoly A x) 
goal: Irreducible (minpoly A x)