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

Commit c0ba4d6

Browse files
feat(ring_theory/polynomial/eisenstein): add cyclotomic_comp_X_add_one_is_eisenstein_at (#12447)
We add `cyclotomic_comp_X_add_one_is_eisenstein_at`: `(cyclotomic p ℤ).comp (X + 1)` is Eisenstein at `p`. From flt-regular
1 parent 94cbfad commit c0ba4d6

File tree

5 files changed

+126
-6
lines changed

5 files changed

+126
-6
lines changed

src/data/polynomial/coeff.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,17 @@ theorem mul_X_pow_eq_zero {p : R[X]} {n : ℕ}
169169
(H : p * X ^ n = 0) : p = 0 :=
170170
ext $ λ k, (coeff_mul_X_pow p n k).symm.trans $ ext_iff.1 H (k+n)
171171

172+
lemma mul_X_pow_injective (n : ℕ) : function.injective (λ P : R[X], X ^ n * P) :=
173+
begin
174+
intros P Q hPQ,
175+
simp only at hPQ,
176+
ext i,
177+
rw [← coeff_X_pow_mul P n i, hPQ, coeff_X_pow_mul Q n i]
178+
end
179+
180+
lemma mul_X_injective : function.injective (λ P : R[X], X * P) :=
181+
by simpa only [pow_one] using mul_X_pow_injective 1
182+
172183
lemma C_mul_X_pow_eq_monomial (c : R) (n : ℕ) : C c * X^n = monomial n c :=
173184
by { ext1, rw [monomial_eq_smul_X, coeff_smul, coeff_C_mul, smul_eq_mul] }
174185

src/field_theory/minpoly.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ minpoly.unique _ _ (minpoly.monic hx)
359359
(is_scalar_tower.aeval_eq_zero_of_aeval_algebra_map_eq_zero K S T hST
360360
(h ▸ root_q : polynomial.aeval (algebra_map S T x) q = 0)))
361361

362-
lemma minpoly_add_algebra_map {B : Type*} [comm_ring B] [algebra A B] {x : B}
362+
lemma add_algebra_map {B : Type*} [comm_ring B] [algebra A B] {x : B}
363363
(hx : is_integral A x) (a : A) :
364364
minpoly A (x + (algebra_map A B a)) = (minpoly A x).comp (X - C a) :=
365365
begin
@@ -375,10 +375,10 @@ begin
375375
nat_degree_X_add_C, mul_one] at H }
376376
end
377377

378-
lemma minpoly_sub_algebra_map {B : Type*} [comm_ring B] [algebra A B] {x : B}
378+
lemma sub_algebra_map {B : Type*} [comm_ring B] [algebra A B] {x : B}
379379
(hx : is_integral A x) (a : A) :
380380
minpoly A (x - (algebra_map A B a)) = (minpoly A x).comp (X + C a) :=
381-
by simpa [sub_eq_add_neg] using minpoly_add_algebra_map hx (-a)
381+
by simpa [sub_eq_add_neg] using add_algebra_map hx (-a)
382382

383383
section gcd_domain
384384

src/number_theory/cyclotomic/primitive_roots.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,15 @@ begin
222222
{ exact hζ.norm_eq_one hn hirr }
223223
end
224224

225+
lemma minpoly_sub_one_eq_cyclotomic_comp [is_cyclotomic_extension {n} K L]
226+
(h : irreducible (polynomial.cyclotomic n K)) :
227+
minpoly K (ζ - 1) = (cyclotomic n K).comp (X + 1) :=
228+
begin
229+
rw [show ζ - 1 = ζ + (algebra_map K L (-1)), by simp [sub_eq_add_neg], minpoly.add_algebra_map
230+
(is_cyclotomic_extension.integral {n} K L ζ), hζ.minpoly_eq_cyclotomic_of_irreducible h],
231+
simp
232+
end
233+
225234
/-- If `irreducible (cyclotomic n K)` (in particular for `K = ℚ`), then the norm of
226235
`ζ - 1` is `eval 1 (cyclotomic n ℤ)`. -/
227236
lemma sub_one_norm_eq_eval_cyclotomic [is_cyclotomic_extension {n} K L]

src/ring_theory/polynomial/basic.lean

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,56 @@ begin
215215
refl,
216216
end
217217

