@@ -20,14 +20,14 @@ which modifies the set of variables.
20
20
21
21
As in other polynomial files we typically use the notation:
22
22
23
- + `σ : Type*` (indexing the variables)
23
+ + `σ τ α : Type*` (indexing the variables)
24
24
25
- + `α : Type*` `[comm_semiring α ]` (the coefficients)
25
+ + `R S : Type*` `[comm_semiring R]` `[comm_semiring S ]` (the coefficients)
26
26
27
27
+ `s : σ →₀ ℕ`, a function from `σ` to `ℕ` which is zero away from a finite set.
28
28
This will give rise to a monomial in `mv_polynomial σ R` which mathematicians might call `X^s`
29
29
30
- + `a : α`
30
+ + `r : R` elements of the coefficient ring
31
31
32
32
+ `i : σ`, with corresponding monomial `X i`, often denoted `X_i` by mathematicians
33
33
@@ -42,35 +42,33 @@ open_locale classical big_operators
42
42
open set function finsupp add_monoid_algebra
43
43
open_locale big_operators
44
44
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]
47
46
48
47
namespace mv_polynomial
49
- variables {σ : Type *} {a a' a₁ a₂ : α} {e : ℕ} {n m : σ} {s : σ →₀ ℕ}
48
+
49
+ -- variables {a : R} {e : ℕ} {n m : σ} {s : σ →₀ ℕ}
50
50
51
51
52
52
section rename
53
- variables {α} [comm_semiring α]
54
53
55
54
/-- 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 :=
57
56
aeval (X ∘ f)
58
57
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 :=
60
59
eval₂_C _ _ _
61
60
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 ) :=
63
62
eval₂_X _ _ _
64
63
65
- lemma map_rename [comm_semiring β] (f : α →+* β)
66
- (g : γ → δ) (p : mv_polynomial γ α) :
64
+ lemma map_rename (f : R →+* S) (g : σ → τ) (p : mv_polynomial σ R) :
67
65
map f (rename g p) = rename g (map f p) :=
68
66
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 ])
72
70
73
- @[simp] lemma rename_rename (f : β → γ ) (g : γ → δ ) (p : mv_polynomial β α ) :
71
+ @[simp] lemma rename_rename (f : σ → τ ) (g : τ → α ) (p : mv_polynomial σ R ) :
74
72
rename g (rename f p) = rename (g ∘ f) p :=
75
73
show rename g (eval₂ C (X ∘ f) p) = _,
76
74
begin
@@ -80,19 +78,19 @@ begin
80
78
ext1, simp only [comp_app, ring_hom.coe_comp, eval₂_hom_C],
81
79
end
82
80
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 :=
84
82
eval₂_eta p
85
83
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 :=
88
86
begin
89
87
rw [rename, aeval_monomial, monomial_eq, finsupp.prod_map_domain_index],
90
88
{ refl },
91
89
{ exact assume n, pow_zero _ },
92
90
{ exact assume n i₁ i₂, pow_add _ _ _ }
93
91
end
94
92
95
- lemma rename_eq (f : β → γ ) (p : mv_polynomial β α ) :
93
+ lemma rename_eq (f : σ → τ ) (p : mv_polynomial σ R ) :
96
94
rename f p = finsupp.map_domain (finsupp.map_domain f) p :=
97
95
begin
98
96
simp only [rename, aeval_def, eval₂, finsupp.map_domain, ring_hom.coe_of],
@@ -105,16 +103,16 @@ begin
105
103
exact assume a b c, pow_add _ _ _
106
104
end
107
105
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 ) =
111
109
finsupp.map_domain (finsupp.map_domain f) := funext (rename_eq f),
112
110
begin
113
111
rw this ,
114
112
exact finsupp.map_domain_injective (finsupp.map_domain_injective hf)
115
113
end
116
114
117
- lemma total_degree_rename_le (f : β → γ ) (p : mv_polynomial β α ) :
115
+ lemma total_degree_rename_le (f : σ → τ ) (p : mv_polynomial σ R ) :
118
116
(rename f p).total_degree ≤ p.total_degree :=
119
117
finset.sup_le $ assume b,
120
118
begin
@@ -130,36 +128,35 @@ finset.sup_le $ assume b,
130
128
end
131
129
132
130
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)
135
132
136
133
lemma eval₂_rename : (rename k p).eval₂ f g = p.eval₂ f (g ∘ k) :=
137
134
by apply mv_polynomial.induction_on p; { intros, simp [*] }
138
135
139
136
lemma eval₂_hom_rename : eval₂_hom f g (rename k p) = eval₂_hom f (g ∘ k) p :=
140
137
eval₂_rename _ _ _ _
141
138
142
- lemma rename_eval₂ (g : δ → mv_polynomial γ α ) :
139
+ lemma rename_eval₂ (g : τ → mv_polynomial σ R ) :
143
140
rename k (p.eval₂ C (g ∘ k)) = (rename k p).eval₂ C (rename k ∘ g) :=
144
141
by apply mv_polynomial.induction_on p; { intros, simp [*] }
145
142
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)) :=
148
145
by apply mv_polynomial.induction_on p; { intros, simp [*] }
149
146
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 :=
152
149
by apply mv_polynomial.induction_on p; { intros, simp [*] }
153
150
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 :=
156
153
eval₂_rename_prodmk (ring_hom.id _) _ _ _
157
154
158
155
end
159
156
160
157
/-- 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 :=
163
160
begin
164
161
apply induction_on p,
165
162
{ intro r, exact ⟨∅, C r, by rw rename_C⟩ },
@@ -176,8 +173,8 @@ begin
176
173
end
177
174
178
175
/-- 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 :=
181
178
begin
182
179
obtain ⟨s, q, rfl⟩ := exists_finset_rename p,
183
180
obtain ⟨n, ⟨e⟩⟩ := fintype.exists_equiv_fin {x // x ∈ s},
@@ -188,12 +185,46 @@ end
188
185
189
186
end rename
190
187
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
195
191
(λ n, by simp only [eval₂_C, rename_C])
196
192
(λ p q hp hq, by simp only [hp, hq, rename, eval₂_add, alg_hom.map_add])
197
193
(λ p n hp, by simp only [hp, rename, aeval_def, eval₂_X, eval₂_mul])
198
194
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
+
199
230
end mv_polynomial
0 commit comments