feat(AlgebraicGeometry): The pushforward of a quasi-coherent sheaf between affines is quasi-coherent#37189
feat(AlgebraicGeometry): The pushforward of a quasi-coherent sheaf between affines is quasi-coherent#37189Brian-Nugent wants to merge 27 commits intoleanprover-community:masterfrom
Conversation
Welcome new contributor!Thank you for contributing to Mathlib! If you haven't done so already, please review our contribution guidelines, as well as the style guide and naming conventions. In particular, we kindly remind contributors that we have guidelines regarding the use of AI when making pull requests. We use a review queue to manage reviews. If your PR does not appear there, it is probably because it is not successfully building (i.e., it doesn't have a green checkmark), has the If you haven't already done so, please come to https://leanprover.zulipchat.com/, introduce yourself, and mention your new PR. Thank you again for joining our community. |
PR summary 2d59066e04
|
| File | Base Count | Head Count | Change |
|---|---|---|---|
| Mathlib.AlgebraicGeometry.Modules.Tilde | 2339 | 2357 | +18 (+0.77%) |
Import changes for all files
| Files | Import difference |
|---|---|
Mathlib.AlgebraicGeometry.Modules.Tilde |
18 |
Declarations diff
+ IsLocalizedModule.comp_iff_of_bijective_left
+ IsLocalizedModule.comp_iff_of_bijective_right
+ IsLocalizedModule.restrictScalars
+ IsLocalizedModule.restrictScalars_iff
+ IsLocalizedModule.restrictScalars_powers
+ IsLocalizing
+ instance : (modulesSpecToSheaf (R := R)).Faithful := SpecModulesToSheafFullyFaithful.faithful
+ instance : (modulesSpecToSheaf (R := R)).Full := SpecModulesToSheafFullyFaithful.full
+ isIso_fromTildeΓ_iff_isLocalizing
+ isIso_iff_isIso_basis
+ isIso_of_isLocalizedModule_comp
+ isLocalizing_iff_of_iso
+ isLocalizing_of_isIso_app_top
+ isLocalizing_of_iso
+ isLocalizing_pushforward_of_isLocalizing
+ isLocalizing_tilde
+ linearEquiv_of_isLocalizedModule_comp
+ pushforwardCompForgetToSheafModuleCat
+ pushforward_isIso_fromTildeΓ
+ pushforward_modulesSpecToSheaf_iso
+ sheafComposePushforwardComp
You can run this locally as follows
## from your `mathlib4` directory:
git clone https://github.com/leanprover-community/mathlib-ci.git ../mathlib-ci
## summary with just the declaration names:
../mathlib-ci/scripts/pr_summary/declarations_diff.sh <optional_commit>
## more verbose report:
../mathlib-ci/scripts/pr_summary/declarations_diff.sh long <optional_commit>The doc-module for scripts/pr_summary/declarations_diff.sh in the mathlib-ci repository contains some details about this script.
Increase in tech debt: (relative, absolute) = (1.00, 0.00)
| Current number | Change | Type |
|---|---|---|
| 6176 | 1 | backward.isDefEq.respectTransparency |
Current commit 8797ae0185
Reference commit 2d59066e04
This script lives in the mathlib-ci repository. To run it locally, from your mathlib4 directory:
git clone https://github.com/leanprover-community/mathlib-ci.git ../mathlib-ci
../mathlib-ci/scripts/reporting/technical-debt-metrics.sh pr_summary
- The
relativevalue is the weighted sum of the differences with weight given by the inverse of the current value of the statistic. - The
absolutevalue is therelativevalue divided by the total sum of the inverses of the current values (i.e. the weighted average of the differences).
| def pushforward_modulesSpecToSheaf_iso : | ||
| Scheme.Modules.pushforward (Spec.map φ) ⋙ modulesSpecToSheaf ≅ | ||
| modulesSpecToSheaf ⋙ TopCat.Sheaf.pushforward (ModuleCat S) (Spec.map φ).base ⋙ | ||
| sheafCompose _ (ModuleCat.restrictScalars φ.hom) := eqToIso (by | ||
| conv_lhs => |
There was a problem hiding this comment.
We probably want to have a better definition of this isomorphism.
There was a problem hiding this comment.
Better in what way? Where the hom and inverse are specified to have some nice definitional properties?
There was a problem hiding this comment.
Since this is an isomorphism of functors, a good start would be to use NatIso.ofComponents.
There was a problem hiding this comment.
Would NatIso.ofComponents fun X => (eqToIso ...) be a good definition?
There was a problem hiding this comment.
Or since the objects in this case are sheaves, maybe we'd want to put the eqToIso another step deeper?
There was a problem hiding this comment.
We should not use eqToIso at all. Generally, the trick for this type of isomorphism is to just keep applying things like NatIso.ofComponents and use dsimp very liberally to simplify the situation (without breaking def-eqs). Then we usually already have the components somewhere. By following this strategy, you get this:
set_option backward.isDefEq.respectTransparency false in
def _root_.SheafOfModules.pushforwardCompForgetToSheafModuleCat {C : Type*} [Category* C]
{D : Type*} [Category* D] {J : GrothendieckTopology C} {K : GrothendieckTopology D} {F : C ⥤ D}
{R : Sheaf K RingCat.{u}} {S : Sheaf J RingCat.{u}} [F.IsContinuous J K]
(φ : S ⟶ (F.sheafPushforwardContinuous RingCat.{u} J K).obj R)
(X : Cᵒᵖ) (hX : IsInitial X) (hX' : IsInitial (F.op.obj X)) :
SheafOfModules.pushforward φ ⋙ SheafOfModules.forgetToSheafModuleCat _ X hX ≅
SheafOfModules.forgetToSheafModuleCat _ _ hX' ⋙
sheafCompose K (ModuleCat.restrictScalars <| (φ.hom.app _).hom) ⋙
F.sheafPushforwardContinuous _ J K := by
refine NatIso.ofComponents (fun M ↦ ObjectProperty.isoMk _ ?_) ?_
· refine NatIso.ofComponents (fun U ↦ ?_) ?_
· refine (ModuleCat.restrictScalarsComp'App _ _ _ ?_ _).symm ≪≫
(ModuleCat.restrictScalarsComp _ _).app _
rw [← RingCat.hom_comp, ← RingCat.hom_comp, φ.hom.naturality]
dsimp
rw [hX'.hom_ext (hX'.to (op (F.obj (unop U)))) _]
· cat_disch
· cat_disch
The special case you have here you should be able to obtain easily from the general case.
There was a problem hiding this comment.
Thank you for this! I've incorporated this but I think something still needs to be done to deal with the sheafCompose in the definition of modulesSpecToSheaf. My attempt at dealing with this is sheafComposePushforwardComp (see my comment below). I can make this more general but I first wanted to check to make sure this is reasonable and gives a good definition for pushforward_modulesSpecToSheaf_iso.
Co-authored-by: Joël Riou <37772949+joelriou@users.noreply.github.com>
| def pushforward_modulesSpecToSheaf_iso : | ||
| Scheme.Modules.pushforward (Spec.map φ) ⋙ modulesSpecToSheaf ≅ | ||
| modulesSpecToSheaf ⋙ TopCat.Sheaf.pushforward (ModuleCat S) (Spec.map φ).base ⋙ | ||
| sheafCompose _ (ModuleCat.restrictScalars φ.hom) := eqToIso (by | ||
| conv_lhs => |
There was a problem hiding this comment.
Since this is an isomorphism of functors, a good start would be to use NatIso.ofComponents.
| def pushforward_modulesSpecToSheaf_iso : | ||
| Scheme.Modules.pushforward (Spec.map φ) ⋙ modulesSpecToSheaf ≅ | ||
| modulesSpecToSheaf ⋙ TopCat.Sheaf.pushforward (ModuleCat S) (Spec.map φ).base ⋙ | ||
| sheafCompose _ (ModuleCat.restrictScalars φ.hom) := eqToIso (by | ||
| conv_lhs => |
There was a problem hiding this comment.
We should not use eqToIso at all. Generally, the trick for this type of isomorphism is to just keep applying things like NatIso.ofComponents and use dsimp very liberally to simplify the situation (without breaking def-eqs). Then we usually already have the components somewhere. By following this strategy, you get this:
set_option backward.isDefEq.respectTransparency false in
def _root_.SheafOfModules.pushforwardCompForgetToSheafModuleCat {C : Type*} [Category* C]
{D : Type*} [Category* D] {J : GrothendieckTopology C} {K : GrothendieckTopology D} {F : C ⥤ D}
{R : Sheaf K RingCat.{u}} {S : Sheaf J RingCat.{u}} [F.IsContinuous J K]
(φ : S ⟶ (F.sheafPushforwardContinuous RingCat.{u} J K).obj R)
(X : Cᵒᵖ) (hX : IsInitial X) (hX' : IsInitial (F.op.obj X)) :
SheafOfModules.pushforward φ ⋙ SheafOfModules.forgetToSheafModuleCat _ X hX ≅
SheafOfModules.forgetToSheafModuleCat _ _ hX' ⋙
sheafCompose K (ModuleCat.restrictScalars <| (φ.hom.app _).hom) ⋙
F.sheafPushforwardContinuous _ J K := by
refine NatIso.ofComponents (fun M ↦ ObjectProperty.isoMk _ ?_) ?_
· refine NatIso.ofComponents (fun U ↦ ?_) ?_
· refine (ModuleCat.restrictScalarsComp'App _ _ _ ?_ _).symm ≪≫
(ModuleCat.restrictScalarsComp _ _).app _
rw [← RingCat.hom_comp, ← RingCat.hom_comp, φ.hom.naturality]
dsimp
rw [hX'.hom_ext (hX'.to (op (F.obj (unop U)))) _]
· cat_disch
· cat_disch
The special case you have here you should be able to obtain easily from the general case.
| /-- `sheafCompose` commutes with `pushforward` -/ | ||
| def sheafComposePushforwardComp : | ||
| sheafCompose (Opens.grothendieckTopology (Spec S)) | ||
| (ModuleCat.restrictScalars (Spec.map φ).appTop.hom) ⋙ | ||
| TopCat.Sheaf.pushforward _ (Spec.map φ).base ⋙ | ||
| sheafCompose _ (ModuleCat.restrictScalars (Scheme.ΓSpecIso R).inv.hom) ≅ | ||
| sheafCompose _ (ModuleCat.restrictScalars (Scheme.ΓSpecIso S).inv.hom) ⋙ | ||
| TopCat.Sheaf.pushforward _ (Spec.map φ).base ⋙ | ||
| sheafCompose _ (ModuleCat.restrictScalars φ.hom) := by | ||
| refine NatIso.ofComponents (fun M ↦ ObjectProperty.isoMk _ ?_) ?_ | ||
| · refine NatIso.ofComponents (fun U ↦ ?_) ?_ | ||
| · refine (ModuleCat.restrictScalarsComp'App _ _ _ ?_ _).symm ≪≫ | ||
| (ModuleCat.restrictScalarsComp φ.hom ((Scheme.ΓSpecIso S).inv).hom).app _ | ||
| rw [← CommRingCat.hom_comp, Scheme.ΓSpecIso_inv_naturality, CommRingCat.hom_comp] | ||
| · cat_disch | ||
| · cat_disch | ||
|
|
||
| /-- `Scheme.Modules.pushforward` and `modulesSpecToSheaf` commute -/ | ||
| def pushforward_modulesSpecToSheaf_iso : | ||
| Scheme.Modules.pushforward (Spec.map φ) ⋙ modulesSpecToSheaf ≅ | ||
| modulesSpecToSheaf ⋙ TopCat.Sheaf.pushforward (ModuleCat S) (Spec.map φ).base ⋙ | ||
| sheafCompose _ (ModuleCat.restrictScalars φ.hom) := | ||
| Functor.isoWhiskerRight (SheafOfModules.pushforwardCompForgetToSheafModuleCat | ||
| (Spec.map φ).toRingCatSheafHom _ _ _) (sheafCompose _ _) ≪≫ | ||
| (Functor.isoWhiskerLeft (SheafOfModules.forgetToSheafModuleCat (Spec S).ringCatSheaf _ | ||
| (initialOpOfTerminal isTerminalTop)) (sheafComposePushforwardComp φ)) |
There was a problem hiding this comment.
I can make sheafComposePushforwardComp more general, but first I just want to make sure that this is a reasonable way of defining pushforward_modulesSpecToSheaf_iso
To be more precise, we show that if
AlgebraicGeometry.Scheme.Modules.fromTildeΓis an isomorphism then the same holds for the pushforward. This will show that being quasicoherent is stable under pushforward for affine morphisms once it is shown thatAlgebraicGeometry.Scheme.Modules.fromTildeΓbeing an isomorphism is equivalent to being quasicoherent.