|
| 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