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

Commit 9462535

Browse files
erdOnejoelriou
andcommitted
feat(algebraic_geometry): Qcqs lemma (#15996)
Co-authored-by: Andrew Yang <[email protected]> Co-authored-by: Joël Riou <[email protected]>
1 parent 6eb334b commit 9462535

File tree

4 files changed

+265
-1
lines changed

4 files changed

+265
-1
lines changed

docs/references.bib

+6
Original file line numberDiff line numberDiff line change
@@ -1783,6 +1783,12 @@ @Book{ riehl2017
17831783
url = {http://www.math.jhu.edu/~eriehl/context.pdf}
17841784
}
17851785

1786+
@Misc{ RisingSea,
1787+
author = "Vakil, Ravi",
1788+
title = "{The Rising Sea: Foundations Of Algebraic Geometry Notes}",
1789+
url = "https://math.stanford.edu/~vakil/216blog/"
1790+
}
1791+
17861792
@Book{ rudin2006real,
17871793
title = {Real and Complex Analysis},
17881794
author = {Rudin, Walter},

src/algebraic_geometry/AffineScheme.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ Let `P` be a predicate on the affine open sets of `X` satisfying
679679
680680
Then `P` holds for every affine open of `X`.
681681
682-
This is also known as the **Affine communication lemma** in Vakil's "The rising sea". -/
682+
This is also known as the **Affine communication lemma** in [*The rising sea*][RisingSea]. -/
683683
@[elab_as_eliminator]
684684
lemma of_affine_open_cover {X : Scheme} (V : X.affine_opens) (S : set X.affine_opens)
685685
{P : X.affine_opens → Prop}

src/algebraic_geometry/morphisms/quasi_compact.lean

+52
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ open category_theory category_theory.limits opposite topological_space
2424

2525
universe u
2626

27+
open_locale algebraic_geometry
28+
2729
namespace algebraic_geometry
2830

2931
variables {X Y : Scheme.{u}} (f : X ⟶ Y)
@@ -285,4 +287,54 @@ begin
285287
exact supr_insert }
286288
end
287289

290+
lemma exists_pow_mul_eq_zero_of_res_basic_open_eq_zero_of_is_affine_open (X : Scheme)
291+
{U : opens X.carrier} (hU : is_affine_open U) (x f : X.presheaf.obj (op U))
292+
(H : x |_ X.basic_open f = 0) :
293+
∃ n : ℕ, f ^ n * x = 0 :=
294+
begin
295+
rw ← map_zero (X.presheaf.map (hom_of_le $ X.basic_open_le f : X.basic_open f ⟶ U).op) at H,
296+
have := (is_localization_basic_open hU f).3,
297+
obtain ⟨⟨_, n, rfl⟩, e⟩ := this.mp H,
298+
exact ⟨n, by simpa [mul_comm x] using e⟩,
299+
end
300+
301+
/-- If `x : Γ(X, U)` is zero on `D(f)` for some `f : Γ(X, U)`, and `U` is quasi-compact, then
302+
`f ^ n * x = 0` for some `n`. -/
303+
lemma exists_pow_mul_eq_zero_of_res_basic_open_eq_zero_of_is_compact (X : Scheme)
304+
{U : opens X.carrier} (hU : is_compact U.1) (x f : X.presheaf.obj (op U))
305+
(H : x |_ X.basic_open f = 0) :
306+
∃ n : ℕ, f ^ n * x = 0 :=
307+
begin
308+
obtain ⟨s, hs, e⟩ := (is_compact_open_iff_eq_finset_affine_union U.1).mp ⟨hU, U.2⟩,
309+
replace e : U = supr (λ i : s, (i : opens X.carrier)),
310+
{ ext1, simpa using e },
311+
have h₁ : ∀ i : s, i.1.1 ≤ U,
312+
{ intro i, change (i : opens X.carrier) ≤ U, rw e, exact le_supr _ _ },
313+
have H' := λ (i : s), exists_pow_mul_eq_zero_of_res_basic_open_eq_zero_of_is_affine_open X i.1.2
314+
(X.presheaf.map (hom_of_le (h₁ i)).op x) (X.presheaf.map (hom_of_le (h₁ i)).op f) _,
315+
swap,
316+
{ delta Top.presheaf.restrict_open Top.presheaf.restrict at H ⊢,
317+
convert congr_arg (X.presheaf.map (hom_of_le _).op) H,
318+
{ simp only [← comp_apply, ← functor.map_comp], congr },
319+
{ rw map_zero },
320+
{ rw X.basic_open_res, exact set.inter_subset_right _ _ } },
321+
choose n hn using H',
322+
haveI := hs.to_subtype,
323+
casesI nonempty_fintype s,
324+
use finset.univ.sup n,
325+
suffices : ∀ (i : s), X.presheaf.map (hom_of_le (h₁ i)).op (f ^ (finset.univ.sup n) * x) = 0,
326+
{ subst e,
327+
apply X.sheaf.eq_of_locally_eq (λ (i : s), (i : opens X.carrier)),
328+
intro i,
329+
rw map_zero,
330+
apply this },
331+
intro i,
332+
replace hn := congr_arg
333+
(λ x, X.presheaf.map (hom_of_le (h₁ i)).op (f ^ (finset.univ.sup n - n i)) * x) (hn i),
334+
dsimp at hn,
335+
simp only [← map_mul, ← map_pow] at hn,
336+
rwa [mul_zero, ← mul_assoc, ← pow_add, tsub_add_cancel_of_le] at hn,
337+
apply finset.le_sup (finset.mem_univ i)
338+
end
339+
288340
end algebraic_geometry

src/algebraic_geometry/morphisms/quasi_separated.lean

+206
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ We show that a morphism is quasi-separated if the preimage of every affine open
2020
We also show that this property is local at the target,
2121
and is stable under compositions and base-changes.
2222
23+
## Main result
24+
- `is_localization_basic_open_of_qcqs` (**Qcqs lemma**):
25+
If `U` is qcqs, then `Γ(X, D(f)) ≃ Γ(X, U)_f` for every `f : Γ(X, U)`.
26+
2327
-/
2428

2529
noncomputable theory
@@ -28,6 +32,8 @@ open category_theory category_theory.limits opposite topological_space
2832

2933
universe u
3034

35+
open_locale algebraic_geometry
36+
3137
namespace algebraic_geometry
3238

3339
variables {X Y : Scheme.{u}} (f : X ⟶ Y)
@@ -274,4 +280,204 @@ begin
274280
{ apply algebraic_geometry.quasi_separated_of_mono }
275281
end
276282

283+
lemma exists_eq_pow_mul_of_is_affine_open (X : Scheme) (U : opens X.carrier) (hU : is_affine_open U)
284+
(f : X.presheaf.obj (op U)) (x : X.presheaf.obj (op $ X.basic_open f)) :
285+
∃ (n : ℕ) (y : X.presheaf.obj (op U)),
286+
y |_ X.basic_open f = (f |_ X.basic_open f) ^ n * x :=
287+
begin
288+
have := (is_localization_basic_open hU f).2,
289+
obtain ⟨⟨y, _, n, rfl⟩, d⟩ := this x,
290+
use [n, y],
291+
delta Top.presheaf.restrict_open Top.presheaf.restrict,
292+
simpa [mul_comm x] using d.symm,
293+
end
294+
295+
lemma exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme)
296+
(S : X.affine_opens) (U₁ U₂ : opens X.carrier)
297+
{n₁ n₂ : ℕ} {y₁ : X.presheaf.obj (op U₁)}
298+
{y₂ : X.presheaf.obj (op U₂)} {f : X.presheaf.obj (op $ U₁ ⊔ U₂)}
299+
{x : X.presheaf.obj (op $ X.basic_open f)}
300+
(h₁ : S.1 ≤ U₁) (h₂ : S.1 ≤ U₂)
301+
(e₁ : X.presheaf.map (hom_of_le $ X.basic_open_le
302+
(X.presheaf.map (hom_of_le le_sup_left).op f) : _ ⟶ U₁).op y₁ =
303+
X.presheaf.map (hom_of_le (by { erw X.basic_open_res, exact inf_le_left })).op
304+
(X.presheaf.map (hom_of_le le_sup_left).op f) ^ n₁ *
305+
(X.presheaf.map (hom_of_le (by { erw X.basic_open_res, exact inf_le_right })).op) x)
306+
(e₂ : X.presheaf.map (hom_of_le $ X.basic_open_le
307+
(X.presheaf.map (hom_of_le le_sup_right).op f) : _ ⟶ U₂).op y₂ =
308+
X.presheaf.map (hom_of_le (by { rw X.basic_open_res, exact inf_le_left })).op
309+
(X.presheaf.map (hom_of_le le_sup_right).op f) ^ n₂ *
310+
(X.presheaf.map (hom_of_le (by { rw X.basic_open_res, exact inf_le_right })).op) x) :
311+
∃ n : ℕ, X.presheaf.map (hom_of_le $ h₁).op
312+
((X.presheaf.map (hom_of_le le_sup_left).op f) ^ (n + n₂) * y₁) =
313+
X.presheaf.map (hom_of_le $ h₂).op
314+
((X.presheaf.map (hom_of_le le_sup_right).op f) ^ (n + n₁) * y₂) :=
315+
begin
316+
have := (is_localization_basic_open S.2
317+
(X.presheaf.map (hom_of_le $ le_trans h₁ le_sup_left).op f)),
318+
obtain ⟨⟨_, n, rfl⟩, e⟩ :=
319+
(@is_localization.eq_iff_exists _ _ _ _ _ _ this (X.presheaf.map (hom_of_le $ h₁).op
320+
((X.presheaf.map (hom_of_le le_sup_left).op f) ^ n₂ * y₁))
321+
(X.presheaf.map (hom_of_le $ h₂).op
322+
((X.presheaf.map (hom_of_le le_sup_right).op f) ^ n₁ * y₂))).mp _,
323+
swap,
324+
{ simp only [map_pow, ring_hom.algebra_map_to_algebra, map_mul, ← comp_apply,
325+
← functor.map_comp, ← op_comp, hom_of_le_comp],
326+
have h₃ : X.basic_open ((X.presheaf.map (hom_of_le (h₁.trans le_sup_left)).op) f) ≤ S.val,
327+
{ simpa only [X.basic_open_res] using inf_le_left, },
328+
transitivity
329+
X.presheaf.map (hom_of_le $ h₃.trans $ h₁.trans le_sup_left).op f ^ (n₂ + n₁) *
330+
X.presheaf.map (hom_of_le $ (X.basic_open_res f _).trans_le inf_le_right).op x,
331+
{ rw [pow_add, mul_assoc], congr' 1,
332+
convert congr_arg (X.presheaf.map (hom_of_le _).op) e₁,
333+
{ simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp], congr },
334+
{ simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp], congr },
335+
{ rw [X.basic_open_res, X.basic_open_res], rintros x ⟨H₁, H₂⟩, exact ⟨h₁ H₁, H₂⟩ } },
336+
{ rw [add_comm, pow_add, mul_assoc], congr' 1,
337+
convert congr_arg (X.presheaf.map (hom_of_le _).op) e₂.symm,
338+
{ simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp], congr },
339+
{ simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp], congr },
340+
{ simp only [X.basic_open_res],
341+
rintros x ⟨H₁, H₂⟩, exact ⟨h₂ H₁, H₂⟩ } } },
342+
use n,
343+
conv_lhs at e { rw mul_comm },
344+
conv_rhs at e { rw mul_comm },
345+
simp only [pow_add, map_pow, map_mul, ← comp_apply, ← mul_assoc,
346+
← functor.map_comp, subtype.coe_mk] at e ⊢,
347+
convert e
348+
end
349+
350+
lemma exists_eq_pow_mul_of_is_compact_of_is_quasi_separated (X : Scheme)
351+
(U : opens X.carrier) (hU : is_compact U.1) (hU' : is_quasi_separated U.1)
352+
(f : X.presheaf.obj (op U)) (x : X.presheaf.obj (op $ X.basic_open f)) :
353+
∃ (n : ℕ) (y : X.presheaf.obj (op U)), y |_ X.basic_open f = (f |_ X.basic_open f) ^ n * x :=
354+
begin
355+
delta Top.presheaf.restrict_open Top.presheaf.restrict,
356+
revert hU' f x,
357+
apply compact_open_induction_on U hU,
358+
{ intros hU' f x,
359+
use [0, f],
360+
refine @@subsingleton.elim (CommRing.subsingleton_of_is_terminal
361+
(X.sheaf.is_terminal_of_eq_empty _)) _ _,
362+
erw eq_bot_iff,
363+
exact X.basic_open_le f },
364+
{ -- Given `f : 𝒪(S ∪ U), x : 𝒪(X_f)`, we need to show that `f ^ n * x` is the restriction of
365+
-- some `y : 𝒪(S ∪ U)` for some `n : ℕ`.
366+
intros S hS U hU hSU f x,
367+
-- We know that such `y₁, n₁` exists on `S` by the induction hypothesis.
368+
obtain ⟨n₁, y₁, hy₁⟩ := hU (hSU.of_subset $ set.subset_union_left _ _)
369+
(X.presheaf.map (hom_of_le le_sup_left).op f) (X.presheaf.map (hom_of_le _).op x),
370+
swap, { rw X.basic_open_res, exact inf_le_right },
371+
-- We know that such `y₂, n₂` exists on `U` since `U` is affine.
372+
obtain ⟨n₂, y₂, hy₂⟩ := exists_eq_pow_mul_of_is_affine_open X _ U.2
373+
(X.presheaf.map (hom_of_le le_sup_right).op f) (X.presheaf.map (hom_of_le _).op x),
374+
delta Top.presheaf.restrict_open Top.presheaf.restrict at hy₂,
375+
swap, { rw X.basic_open_res, exact inf_le_right },
376+
-- Since `S ∪ U` is quasi-separated, `S ∩ U` can be covered by finite affine opens.
377+
obtain ⟨s, hs', hs⟩ := (is_compact_open_iff_eq_finset_affine_union _).mp
378+
⟨hSU _ _ (set.subset_union_left _ _) S.2 hS
379+
(set.subset_union_right _ _) U.1.2 U.2.is_compact, (S ⊓ U.1).2⟩,
380+
haveI := hs'.to_subtype,
381+
casesI nonempty_fintype s,
382+
replace hs : S ⊓ U.1 = supr (λ i : s, (i : opens X.carrier)) := by { ext1, simpa using hs },
383+
have hs₁ : ∀ i : s, i.1.1 ≤ S,
384+
{ intro i, change (i : opens X.carrier) ≤ S,
385+
refine le_trans _ inf_le_left, use U.1, erw hs, exact le_supr _ _ },
386+
have hs₂ : ∀ i : s, i.1.1 ≤ U.1,
387+
{ intro i, change (i : opens X.carrier) ≤ U,
388+
refine le_trans _ inf_le_right, use S, erw hs, exact le_supr _ _ },
389+
-- On each affine open in the intersection, we have `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`
390+
-- for some `n` since `f ^ n₂ * y₁ = f ^ (n₁ + n₂) * x = f ^ n₁ * y₂` on `X_f`.
391+
have : ∀ i : s, ∃ n : ℕ,
392+
X.presheaf.map (hom_of_le $ hs₁ i).op
393+
((X.presheaf.map (hom_of_le le_sup_left).op f) ^ (n + n₂) * y₁) =
394+
X.presheaf.map (hom_of_le $ hs₂ i).op
395+
((X.presheaf.map (hom_of_le le_sup_right).op f) ^ (n + n₁) * y₂),
396+
{ intro i,
397+
exact exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux X i.1 S U (hs₁ i) (hs₂ i)
398+
hy₁ hy₂ },
399+
choose n hn using this,
400+
-- We can thus choose a big enough `n` such that `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`
401+
-- on `S ∩ U`.
402+
have : X.presheaf.map (hom_of_le $ inf_le_left).op
403+
((X.presheaf.map (hom_of_le le_sup_left).op f) ^ (finset.univ.sup n + n₂) * y₁) =
404+
X.presheaf.map (hom_of_le $ inf_le_right).op
405+
((X.presheaf.map (hom_of_le le_sup_right).op f) ^ (finset.univ.sup n + n₁) * y₂),
406+
{ fapply X.sheaf.eq_of_locally_eq' (λ i : s, i.1.1),
407+
{ refine λ i, hom_of_le _, erw hs, exact le_supr _ _ },
408+
{ exact le_of_eq hs },
409+
{ intro i,
410+
replace hn := congr_arg (λ x, X.presheaf.map (hom_of_le
411+
(le_trans (hs₁ i) le_sup_left)).op f ^ (finset.univ.sup n - n i) * x) (hn i),
412+
dsimp only at hn,
413+
delta Scheme.sheaf SheafedSpace.sheaf,
414+
simp only [← map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp, ← mul_assoc]
415+
at hn ⊢,
416+
erw [← map_mul, ← map_mul] at hn,
417+
rw [← pow_add, ← pow_add, ← add_assoc, ← add_assoc, tsub_add_cancel_of_le] at hn,
418+
convert hn,
419+
exact finset.le_sup (finset.mem_univ _) } },
420+
use finset.univ.sup n + n₁ + n₂,
421+
-- By the sheaf condition, since `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`, it can be glued into
422+
-- the desired section on `S ∪ U`.
423+
use (X.sheaf.obj_sup_iso_prod_eq_locus S U.1).inv ⟨⟨_ * _, _ * _⟩, this⟩,
424+
refine X.sheaf.eq_of_locally_eq₂
425+
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_left).op f) ≤ _))
426+
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_right).op f) ≤ _)) _ _ _ _ _,
427+
{ rw X.basic_open_res, exact inf_le_right },
428+
{ rw X.basic_open_res, exact inf_le_right },
429+
{ rw [X.basic_open_res, X.basic_open_res],
430+
erw ← inf_sup_right,
431+
refine le_inf_iff.mpr ⟨X.basic_open_le f, le_of_eq rfl⟩ },
432+
{ convert congr_arg (X.presheaf.map (hom_of_le _).op)
433+
(X.sheaf.obj_sup_iso_prod_eq_locus_inv_fst S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using 1,
434+
{ delta Scheme.sheaf SheafedSpace.sheaf,
435+
simp only [← comp_apply (X.presheaf.map _) (X.presheaf.map _),
436+
← functor.map_comp, ← op_comp],
437+
congr },
438+
{ delta Scheme.sheaf SheafedSpace.sheaf,
439+
simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp, mul_assoc,
440+
pow_add], erw hy₁, congr' 1, rw [← mul_assoc, ← mul_assoc], congr' 1,
441+
rw [mul_comm, ← comp_apply, ← functor.map_comp], congr } },
442+
{ convert congr_arg (X.presheaf.map (hom_of_le _).op)
443+
(X.sheaf.obj_sup_iso_prod_eq_locus_inv_snd S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using 1,
444+
{ delta Scheme.sheaf SheafedSpace.sheaf,
445+
simp only [← comp_apply (X.presheaf.map _) (X.presheaf.map _),
446+
← functor.map_comp, ← op_comp],
447+
congr },
448+
{ delta Scheme.sheaf SheafedSpace.sheaf,
449+
simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp, mul_assoc,
450+
pow_add], erw hy₂, rw [← comp_apply, ← functor.map_comp], congr } } }
451+
end
452+
453+
/-- If `U` is qcqs, then `Γ(X, D(f)) ≃ Γ(X, U)_f` for every `f : Γ(X, U)`.
454+
This is known as the **Qcqs lemma** in [R. Vakil, *The rising sea*][RisingSea]. -/
455+
lemma is_localization_basic_open_of_qcqs {X : Scheme} {U : opens X.carrier}
456+
(hU : is_compact U.1) (hU' : is_quasi_separated U.1)
457+
(f : X.presheaf.obj (op U)) :
458+
is_localization.away f (X.presheaf.obj (op $ X.basic_open f)) :=
459+
begin
460+
constructor,
461+
{ rintro ⟨_, n, rfl⟩,
462+
simp only [map_pow, subtype.coe_mk, ring_hom.algebra_map_to_algebra],
463+
exact is_unit.pow _ (RingedSpace.is_unit_res_basic_open _ f), },
464+
{ intro z,
465+
obtain ⟨n, y, e⟩ := exists_eq_pow_mul_of_is_compact_of_is_quasi_separated X U hU hU' f z,
466+
refine ⟨⟨y, _, n, rfl⟩, _⟩,
467+
simpa only [map_pow, subtype.coe_mk, ring_hom.algebra_map_to_algebra, mul_comm z]
468+
using e.symm },
469+
{ intros x y,
470+
rw [← sub_eq_zero, ← map_sub, ring_hom.algebra_map_to_algebra],
471+
simp_rw [← @sub_eq_zero _ _ (x * _) (y * _), ← sub_mul],
472+
generalize : x - y = z,
473+
split,
474+
{ intro H,
475+
obtain ⟨n, e⟩ := exists_pow_mul_eq_zero_of_res_basic_open_eq_zero_of_is_compact X hU _ _ H,
476+
refine ⟨⟨_, n, rfl⟩, _⟩,
477+
simpa [mul_comm z] using e },
478+
{ rintro ⟨⟨_, n, rfl⟩, e : z * f ^ n = 0⟩,
479+
rw [← ((RingedSpace.is_unit_res_basic_open _ f).pow n).mul_left_inj, zero_mul, ← map_pow,
480+
← map_mul, e, map_zero] } }
481+
end
482+
277483
end algebraic_geometry

0 commit comments

Comments
 (0)