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

Commit a360354

Browse files
committed
feat(algebraic_geometry): Basic open set is empty iff section is zero in reduced schemes. (#11012)
Co-authored-by: Andrew Yang <36414270+erdOne@users.noreply.github.com>
1 parent ae8f08f commit a360354

File tree

6 files changed

+152
-1
lines changed

6 files changed

+152
-1
lines changed

src/algebraic_geometry/locally_ringed_space.lean

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,18 @@ begin
237237
exact (is_unit_map_iff (PresheafedSpace.stalk_map f.1 _) _).mp hy }
238238
end
239239

240+
-- This actually holds for all ringed spaces with nontrivial stalks.
241+
@[simp] lemma basic_open_zero (X : LocallyRingedSpace) (U : opens X.carrier) :
242+
X.to_RingedSpace.basic_open (0 : X.presheaf.obj $ op U) = ∅ :=
243+
begin
244+
ext,
245+
simp only [set.mem_empty_eq, topological_space.opens.empty_eq, topological_space.opens.mem_coe,
246+
opens.coe_bot, iff_false, RingedSpace.basic_open, is_unit_zero_iff, set.mem_set_of_eq,
247+
map_zero],
248+
rintro ⟨⟨y, _⟩, h, e⟩,
249+
exact @zero_ne_one (X.presheaf.stalk y) _ _ h,
250+
end
251+
240252
instance component_nontrivial (X : LocallyRingedSpace) (U : opens X.carrier)
241253
[hU : nonempty U] : nontrivial (X.presheaf.obj $ op U) :=
242254
(X.to_PresheafedSpace.presheaf.germ hU.some).domain_nontrivial

src/algebraic_geometry/prime_spectrum/basic.lean

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import ring_theory.ideal.prod
88
import ring_theory.ideal.over
99
import linear_algebra.finsupp
1010
import algebra.punit_instances
11+
import ring_theory.nilpotent
1112
import topology.sober
1213

