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

Commit bd5552a

Browse files
committed
feat(ring_theory/polynomial/basic): Isomorphism between polynomials over a quotient and quotient over polynomials (#3847)
The main statement is `polynomial_quotient_equiv_quotient_polynomial`, which gives that If `I` is an ideal of `R`, then the ring polynomials over the quotient ring `I.quotient` is isomorphic to the quotient of `polynomial R` by the ideal `map C I`. Also, `mem_map_C_iff` shows that `map C I` contains exactly the polynomials whose coefficients all lie in `I`
1 parent 15cacf0 commit bd5552a

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

src/ring_theory/polynomial/basic.lean

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,88 @@ variables {R : Type u} {σ : Type v} [comm_ring R]
178178
namespace ideal
179179
open polynomial
180180

181+
/-- The push-forward of an ideal `I` of `R` to `polynomial R` via inclusion
182+
is exactly the set of polynomials whose coefficients are in `I` -/
183+
theorem mem_map_C_iff {I : ideal R} {f : polynomial R} :
184+
f ∈ (ideal.map C I : ideal (polynomial R)) ↔ ∀ n : ℕ, f.coeff n ∈ I :=
185+
begin
186+
split,
187+
{ intros hf,
188+
apply submodule.span_induction hf,
189+
{ intros f hf n,
190+
cases (set.mem_image _ _ _).mp hf with x hx,
191+
rw [← hx.right, coeff_C],
192+
by_cases (n = 0),
193+
{ simpa [h] using hx.left },
194+
{ simp [h] } },
195+
{ simp },
196+
{ exact λ f g hf hg n, by simp [I.add_mem (hf n) (hg n)] },
197+
{ refine λ f g hg n, _,
198+
rw [smul_eq_mul, coeff_mul],
199+
exact I.sum_mem (λ c hc, I.smul_mem (f.coeff c.fst) (hg c.snd)) } },
200+
{ intros hf,
201+
rw ← sum_monomial_eq f,
202+
refine (map C I : ideal (polynomial R)).sum_mem (λ n hn, _),
203+
simp [single_eq_C_mul_X],
204+
rw mul_comm,
205+
exact (map C I : ideal (polynomial R)).smul_mem _ (mem_map_of_mem (hf n)) }
206+
end
207+
208+
lemma quotient_map_C_eq_zero {I : ideal R} :
209+
∀ a ∈ I, ((quotient.mk (map C I : ideal (polynomial R))).comp C) a = 0 :=
210+
begin
211+
intros a ha,
212+
rw [ring_hom.comp_apply, quotient.eq_zero_iff_mem],
213+
exact mem_map_of_mem ha,
214+
end
215+
216+
lemma eval₂_C_mk_eq_zero {I : ideal R} :
217+
∀ f ∈ (map C I : ideal (polynomial R)), eval₂_ring_hom (C.comp (quotient.mk I)) X f = 0 :=
218+
begin
219+
intros a ha,
220+
rw ← sum_monomial_eq a,
221+
dsimp,
222+
rw eval₂_sum (C.comp (quotient.mk I)) a monomial X,
223+
refine finset.sum_eq_zero (λ n hn, _),
224+
dsimp,
225+
rw eval₂_monomial (C.comp (quotient.mk I)) X,
226+
refine mul_eq_zero_of_left (polynomial.ext (λ m, _)) (X ^ n),
227+
erw coeff_C,
228+
by_cases h : m = 0,
229+
{ simpa [h] using quotient.eq_zero_iff_mem.2 ((mem_map_C_iff.1 ha) n) },
230+
{ simp [h] }
231+
end
232+
233+
/-- If `I` is an ideal of `R`, then the ring polynomials over the quotient ring `I.quotient` is
234+
isomorphic to the quotient of `polynomial R` by the ideal `map C I`,
235+
where `map C I` contains exactly the polynomials whose coefficients all lie in `I` -/
236+
def polynomial_quotient_equiv_quotient_polynomial {I : ideal R} :
237+
polynomial (I.quotient) ≃+* (map C I : ideal (polynomial R)).quotient :=
238+
{ to_fun := eval₂_ring_hom
239+
(quotient.lift I ((quotient.mk (map C I : ideal (polynomial R))).comp C) quotient_map_C_eq_zero)
240+
((quotient.mk (map C I : ideal (polynomial R)) X)),
241+
inv_fun := quotient.lift (map C I : ideal (polynomial R))
242+
(eval₂_ring_hom (C.comp (quotient.mk I)) X) eval₂_C_mk_eq_zero,
243+
map_mul' := λ f g, by simp,
244+
map_add' := λ f g, by simp,
245+
left_inv := begin
246+
intro f,
247+
apply polynomial.induction_on' f,
248+
{ simp_intros p q hp hq,
249+
rw [hp, hq] },
250+
{ rintros n ⟨x⟩,
251+
simp [monomial_eq_smul_X, C_mul'] }
252+
end,
253+
right_inv := begin
254+
rintro ⟨f⟩,
255+
apply polynomial.induction_on' f,
256+
{ simp_intros p q hp hq,
257+
rw [hp, hq] },
258+
{ intros n a,
259+
simp [monomial_eq_smul_X, ← C_mul' a (X ^ n)] },
260+
end,
261+
}
262+
181263
/-- Transport an ideal of `R[X]` to an `R`-submodule of `R[X]`. -/
182264
def of_polynomial (I : ideal (polynomial R)) : submodule R (polynomial R) :=
183265
{ carrier := I.carrier,

0 commit comments

Comments
 (0)