218+
lemma geom_sum_X_comp_X_add_one_eq_sum (n : ℕ) :
219+
(geom_sum (X : R[X]) n).comp (X + 1) =
220+
(finset.range n).sum (λ (i : ℕ), (n.choose (i + 1) : R[X]) * X ^ i) :=
221+
begin
222+
ext i,
223+
transitivity (n.choose (i + 1) : R), swap,
224+
{ simp only [finset_sum_coeff, ← C_eq_nat_cast, coeff_C_mul_X_pow],
225+
rw [finset.sum_eq_single i, if_pos rfl],
226+
{ simp only [@eq_comm _ i, if_false, eq_self_iff_true, implies_true_iff] {contextual := tt}, },
227+
{ simp only [nat.lt_add_one_iff, nat.choose_eq_zero_of_lt, nat.cast_zero, finset.mem_range,
228+
not_lt, eq_self_iff_true, if_true, implies_true_iff] {contextual := tt}, } },
229+
induction n with n ih generalizing i,
230+
{ simp only [geom_sum_zero, zero_comp, coeff_zero, nat.choose_zero_succ, nat.cast_zero], },
231+
simp only [geom_sum_succ', ih, add_comp, pow_comp, X_comp, coeff_add, nat.choose_succ_succ,
232+
nat.cast_add, add_pow, one_pow, mul_one, finset_sum_coeff, ← C_eq_nat_cast, mul_comm _ (C _),
233+
coeff_C_mul_X_pow],
234+
rw [finset.sum_eq_single i, if_pos rfl],
235+
{ simp only [@eq_comm _ i, if_false, eq_self_iff_true, implies_true_iff] {contextual := tt}, },
236+
{ simp only [nat.lt_add_one_iff, nat.choose_eq_zero_of_lt, nat.cast_zero, finset.mem_range,
237+
eq_self_iff_true, if_true, implies_true_iff, not_le] {contextual := tt}, },
238+
end
239+
240+
lemma monic.geom_sum {R : Type*} [semiring R] {P : R[X]}
241+
(hP : P.monic) (hdeg : 0 < P.nat_degree) {n : ℕ} (hn : n ≠ 0) : (geom_sum P n).monic :=
242+
begin
243+
nontriviality R,
244+
cases n, { exact (hn rfl).elim },
245+
rw [geom_sum_succ', geom_sum_def],
246+
refine monic_add_of_left (monic_pow hP _) _,
247+
refine lt_of_le_of_lt (degree_sum_le _ _) _,
248+
rw [finset.sup_lt_iff],
249+
{ simp only [finset.mem_range, degree_eq_nat_degree (monic_pow hP _).ne_zero,
250+
with_bot.coe_lt_coe, hP.nat_degree_pow],
251+
intro k, exact nsmul_lt_nsmul hdeg },
252+
{ rw [bot_lt_iff_ne_bot, ne.def, degree_eq_bot],
253+
exact (monic_pow hP _).ne_zero }
254+
end
255+
256+
lemma monic.geom_sum' {R : Type*} [semiring R] {P : R[X]}
257+
(hP : P.monic) (hdeg : 0 < P.degree) {n : ℕ} (hn : n ≠ 0) : (geom_sum P n).monic :=
258+
hP.geom_sum (nat_degree_pos_iff_degree_pos.2 hdeg) hn
259+
260+
lemma monic_geom_sum_X (R : Type*) [semiring R] {n : ℕ} (hn : n ≠ 0) :
261+
(geom_sum (X : R[X]) n).monic :=
262+
begin
263+
nontriviality R,
264+
apply monic_X.geom_sum _ hn,
265+
simpa only [nat_degree_X] using zero_lt_one
266+
end
267+
218268
section to_subring
219269

220270
variables (p : R[X]) (T : subring R)

src/ring_theory/polynomial/eisenstein.lean

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Authors: Riccardo Brasca
77
import ring_theory.eisenstein_criterion
88
import ring_theory.integrally_closed
99
import ring_theory.norm
10+
import ring_theory.polynomial.cyclotomic.basic
1011

1112
/-!
1213
# Eisenstein polynomials
@@ -194,6 +195,55 @@ end is_eisenstein_at
194195

195196
end polynomial
196197

198+
section cyclotomic
199+
200+
variables {p : ℕ}
201+
202+
local notation `𝓟` := submodule.span ℤ {p}
203+
204+
open polynomial
205+
206+
lemma cyclotomic_comp_X_add_one_is_eisenstein_at [hp : fact p.prime] :
207+
((cyclotomic p ℤ).comp (X + 1)).is_eisenstein_at 𝓟 :=
208+
{ leading :=
209+
begin
210+
intro h,
211+
rw [show (X + 1 : ℤ[X]) = X + C 1, by simp] at h,
212+
suffices : ((cyclotomic p ℤ).comp (X + C 1)).monic,
213+
{ rw [monic.def.1 this, ideal.submodule_span_eq, ideal.mem_span_singleton] at h,
214+
exact nat.prime.not_dvd_one hp.out (by exact_mod_cast h) },
215+
refine monic.comp (cyclotomic.monic p ℤ) (monic_X_add_C 1) (λ h₁, _),
216+
rw [nat_degree_X_add_C] at h₁,
217+
exact zero_ne_one h₁.symm,
218+
end,
219+
mem := λ i hi,
220+
begin
221+
rw [cyclotomic_eq_geom_sum hp.out, geom_sum_X_comp_X_add_one_eq_sum, ← lcoeff_apply,
222+
linear_map.map_sum],
223+
conv { congr, congr, skip, funext,
224+
rw [lcoeff_apply, ← C_eq_nat_cast, ← monomial_eq_C_mul_X, coeff_monomial] },
225+
rw [nat_degree_comp, show (X + 1 : ℤ[X]) = X + C 1, by simp, nat_degree_X_add_C, mul_one,
226+
nat_degree_cyclotomic, nat.totient_prime hp.out] at hi,
227+
simp only [lt_of_lt_of_le hi (nat.sub_le _ _), int.nat_cast_eq_coe_nat, sum_ite_eq', mem_range,
228+
if_true, ideal.submodule_span_eq, ideal.mem_span_singleton],
229+
exact int.coe_nat_dvd.2
230+
(nat.prime.dvd_choose_self (nat.succ_pos i) (lt_tsub_iff_right.1 hi) hp.out)
231+
end,
232+
not_mem :=
233+
begin
234+
rw [coeff_zero_eq_eval_zero, eval_comp, cyclotomic_eq_geom_sum hp.out, eval_add, eval_X,
235+
eval_one, zero_add, eval_geom_sum, one_geom_sum, int.nat_cast_eq_coe_nat,
236+
ideal.submodule_span_eq, ideal.span_singleton_pow, ideal.mem_span_singleton],
237+
intro h,
238+
obtain ⟨k, hk⟩ := int.coe_nat_dvd.1 h,
239+
rw [← mul_assoc, mul_one, mul_assoc] at hk,
240+
nth_rewrite 0 [← nat.mul_one p] at hk,
241+
rw [nat.mul_right_inj hp.out.pos] at hk,
242+
exact nat.prime.not_dvd_one hp.out (dvd.intro k (hk.symm)),
243+
end }
244+
245+
end cyclotomic
246+
197247
section is_integral
198248

199249
variables {K : Type v} {L : Type z} {p : R} [comm_ring R] [field K] [field L]
@@ -350,12 +400,12 @@ begin
350400
have H := degree_mod_by_monic_lt Q₁ (minpoly.monic hBint),
351401
rw [← hQ₁, ← hP] at H,
352402
replace H:= nat.lt_iff_add_one_le.1 (lt_of_lt_of_le (lt_of_le_of_lt
353-
(nat.lt_iff_add_one_le.1 (lt_of_succ_lt_succ (mem_range.1 hj))) (lt_succ_self _))
403+
(nat.lt_iff_add_one_le.1 (nat.lt_of_succ_lt_succ (mem_range.1 hj))) (lt_succ_self _))
354404
(nat.lt_iff_add_one_le.1 (((nat_degree_lt_nat_degree_iff hQzero).2 H)))),
355405
rw [add_assoc] at H,
356406
have Hj : Q.nat_degree + 1 = j + 1 + (Q.nat_degree - j),
357407
{ rw [← add_comm 1, ← add_comm 1, add_assoc, add_right_inj, ← nat.add_sub_assoc
358-
(lt_of_succ_lt_succ (mem_range.1 hj)).le, add_comm, nat.add_sub_cancel] },
408+
(nat.lt_of_succ_lt_succ (mem_range.1 hj)).le, add_comm, nat.add_sub_cancel] },
359409

