Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 24dc410

Browse files
feat(field_theory/separable_degree): introduce the separable degree (#6743)
We introduce the definition of the separable degree of a polynomial. We prove that every irreducible polynomial can be contracted to a separable polynomial. We show that the separable degree divides the degree of the polynomial. This formalizes a lemma in the Stacks Project, cf. https://stacks.math.columbia.edu/tag/09H0 We also show that the separable degree is unique.
1 parent f12575e commit 24dc410

File tree

2 files changed

+184
-0
lines changed

2 files changed

+184
-0
lines changed

src/field_theory/separable.lean

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,23 @@ theorem map_expand {p : ℕ} (hp : 0 < p) {f : R →+* S} {q : polynomial R} :
203203
map f (expand R p q) = expand S p (map f q) :=
204204
by { ext, rw [coeff_map, coeff_expand hp, coeff_expand hp], split_ifs; simp, }
205205

206+
/-- Expansion is injective. -/
207+
lemma expand_injective {n : ℕ} (hn : 0 < n) :
208+
function.injective (expand R n) :=
209+
λ g g' h, begin
210+
ext,
211+
have h' : (expand R n g).coeff (n * n_1) = (expand R n g').coeff (n * n_1) :=
212+
begin
213+
apply polynomial.ext_iff.1,
214+
exact h,
215+
end,
216+
217+
rw [polynomial.coeff_expand hn g (n * n_1), polynomial.coeff_expand hn g' (n * n_1)] at h',
218+
simp only [if_true, dvd_mul_right] at h',
219+
rw (nat.mul_div_right n_1 hn) at h',
220+
exact h',
221+
end
222+
206223
end comm_semiring
207224

208225
section comm_ring
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
/-
2+
Copyright (c) 2021 Jakob Scholbach. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Jakob Scholbach
5+
-/
6+
import field_theory.separable
7+
import algebra.algebra.basic
8+
import data.polynomial.degree
9+
import algebra.char_p.exp_char
10+
11+
/-!
12+
13+
# Separable degree
14+
15+
This file contains basics about the separable degree of a polynomial.
16+
17+
## Main results
18+
19+
- `is_separable_contraction`: is the condition that `g(x^(q^m)) = f(x)` for some `m : ℕ`
20+
- `has_separable_contraction`: the condition of having a separable contraction
21+
- `has_separable_contraction.degree`: the separable degree, defined as the degree of some
22+
separable contraction
23+
- `irreducible_has_separable_contraction`: any nonzero irreducible polynomial can be contracted
24+
to a separable polynomial
25+
- `has_separable_contraction.dvd_degree'`: the degree of a separable contraction divides the degree,
26+
in function of the exponential characteristic of the field
27+
- `has_separable_contraction.dvd_degree` and `has_separable_contraction.eq_degree` specialize the
28+
statement of `separable_degree_dvd_degree`
29+
- `is_separable_contraction.degree_eq`: the separable degree is well-defined, implemented as the
30+
statement that the degree of any separable contraction equals `has_separable_contraction.degree`
31+
32+
## Tags
33+
34+
separable degree, degree, polynomial
35+
-/
36+
37+
namespace polynomial
38+
39+
noncomputable theory
40+
open_locale classical
41+
42+
section comm_semiring
43+
44+
variables {F : Type} [comm_semiring F] (q : ℕ)
45+
46+
/-- A separable contraction of a polynomial `f` is a separable polynomial `g` such that
47+
`g(x^(q^m)) = f(x)` for some `m : ℕ`.-/
48+
def is_separable_contraction (f : polynomial F) (g : polynomial F) : Prop :=
49+
g.separable ∧ ∃ m : ℕ, expand F (q^m) g = f
50+
51+
/-- The condition of having a separable contration. -/
52+
def has_separable_contraction (f : polynomial F) : Prop :=
53+
∃ g : polynomial F, is_separable_contraction q f g
54+
55+
variables {q} {f : polynomial F} (hf : has_separable_contraction q f)
56+
57+
/-- A choice of a separable contraction. -/
58+
def has_separable_contraction.contraction : polynomial F := classical.some hf
59+
60+
/-- The separable degree of a polynomial is the degree of a given separable contraction. -/
61+
def has_separable_contraction.degree : ℕ := hf.contraction.nat_degree
62+
63+
/-- The separable degree divides the degree, in function of the exponential characteristic of F. -/
64+
lemma is_separable_contraction.dvd_degree' {g} (hf : is_separable_contraction q f g) :
65+
∃ m : ℕ, g.nat_degree * (q ^ m) = f.nat_degree :=
66+
begin
67+
obtain ⟨m, rfl⟩ := hf.2,
68+
use m,
69+
rw nat_degree_expand,
70+
end
71+
72+
lemma has_separable_contraction.dvd_degree' : ∃ m : ℕ, hf.degree * (q ^ m) = f.nat_degree :=
73+
(classical.some_spec hf).dvd_degree'
74+
75+
/-- The separable degree divides the degree. -/
76+
lemma has_separable_contraction.dvd_degree :
77+
hf.degree ∣ f.nat_degree :=
78+
let ⟨a, ha⟩ := hf.dvd_degree' in dvd.intro (q ^ a) ha
79+
80+
/-- In exponential characteristic one, the separable degree equals the degree. -/
81+
lemma has_separable_contraction.eq_degree {f : polynomial F}
82+
(hf : has_separable_contraction 1 f) : hf.degree = f.nat_degree :=
83+
let ⟨a, ha⟩ := hf.dvd_degree' in by rw [←ha, one_pow a, mul_one]
84+
85+
end comm_semiring
86+
87+
section field
88+
89+
variables {F : Type} [field F]
90+
variables (q : ℕ) {f : polynomial F} (hf : has_separable_contraction q f)
91+
92+
/-- Every irreducible polynomial can be contracted to a separable polynomial.
93+
https://stacks.math.columbia.edu/tag/09H0 -/
94+
lemma irreducible_has_separable_contraction (q : ℕ) [hF : exp_char F q]
95+
(f : polynomial F) [irred : irreducible f] (fn : f ≠ 0) : has_separable_contraction q f :=
96+
begin
97+
casesI hF,
98+
{ use f,
99+
exact ⟨irreducible.separable irred, ⟨0, by rw [pow_zero, expand_one]⟩⟩ },
100+
{ haveI qp : fact (nat.prime q) := ⟨hF_hprime⟩,
101+
rcases exists_separable_of_irreducible q irred fn with ⟨n, g, hgs, hge⟩,
102+
exact ⟨g, hgs, n, hge⟩, }
103+
end
104+
105+
/-- A helper lemma: if two expansions (along the positive characteristic) of two polynomials `g` and
106+
`g'` agree, and the one with the larger degree is separable, then their degrees are the same. -/
107+
lemma contraction_degree_eq_aux [hq : fact q.prime] [hF : char_p F q]
108+
(g g' : polynomial F) (m m' : ℕ)
109+
(h_expand : expand F (q^m) g = expand F (q^m') g')
110+
(h : m < m') (hg : g.separable):
111+
g.nat_degree = g'.nat_degree :=
112+
begin
113+
obtain ⟨s, rfl⟩ := nat.exists_eq_add_of_lt h,
114+
rw [add_assoc, pow_add, expand_mul] at h_expand,
115+
let aux := expand_injective (pow_pos hq.1.pos m) h_expand,
116+
rw aux at hg,
117+
have := (is_unit_or_eq_zero_of_separable_expand q (s + 1) hg).resolve_right
118+
s.succ_ne_zero,
119+
rw [aux, nat_degree_expand,
120+
nat_degree_eq_of_degree_eq_some (degree_eq_zero_of_is_unit this),
121+
zero_mul]
122+
end
123+
124+
/-- If two expansions (along the positive characteristic) of two separable polynomials
125+
`g` and `g'` agree, then they have the same degree. -/
126+
theorem contraction_degree_eq_or_insep
127+
[hq : fact q.prime] [char_p F q]
128+
(g g' : polynomial F) (m m' : ℕ)
129+
(h_expand : expand F (q^m) g = expand F (q^m') g')
130+
(hg : g.separable) (hg' : g'.separable) :
131+
g.nat_degree = g'.nat_degree :=
132+
begin
133+
by_cases h : m = m',
134+
{ -- if `m = m'` then we show `g.nat_degree = g'.nat_degree` by unfolding the definitions
135+
rw h at h_expand,
136+
have expand_deg : ((expand F (q ^ m')) g).nat_degree =
137+
(expand F (q ^ m') g').nat_degree, by rw h_expand,
138+
rw [nat_degree_expand (q^m') g, nat_degree_expand (q^m') g'] at expand_deg,
139+
apply nat.eq_of_mul_eq_mul_left (pow_pos hq.1.pos m'),
140+
rw [mul_comm] at expand_deg, rw expand_deg, rw [mul_comm] },
141+
{ cases ne.lt_or_lt h,
142+
{ exact contraction_degree_eq_aux q g g' m m' h_expand h_1 hg },
143+
{ exact (contraction_degree_eq_aux q g' g m' m h_expand.symm h_1 hg').symm, } }
144+
end
145+
146+
/-- The separable degree equals the degree of any separable contraction, i.e., it is unique. -/
147+
theorem is_separable_contraction.degree_eq [hF : exp_char F q]
148+
(g : polynomial F) (hg : is_separable_contraction q f g) :
149+
g.nat_degree = hf.degree :=
150+
begin
151+
casesI hF,
152+
{ rcases hg with ⟨g, m, hm⟩,
153+
rw [one_pow, expand_one] at hm,
154+
rw hf.eq_degree,
155+
rw hm, },
156+
{ rcases hg with ⟨hg, m, hm⟩,
157+
let g' := classical.some hf,
158+
cases (classical.some_spec hf).2 with m' hm',
159+
haveI : fact q.prime := fact_iff.2 hF_hprime,
160+
apply contraction_degree_eq_or_insep q g g' m m',
161+
rw [hm, hm'],
162+
exact hg, exact (classical.some_spec hf).1 }
163+
end
164+
165+
end field
166+
167+
end polynomial

0 commit comments

Comments
 (0)