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

Commit a7a4f34

Browse files
committed
feat(algebraic_geometry/is_open_comap_C): add file is_open_comap_C, prove that Spec R[x] \to Spec R is an open map (#5693)
This file is the first part of a proof of Chevalley's Theorem. It contains a proof that the morphism Spec R[x] \to Spec R is open. In a later PR, I hope to prove that, under the same morphism, the image of a closed set is constructible.
1 parent 0c57d1e commit a7a4f34

File tree

4 files changed

+122
-16
lines changed

4 files changed

+122
-16
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/-
2+
Copyright (c) 2021 Damiano Testa. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Damiano Testa
5+
-/
6+
import algebraic_geometry.prime_spectrum
7+
import ring_theory.polynomial.basic
8+
/-!
9+
The morphism `Spec R[x] --> Spec R` induced by the natural inclusion `R --> R[x]` is an open map.
10+
-/
11+
12+
open ideal polynomial prime_spectrum set
13+
14+
namespace algebraic_geometry
15+
16+
namespace polynomial
17+
18+
variables {R : Type*} [comm_ring R] {f : polynomial R}
19+
20+
/-- Given a polynomial `f ∈ R[x]`, `image_of_Df` is the subset of `Spec R` where at least one
21+
of the coefficients of `f` does not vanish. Lemma `image_of_Df_eq_comap_C_compl_zero_locus`
22+
proves that `image_of_Df` is the image of `(zero_locus {f})ᶜ` under the morphism
23+
`comap C : Spec R[x] → Spec R`. -/
24+
def image_of_Df (f) : set (prime_spectrum R) :=
25+
{p : prime_spectrum R | ∃ i : ℕ , (coeff f i) ∉ p.as_ideal}
26+
27+
lemma is_open_image_of_Df : is_open (image_of_Df f) :=
28+
begin
29+
rw [image_of_Df, set_of_exists (λ i (x : prime_spectrum R), coeff f i ∉ x.val)],
30+
exact is_open_Union (λ i, is_open_basic_open),
31+
end
32+
33+
/-- If a point of `Spec R[x]` is not contained in the vanishing set of `f`, then its image in
34+
`Spec R` is contained in the open set where at least one of the coefficients of `f` is non-zero.
35+
This lemma is a reformulation of `exists_coeff_not_mem_C_inverse`. -/
36+
lemma comap_C_mem_image_of_Df {I : prime_spectrum (polynomial R)}
37+
(H : I ∈ (zero_locus {f} : set (prime_spectrum (polynomial R)))ᶜ ) :
38+
comap (polynomial.C : R →+* polynomial R) I ∈ image_of_Df f :=
39+
exists_coeff_not_mem_C_inverse (mem_compl_zero_locus_iff_not_mem.mp H)
40+
41+
/-- The open set `image_of_Df f` coincides with the image of `basic_open f` under the
42+
morphism `C⁺ : Spec R[x] → Spec R`. -/
43+
lemma image_of_Df_eq_comap_C_compl_zero_locus :
44+
image_of_Df f = comap C '' (zero_locus {f})ᶜ :=
45+
begin
46+
refine ext (λ x, ⟨λ hx, ⟨⟨map C x.val, (is_prime_map_C_of_is_prime x.property)⟩, ⟨_, _⟩⟩, _⟩),
47+
{ rw [mem_compl_eq, mem_zero_locus, singleton_subset_iff],
48+
cases hx with i hi,
49+
exact λ a, hi (mem_map_C_iff.mp a i) },
50+
{ refine subtype.ext (ext (λ x, ⟨λ h, _, λ h, subset_span (mem_image_of_mem C.1 h)⟩)),
51+
rw ← @coeff_C_zero R x _,
52+
exact mem_map_C_iff.mp h 0 },
53+
{ rintro ⟨xli, complement, rfl⟩,
54+
exact comap_C_mem_image_of_Df complement }
55+
end
56+
57+
/-- The morphism `C⁺ : Spec R[x] → Spec R` is open. -/
58+
theorem is_open_map_comap_C :
59+
is_open_map (comap (C : R →+* polynomial R)) :=
60+
begin
61+
rintros U ⟨s, z⟩,
62+
rw [← compl_compl U, ← z, ← Union_of_singleton_coe s, zero_locus_Union, compl_Inter, image_Union],
63+
simp_rw [← image_of_Df_eq_comap_C_compl_zero_locus],
64+
exact is_open_Union (λ f, is_open_image_of_Df),
65+
end
66+
67+
end polynomial
68+
69+
end algebraic_geometry

src/algebraic_geometry/prime_spectrum.lean

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -146,21 +146,8 @@ by rw [← submodule.mem_coe, coe_vanishing_ideal, set.mem_set_of_eq]
146146

147147
lemma subset_zero_locus_iff_le_vanishing_ideal (t : set (prime_spectrum R)) (I : ideal R) :
148148
t ⊆ zero_locus I ↔ I ≤ vanishing_ideal t :=
149-
begin
150-
split; intro h,
151-
{ intros f hf,
152-
rw [mem_vanishing_ideal],
153-
intros x hx,
154-
have hxI := h hx,
155-
rw mem_zero_locus at hxI,
156-
exact hxI hf },
157-
{ intros x hx,
158-
rw mem_zero_locus,
159-
refine le_trans h _,
160-
intros f hf,
161-
rw [mem_vanishing_ideal] at hf,
162-
exact hf x hx }
163-
end
149+
⟨λ h f k, (mem_vanishing_ideal _ _).mpr (λ x j, (mem_zero_locus _ _).mpr (h j) k), λ h,
150+
λ x j, (mem_zero_locus _ _).mpr (le_trans h (λ f h, ((mem_vanishing_ideal _ _).mp h) x j))⟩
164151

165152
section gc
166153
variable (R)
@@ -306,6 +293,10 @@ begin
306293
apply submodule.add_mem; solve_by_elim
307294
end
308295

296+
lemma mem_compl_zero_locus_iff_not_mem {f : R} {I : prime_spectrum R} :
297+
I ∈ (zero_locus {f} : set (prime_spectrum R))ᶜ ↔ f ∉ I.as_ideal :=
298+
by rw [set.mem_compl_eq, mem_zero_locus, set.singleton_subset_iff]; refl
299+
309300
/-- The Zariski topology on the prime spectrum of a commutative ring
310301
is defined via the closed sets of the topology:
311302
they are exactly those sets that are the zero locus of a subset of the ring. -/
@@ -415,6 +406,9 @@ def basic_open (r : R) : topological_space.opens (prime_spectrum R) :=
415406
{ val := { x | r ∉ x.as_ideal },
416407
property := ⟨{r}, set.ext $ λ x, set.singleton_subset_iff.trans $ not_not.symm⟩ }
417408

409+
lemma is_open_basic_open {a : R} : is_open ((basic_open a) : set (prime_spectrum R)) :=
410+
(basic_open a).property
411+
418412
end basic_open
419413

420414
end prime_spectrum

src/data/polynomial/coeff.lean

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,33 @@ end
140140

141141
end coeff
142142

143+
open submodule polynomial set
144+
145+
variables {f : polynomial R} {I : submodule (polynomial R) (polynomial R)}
146+
147+
/-- If the coefficients of a polynomial belong to n ideal contains the submodule span of the
148+
coefficients of a polynomial. -/
149+
lemma span_le_of_coeff_mem_C_inverse (cf : ∀ (i : ℕ), f.coeff i ∈ (C ⁻¹' I.carrier)) :
150+
(span (polynomial R) {g | ∃ i, g = C (f.coeff i)}) ≤ I :=
151+
begin
152+
refine bInter_subset_of_mem _,
153+
rintros _ ⟨i, rfl⟩,
154+
exact (mem_coe _).mpr (cf i),
155+
end
156+
157+
lemma mem_span_C_coeff :
158+
f ∈ span (polynomial R) {g : polynomial R | ∃ i : ℕ, g = (C (coeff f i))} :=
159+
begin
160+
rw [← f.sum_single] {occs := occurrences.pos [1]},
161+
refine sum_mem _ (λ i hi, _),
162+
change monomial i _ ∈ span _ _,
163+
rw [← C_mul_X_pow_eq_monomial, ← X_pow_mul],
164+
exact smul_mem _ _ (subset_span ⟨i, rfl⟩),
165+
end
166+
167+
lemma exists_coeff_not_mem_C_inverse :
168+
f ∉ I → ∃ i : ℕ , coeff f i ∉ (C ⁻¹' I.carrier) :=
169+
imp_of_not_imp_not _ _
170+
(λ cf, not_not.mpr ((span_le_of_coeff_mem_C_inverse (not_exists_not.mp cf)) mem_span_C_coeff))
171+
143172
end polynomial

src/ring_theory/polynomial/basic.lean

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,19 @@ def polynomial_quotient_equiv_quotient_polynomial (I : ideal R) :
306306
end,
307307
}
308308

309+
/-- If `P` is a prime ideal of `R`, then `R[x]/(P)` is an integral domain. -/
310+
lemma is_integral_domain_map_C_quotient {P : ideal R} (H : is_prime P) :
311+
is_integral_domain (quotient (map C P : ideal (polynomial R))) :=
312+
ring_equiv.is_integral_domain (polynomial (quotient P))
313+
(integral_domain.to_is_integral_domain (polynomial (quotient P)))
314+
(polynomial_quotient_equiv_quotient_polynomial P).symm
315+
316+
/-- If `P` is a prime ideal of `R`, then `P.R[x]` is a prime ideal of `R[x]`. -/
317+
lemma is_prime_map_C_of_is_prime {P : ideal R} (H : is_prime P) :
318+
is_prime (map C P : ideal (polynomial R)) :=
319+
(quotient.is_integral_domain_iff_prime (map C P : ideal (polynomial R))).mp
320+
(is_integral_domain_map_C_quotient H)
321+
309322
/-- Given any ring `R` and an ideal `I` of `polynomial R`, we get a map `R → R[x] → R[x]/I`.
310323
If we let `R` be the image of `R` in `R[x]/I` then we also have a map `R[x] → R'[x]`.
311324
In particular we can map `I` across this map, to get `I'` and a new map `R' → R'[x] → R'[x]/I`.
@@ -388,7 +401,8 @@ def leading_coeff_nth (n : ℕ) : ideal R :=
388401
theorem mem_leading_coeff_nth (n : ℕ) (x) :
389402
x ∈ I.leading_coeff_nth n ↔ ∃ p ∈ I, degree p ≤ n ∧ leading_coeff p = x :=
390403
begin
391-
simp only [leading_coeff_nth, degree_le, submodule.mem_map, lcoeff_apply, submodule.mem_inf, mem_degree_le],
404+
simp only [leading_coeff_nth, degree_le, submodule.mem_map, lcoeff_apply, submodule.mem_inf,
405+
mem_degree_le],
392406
split,
393407
{ rintro ⟨p, ⟨hpdeg, hpI⟩, rfl⟩,
394408
cases lt_or_eq_of_le hpdeg with hpdeg hpdeg,

0 commit comments

Comments
 (0)