Definitions/Def_AlgebraicGeometry_OModulePresheafCechPushforward.lean
Čech pushforward of a presheaf-of-modules datum
Fix a commutative ring R, schemes V', Z, morphisms p : V' \to Z and \pi_Z : Z \to \operatorname{Spec} R, and a finite linearly ordered affine open cover K' of V'. For an open U \subseteq Z and an index i, chart is the open K'_i \cap p^{-1}U of V'; it is contained in p^{-1}U and is monotone in U. Given a datum G of type OModulePresheaf (p ≫ πZ) — an assignment of an R-module and \Gamma(V',O)-module G(O) to each open O \subseteq V', with the two actions compatible over the R-algebra structure on \Gamma(V',O) coming from p \circ \pi_Z, together with R-linear restrictions satisfying semilinearity, reflexivity and transitivity — cocycles is the R-submodule of \prod_i G(K'_i \cap p^{-1}U) cut out by the equalities x_i|_{W_{ij}} = x_j|_{W_{ij}} on W_{ij} = (K'_i \cap p^{-1}U) \cap (K'_j \cap p^{-1}U), for all ordered pairs (i,j) (mem_cocycles_iff records this description). The maps toChart are the components \Gamma(Z,U) \to \Gamma(V', K'_i \cap p^{-1}U) of p; through them \Gamma(Z,U) acts componentwise on the cocycles (sectionsSMul, sectionsModule), compatibly with the R-action since toChart is an R-algebra map. Componentwise restriction preserves cocycles (res_mem, resL), and cechPushforward packages all this as a datum of type OModulePresheaf πZ with U \mapsto these cocycles: the sections p_*G computed by degree-zero Čech sections over the fixed cover, rather than by U \mapsto G(p^{-1}U).
Helper lemmas describe the values, scalar multiplications, addition and extensionality componentwise. Hom.cechPushforward pushes a morphism of data defined on all opens to the Čech pushforwards, componentwise. For morphisms given on affine opens only, AffHom.affineChart exhibits K'_i \cap p^{-1}U as an affine open for U affine when \pi_Z is separated, and AffHom.cechPushforward, assuming in addition that p is separated (so that the pairwise intersections are affine too), produces the corresponding AffHom between the pushforwards.
Relation to Mathlib
The OModulePresheaf structure over a morphism to \operatorname{Spec} R and the Čech pushforward constructed from it are the project's own; they are not Mathlib's presheaf-of-modules or pushforward-of-sheaves machinery, and no sheaf condition is imposed.
Where it is used
These data form part of the project's Čech-theoretic treatment of coherent and quasi-coherent modules on schemes over an affine base, where direct images along a morphism must be available with sections that are computed by an explicit cover rather than taken on possibly non-affine preimages.
References
- R. Hartshorne, Algebraic Geometry, Graduate Texts in Mathematics 52, Springer, 1977, Chapter III
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 220 lines
- 25 declarations
- used in the statements of 15 theorems and imported by 16 proofs
- imports 2 definition modules
Source file: Definitions/Def_AlgebraicGeometry_OModulePresheafCechPushforward.lean
Imported by
- no other definition module
Declarations
- abbrev
AlgebraicGeometry.OModulePresheaf.cechPushforward.chart - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.chart_le_preimage - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.chart_mono - def
AlgebraicGeometry.OModulePresheaf.cechPushforward.cocycles - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.mem_cocycles_iff - abbrev
AlgebraicGeometry.OModulePresheaf.cechPushforward.toChart - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.toChart_algebraMap - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.map_toChart_left - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.map_toChart_right - def
AlgebraicGeometry.OModulePresheaf.cechPushforward.sectionsSMul - def
AlgebraicGeometry.OModulePresheaf.cechPushforward.sectionsModule - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.res_mem - def
AlgebraicGeometry.OModulePresheaf.cechPushforward.resL - def
AlgebraicGeometry.OModulePresheaf.cechPushforward - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward_obj - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.coe_res - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.coe_smul - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.coe_sectionsSMul - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.coe_add - theorem
AlgebraicGeometry.OModulePresheaf.cechPushforward.ext - def
AlgebraicGeometry.OModulePresheaf.Hom.cechPushforward - theorem
AlgebraicGeometry.OModulePresheaf.Hom.coe_cechPushforward_app - abbrev
AlgebraicGeometry.OModulePresheaf.AffHom.affineChart - def
AlgebraicGeometry.OModulePresheaf.AffHom.cechPushforward - theorem
AlgebraicGeometry.OModulePresheaf.AffHom.coe_cechPushforward_app
Source
import Mathlib import Definitions.Def_AlgebraicGeometry_OModulePresheafHom import Definitions.Def_AlgebraicGeometry_OModulePresheafLerayBicomplex set_option autoImplicit false noncomputable section universe u namespace AlgebraicGeometry open CategoryTheory Opposite TopologicalSpace namespace OModulePresheaf variable {R : Type u} [CommRing R] {V' Z : Scheme.{u}} variable (p : V' ⟶ Z) (πZ : Z ⟶ Spec (.of R)) (K' : V'.OrderedAffineCover) namespace cechPushforward abbrev chart (U : Z.Opens) (i : K'.ι) : V'.Opens := K'.U i ⊓ p ⁻¹ᵁ U theorem chart_le_preimage (U : Z.Opens) (i : K'.ι) : chart p K' U i ≤ p ⁻¹ᵁ U := inf_le_right theorem chart_mono {U U' : Z.Opens} (h : U ≤ U') (i : K'.ι) : chart p K' U i ≤ chart p K' U' i := inf_le_inf_left _ ((Opens.map p.base).monotone h) variable (G : OModulePresheaf (p ≫ πZ)) def cocycles (U : Z.Opens) : Submodule R (∀ i : K'.ι, G.obj (chart p K' U i)) := ⨅ i : K'.ι, ⨅ j : K'.ι, LinearMap.ker ((G.res (U := chart p K' U i ⊓ chart p K' U j) inf_le_left).comp (LinearMap.proj i) - (G.res (U := chart p K' U i ⊓ chart p K' U j) inf_le_right).comp (LinearMap.proj j)) theorem mem_cocycles_iff (U : Z.Opens) (x : ∀ i : K'.ι, G.obj (chart p K' U i)) : x ∈ cocycles p πZ K' G U ↔ ∀ i j : K'.ι, G.res (U := chart p K' U i ⊓ chart p K' U j) inf_le_left (x i) = G.res (U := chart p K' U i ⊓ chart p K' U j) inf_le_right (x j) := by simp only [cocycles, Submodule.mem_iInf, LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.comp_apply, LinearMap.proj_apply, sub_eq_zero] abbrev toChart (U : Z.Opens) (i : K'.ι) : Γ(Z, U) ⟶ Γ(V', chart p K' U i) := p.appLE U (chart p K' U i) (chart_le_preimage p K' U i) theorem toChart_algebraMap (U : Z.Opens) (i : K'.ι) (r : R) : letI := Scheme.TwoAffineOpenCover.algebraOfHom πZ U letI := Scheme.TwoAffineOpenCover.algebraOfHom (p ≫ πZ) (chart p K' U i) (toChart p K' U i).hom (algebraMap R Γ(Z, U) r) = algebraMap R Γ(V', chart p K' U i) r := by show (p.appLE U _ _).hom ((πZ.appLE ⊤ U le_top).hom _) = ((p ≫ πZ).appLE ⊤ _ le_top).hom _ rw [← CommRingCat.comp_apply, Scheme.Hom.appLE_comp_appLE] theorem map_toChart_left (U : Z.Opens) (i j : K'.ι) (a : Γ(Z, U)) : (V'.presheaf.map (homOfLE (inf_le_left : chart p K' U i ⊓ chart p K' U j ≤ chart p K' U i)).op).hom ((toChart p K' U i).hom a) = (p.appLE U (chart p K' U i ⊓ chart p K' U j) (inf_le_left.trans (chart_le_preimage p K' U i))).hom a := by rw [← CommRingCat.comp_apply, Scheme.Hom.appLE_map] theorem map_toChart_right (U : Z.Opens) (i j : K'.ι) (a : Γ(Z, U)) : (V'.presheaf.map (homOfLE (inf_le_right : chart p K' U i ⊓ chart p K' U j ≤ chart p K' U j)).op).hom ((toChart p K' U j).hom a) = (p.appLE U (chart p K' U i ⊓ chart p K' U j) (inf_le_left.trans (chart_le_preimage p K' U i))).hom a := by rw [← CommRingCat.comp_apply, Scheme.Hom.appLE_map] @[reducible] def sectionsSMul (U : Z.Opens) : SMul Γ(Z, U) (cocycles p πZ K' G U) where smul a x := ⟨fun i => (toChart p K' U i).hom a • x.1 i, by rw [mem_cocycles_iff] intro i j rw [G.res_smul, G.res_smul, map_toChart_left, map_toChart_right, (mem_cocycles_iff p πZ K' G U x.1).mp x.2 i j]⟩ @[reducible] def sectionsModule (U : Z.Opens) : Module Γ(Z, U) (cocycles p πZ K' G U) := letI := sectionsSMul p πZ K' G U { one_smul := fun x => Subtype.ext (funext fun i => by show (toChart p K' U i).hom 1 • x.1 i = x.1 i rw [map_one, one_smul]) mul_smul := fun a b x => Subtype.ext (funext fun i => by show (toChart p K' U i).hom (a * b) • x.1 i = (toChart p K' U i).hom a • ((toChart p K' U i).hom b • x.1 i) rw [map_mul, mul_smul]) smul_zero := fun a => Subtype.ext (funext fun i => smul_zero _) smul_add := fun a x y => Subtype.ext (funext fun i => smul_add _ _ _) add_smul := fun a b x => Subtype.ext (funext fun i => by show (toChart p K' U i).hom (a + b) • x.1 i = (toChart p K' U i).hom a • x.1 i + (toChart p K' U i).hom b • x.1 i rw [map_add, add_smul]) zero_smul := fun x => Subtype.ext (funext fun i => by show (toChart p K' U i).hom 0 • x.1 i = 0 rw [map_zero, zero_smul]) } theorem res_mem {U U' : Z.Opens} (h : U ≤ U') (x : cocycles p πZ K' G U') : (fun i => G.res (chart_mono p K' h i) (x.1 i)) ∈ cocycles p πZ K' G U := by rw [mem_cocycles_iff] intro i j rw [G.res_res, G.res_res, ← G.res_res (inf_le_inf (chart_mono p K' h i) (chart_mono p K' h j)) (inf_le_left : chart p K' U' i ⊓ chart p K' U' j ≤ _), ← G.res_res (inf_le_inf (chart_mono p K' h i) (chart_mono p K' h j)) (inf_le_right : chart p K' U' i ⊓ chart p K' U' j ≤ _), (mem_cocycles_iff p πZ K' G U' x.1).mp x.2 i j] def resL {U U' : Z.Opens} (h : U ≤ U') : cocycles p πZ K' G U' →ₗ[R] cocycles p πZ K' G U where toFun x := ⟨fun i => G.res (chart_mono p K' h i) (x.1 i), res_mem p πZ K' G h x⟩ map_add' x y := Subtype.ext (funext fun i => (G.res (chart_mono p K' h i)).map_add (x.1 i) (y.1 i)) map_smul' r x := Subtype.ext (funext fun i => (G.res (chart_mono p K' h i)).map_smul r (x.1 i)) end cechPushforward open cechPushforward in def cechPushforward (G : OModulePresheaf (p ≫ πZ)) : OModulePresheaf πZ where obj U := cocycles p πZ K' G U module U := inferInstance moduleSections U := sectionsModule p πZ K' G U isScalarTower U := by letI := Scheme.TwoAffineOpenCover.algebraOfHom πZ U letI := sectionsModule p πZ K' G U refine ⟨fun r a x => Subtype.ext (funext fun i => ?_)⟩ letI := Scheme.TwoAffineOpenCover.algebraOfHom (p ≫ πZ) (chart p K' U i) show (toChart p K' U i).hom (r • a) • x.1 i = r • ((toChart p K' U i).hom a • x.1 i) rw [Algebra.smul_def, map_mul, mul_smul, toChart_algebraMap, algebraMap_smul] res h := resL p πZ K' G h res_smul {U U'} h a x := Subtype.ext (funext fun i => by show G.res _ ((toChart p K' U' i).hom a • x.1 i) = (toChart p K' U i).hom ((Z.presheaf.map (homOfLE h).op).hom a) • G.res (chart_mono p K' h i) (x.1 i) rw [G.res_smul, ← CommRingCat.comp_apply, ← CommRingCat.comp_apply (f := Z.presheaf.map _), Scheme.Hom.appLE_map, Scheme.Hom.map_appLE]) res_refl U := LinearMap.ext fun x => Subtype.ext (funext fun i => G.res_refl_apply _ _) res_comp h h' := LinearMap.ext fun x => Subtype.ext (funext fun i => (G.res_res _ _ _).symm) section Lemmas variable (G : OModulePresheaf (p ≫ πZ)) @[simp] theorem cechPushforward_obj (U : Z.Opens) : (cechPushforward p πZ K' G).obj U = ↥(cechPushforward.cocycles p πZ K' G U) := rfl namespace cechPushforward theorem coe_res {U U' : Z.Opens} (h : U ≤ U') (x : (cechPushforward p πZ K' G).obj U') (i : K'.ι) : ((cechPushforward p πZ K' G).res h x).1 i = G.res (cechPushforward.chart_mono p K' h i) (x.1 i) := rfl theorem coe_smul (U : Z.Opens) (r : R) (x : (cechPushforward p πZ K' G).obj U) (i : K'.ι) : (r • x).1 i = r • x.1 i := rfl theorem coe_sectionsSMul (U : Z.Opens) (a : Γ(Z, U)) (x : (cechPushforward p πZ K' G).obj U) (i : K'.ι) : (a • x).1 i = (cechPushforward.toChart p K' U i).hom a • x.1 i := rfl theorem coe_add (U : Z.Opens) (x y : (cechPushforward p πZ K' G).obj U) (i : K'.ι) : (x + y).1 i = x.1 i + y.1 i := rfl theorem ext {U : Z.Opens} {x y : (cechPushforward p πZ K' G).obj U} (h : ∀ i, x.1 i = y.1 i) : x = y := Subtype.ext (funext h) end cechPushforward end Lemmas namespace Hom variable {G G' : OModulePresheaf (p ≫ πZ)} def cechPushforward (φ : Hom G G') : Hom (OModulePresheaf.cechPushforward p πZ K' G) (OModulePresheaf.cechPushforward p πZ K' G') where app U := { toFun := fun x => ⟨fun i => φ.app _ (x.1 i), by rw [cechPushforward.mem_cocycles_iff] intro i j rw [← φ.naturality_apply, ← φ.naturality_apply, (cechPushforward.mem_cocycles_iff p πZ K' G U x.1).mp x.2 i j]⟩ map_add' := fun x y => Subtype.ext (funext fun i => map_add _ _ _) map_smul' := fun r x => Subtype.ext (funext fun i => LinearMap.map_smul _ _ _) } app_smul U a x := Subtype.ext (funext fun i => φ.app_smul _ _ _) naturality h := LinearMap.ext fun x => Subtype.ext (funext fun i => φ.naturality_apply _ _) @[simp] theorem coe_cechPushforward_app (φ : Hom G G') (U : Z.Opens) (x : (OModulePresheaf.cechPushforward p πZ K' G).obj U) (i : K'.ι) : ((φ.cechPushforward p πZ K').app U x).1 i = φ.app _ (x.1 i) := rfl end Hom namespace AffHom variable {G G' : OModulePresheaf (p ≫ πZ)} abbrev affineChart [IsSeparated πZ] (U : Z.affineOpens) (i : K'.ι) : V'.affineOpens := ⟨OModulePresheaf.cechPushforward.chart p K' U.1 i, Scheme.OrderedAffineCover.fiberAffineOpen p πZ (K'.isAffineOpen i) U.2⟩ def cechPushforward [IsSeparated πZ] [IsSeparated p] (φ : AffHom G G') : AffHom (OModulePresheaf.cechPushforward p πZ K' G) (OModulePresheaf.cechPushforward p πZ K' G') where app U := { toFun := fun x => ⟨fun i => φ.app (affineChart p πZ K' U i) (x.1 i), by rw [OModulePresheaf.cechPushforward.mem_cocycles_iff] intro i j have hij : IsAffineOpen (OModulePresheaf.cechPushforward.chart p K' U.1 i ⊓ OModulePresheaf.cechPushforward.chart p K' U.1 j) := haveI : IsSeparated (p ≫ πZ) := inferInstance Scheme.OrderedAffineCover.isAffineOpen_inf_of_isSeparated (p ≫ πZ) (affineChart p πZ K' U i).2 (affineChart p πZ K' U j).2 rw [← φ.naturality_apply (U := ⟨_, hij⟩) (U' := affineChart p πZ K' U i), ← φ.naturality_apply (U := ⟨_, hij⟩) (U' := affineChart p πZ K' U j), (OModulePresheaf.cechPushforward.mem_cocycles_iff p πZ K' G U.1 x.1).mp x.2 i j]⟩ map_add' := fun x y => Subtype.ext (funext fun i => map_add _ _ _) map_smul' := fun r x => Subtype.ext (funext fun i => LinearMap.map_smul _ _ _) } app_smul U a x := Subtype.ext (funext fun i => φ.app_smul _ _ _) naturality {U U'} h := LinearMap.ext fun x => Subtype.ext (funext fun i => φ.naturality_apply (U := affineChart p πZ K' U i) (U' := affineChart p πZ K' U' i) _ _) @[simp] theorem coe_cechPushforward_app [IsSeparated πZ] [IsSeparated p] (φ : AffHom G G') (U : Z.affineOpens) (x : (OModulePresheaf.cechPushforward p πZ K' G).obj U.1) (i : K'.ι) : ((φ.cechPushforward p πZ K').app U x).1 i = φ.app (affineChart p πZ K' U i) (x.1 i) := rfl end AffHom end OModulePresheaf end AlgebraicGeometry end
Statements phrased using this module (15)
- Semilinear family η induces an affine morphism into the Čech pushforward
AlgebraicGeometry.OModulePresheaf.exists_affHom_cechPushforward_apply_eq_of_forall_res_eq0 below · depth 31 - Čech direct image along a proper map of an algebraised system
AlgebraicGeometry.OModulePresheaf.exists_affHom_cechPushforward_comp_eq_of_forall_ker_eq_pow_smul_top_of_isProper63 below · depth 31 - Cokernel and kernel of ̂ u killed by a power of J
AlgebraicGeometry.OModulePresheaf.exists_forall_smul_mem_range_of_cechPushforward_of_isIso_pullback_snd_of_isProper96 below · depth 31 - Globalising the exponent for Čech thread comparison over P
AlgebraicGeometry.OModulePresheaf.exists_forall_affineOpens_thread_smul_of_forall_exists_forall_le_of_isProper1 below · depth 32 - Thread-level bounds imply level-wise bounds for u_k
AlgebraicGeometry.OModulePresheaf.exists_forall_smul_mem_range_of_forall_thread_of_cechPushforward9 below · depth 32 - Uniform annihilation of kernel and cokernel of the threaded Čech unit
AlgebraicGeometry.OModulePresheaf.exists_forall_thread_smul_eq_apply_and_smul_eq_zero_of_isIso_pullback_snd_of_isProper85 below · depth 32 - Coherence of the Čech pushforward along a proper morphism
AlgebraicGeometry.OModulePresheaf.isCoherent_cechPushforward_of_isProper53 below · depth 32 - Quasi-coherence of the Čech direct image along a separated morphism
AlgebraicGeometry.OModulePresheaf.isQuasicoherent_cechPushforward_of_isSeparated0 below · depth 32 - Čech 0-cocycle threads over a complete base: existence, uniqueness, finiteness
AlgebraicGeometry.OModulePresheaf.exists_forall_eq_thread_and_eq_zero_of_forall_eq_zero_of_isAdicComplete_of_isProper60 below · depth 33 - Base change of an adic datum to a proper frame
AlgebraicGeometry.OModulePresheaf.exists_isPullback_isProper_and_exists_forall_surjective_ker_eq_pow_smul_top_of_forall_ker_eq_pow_smul_top0 below · depth 33 - Čech unit becomes bijective after inverting functions vanishing on T'
AlgebraicGeometry.OModulePresheaf.exists_pow_smul_eq_zero_and_exists_eq_pow_smul_of_mem_vanishingIdeal_of_isIso_pullback_snd4 below · depth 33 - Flat base change of Čech torsion and solvability from W₀ to W
AlgebraicGeometry.OModulePresheaf.forall_smul_eq_zero_and_exists_eq_smul_of_le_of_flat_of_bijective6 below · depth 33 - Čech families over a cover inherit a-power localisation
AlgebraicGeometry.OModulePresheaf.exists_pow_smul_eq_zero_and_exists_eq_pow_smul_of_forall_isAffineOpen_basicOpen2 below · depth 34 - Affineness and localisation of the unit over basic opens off T'
AlgebraicGeometry.OModulePresheaf.isAffineOpen_basicOpen_and_exists_pow_smul_eq_zero_and_exists_eq_pow_smul_of_mem_vanishingIdeal0 below · depth 34 - Sections over an affine preimage are the Čech 0-cocycles
AlgebraicGeometry.OModulePresheaf.bijective_cechPushforward_of_isAffineOpen_preimage1 below · depth 35