Separable polynomials #
We define a polynomial to be separable if it is coprime with its derivative. We prove basic properties about separable polynomials here.
Main definitions #
polynomial.separable f
: a polynomialf
is separable iff it is coprime with its derivative.polynomial.expand R p f
: expand the polynomialf
with coefficients in a commutative semiringR
by a factor of p, soexpand R p (∑ aₙ xⁿ)
is∑ aₙ xⁿᵖ
.polynomial.contract p f
: the opposite ofexpand
, so it sends∑ aₙ xⁿᵖ
to∑ aₙ xⁿ
.
A polynomial is separable iff it is coprime with its derivative.
Equations
- f.separable = is_coprime f (⇑polynomial.derivative f)
theorem
polynomial.separable_def
{R : Type u}
[comm_semiring R]
(f : R[X]) :
f.separable ↔ is_coprime f (⇑polynomial.derivative f)
theorem
polynomial.separable_of_subsingleton
{R : Type u}
[comm_semiring R]
[subsingleton R]
(f : R[X]) :
theorem
polynomial.separable_C
{R : Type u}
[comm_semiring R]
(r : R) :
(⇑polynomial.C r).separable ↔ is_unit r
theorem
polynomial.separable.of_mul_left
{R : Type u}
[comm_semiring R]
{f g : R[X]}
(h : (f * g).separable) :
theorem
polynomial.separable.of_mul_right
{R : Type u}
[comm_semiring R]
{f g : R[X]}
(h : (f * g).separable) :
theorem
polynomial.separable.of_dvd
{R : Type u}
[comm_semiring R]
{f g : R[X]}
(hf : f.separable)
(hfg : g ∣ f) :
theorem
polynomial.separable_gcd_left
{F : Type u_1}
[field F]
{f : F[X]}
(hf : f.separable)
(g : F[X]) :
theorem
polynomial.separable_gcd_right
{F : Type u_1}
[field F]
{g : F[X]}
(f : F[X])
(hg : g.separable) :
theorem
polynomial.separable.is_coprime
{R : Type u}
[comm_semiring R]
{f g : R[X]}
(h : (f * g).separable) :
is_coprime f g
theorem
polynomial.separable.map
{R : Type u}
[comm_semiring R]
{S : Type v}
[comm_semiring S]
{p : R[X]}
(h : p.separable)
{f : R →+* S} :
(polynomial.map f p).separable
Expand the polynomial by a factor of p, so ∑ aₙ xⁿ
becomes ∑ aₙ xⁿᵖ
.
Equations
- polynomial.expand R p = {to_fun := (polynomial.eval₂_ring_hom polynomial.C (polynomial.X ^ p)).to_fun, map_one' := _, map_mul' := _, map_zero' := _, map_add' := _, commutes' := _}
theorem
polynomial.coe_expand
(R : Type u)
[comm_semiring R]
(p : ℕ) :
⇑(polynomial.expand R p) = polynomial.eval₂ polynomial.C (polynomial.X ^ p)
theorem
polynomial.expand_eq_sum
{R : Type u}
[comm_semiring R]
(p : ℕ)
{f : R[X]} :
⇑(polynomial.expand R p) f = f.sum (λ (e : ℕ) (a : R), (⇑polynomial.C a) * (polynomial.X ^ p) ^ e)
@[simp]
theorem
polynomial.expand_C
{R : Type u}
[comm_semiring R]
(p : ℕ)
(r : R) :
⇑(polynomial.expand R p) (⇑polynomial.C r) = ⇑polynomial.C r
@[simp]
theorem
polynomial.expand_X
{R : Type u}
[comm_semiring R]
(p : ℕ) :
⇑(polynomial.expand R p) polynomial.X = polynomial.X ^ p
@[simp]
theorem
polynomial.expand_monomial
{R : Type u}
[comm_semiring R]
(p q : ℕ)
(r : R) :
⇑(polynomial.expand R p) (⇑(polynomial.monomial q) r) = ⇑(polynomial.monomial (q * p)) r
theorem
polynomial.expand_expand
{R : Type u}
[comm_semiring R]
(p q : ℕ)
(f : R[X]) :
⇑(polynomial.expand R p) (⇑(polynomial.expand R q) f) = ⇑(polynomial.expand R (p * q)) f
theorem
polynomial.expand_mul
{R : Type u}
[comm_semiring R]
(p q : ℕ)
(f : R[X]) :
⇑(polynomial.expand R (p * q)) f = ⇑(polynomial.expand R p) (⇑(polynomial.expand R q) f)
@[simp]
theorem
polynomial.expand_zero
{R : Type u}
[comm_semiring R]
(f : R[X]) :
⇑(polynomial.expand R 0) f = ⇑polynomial.C (polynomial.eval 1 f)
@[simp]
theorem
polynomial.expand_one
{R : Type u}
[comm_semiring R]
(f : R[X]) :
⇑(polynomial.expand R 1) f = f
theorem
polynomial.expand_pow
{R : Type u}
[comm_semiring R]
(p q : ℕ)
(f : R[X]) :
⇑(polynomial.expand R (p ^ q)) f = ⇑(polynomial.expand R p)^[q] f
theorem
polynomial.derivative_expand
{R : Type u}
[comm_semiring R]
(p : ℕ)
(f : R[X]) :
⇑polynomial.derivative (⇑(polynomial.expand R p) f) = (⇑(polynomial.expand R p) (⇑polynomial.derivative f)) * (↑p) * polynomial.X ^ (p - 1)
theorem
polynomial.coeff_expand
{R : Type u}
[comm_semiring R]
{p : ℕ}
(hp : 0 < p)
(f : R[X])
(n : ℕ) :
@[simp]
theorem
polynomial.coeff_expand_mul
{R : Type u}
[comm_semiring R]
{p : ℕ}
(hp : 0 < p)
(f : R[X])
(n : ℕ) :
@[simp]
theorem
polynomial.coeff_expand_mul'
{R : Type u}
[comm_semiring R]
{p : ℕ}
(hp : 0 < p)
(f : R[X])
(n : ℕ) :
theorem
polynomial.expand_inj
{R : Type u}
[comm_semiring R]
{p : ℕ}
(hp : 0 < p)
{f g : R[X]} :
⇑(polynomial.expand R p) f = ⇑(polynomial.expand R p) g ↔ f = g
theorem
polynomial.expand_eq_zero
{R : Type u}
[comm_semiring R]
{p : ℕ}
(hp : 0 < p)
{f : R[X]} :
⇑(polynomial.expand R p) f = 0 ↔ f = 0
theorem
polynomial.expand_eq_C
{R : Type u}
[comm_semiring R]
{p : ℕ}
(hp : 0 < p)
{f : R[X]}
{r : R} :
⇑(polynomial.expand R p) f = ⇑polynomial.C r ↔ f = ⇑polynomial.C r
theorem
polynomial.nat_degree_expand
{R : Type u}
[comm_semiring R]
(p : ℕ)
(f : R[X]) :
(⇑(polynomial.expand R p) f).nat_degree = (f.nat_degree) * p
theorem
polynomial.monic.expand
{R : Type u}
[comm_semiring R]
{p : ℕ}
{f : R[X]}
(hp : 0 < p)
(h : f.monic) :
(⇑(polynomial.expand R p) f).monic
theorem
polynomial.map_expand
{R : Type u}
[comm_semiring R]
{S : Type v}
[comm_semiring S]
{p : ℕ}
{f : R →+* S}
{q : R[X]} :
polynomial.map f (⇑(polynomial.expand R p) q) = ⇑(polynomial.expand S p) (polynomial.map f q)
Expansion is injective.
@[simp]
theorem
polynomial.expand_eval
{R : Type u}
[comm_semiring R]
(p : ℕ)
(P : R[X])
(r : R) :
polynomial.eval r (⇑(polynomial.expand R p) P) = polynomial.eval (r ^ p) P
theorem
polynomial.is_unit_of_self_mul_dvd_separable
{R : Type u}
[comm_semiring R]
{p q : R[X]}
(hp : p.separable)
(hq : q * q ∣ p) :
is_unit q
The opposite of expand
: sends ∑ aₙ xⁿᵖ
to ∑ aₙ xⁿ
.
Equations
- polynomial.contract p f = ∑ (n : ℕ) in finset.range (f.nat_degree + 1), ⇑(polynomial.monomial n) (f.coeff (n * p))
theorem
polynomial.coeff_contract
{R : Type u}
[comm_semiring R]
{p : ℕ}
(hp : p ≠ 0)
(f : R[X])
(n : ℕ) :
(polynomial.contract p f).coeff n = f.coeff (n * p)
theorem
polynomial.contract_expand
{R : Type u}
[comm_semiring R]
(p : ℕ)
{f : R[X]}
(hp : p ≠ 0) :
polynomial.contract p (⇑(polynomial.expand R p) f) = f
theorem
polynomial.expand_contract
{R : Type u}
[comm_semiring R]
(p : ℕ)
[char_p R p]
[no_zero_divisors R]
{f : R[X]}
(hf : ⇑polynomial.derivative f = 0)
(hp : p ≠ 0) :
⇑(polynomial.expand R p) (polynomial.contract p f) = f
theorem
polynomial.expand_char
{R : Type u}
[comm_semiring R]
(p : ℕ)
[char_p R p]
[hp : fact (nat.prime p)]
(f : R[X]) :
polynomial.map (frobenius R p) (⇑(polynomial.expand R p) f) = f ^ p
theorem
polynomial.map_expand_pow_char
{R : Type u}
[comm_semiring R]
(p : ℕ)
[char_p R p]
[hp : fact (nat.prime p)]
(f : R[X])
(n : ℕ) :
polynomial.map (frobenius R p ^ n) (⇑(polynomial.expand R (p ^ n)) f) = f ^ p ^ n
theorem
polynomial.multiplicity_le_one_of_separable
{R : Type u}
[comm_semiring R]
{p q : R[X]}
(hq : ¬is_unit q)
(hsep : p.separable) :
multiplicity q p ≤ 1
theorem
polynomial.separable.squarefree
{R : Type u}
[comm_semiring R]
{p : R[X]}
(hsep : p.separable) :
theorem
polynomial.separable.mul
{R : Type u}
[comm_ring R]
{f g : R[X]}
(hf : f.separable)
(hg : g.separable)
(h : is_coprime f g) :
theorem
polynomial.separable_prod
{R : Type u}
[comm_ring R]
{ι : Type u_1}
[fintype ι]
{f : ι → R[X]}
(h1 : pairwise (is_coprime on f))
(h2 : ∀ (x : ι), (f x).separable) :
(∏ (x : ι), f x).separable
theorem
polynomial.separable.inj_of_prod_X_sub_C
{R : Type u}
[comm_ring R]
[nontrivial R]
{ι : Type u_1}
{f : ι → R}
{s : finset ι}
(hfs : (∏ (i : ι) in s, (polynomial.X - ⇑polynomial.C (f i))).separable)
{x y : ι}
(hx : x ∈ s)
(hy : y ∈ s)
(hfxy : f x = f y) :
x = y
theorem
polynomial.separable.injective_of_prod_X_sub_C
{R : Type u}
[comm_ring R]
[nontrivial R]
{ι : Type u_1}
[fintype ι]
{f : ι → R}
(hfs : (∏ (i : ι), (polynomial.X - ⇑polynomial.C (f i))).separable) :
theorem
polynomial.nodup_of_separable_prod
{R : Type u}
[comm_ring R]
[nontrivial R]
{s : multiset R}
(hs : (multiset.map (λ (a : R), polynomial.X - ⇑polynomial.C a) s).prod.separable) :
s.nodup
theorem
polynomial.root_multiplicity_le_one_of_separable
{R : Type u}
[comm_ring R]
[nontrivial R]
{p : R[X]}
(hsep : p.separable)
(x : R) :
theorem
polynomial.is_local_ring_hom_expand
(R : Type u)
[comm_ring R]
[is_domain R]
{p : ℕ}
(hp : 0 < p) :
theorem
polynomial.of_irreducible_expand
{R : Type u}
[comm_ring R]
[is_domain R]
{p : ℕ}
(hp : p ≠ 0)
{f : R[X]}
(hf : irreducible (⇑(polynomial.expand R p) f)) :
theorem
polynomial.of_irreducible_expand_pow
{R : Type u}
[comm_ring R]
[is_domain R]
{p : ℕ}
(hp : p ≠ 0)
{f : R[X]}
{n : ℕ} :
irreducible (⇑(polynomial.expand R (p ^ n)) f) → irreducible f
theorem
polynomial.count_roots_le_one
{R : Type u}
[comm_ring R]
[is_domain R]
{p : R[X]}
(hsep : p.separable)
(x : R) :
multiset.count x p.roots ≤ 1
theorem
polynomial.separable_iff_derivative_ne_zero
{F : Type u}
[field F]
{f : F[X]}
(hf : irreducible f) :
f.separable ↔ ⇑polynomial.derivative f ≠ 0
theorem
polynomial.separable_map
{F : Type u}
[field F]
{K : Type v}
[field K]
(f : F →+* K)
{p : F[X]} :
(polynomial.map f p).separable ↔ p.separable
theorem
polynomial.separable_prod_X_sub_C_iff'
{F : Type u}
[field F]
{ι : Type u_1}
{f : ι → F}
{s : finset ι} :
(∏ (i : ι) in s, (polynomial.X - ⇑polynomial.C (f i))).separable ↔ ∀ (x : ι), x ∈ s → ∀ (y : ι), y ∈ s → f x = f y → x = y
theorem
polynomial.separable_prod_X_sub_C_iff
{F : Type u}
[field F]
{ι : Type u_1}
[fintype ι]
{f : ι → F} :
(∏ (i : ι), (polynomial.X - ⇑polynomial.C (f i))).separable ↔ function.injective f
theorem
polynomial.separable_or
{F : Type u}
[field F]
(p : ℕ)
[HF : char_p F p]
{f : F[X]}
(hf : irreducible f) :
theorem
polynomial.unique_separable_of_irreducible
{F : Type u}
[field F]
(p : ℕ)
[HF : char_p F p]
{f : F[X]}
(hf : irreducible f)
(hp : 0 < p)
(n₁ : ℕ)
(g₁ : F[X])
(hg₁ : g₁.separable)
(hgf₁ : ⇑(polynomial.expand F (p ^ n₁)) g₁ = f)
(n₂ : ℕ)
(g₂ : F[X])
(hg₂ : g₂.separable)
(hgf₂ : ⇑(polynomial.expand F (p ^ n₂)) g₂ = f) :
theorem
polynomial.separable_X_pow_sub_C
{F : Type u}
[field F]
{n : ℕ}
(a : F)
(hn : ↑n ≠ 0)
(ha : a ≠ 0) :
(polynomial.X ^ n - ⇑polynomial.C a).separable
If n ≠ 0
in F
, then X ^ n - a
is separable for any a ≠ 0
.
theorem
polynomial.card_root_set_eq_nat_degree
{F : Type u}
[field F]
{K : Type v}
[field K]
[algebra F K]
{p : F[X]}
(hsep : p.separable)
(hsplit : polynomial.splits (algebra_map F K) p) :
fintype.card ↥(p.root_set K) = p.nat_degree
theorem
polynomial.eq_X_sub_C_of_separable_of_root_eq
{F : Type u}
[field F]
{K : Type v}
[field K]
{i : F →+* K}
{x : F}
{h : F[X]}
(h_sep : h.separable)
(h_root : polynomial.eval x h = 0)
(h_splits : polynomial.splits i h)
(h_roots : ∀ (y : K), y ∈ (polynomial.map i h).roots → y = ⇑i x) :
h = (⇑polynomial.C h.leading_coeff) * (polynomial.X - ⇑polynomial.C x)
theorem
polynomial.exists_finset_of_splits
{F : Type u}
[field F]
{K : Type v}
[field K]
(i : F →+* K)
{f : F[X]}
(sep : f.separable)
(sp : polynomial.splits i f) :
∃ (s : finset K), polynomial.map i f = (⇑polynomial.C (⇑i f.leading_coeff)) * ∏ (a : K) in s, (polynomial.X - ⇑polynomial.C a)
theorem
irreducible.separable
{F : Type u}
[field F]
[char_zero F]
{f : F[X]}
(hf : irreducible f) :
@[class]
- is_integral' : ∀ (x : K), is_integral F x
- separable' : ∀ (x : K), (minpoly F x).separable
Typeclass for separable field extension: K
is a separable field extension of F
iff
the minimal polynomial of every x : K
is separable.
We define this for general (commutative) rings and only assume F
and K
are fields if this
is needed for a proof.
theorem
is_separable.is_integral
(F : Type u_1)
{K : Type u_2}
[comm_ring F]
[ring K]
[algebra F K]
[is_separable F K]
(x : K) :
is_integral F x
theorem
is_separable.separable
(F : Type u_1)
{K : Type u_2}
[comm_ring F]
[ring K]
[algebra F K]
[is_separable F K]
(x : K) :
theorem
is_separable_iff
{F : Type u_1}
{K : Type u_2}
[comm_ring F]
[ring K]
[algebra F K] :
is_separable F K ↔ ∀ (x : K), is_integral F x ∧ (minpoly F x).separable
@[protected, instance]
def
is_separable.of_finite
(F : Type u_1)
(K : Type u_2)
[field F]
[field K]
[algebra F K]
[finite_dimensional F K]
[char_zero F] :
is_separable F K
A finite field extension in characteristic 0 is separable.
theorem
is_separable_tower_top_of_is_separable
(F : Type u_1)
(K : Type u_2)
(E : Type u_3)
[field F]
[field K]
[field E]
[algebra F K]
[algebra F E]
[algebra K E]
[is_scalar_tower F K E]
[is_separable F E] :
is_separable K E
theorem
is_separable_tower_bot_of_is_separable
(F : Type u_1)
(K : Type u_2)
(E : Type u_3)
[field F]
[field K]
[field E]
[algebra F K]
[algebra F E]
[algebra K E]
[is_scalar_tower F K E]
[h : is_separable F E] :
is_separable F K
theorem
is_separable.of_alg_hom
(F : Type u_1)
{E : Type u_3}
[field F]
[field E]
[algebra F E]
(E' : Type u_2)
[field E']
[algebra F E']
(f : E →ₐ[F] E')
[is_separable F E'] :
is_separable F E
theorem
alg_hom.card_of_power_basis
{S : Type u_2}
[comm_ring S]
{K : Type u_4}
{L : Type u_5}
[field K]
[field L]
[algebra K S]
[algebra K L]
(pb : power_basis K S)
(h_sep : (minpoly K pb.gen).separable)
(h_splits : polynomial.splits (algebra_map K L) (minpoly K pb.gen)) :
fintype.card (S →ₐ[K] L) = pb.dim