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

Commit ed07cac

Browse files
committed
feat(data/mv_polynomial/rename): coeff_rename (#4203)
Also, use the opportunity to use R as variable for the coefficient ring throughout the file.
1 parent ef18740 commit ed07cac

File tree

1 file changed

+72
-41
lines changed

1 file changed

+72
-41
lines changed

src/data/mv_polynomial/rename.lean

Lines changed: 72 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ which modifies the set of variables.
2020
2121
As in other polynomial files we typically use the notation:
2222
23-
+ `σ : Type*` (indexing the variables)
23+
+ `σ τ α : Type*` (indexing the variables)
2424
25-
+ `α : Type*` `[comm_semiring α]` (the coefficients)
25+
+ `R S : Type*` `[comm_semiring R]` `[comm_semiring S]` (the coefficients)
2626
2727
+ `s : σ →₀ ℕ`, a function from `σ` to `ℕ` which is zero away from a finite set.
2828
This will give rise to a monomial in `mv_polynomial σ R` which mathematicians might call `X^s`
2929
30-
+ `a : α`
30+
+ `r : R` elements of the coefficient ring
3131
3232
+ `i : σ`, with corresponding monomial `X i`, often denoted `X_i` by mathematicians
3333
@@ -42,35 +42,33 @@ open_locale classical big_operators
4242
open set function finsupp add_monoid_algebra
4343
open_locale big_operators
4444

45-
universes u v w x
46-
variables {α : Type u} {β : Type v} {γ : Type w} {δ : Type x}
45+
variables {σ τ α R S : Type*} [comm_semiring R] [comm_semiring S]
4746

4847
namespace mv_polynomial
49-
variables {σ : Type*} {a a' a₁ a₂ : α} {e : ℕ} {n m : σ} {s : σ →₀ ℕ}
48+
49+
-- variables {a : R} {e : ℕ} {n m : σ} {s : σ →₀ ℕ}
5050

5151

5252
section rename
53-
variables {α} [comm_semiring α]
5453

5554
/-- Rename all the variables in a multivariable polynomial. -/
56-
def rename (f : βγ) : mv_polynomial β α →ₐ[α] mv_polynomial γ α :=
55+
def rename (f : στ) : mv_polynomial σ R →ₐ[R] mv_polynomial τ R :=
5756
aeval (X ∘ f)
5857

59-
@[simp] lemma rename_C (f : βγ) (a : α) : rename f (C a) = C a :=
58+
@[simp] lemma rename_C (f : στ) (r : R) : rename f (C r) = C r :=
6059
eval₂_C _ _ _
6160

62-
@[simp] lemma rename_X (f : βγ) (b : β) : rename f (X b : mv_polynomial β α) = X (f b) :=
61+
@[simp] lemma rename_X (f : στ) (i : σ) : rename f (X i : mv_polynomial σ R) = X (f i) :=
6362
eval₂_X _ _ _
6463

65-
lemma map_rename [comm_semiring β] (f : α →+* β)
66-
(g : γ → δ) (p : mv_polynomial γ α) :
64+
lemma map_rename (f : R →+* S) (g : σ → τ) (p : mv_polynomial σ R) :
6765
map f (rename g p) = rename g (map f p) :=
6866
mv_polynomial.induction_on p
69-
(λ a, by simp)
70-
(λ p q hp hq, by simp [hp, hq])
71-
(λ p n hp, by simp [hp])
67+
(λ a, by simp only [map_C, rename_C])
68+
(λ p q hp hq, by simp only [hp, hq, alg_hom.map_add, ring_hom.map_add])
69+
(λ p n hp, by simp only [hp, rename_X, map_X, ring_hom.map_mul, alg_hom.map_mul])
7270

73-
@[simp] lemma rename_rename (f : βγ) (g : γδ) (p : mv_polynomial β α) :
71+
@[simp] lemma rename_rename (f : στ) (g : τα) (p : mv_polynomial σ R) :
7472
rename g (rename f p) = rename (g ∘ f) p :=
7573
show rename g (eval₂ C (X ∘ f) p) = _,
7674
begin
@@ -80,19 +78,19 @@ begin
8078
ext1, simp only [comp_app, ring_hom.coe_comp, eval₂_hom_C],
8179
end
8280

83-
@[simp] lemma rename_id (p : mv_polynomial β α) : rename id p = p :=
81+
@[simp] lemma rename_id (p : mv_polynomial σ R) : rename id p = p :=
8482
eval₂_eta p
8583

86-
lemma rename_monomial (f : βγ) (p : β →₀ ℕ) (a : α) :
87-
rename f (monomial p a) = monomial (p.map_domain f) a :=
84+
lemma rename_monomial (f : στ) (d : σ →₀ ℕ) (r : R) :
85+
rename f (monomial d r) = monomial (d.map_domain f) r :=
8886
begin
8987
rw [rename, aeval_monomial, monomial_eq, finsupp.prod_map_domain_index],
9088
{ refl },
9189
{ exact assume n, pow_zero _ },
9290
{ exact assume n i₁ i₂, pow_add _ _ _ }
9391
end
9492

95-
lemma rename_eq (f : βγ) (p : mv_polynomial β α) :
93+
lemma rename_eq (f : στ) (p : mv_polynomial σ R) :
9694
rename f p = finsupp.map_domain (finsupp.map_domain f) p :=
9795
begin
9896
simp only [rename, aeval_def, eval₂, finsupp.map_domain, ring_hom.coe_of],
@@ -105,16 +103,16 @@ begin
105103
exact assume a b c, pow_add _ _ _
106104
end
107105

108-
lemma rename_injective (f : βγ) (hf : function.injective f) :
109-
function.injective (rename f : mv_polynomial β α → mv_polynomial γ α) :=
110-
have (rename f : mv_polynomial β α → mv_polynomial γ α) =
106+
lemma rename_injective (f : στ) (hf : function.injective f) :
107+
function.injective (rename f : mv_polynomial σ R → mv_polynomial τ R) :=
108+
have (rename f : mv_polynomial σ R → mv_polynomial τ R) =
111109
finsupp.map_domain (finsupp.map_domain f) := funext (rename_eq f),
112110
begin
113111
rw this,
114112
exact finsupp.map_domain_injective (finsupp.map_domain_injective hf)
115113
end
116114

117-
lemma total_degree_rename_le (f : βγ) (p : mv_polynomial β α) :
115+
lemma total_degree_rename_le (f : στ) (p : mv_polynomial σ R) :
118116
(rename f p).total_degree ≤ p.total_degree :=
119117
finset.sup_le $ assume b,
120118
begin
@@ -130,36 +128,35 @@ finset.sup_le $ assume b,
130128
end
131129

132130
section
133-
variables [comm_semiring β] (f : α →+* β)
134-
variables (k : γ → δ) (g : δ → β) (p : mv_polynomial γ α)
131+
variables (f : R →+* S) (k : σ → τ) (g : τ → S) (p : mv_polynomial σ R)
135132

136133
lemma eval₂_rename : (rename k p).eval₂ f g = p.eval₂ f (g ∘ k) :=
137134
by apply mv_polynomial.induction_on p; { intros, simp [*] }
138135

139136
lemma eval₂_hom_rename : eval₂_hom f g (rename k p) = eval₂_hom f (g ∘ k) p :=
140137
eval₂_rename _ _ _ _
141138

142-
lemma rename_eval₂ (g : δ → mv_polynomial γ α) :
139+
lemma rename_eval₂ (g : τ → mv_polynomial σ R) :
143140
rename k (p.eval₂ C (g ∘ k)) = (rename k p).eval₂ C (rename k ∘ g) :=
144141
by apply mv_polynomial.induction_on p; { intros, simp [*] }
145142

146-
lemma rename_prodmk_eval₂ (d : δ) (g : γ → mv_polynomial γ α) :
147-
rename (prod.mk d) (p.eval₂ C g) = p.eval₂ C (λ x, rename (prod.mk d) (g x)) :=
143+
lemma rename_prodmk_eval₂ (j : τ) (g : σ → mv_polynomial σ R) :
144+
rename (prod.mk j) (p.eval₂ C g) = p.eval₂ C (λ x, rename (prod.mk j) (g x)) :=
148145
by apply mv_polynomial.induction_on p; { intros, simp [*] }
149146

150-
lemma eval₂_rename_prodmk (g : δ × γβ) (d : δ) :
151-
(rename (prod.mk d) p).eval₂ f g = eval₂ f (λ i, g (d, i)) p :=
147+
lemma eval₂_rename_prodmk (g : σ × τS) (i : σ) (p : mv_polynomial τ R) :
148+
(rename (prod.mk i) p).eval₂ f g = eval₂ f (λ j, g (i, j)) p :=
152149
by apply mv_polynomial.induction_on p; { intros, simp [*] }
153150

154-
lemma eval_rename_prodmk (g : δ × γα) (d : δ) :
155-
eval g (rename (prod.mk d) p) = eval (λ i, g (d, i)) p :=
151+
lemma eval_rename_prodmk (g : σ × τR) (i : σ) (p : mv_polynomial τ R) :
152+
eval g (rename (prod.mk i) p) = eval (λ j, g (i, j)) p :=
156153
eval₂_rename_prodmk (ring_hom.id _) _ _ _
157154

158155
end
159156

160157
/-- Every polynomial is a polynomial in finitely many variables. -/
161-
theorem exists_finset_rename (p : mv_polynomial γ α) :
162-
∃ (s : finset γ) (q : mv_polynomial {x // x ∈ s} α), p = rename coe q :=
158+
theorem exists_finset_rename (p : mv_polynomial σ R) :
159+
∃ (s : finset σ) (q : mv_polynomial {x // x ∈ s} R), p = rename coe q :=
163160
begin
164161
apply induction_on p,
165162
{ intro r, exact ⟨∅, C r, by rw rename_C⟩ },
@@ -176,8 +173,8 @@ begin
176173
end
177174

178175
/-- Every polynomial is a polynomial in finitely many variables. -/
179-
theorem exists_fin_rename (p : mv_polynomial γ α) :
180-
∃ (n : ℕ) (f : fin n → γ) (hf : injective f) (q : mv_polynomial (fin n) α), p = rename f q :=
176+
theorem exists_fin_rename (p : mv_polynomial σ R) :
177+
∃ (n : ℕ) (f : fin n → σ) (hf : injective f) (q : mv_polynomial (fin n) R), p = rename f q :=
181178
begin
182179
obtain ⟨s, q, rfl⟩ := exists_finset_rename p,
183180
obtain ⟨n, ⟨e⟩⟩ := fintype.exists_equiv_fin {x // x ∈ s},
@@ -188,12 +185,46 @@ end
188185

189186
end rename
190187

191-
lemma eval₂_cast_comp {β : Type u} {γ : Type v} (f : γ → β)
192-
{α : Type w} [comm_ring α] (c : ℤ →+* α) (g : β → α) (x : mv_polynomial γ ℤ) :
193-
eval₂ c (g ∘ f) x = eval₂ c g (rename f x) :=
194-
mv_polynomial.induction_on x
188+
lemma eval₂_cast_comp (f : σ → τ) (c : ℤ →+* R) (g : τ → R) (p : mv_polynomial σ ℤ) :
189+
eval₂ c (g ∘ f) p = eval₂ c g (rename f p) :=
190+
mv_polynomial.induction_on p
195191
(λ n, by simp only [eval₂_C, rename_C])
196192
(λ p q hp hq, by simp only [hp, hq, rename, eval₂_add, alg_hom.map_add])
197193
(λ p n hp, by simp only [hp, rename, aeval_def, eval₂_X, eval₂_mul])
198194

195+
section coeff
196+
197+
@[simp]
198+
lemma coeff_rename_map_domain (f : σ → τ) (hf : injective f) (φ : mv_polynomial σ R) (d : σ →₀ ℕ) :
199+
(rename f φ).coeff (d.map_domain f) = φ.coeff d :=
200+
begin
201+
apply induction_on' φ,
202+
{ intros u r,
203+
rw [rename_monomial, coeff_monomial, coeff_monomial],
204+
simp only [(finsupp.map_domain_injective hf).eq_iff],
205+
split_ifs; refl, },
206+
{ intros, simp only [*, alg_hom.map_add, coeff_add], }
207+
end
208+
209+
lemma coeff_rename_eq_zero (f : σ → τ) (φ : mv_polynomial σ R) (d : τ →₀ ℕ)
210+
(h : ∀ u : σ →₀ ℕ, u.map_domain f = d → φ.coeff u = 0) :
211+
(rename f φ).coeff d = 0 :=
212+
begin
213+
rw [rename_eq, coeff, ← not_mem_support_iff],
214+
intro H,
215+
replace H := map_domain_support H,
216+
rw [finset.mem_image] at H,
217+
obtain ⟨u, hu, rfl⟩ := H,
218+
specialize h u rfl,
219+
simp [mem_support_iff, coeff] at h hu,
220+
contradiction
221+
end
222+
223+
lemma coeff_rename_ne_zero (f : σ → τ) (φ : mv_polynomial σ R) (d : τ →₀ ℕ)
224+
(h : (rename f φ).coeff d ≠ 0) :
225+
∃ u : σ →₀ ℕ, u.map_domain f = d ∧ φ.coeff u ≠ 0 :=
226+
by { contrapose! h, apply coeff_rename_eq_zero _ _ _ h }
227+
228+
end coeff
229+
199230
end mv_polynomial

0 commit comments

Comments
 (0)