Skip to content

Commit ba2ac75

Browse files
committed
chore(RingTheory/Polynomial/Basic): golf degreeLTEquiv (leanprover-community#39514)
Also extracts the `monomial i a ∈ degreeLT R n` proof to a lemma.
1 parent f10b8a1 commit ba2ac75

1 file changed

Lines changed: 11 additions & 32 deletions

File tree

Mathlib/RingTheory/Polynomial/Basic.lean

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ theorem degreeLE_eq_span_X_pow [DecidableEq R] {n : ℕ} :
8888
theorem mem_degreeLT {n : ℕ} {f : R[X]} : f ∈ degreeLT R n ↔ degree f < n := by
8989
simpa [degreeLT, Submodule.mem_iInf] using (degree_lt_iff_coeff_zero _ _).symm
9090

91+
theorem monomial_coe_mem_degreeLT {n : ℕ} (i : Fin n) (a : R) : monomial i a ∈ degreeLT R n :=
92+
mem_degreeLT.mpr <| degree_monomial_le i a |>.trans_lt <| by simp
93+
9194
@[gcongr, mono]
9295
theorem degreeLT_mono {m n : ℕ} (H : m ≤ n) : degreeLT R m ≤ degreeLT R n := fun _ hf =>
9396
mem_degreeLT.2 (lt_of_lt_of_le (mem_degreeLT.1 hf) <| WithBot.coe_le_coe.2 H)
@@ -105,43 +108,19 @@ theorem degreeLT_eq_span_X_pow [DecidableEq R] {n : ℕ} :
105108
rw [Submodule.span_le, Finset.coe_image, Set.image_subset_iff]
106109
intro k hk
107110
apply mem_degreeLT.2
108-
exact lt_of_le_of_lt (degree_X_pow_le _) (WithBot.coe_lt_coe.2 <| Finset.mem_range.1 hk)
111+
exact degree_X_pow_le _ |>.trans_lt <| WithBot.coe_lt_coe.2 <| Finset.mem_range.1 hk
109112

113+
variable (R) in
110114
/-- The first `n` coefficients on `degreeLT n` form a linear equivalence with `Fin n → R`. -/
111-
def degreeLTEquiv (R) [Semiring R] (n : ℕ) : degreeLT R n ≃ₗ[R] Fin n → R where
115+
def degreeLTEquiv (n : ℕ) : degreeLT R n ≃ₗ[R] Fin n → R where
112116
toFun p n := (↑p : R[X]).coeff n
113117
invFun f :=
114118
⟨∑ i : Fin n, monomial i (f i),
115-
(degreeLT R n).sum_mem fun i _ =>
116-
mem_degreeLT.mpr
117-
(lt_of_le_of_lt (degree_monomial_le i (f i)) (WithBot.coe_lt_coe.mpr i.is_lt))⟩
118-
map_add' p q := by
119-
ext
120-
dsimp
121-
rw [coeff_add]
122-
map_smul' x p := by
123-
ext
124-
dsimp
125-
rw [coeff_smul]
126-
rfl
127-
left_inv := by
128-
rintro ⟨p, hp⟩
129-
ext1
130-
simp only
131-
by_cases hp0 : p = 0
132-
· subst hp0
133-
simp only [coeff_zero, map_zero, Finset.sum_const_zero]
134-
rw [mem_degreeLT, degree_eq_natDegree hp0, Nat.cast_lt] at hp
135-
conv_rhs => rw [p.as_sum_range' n hp, ← Fin.sum_univ_eq_sum_range]
136-
right_inv f := by
137-
ext i
138-
simp only [finsetSum_coeff]
139-
rw [Finset.sum_eq_single i, coeff_monomial, if_pos rfl]
140-
· rintro j - hji
141-
rw [coeff_monomial, if_neg]
142-
rwa [← Fin.ext_iff]
143-
· intro h
144-
exact (h (Finset.mem_univ _)).elim
119+
degreeLT R n |>.sum_mem fun i _ ↦ monomial_coe_mem_degreeLT i (f i)⟩
120+
map_add' p q := by ext; simp
121+
map_smul' x p := by ext; simp
122+
left_inv := fun ⟨p, hp⟩ ↦ by simpa using p.sum_fin (monomial ·) (by simp) (mem_degreeLT.mp hp)
123+
right_inv f := by ext i; grind [finsetSum_coeff, Finset.sum_eq_single i, coeff_monomial]
145124

146125
theorem degreeLTEquiv_eq_zero_iff_eq_zero {n : ℕ} {p : R[X]} (hp : p ∈ degreeLT R n) :
147126
degreeLTEquiv _ _ ⟨p, hp⟩ = 0 ↔ p = 0 := by simp

0 commit comments

Comments
 (0)