Skip to content

Commit c083085

Browse files
committed
refactor(FieldTheory/KummerExtension): Split off irreducibility of X ^ p - a (#20695)
This PR splits of irreducibility of `X ^ p - a` from `FieldTheory/KummerExtension` since it has lighter imports and can be used to golf a proof in `FieldTheory/Perfect`. Co-authored-by: Thomas Browning <tb65536@users.noreply.github.com>
1 parent 56f9c5e commit c083085

File tree

4 files changed

+135
-131
lines changed

4 files changed

+135
-131
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3103,6 +3103,7 @@ import Mathlib.FieldTheory.Isaacs
31033103
import Mathlib.FieldTheory.JacobsonNoether
31043104
import Mathlib.FieldTheory.KrullTopology
31053105
import Mathlib.FieldTheory.KummerExtension
3106+
import Mathlib.FieldTheory.KummerPolynomial
31063107
import Mathlib.FieldTheory.Laurent
31073108
import Mathlib.FieldTheory.LinearDisjoint
31083109
import Mathlib.FieldTheory.Minpoly.Basic

Mathlib/FieldTheory/KummerExtension.lean

Lines changed: 1 addition & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Andrew Yang
55
-/
66
import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots
7-
import Mathlib.RingTheory.AdjoinRoot
87
import Mathlib.FieldTheory.Galois.Basic
8+
import Mathlib.FieldTheory.KummerPolynomial
99
import Mathlib.LinearAlgebra.Eigenspace.Minpoly
1010
import Mathlib.RingTheory.Norm.Basic
1111
/-!
@@ -31,8 +31,6 @@ then isomorphic to `Multiplicative (ZMod n)` whose inverse is given by
3131
3232
## Other results
3333
Criteria for `X ^ n - C a` to be irreducible is given:
34-
- `X_pow_sub_C_irreducible_iff_of_prime`:
35-
For `n = p` a prime, `X ^ n - C a` is irreducible iff `a` is not a `p`-power.
3634
- `X_pow_sub_C_irreducible_iff_of_prime_pow`:
3735
For `n = p ^ k` an odd prime power, `X ^ n - C a` is irreducible iff `a` is not a `p`-power.
3836
- `X_pow_sub_C_irreducible_iff_forall_prime_of_odd`:
@@ -51,26 +49,6 @@ open Polynomial IntermediateField AdjoinRoot
5149

5250
section Splits
5351

54-
lemma root_X_pow_sub_C_pow (n : ℕ) (a : K) :
55-
(AdjoinRoot.root (X ^ n - C a)) ^ n = AdjoinRoot.of _ a := by
56-
rw [← sub_eq_zero, ← AdjoinRoot.eval₂_root, eval₂_sub, eval₂_C, eval₂_pow, eval₂_X]
57-
58-
lemma root_X_pow_sub_C_ne_zero {n : ℕ} (hn : 1 < n) (a : K) :
59-
(AdjoinRoot.root (X ^ n - C a)) ≠ 0 :=
60-
mk_ne_zero_of_natDegree_lt (monic_X_pow_sub_C _ (Nat.not_eq_zero_of_lt hn))
61-
X_ne_zero <| by rwa [natDegree_X_pow_sub_C, natDegree_X]
62-
63-
lemma root_X_pow_sub_C_ne_zero' {n : ℕ} {a : K} (hn : 0 < n) (ha : a ≠ 0) :
64-
(AdjoinRoot.root (X ^ n - C a)) ≠ 0 := by
65-
obtain (rfl|hn) := (Nat.succ_le_iff.mpr hn).eq_or_lt
66-
· rw [pow_one]
67-
intro e
68-
refine mk_ne_zero_of_natDegree_lt (monic_X_sub_C a) (C_ne_zero.mpr ha) (by simp) ?_
69-
trans AdjoinRoot.mk (X - C a) (X - (X - C a))
70-
· rw [sub_sub_cancel]
71-
· rw [map_sub, mk_self, sub_zero, mk_X, e]
72-
· exact root_X_pow_sub_C_ne_zero hn a
73-
7452
theorem X_pow_sub_C_splits_of_isPrimitiveRoot
7553
{n : ℕ} {ζ : K} (hζ : IsPrimitiveRoot ζ n) {α a : K} (e : α ^ n = a) :
7654
(X ^ n - C a).Splits (RingHom.id _) := by
@@ -105,85 +83,6 @@ end Splits
10583

10684
section Irreducible
10785

108-
lemma ne_zero_of_irreducible_X_pow_sub_C {n : ℕ} {a : K} (H : Irreducible (X ^ n - C a)) :
109-
n ≠ 0 := by
110-
rintro rfl
111-
rw [pow_zero, ← C.map_one, ← map_sub] at H
112-
exact not_irreducible_C _ H
113-
114-
lemma ne_zero_of_irreducible_X_pow_sub_C' {n : ℕ} (hn : n ≠ 1) {a : K}
115-
(H : Irreducible (X ^ n - C a)) : a ≠ 0 := by
116-
rintro rfl
117-
rw [map_zero, sub_zero] at H
118-
exact not_irreducible_pow hn H
119-
120-
lemma root_X_pow_sub_C_eq_zero_iff {n : ℕ} {a : K} (H : Irreducible (X ^ n - C a)) :
121-
(AdjoinRoot.root (X ^ n - C a)) = 0 ↔ a = 0 := by
122-
have hn := Nat.pos_iff_ne_zero.mpr (ne_zero_of_irreducible_X_pow_sub_C H)
123-
refine ⟨not_imp_not.mp (root_X_pow_sub_C_ne_zero' hn), ?_⟩
124-
rintro rfl
125-
have := not_imp_not.mp (fun hn ↦ ne_zero_of_irreducible_X_pow_sub_C' hn H) rfl
126-
rw [this, pow_one, map_zero, sub_zero, ← mk_X, mk_self]
127-
128-
lemma root_X_pow_sub_C_ne_zero_iff {n : ℕ} {a : K} (H : Irreducible (X ^ n - C a)) :
129-
(AdjoinRoot.root (X ^ n - C a)) ≠ 0 ↔ a ≠ 0 :=
130-
(root_X_pow_sub_C_eq_zero_iff H).not
131-
132-
theorem pow_ne_of_irreducible_X_pow_sub_C {n : ℕ} {a : K}
133-
(H : Irreducible (X ^ n - C a)) {m : ℕ} (hm : m ∣ n) (hm' : m ≠ 1) (b : K) : b ^ m ≠ a := by
134-
have hn : n ≠ 0 := fun e ↦ not_irreducible_C
135-
(1 - a) (by simpa only [e, pow_zero, ← C.map_one, ← map_sub] using H)
136-
obtain ⟨k, rfl⟩ := hm
137-
rintro rfl
138-
obtain ⟨q, hq⟩ := sub_dvd_pow_sub_pow (X ^ k) (C b) m
139-
rw [mul_comm, pow_mul, map_pow, hq] at H
140-
have : degree q = 0 := by
141-
simpa [isUnit_iff_degree_eq_zero, degree_X_pow_sub_C,
142-
Nat.pos_iff_ne_zero, (mul_ne_zero_iff.mp hn).2] using H.2 _ q rfl
143-
apply_fun degree at hq
144-
simp only [this, ← pow_mul, mul_comm k m, degree_X_pow_sub_C, Nat.pos_iff_ne_zero.mpr hn,
145-
Nat.pos_iff_ne_zero.mpr (mul_ne_zero_iff.mp hn).2, degree_mul, ← map_pow, add_zero,
146-
Nat.cast_injective.eq_iff] at hq
147-
exact hm' ((mul_eq_right₀ (mul_ne_zero_iff.mp hn).2).mp hq)
148-
149-
/--Let `p` be a prime number. Let `K` be a field.
150-
Let `t ∈ K` be an element which does not have a `p`th root in `K`.
151-
Then the polynomial `x ^ p - t` is irreducible over `K`.-/
152-
@[stacks 09HF "We proved the result without the condition that `K` is char p in 09HF."]
153-
theorem X_pow_sub_C_irreducible_of_prime {p : ℕ} (hp : p.Prime) {a : K} (ha : ∀ b : K, b ^ p ≠ a) :
154-
Irreducible (X ^ p - C a) := by
155-
-- First of all, We may find an irreducible factor `g` of `X ^ p - C a`.
156-
have : ¬ IsUnit (X ^ p - C a) := by
157-
rw [Polynomial.isUnit_iff_degree_eq_zero, degree_X_pow_sub_C hp.pos, Nat.cast_eq_zero]
158-
exact hp.ne_zero
159-
have ⟨g, hg, hg'⟩ := WfDvdMonoid.exists_irreducible_factor this (X_pow_sub_C_ne_zero hp.pos a)
160-
-- It suffices to show that `deg g = p`.
161-
suffices natDegree g = p from (associated_of_dvd_of_natDegree_le hg'
162-
(X_pow_sub_C_ne_zero hp.pos a) (this.trans natDegree_X_pow_sub_C.symm).ge).irreducible hg
163-
-- Suppose `deg g ≠ p`.
164-
by_contra h
165-
have : Fact (Irreducible g) := ⟨hg⟩
166-
-- Let `r` be a root of `g`, then `N_K(r) ^ p = N_K(r ^ p) = N_K(a) = a ^ (deg g)`.
167-
have key : (Algebra.norm K (AdjoinRoot.root g)) ^ p = a ^ g.natDegree := by
168-
have := eval₂_eq_zero_of_dvd_of_eval₂_eq_zero _ _ hg' (AdjoinRoot.eval₂_root g)
169-
rw [eval₂_sub, eval₂_pow, eval₂_C, eval₂_X, sub_eq_zero] at this
170-
rw [← map_pow, this, ← AdjoinRoot.algebraMap_eq, Algebra.norm_algebraMap,
171-
← finrank_top', ← IntermediateField.adjoin_root_eq_top g,
172-
IntermediateField.adjoin.finrank,
173-
AdjoinRoot.minpoly_root hg.ne_zero, natDegree_mul_C]
174-
· simpa using hg.ne_zero
175-
· exact AdjoinRoot.isIntegral_root hg.ne_zero
176-
-- Since `a ^ (deg g)` is a `p`-power, and `p` is coprime to `deg g`, we conclude that `a` is
177-
-- also a `p`-power, contradicting the hypothesis
178-
have : p.Coprime (natDegree g) := hp.coprime_iff_not_dvd.mpr (fun e ↦ h (((natDegree_le_of_dvd hg'
179-
(X_pow_sub_C_ne_zero hp.pos a)).trans_eq natDegree_X_pow_sub_C).antisymm (Nat.le_of_dvd
180-
(natDegree_pos_iff_degree_pos.mpr <| Polynomial.degree_pos_of_irreducible hg) e)))
181-
exact ha _ ((pow_mem_range_pow_of_coprime this.symm a).mp ⟨_, key⟩).choose_spec
182-
183-
theorem X_pow_sub_C_irreducible_iff_of_prime {p : ℕ} (hp : p.Prime) {a : K} :
184-
Irreducible (X ^ p - C a) ↔ ∀ b, b ^ p ≠ a :=
185-
⟨(pow_ne_of_irreducible_X_pow_sub_C · dvd_rfl hp.ne_one), X_pow_sub_C_irreducible_of_prime hp⟩
186-
18786
theorem X_pow_mul_sub_C_irreducible
18887
{n m : ℕ} {a : K} (hm : Irreducible (X ^ m - C a))
18988
(hn : ∀ (E : Type u) [Field E] [Algebra K E] (x : E) (_ : minpoly K x = X ^ m - C a),
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/-
2+
Copyright (c) 2023 Andrew Yang, Patrick Lutz. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Andrew Yang
5+
-/
6+
import Mathlib.RingTheory.AdjoinRoot
7+
import Mathlib.RingTheory.Norm.Defs
8+
/-!
9+
# Irreducibility of X ^ p - a
10+
11+
## Main result
12+
- `X_pow_sub_C_irreducible_iff_of_prime`: For `p` prime, `X ^ p - C a` is irreducible iff `a` is not
13+
a `p`-power. This is not true for composite `n`. For example, `x^4+4=(x^2-2x+2)(x^2+2x+2)` but
14+
`-4` is not a 4th power.
15+
16+
-/
17+
universe u
18+
19+
variable {K : Type u} [Field K]
20+
21+
open Polynomial AdjoinRoot
22+
23+
section Splits
24+
25+
lemma root_X_pow_sub_C_pow (n : ℕ) (a : K) :
26+
(AdjoinRoot.root (X ^ n - C a)) ^ n = AdjoinRoot.of _ a := by
27+
rw [← sub_eq_zero, ← AdjoinRoot.eval₂_root, eval₂_sub, eval₂_C, eval₂_pow, eval₂_X]
28+
29+
lemma root_X_pow_sub_C_ne_zero {n : ℕ} (hn : 1 < n) (a : K) :
30+
(AdjoinRoot.root (X ^ n - C a)) ≠ 0 :=
31+
mk_ne_zero_of_natDegree_lt (monic_X_pow_sub_C _ (Nat.not_eq_zero_of_lt hn))
32+
X_ne_zero <| by rwa [natDegree_X_pow_sub_C, natDegree_X]
33+
34+
lemma root_X_pow_sub_C_ne_zero' {n : ℕ} {a : K} (hn : 0 < n) (ha : a ≠ 0) :
35+
(AdjoinRoot.root (X ^ n - C a)) ≠ 0 := by
36+
obtain (rfl|hn) := (Nat.succ_le_iff.mpr hn).eq_or_lt
37+
· rw [pow_one]
38+
intro e
39+
refine mk_ne_zero_of_natDegree_lt (monic_X_sub_C a) (C_ne_zero.mpr ha) (by simp) ?_
40+
trans AdjoinRoot.mk (X - C a) (X - (X - C a))
41+
· rw [sub_sub_cancel]
42+
· rw [map_sub, mk_self, sub_zero, mk_X, e]
43+
· exact root_X_pow_sub_C_ne_zero hn a
44+
45+
end Splits
46+
47+
section Irreducible
48+
49+
lemma ne_zero_of_irreducible_X_pow_sub_C {n : ℕ} {a : K} (H : Irreducible (X ^ n - C a)) :
50+
n ≠ 0 := by
51+
rintro rfl
52+
rw [pow_zero, ← C.map_one, ← map_sub] at H
53+
exact not_irreducible_C _ H
54+
55+
lemma ne_zero_of_irreducible_X_pow_sub_C' {n : ℕ} (hn : n ≠ 1) {a : K}
56+
(H : Irreducible (X ^ n - C a)) : a ≠ 0 := by
57+
rintro rfl
58+
rw [map_zero, sub_zero] at H
59+
exact not_irreducible_pow hn H
60+
61+
lemma root_X_pow_sub_C_eq_zero_iff {n : ℕ} {a : K} (H : Irreducible (X ^ n - C a)) :
62+
(AdjoinRoot.root (X ^ n - C a)) = 0 ↔ a = 0 := by
63+
have hn := Nat.pos_iff_ne_zero.mpr (ne_zero_of_irreducible_X_pow_sub_C H)
64+
refine ⟨not_imp_not.mp (root_X_pow_sub_C_ne_zero' hn), ?_⟩
65+
rintro rfl
66+
have := not_imp_not.mp (fun hn ↦ ne_zero_of_irreducible_X_pow_sub_C' hn H) rfl
67+
rw [this, pow_one, map_zero, sub_zero, ← mk_X, mk_self]
68+
69+
lemma root_X_pow_sub_C_ne_zero_iff {n : ℕ} {a : K} (H : Irreducible (X ^ n - C a)) :
70+
(AdjoinRoot.root (X ^ n - C a)) ≠ 0 ↔ a ≠ 0 :=
71+
(root_X_pow_sub_C_eq_zero_iff H).not
72+
73+
theorem pow_ne_of_irreducible_X_pow_sub_C {n : ℕ} {a : K}
74+
(H : Irreducible (X ^ n - C a)) {m : ℕ} (hm : m ∣ n) (hm' : m ≠ 1) (b : K) : b ^ m ≠ a := by
75+
have hn : n ≠ 0 := fun e ↦ not_irreducible_C
76+
(1 - a) (by simpa only [e, pow_zero, ← C.map_one, ← map_sub] using H)
77+
obtain ⟨k, rfl⟩ := hm
78+
rintro rfl
79+
obtain ⟨q, hq⟩ := sub_dvd_pow_sub_pow (X ^ k) (C b) m
80+
rw [mul_comm, pow_mul, map_pow, hq] at H
81+
have : degree q = 0 := by
82+
simpa [isUnit_iff_degree_eq_zero, degree_X_pow_sub_C,
83+
Nat.pos_iff_ne_zero, (mul_ne_zero_iff.mp hn).2] using H.2 _ q rfl
84+
apply_fun degree at hq
85+
simp only [this, ← pow_mul, mul_comm k m, degree_X_pow_sub_C, Nat.pos_iff_ne_zero.mpr hn,
86+
Nat.pos_iff_ne_zero.mpr (mul_ne_zero_iff.mp hn).2, degree_mul, ← map_pow, add_zero,
87+
Nat.cast_injective.eq_iff] at hq
88+
exact hm' ((mul_eq_right₀ (mul_ne_zero_iff.mp hn).2).mp hq)
89+
90+
/--Let `p` be a prime number. Let `K` be a field.
91+
Let `t ∈ K` be an element which does not have a `p`th root in `K`.
92+
Then the polynomial `x ^ p - t` is irreducible over `K`.-/
93+
@[stacks 09HF "We proved the result without the condition that `K` is char p in 09HF."]
94+
theorem X_pow_sub_C_irreducible_of_prime {p : ℕ} (hp : p.Prime) {a : K} (ha : ∀ b : K, b ^ p ≠ a) :
95+
Irreducible (X ^ p - C a) := by
96+
-- First of all, We may find an irreducible factor `g` of `X ^ p - C a`.
97+
have : ¬ IsUnit (X ^ p - C a) := by
98+
rw [Polynomial.isUnit_iff_degree_eq_zero, degree_X_pow_sub_C hp.pos, Nat.cast_eq_zero]
99+
exact hp.ne_zero
100+
have ⟨g, hg, hg'⟩ := WfDvdMonoid.exists_irreducible_factor this (X_pow_sub_C_ne_zero hp.pos a)
101+
-- It suffices to show that `deg g = p`.
102+
suffices natDegree g = p from (associated_of_dvd_of_natDegree_le hg'
103+
(X_pow_sub_C_ne_zero hp.pos a) (this.trans natDegree_X_pow_sub_C.symm).ge).irreducible hg
104+
-- Suppose `deg g ≠ p`.
105+
by_contra h
106+
have : Fact (Irreducible g) := ⟨hg⟩
107+
-- Let `r` be a root of `g`, then `N_K(r) ^ p = N_K(r ^ p) = N_K(a) = a ^ (deg g)`.
108+
have key : (Algebra.norm K (AdjoinRoot.root g)) ^ p = a ^ g.natDegree := by
109+
have := eval₂_eq_zero_of_dvd_of_eval₂_eq_zero _ _ hg' (AdjoinRoot.eval₂_root g)
110+
rw [eval₂_sub, eval₂_pow, eval₂_C, eval₂_X, sub_eq_zero] at this
111+
rw [← map_pow, this, ← AdjoinRoot.algebraMap_eq, Algebra.norm_algebraMap,
112+
(powerBasis hg.ne_zero).finrank, powerBasis_dim hg.ne_zero]
113+
-- Since `a ^ (deg g)` is a `p`-power, and `p` is coprime to `deg g`, we conclude that `a` is
114+
-- also a `p`-power, contradicting the hypothesis
115+
have : p.Coprime (natDegree g) := hp.coprime_iff_not_dvd.mpr (fun e ↦ h (((natDegree_le_of_dvd hg'
116+
(X_pow_sub_C_ne_zero hp.pos a)).trans_eq natDegree_X_pow_sub_C).antisymm (Nat.le_of_dvd
117+
(natDegree_pos_iff_degree_pos.mpr <| Polynomial.degree_pos_of_irreducible hg) e)))
118+
exact ha _ ((pow_mem_range_pow_of_coprime this.symm a).mp ⟨_, key⟩).choose_spec
119+
120+
theorem X_pow_sub_C_irreducible_iff_of_prime {p : ℕ} (hp : p.Prime) {a : K} :
121+
Irreducible (X ^ p - C a) ↔ ∀ b, b ^ p ≠ a :=
122+
⟨(pow_ne_of_irreducible_X_pow_sub_C · dvd_rfl hp.ne_one), X_pow_sub_C_irreducible_of_prime hp⟩
123+
124+
end Irreducible

Mathlib/FieldTheory/Perfect.lean

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ Authors: Oliver Nash
55
-/
66
import Mathlib.Algebra.CharP.Basic
77
import Mathlib.Algebra.CharP.Reduced
8+
import Mathlib.FieldTheory.KummerPolynomial
89
import Mathlib.FieldTheory.Separable
9-
import Mathlib.FieldTheory.SplittingField.Construction
1010

1111
/-!
1212
@@ -203,35 +203,15 @@ instance ofFinite [Finite K] : PerfectField K := by
203203
variable [PerfectField K]
204204

205205
/-- A perfect field of characteristic `p` (prime) is a perfect ring. -/
206-
instance toPerfectRing (p : ℕ) [ExpChar K p] : PerfectRing K p := by
206+
instance toPerfectRing (p : ℕ) [hp : ExpChar K p] : PerfectRing K p := by
207207
refine PerfectRing.ofSurjective _ _ fun y ↦ ?_
208-
let f : K[X] := X ^ p - C y
209-
let L := f.SplittingField
210-
let ι := algebraMap K L
211-
have hf_deg : f.degree ≠ 0 := by
212-
rw [degree_X_pow_sub_C (expChar_pos K p) y, p.cast_ne_zero]; exact (expChar_pos K p).ne'
213-
let a : L := f.rootOfSplits ι (SplittingField.splits f) hf_deg
214-
have hfa : aeval a f = 0 := by rw [aeval_def, map_rootOfSplits _ (SplittingField.splits f) hf_deg]
215-
have ha_pow : a ^ p = ι y := by rwa [map_sub, aeval_X_pow, aeval_C, sub_eq_zero] at hfa
216-
let g : K[X] := minpoly K a
217-
suffices (g.map ι).natDegree = 1 by
218-
rw [g.natDegree_map, ← degree_eq_iff_natDegree_eq_of_pos Nat.one_pos] at this
219-
obtain ⟨a' : K, ha' : ι a' = a⟩ := minpoly.mem_range_of_degree_eq_one K a this
220-
refine ⟨a', NoZeroSMulDivisors.algebraMap_injective K L ?_⟩
221-
rw [RingHom.map_frobenius, ha', frobenius_def, ha_pow]
222-
have hg_dvd : g.map ι ∣ (X - C a) ^ p := by
223-
convert Polynomial.map_dvd ι (minpoly.dvd K a hfa)
224-
rw [sub_pow_expChar, Polynomial.map_sub, Polynomial.map_pow, map_X, map_C, ← ha_pow, map_pow]
225-
have ha : IsIntegral K a := .of_finite K a
226-
have hg_pow : g.map ι = (X - C a) ^ (g.map ι).natDegree := by
227-
obtain ⟨q, -, hq⟩ := (dvd_prime_pow (prime_X_sub_C a) p).mp hg_dvd
228-
rw [eq_of_monic_of_associated ((minpoly.monic ha).map ι) ((monic_X_sub_C a).pow q) hq,
229-
natDegree_pow, natDegree_X_sub_C, mul_one]
230-
have hg_sep : (g.map ι).Separable := (separable_of_irreducible <| minpoly.irreducible ha).map
231-
rw [hg_pow] at hg_sep
232-
refine (Separable.of_pow (not_isUnit_X_sub_C a) ?_ hg_sep).2
233-
rw [g.natDegree_map ι, ← Nat.pos_iff_ne_zero, natDegree_pos_iff_degree_pos]
234-
exact minpoly.degree_pos ha
208+
rcases hp with _ | hp
209+
· simp [frobenius]
210+
rw [← not_forall_not]
211+
apply mt (X_pow_sub_C_irreducible_of_prime hp)
212+
apply mt separable_of_irreducible
213+
simp [separable_def, isCoprime_zero_right, isUnit_iff_degree_eq_zero,
214+
degree_X_pow_sub_C hp.pos, hp.ne_zero]
235215

236216
theorem separable_iff_squarefree {g : K[X]} : g.Separable ↔ Squarefree g := by
237217
refine ⟨Separable.squarefree, fun sqf ↦ isCoprime_of_irreducible_dvd (sqf.ne_zero ·.1) ?_⟩

0 commit comments

Comments
 (0)