import Mathlib import Definitions.Def_ModularCurve_DRModelPackage import Definitions.Def_AlgebraicGeometry_RelativePicardFunctor import Definitions.Def_AlgebraicGeometry_RepresentsRelSubPic import Definitions.Def_AlgebraicGeometry_RelPicardAlgEquivZeroCut import Definitions.Def_AlgebraicGeometry_RelPicardChartSections import Definitions.Def_AlgebraicGeometry_SmoothProperCurveBase import Definitions.Def_AlgebraicGeometry_TwoAffineOpenCover import Definitions.Def_AlgebraicGeometry_TwoChartCechSectionsOf import Definitions.Def_AlgebraicCurve_CurveModel import Definitions.Def_AlgebraicCurve_RatFuncPlaces import Definitions.Def_AlgebraicCurve_RatFuncPlaceInfty import Definitions.Def_JacJ1Iface import Definitions.Def_SheafOfModules_Monoidal set_option autoImplicit false open CategoryTheory CategoryTheory.Limits MonoidalCategory AlgebraicGeometry AlgebraicGeometry.RelPicard AlgebraicGeometry.SmoothProperCurve NeronModelInfra GoodReductionJacobian ModularCurve AlgebraicCurve IsLocalRing noncomputable section namespace ModularCurve variable (p : β„•) [Fact p.Prime] variable {p} in structure DRModelPackage.LegTwoInput (𝔛 : DRModelPackage p) where 𝒱 : (DRModel p).TwoAffineOpenCover hH0 : βˆ€ (A : Type) [CommRing A] [Algebra β„€ A], letI := Scheme.TwoAffineOpenCover.algebraOfHom (Limits.pullback.snd (DRModel.toBase p) (Scheme.TwoAffineOpenCover.specMap β„€ A)) ⊀ Function.Bijective (algebraMap A Ξ“(Limits.pullback (DRModel.toBase p) (Scheme.TwoAffineOpenCover.specMap β„€ A), ⊀)) hcov : βˆ€ (V : (Spec (CommRingCat.of β„€)).affineOpens) (F : Finset β†₯𝔛.smoothLocus), (βˆ€ x ∈ F, (𝔛.smoothLocus.ΞΉ ≫ (DRModel.toBase p)).base x ∈ (V : (Spec (CommRingCat.of β„€)).Opens)) β†’ βˆƒ W : (𝔛.smoothLocus : Scheme.{0}).Opens, IsAffineOpen W ∧ W ≀ (𝔛.smoothLocus.ΞΉ ≫ (DRModel.toBase p)) ⁻¹ᡁ (V : (Spec (CommRingCat.of β„€)).Opens) ∧ βˆ€ x ∈ F, x ∈ W hfib : βˆ€ (k : Type) [Field k] [IsAlgClosed k] (x : Spec (CommRingCat.of k) ⟢ Spec (CommRingCat.of β„€)) (L : (pullback (DRModel.toBase p) x).Modules), Scheme.Modules.IsInvertible L β†’ IsAlgEquivZero (pullback.snd (DRModel.toBase p) x) L β†’ βˆ€ s : πŸ™_ (pullback (DRModel.toBase p) x).Modules ⟢ L, s β‰  0 β†’ Nonempty (L β‰… πŸ™_ (pullback (DRModel.toBase p) x).Modules) hgred : βˆ€ (k : Type) [Field k] [IsAlgClosed k] (x : Spec (CommRingCat.of k) ⟢ Spec (CommRingCat.of β„€)), IsReduced (pullback (DRModel.toBase p) x) genus : β„• hg : βˆ€ (k : Type) [Field k] [IsAlgClosed k] (x : Spec (CommRingCat.of k) ⟢ Spec (CommRingCat.of β„€)) (𝒲 : (pullback (pullback.snd (DRModel.toBase p) (πŸ™ (Spec (CommRingCat.of β„€)))) x).TwoAffineOpenCover), Module.finrank k (𝒲.sectionsOf (fibreAt (DRModel.toBase p) (πŸ™ _) x) (SheafOfModules.unit (pullback (pullback.snd (DRModel.toBase p) (πŸ™ (Spec (CommRingCat.of β„€)))) x).ringCatSheaf)).H1 = genus hpool : βˆ€ (𝔭 : PrimeSpectrum β„€) (Aβ‚€ Bβ‚€ nβ‚€ : β„•), βˆƒ (f : β„€) (_ : f βˆ‰ 𝔭.asIdeal) (b M : β„•) (_ : Aβ‚€ * b ^ nβ‚€ + Bβ‚€ < M) (R' : Type) (_ : CommRing R') (aZ : Algebra β„€ R') (aL : Algebra (Localization.Away f) R') (_ : @IsScalarTower β„€ (Localization.Away f) R' OreLocalization.instSMulOfIsScalarTower aL.toSMul aZ.toSMul) (_ : Module.Finite (Localization.Away f) R') (_ : Algebra.Etale (Localization.Away f) R') (_ : Module.FaithfullyFlat (Localization.Away f) R') (B : Fin M β†’ Type) (_ : βˆ€ i, CommRing (B i)) (_ : βˆ€ i, Algebra (Localization.Away f) (B i)) (_ : βˆ€ i, Module.Finite (Localization.Away f) (B i)) (_ : βˆ€ i, Algebra.Etale (Localization.Away f) (B i)) (deg : Fin M β†’ β„•) (_ : βˆ€ i, 1 ≀ deg i) (_ : βˆ€ i, deg i ≀ b) (_Ο† : βˆ€ i, TensorProduct (Localization.Away f) R' (B i) ≃ₐ[R'] (Fin (deg i) β†’ R')) (z : βˆ€ i, Spec (CommRingCat.of (B i)) ⟢ pullback (DRModel.toBase p) (specMap β„€ (Localization.Away f))) (_ : βˆ€ i, IsClosedImmersion (z i)), (βˆ€ i, z i ≫ baseChange β„€ (DRModel.toBase p) (Localization.Away f) = specMap (Localization.Away f) (B i)) ∧ (βˆ€ i, Set.range (z i).base βŠ† ((pullback.fst (DRModel.toBase p) (specMap β„€ (Localization.Away f)) ⁻¹ᡁ 𝔛.smoothLocus : (pullback (DRModel.toBase p) (specMap β„€ (Localization.Away f))).Opens) : Set β†₯(pullback (DRModel.toBase p) (specMap β„€ (Localization.Away f))))) ∧ (Pairwise fun i j => Disjoint (Set.range (z i).base) (Set.range (z j).base)) ∧ (βˆ€ (k : Type) [Field k] [IsAlgClosed k] (s : Spec (CommRingCat.of k) ⟢ Spec (CommRingCat.of (Localization.Away f))) (i : Fin M), (pullback.fst (baseChange β„€ (DRModel.toBase p) (Localization.Away f)) s).base ⁻¹' Set.range (z i).base βŠ† connectedComponentIn (((pullback.fst (baseChange β„€ (DRModel.toBase p) (Localization.Away f)) s ≫ pullback.fst (DRModel.toBase p) (specMap β„€ (Localization.Away f))) ⁻¹ᡁ 𝔛.smoothLocus : (pullback (baseChange β„€ (DRModel.toBase p) (Localization.Away f)) s).Opens) : Set β†₯(pullback (baseChange β„€ (DRModel.toBase p) (Localization.Away f)) s)) (((sectionFibrePoint (sectionBaseChange (Localization.Away f) 𝔛.Ξ΅inf) s).1).base (IsLocalRing.closedPoint k))) hbad : βˆ€ (k : Type) [Field k] [IsAlgClosed k] [DecidableEq (RatFunc k)] (s : Spec (CommRingCat.of k) ⟢ Spec (CommRingCat.of β„€)), Β¬ Smooth (pullback.snd (DRModel.toBase p) s) β†’ βˆƒ (M₁ Mβ‚‚ : CurveModel k (RatFunc k)) (i₁ : M₁.C ⟢ pullback (DRModel.toBase p) s) (iβ‚‚ : Mβ‚‚.C ⟢ pullback (DRModel.toBase p) s) (_ : IsClosedImmersion i₁) (_ : IsClosedImmersion iβ‚‚) (n : β„•) (a b : Fin n β†’ kΛ£) (𝒲₀ : (pullback (DRModel.toBase p) s).TwoAffineOpenCover), i₁ ≫ pullback.snd (DRModel.toBase p) s = M₁.toBase ∧ iβ‚‚ ≫ pullback.snd (DRModel.toBase p) s = Mβ‚‚.toBase ∧ Set.range i₁.base βˆͺ Set.range iβ‚‚.base = Set.univ ∧ Function.Injective a ∧ (βˆ€ i, i₁.base (M₁.placeEquiv.symm (RationalFunctionField.placeOfPoint k (a i : k))).1 = iβ‚‚.base (Mβ‚‚.placeEquiv.symm (RationalFunctionField.placeOfPoint k (b i : k))).1) ∧ (βˆ€ (P₁ : M₁.C) (Qβ‚‚ : Mβ‚‚.C), i₁.base P₁ = iβ‚‚.base Qβ‚‚ β†’ βˆƒ i, P₁ = (M₁.placeEquiv.symm (RationalFunctionField.placeOfPoint k (a i : k))).1 ∧ Qβ‚‚ = (Mβ‚‚.placeEquiv.symm (RationalFunctionField.placeOfPoint k (b i : k))).1) ∧ IsReduced (pullback i₁ iβ‚‚) ∧ ((i₁ ⁻¹ᡁ 𝒲₀.U0 : M₁.C.Opens) : Set M₁.C) = {(M₁.placeEquiv.symm (RationalFunctionField.placeInfty k)).1}ᢜ ∧ ((iβ‚‚ ⁻¹ᡁ 𝒲₀.U0 : Mβ‚‚.C.Opens) : Set Mβ‚‚.C) = {(Mβ‚‚.placeEquiv.symm (RationalFunctionField.placeInfty k)).1}ᢜ ∧ ((i₁ ⁻¹ᡁ 𝒲₀.U1 : M₁.C.Opens) : Set M₁.C) = {(M₁.placeEquiv.symm (RationalFunctionField.placeOfPoint k 0)).1}ᢜ ∧ ((iβ‚‚ ⁻¹ᡁ 𝒲₀.U1 : Mβ‚‚.C.Opens) : Set Mβ‚‚.C) = {(Mβ‚‚.placeEquiv.symm (RationalFunctionField.placeOfPoint k 0)).1}ᢜ ∧ i₁.base (M₁.placeEquiv.symm (RationalFunctionField.placeInfty k)).1 = ((sectionFibrePoint 𝔛.Ξ΅inf s).1).base (IsLocalRing.closedPoint k) ∧ Set.range i₁.base ∩ ((pullback.fst (DRModel.toBase p) s ⁻¹ᡁ 𝔛.smoothLocus : (pullback (DRModel.toBase p) s).Opens) : Set β†₯(pullback (DRModel.toBase p) s)) = connectedComponentIn ((pullback.fst (DRModel.toBase p) s ⁻¹ᡁ 𝔛.smoothLocus : (pullback (DRModel.toBase p) s).Opens) : Set β†₯(pullback (DRModel.toBase p) s)) (((sectionFibrePoint 𝔛.Ξ΅inf s).1).base (IsLocalRing.closedPoint k)) ∧ (βˆ€ i, i₁.base (M₁.placeEquiv.symm (RationalFunctionField.placeOfPoint k (a i : k))).1 βˆ‰ (pullback.fst (DRModel.toBase p) s ⁻¹ᡁ 𝔛.smoothLocus : (pullback (DRModel.toBase p) s).Opens)) ∧ (βˆƒ W₁ : (pullback (DRModel.toBase p) s).Opens, (W₁ : Set β†₯(pullback (DRModel.toBase p) s)) = (Set.range iβ‚‚.base)ᢜ ∧ IsOpenImmersion ((i₁ ⁻¹ᡁ W₁).ΞΉ ≫ i₁)) end ModularCurve end