360410
-- By induction hypothesis we can find `g : ℕ → R` such that
361411
-- `k ∈ range (j + 1) → Q.coeff k • B.gen ^ k = (algebra_map R L) p * g k • B.gen ^ k`-
@@ -408,7 +458,7 @@ begin
408458
-- we didn't know were multiples of `p`, and we take the norm on both sides.
409459
replace hQ := congr_arg (λ x, x * B.gen ^ (P.nat_degree - (j + 2))) hQ,
410460
simp_rw [sum_map, add_left_embedding_apply, add_mul, sum_mul, mul_assoc] at hQ,
411-
rw [← insert_erase (mem_range.2 (tsub_pos_iff_lt.2 $ lt_of_succ_lt_succ $ mem_range.1 hj)),
461+
rw [← insert_erase (mem_range.2 (tsub_pos_iff_lt.2 $ nat.lt_of_succ_lt_succ $ mem_range.1 hj)),
412462
sum_insert (not_mem_erase 0 _), add_zero, sum_congr rfl hf₁, ← mul_sum, ← mul_sum,
413463
add_assoc, ← mul_add, smul_mul_assoc, ← pow_add, smul_def] at hQ,
414464
replace hQ := congr_arg (norm K) (eq_sub_of_add_eq hQ),

0 commit comments

Comments
 (0)