1314
/-!
@@ -604,7 +605,7 @@ set.ext $ λ x, by simpa only [set.mem_compl_eq, mem_zero_locus, set.singleton_s
604605
topological_space.opens.ext $ by {simp, refl}
605606

606607
@[simp] lemma basic_open_zero : basic_open (0 : R) = ⊥ :=
607-
topological_space.opens.ext $ by {simp, refl}
608+
topological_space.opens.ext $ by simp
608609

609610
lemma basic_open_le_basic_open_iff (f g : R) :
610611
basic_open f ≤ basic_open g ↔ f ∈ (ideal.span ({g} : set R)).radical :=
@@ -669,6 +670,17 @@ begin
669670
exact ⟨n, hs⟩
670671
end
671672

673+
@[simp]
674+
lemma basic_open_eq_bot_iff (f : R) :
675+
basic_open f = ⊥ ↔ is_nilpotent f :=
676+
begin
677+
rw [← subtype.coe_injective.eq_iff, basic_open_eq_zero_locus_compl],
678+
simp only [set.eq_univ_iff_forall, topological_space.opens.empty_eq, set.singleton_subset_iff,
679+
topological_space.opens.coe_bot, nilpotent_iff_mem_prime, set.compl_empty_iff, mem_zero_locus,
680+
set_like.mem_coe],
681+
exact subtype.forall,
682+
end
683+
672684
lemma localization_away_comap_range (S : Type v) [comm_ring S] [algebra R S] (r : R)
673685
[is_localization.away r S] : set.range (comap (algebra_map R S)) = basic_open r :=
674686
begin

src/algebraic_geometry/properties.lean

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,115 @@ begin
9696
rw [comp_apply, e', map_zero]
9797
end
9898

99+
lemma is_reduced_of_open_immersion {X Y : Scheme} (f : X ⟶ Y) [H : is_open_immersion f]
100+
[is_reduced Y] : is_reduced X :=
101+
begin
102+
constructor,
103+
intro U,
104+
have : U = (opens.map f.1.base).obj (H.base_open.is_open_map.functor.obj U),
105+
{ ext1, exact (set.preimage_image_eq _ H.base_open.inj).symm },
106+
rw this,
107+
exact is_reduced_of_injective (inv $ f.1.c.app (op $ H.base_open.is_open_map.functor.obj U))
108+
(as_iso $ f.1.c.app (op $ H.base_open.is_open_map.functor.obj U) : Y.presheaf.obj _ ≅ _).symm
109+
.CommRing_iso_to_ring_equiv.injective
110+
end
111+
112+
local attribute [elementwise] category_theory.is_iso.hom_inv_id
113+
114+
lemma basic_open_eq_of_affine {R : CommRing} (f : R) :
115+
RingedSpace.basic_open (Spec.to_SheafedSpace.obj (op R)) ((Spec_Γ_identity.app R).inv f) =
116+
prime_spectrum.basic_open f :=
117+
begin
118+
ext,
119+
change ↑(⟨x, trivial⟩ : (⊤ : opens _)) ∈
120+
RingedSpace.basic_open (Spec.to_SheafedSpace.obj (op R)) _ ↔ _,
121+
rw RingedSpace.mem_basic_open,
122+
suffices : is_unit (structure_sheaf.to_stalk R x f) ↔ f ∉ prime_spectrum.as_ideal x,
123+
{ exact this },
124+
erw [← is_unit_map_iff (structure_sheaf.stalk_to_fiber_ring_hom R x),
125+
structure_sheaf.stalk_to_fiber_ring_hom_to_stalk],
126+
exact (is_localization.at_prime.is_unit_to_map_iff
127+
(localization.at_prime (prime_spectrum.as_ideal x)) (prime_spectrum.as_ideal x) f : _)
128+
end
129+
130+
lemma basic_open_eq_of_affine' {R : CommRing}
131+
(f : (Spec.to_SheafedSpace.obj (op R)).presheaf.obj (op ⊤)) :
132+
RingedSpace.basic_open (Spec.to_SheafedSpace.obj (op R)) f =
133+
prime_spectrum.basic_open ((Spec_Γ_identity.app R).hom f) :=
134+
begin
135+
convert basic_open_eq_of_affine ((Spec_Γ_identity.app R).hom f),
136+
exact (coe_hom_inv_id _ _).symm
137+
end
138+
139+
lemma reduce_to_affine_global (P : ∀ (X : Scheme) (U : opens X.carrier), Prop)
140+
(h₁ : ∀ (X : Scheme) (U : opens X.carrier),
141+
(∀ (x : U), ∃ {V} (h : x.1 ∈ V) (i : V ⟶ U), P X V) → P X U)
142+
(h₂ : ∀ {X Y} (f : X ⟶ Y) [hf : is_open_immersion f], ∃ {U : set X.carrier} {V : set Y.carrier}
143+
(hU : U = ⊤) (hV : V = set.range f.1.base), P X ⟨U, hU.symm ▸ is_open_univ⟩ →
144+
P Y ⟨V, hV.symm ▸ hf.base_open.open_range⟩)
145+
(h₃ : ∀ (R : CommRing), P (Scheme.Spec.obj $ op R) ⊤) :
146+
∀ (X : Scheme) (U : opens X.carrier), P X U :=
147+
begin
148+
intros X U,
149+
apply h₁,
150+
intro x,
151+
obtain ⟨_,⟨j,rfl⟩,hx,i⟩ := X.affine_basis_cover_is_basis.exists_subset_of_mem_open x.prop U.2,
152+
let U' : opens _ := ⟨_, (X.affine_basis_cover.is_open j).base_open.open_range⟩,
153+
let i' : U' ⟶ U :=
154+
hom_of_le i,
155+
refine ⟨U', hx, i', _⟩,
156+
obtain ⟨_,_,rfl,rfl,h₂'⟩ := h₂ (X.affine_basis_cover.map j),
157+
apply h₂',
158+
apply h₃
159+
end
160+
161+
lemma eq_zero_of_basic_open_empty {X : Scheme} [hX : is_reduced X] {U : opens X.carrier}
162+
(s : X.presheaf.obj (op U)) (hs : X.to_LocallyRingedSpace.to_RingedSpace.basic_open s = ∅) :
163+
s = 0 :=
164+
begin
165+
apply Top.presheaf.section_ext X.sheaf U,
166+
simp_rw ring_hom.map_zero,
167+
tactic.unfreeze_local_instances,
168+
revert X U hX s,
169+
refine reduce_to_affine_global _ _ _ _,
170+
{ intros X U hx hX s hs x,
171+
obtain ⟨V, hx, i, H⟩ := hx x,
172+
specialize H (X.presheaf.map i.op s),
173+
erw RingedSpace.basic_open_res at H,
174+
rw [hs, ← subtype.coe_injective.eq_iff, opens.empty_eq, opens.inter_eq, inf_bot_eq] at H,
175+
specialize H rfl ⟨x, hx⟩,
176+
erw Top.presheaf.germ_res_apply at H,
177+
exact H },
178+
{ rintros X Y f hf,
179+
have e : (f.val.base) ⁻¹' set.range ⇑(f.val.base) = ⊤,
180+
{ rw [← set.image_univ, set.preimage_image_eq _ hf.base_open.inj, set.top_eq_univ] },
181+
refine ⟨_, _, e, rfl, _⟩,
182+
rintros H hX s hs ⟨_, x, rfl⟩,
183+
haveI := is_reduced_of_open_immersion f,
184+
specialize H (f.1.c.app _ s) _ ⟨x, by { change x ∈ (f.val.base) ⁻¹' _, rw e, trivial }⟩,
185+
{ rw [← LocallyRingedSpace.preimage_basic_open, hs], ext1, simp [opens.map] },
186+
{ erw ← PresheafedSpace.stalk_map_germ_apply f.1 ⟨_,_⟩ ⟨x,_⟩ at H,
187+
apply_fun (inv $ PresheafedSpace.stalk_map f.val x) at H,
188+
erw [category_theory.is_iso.hom_inv_id_apply, map_zero] at H,
189+
exact H } },
190+
{ intros R hX s hs x,
191+
erw [basic_open_eq_of_affine', prime_spectrum.basic_open_eq_bot_iff] at hs,
192+
replace hs := (hs.map (Spec_Γ_identity.app R).inv).eq_zero,
193+
rw coe_hom_inv_id at hs,
194+
rw [hs, map_zero],
195+
exact @@is_reduced.component_reduced hX ⊤ }
196+
end
197+
198+
@[simp]
199+
lemma basic_open_eq_bot_iff {X : Scheme} [is_reduced X] {U : opens X.carrier}
200+
(s : X.presheaf.obj $ op U) :
201+
X.to_LocallyRingedSpace.to_RingedSpace.basic_open s = ⊥ ↔ s = 0 :=
202+
begin
203+
refine ⟨eq_zero_of_basic_open_empty s, _⟩,
204+
rintro rfl,
205+
simp,
206+
end
207+
99208
@[priority 900]
100209
instance is_reduced_of_is_integral [is_integral X] : is_reduced X :=
101210
begin

src/algebraic_geometry/structure_sheaf.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,12 @@ corresponding to a prime ideal in `R` and the localization of `R` at `p`. -/
527527
by { ext f, simp only [ring_hom.comp_apply, ring_hom.id_apply, localization_to_stalk_of,
528528
stalk_to_fiber_ring_hom_to_stalk] } }
529529

530+
instance (x : prime_spectrum R) : is_iso (stalk_to_fiber_ring_hom R x) :=
531+
is_iso.of_iso (stalk_iso R x)
532+
533+
instance (x : prime_spectrum R) : is_iso (localization_to_stalk R x) :=
534+
is_iso.of_iso (stalk_iso R x).symm
535+
530536
/-- The canonical ring homomorphism interpreting `s ∈ R_f` as a section of the structure sheaf
531537
on the basic open defined by `f ∈ R`. -/
532538
def to_basic_open (f : R) : localization.away f →+*

src/ring_theory/nilpotent.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,17 @@ is_reduced.eq_zero x h
7272
is_nilpotent x ↔ x = 0 :=
7373
⟨λ h, h.eq_zero, λ h, h.symm ▸ is_nilpotent.zero⟩
7474

75+
lemma is_reduced_of_injective [monoid_with_zero R] [monoid_with_zero S]
76+
{F : Type*} [monoid_with_zero_hom_class F R S] (f : F)
77+
(hf : function.injective f) [_root_.is_reduced S] : _root_.is_reduced R :=
78+
begin
79+
constructor,
80+
intros x hx,
81+
apply hf,
82+
rw map_zero,
83+
exact (hx.map f).eq_zero,
84+
end
85+
7586
namespace commute
7687

7788
section semiring

src/topology/opens.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ by refl
9595
(⟨U, hU⟩ ⊓ ⟨V, hV⟩ : opens α) = ⟨U ⊓ V, is_open.inter hU hV⟩ := rfl
9696
@[simp,norm_cast] lemma coe_inf {U V : opens α} :
9797
((U ⊓ V : opens α) : set α) = (U : set α) ⊓ (V : set α) := rfl
98+
@[simp] lemma coe_bot : ((⊥ : opens α) : set α) = ∅ := rfl
9899

99100
instance : has_inter (opens α) := ⟨λ U V, U ⊓ V⟩
100101
instance : has_union (opens α) := ⟨λ U V, U ⊔ V⟩

0 commit comments

Comments
 (0)