import Definitions.Def_AlgebraicCurve_DivisorClassGroup import Mathlib.RingTheory.Kaehler.Basic import Mathlib.FieldTheory.IsAlgClosed.Basic set_option autoImplicit false noncomputable section open KaehlerDifferential namespace AlgebraicCurve variable (K F : Type*) [Field K] [Field F] [Algebra K F] class IsCurveOver : Prop extends HasPrincipalDivisors K F where finiteResidue : ∀ v : Place K F, Module.Finite K v.ResidueField kaehler_free_rank_one : Module.Free F Ω[F⁄K] ∧ Module.finrank F Ω[F⁄K] = 1 namespace IsCurveOver variable {K F} theorem hasPrincipalDivisors [h : IsCurveOver K F] : HasPrincipalDivisors K F := h.toHasPrincipalDivisors theorem finite_residueField [IsCurveOver K F] (v : Place K F) : Module.Finite K v.ResidueField := IsCurveOver.finiteResidue v instance instFiniteResidue [IsCurveOver K F] (v : Place K F) : v.FiniteResidue := ⟨IsCurveOver.finiteResidue v⟩ instance instFreeKaehler [h : IsCurveOver K F] : Module.Free F Ω[F⁄K] := h.kaehler_free_rank_one.1 theorem finrank_kaehler [h : IsCurveOver K F] : Module.finrank F Ω[F⁄K] = 1 := h.kaehler_free_rank_one.2 instance instNontrivialKaehler [IsCurveOver K F] : Nontrivial Ω[F⁄K] := Module.nontrivial_of_finrank_eq_succ (n := 0) finrank_kaehler end IsCurveOver namespace Place variable {K F} theorem deg_eq_one_of_isAlgClosed_of_finite [IsAlgClosed K] (v : Place K F) [Module.Finite K v.ResidueField] : v.deg = 1 := by have : Algebra.IsIntegral K v.ResidueField := Algebra.IsIntegral.of_finite K v.ResidueField have hbij : Function.Bijective (algebraMap K v.ResidueField) := IsAlgClosed.algebraMap_bijective_of_isIntegral show Module.finrank K v.ResidueField = 1 rw [← Module.finrank_self K] exact ((AlgEquiv.ofBijective (Algebra.ofId K v.ResidueField) hbij).toLinearEquiv.finrank_eq).symm end Place namespace IsCurveOver variable {K F} theorem deg_eq_one_of_isAlgClosed [IsAlgClosed K] [IsCurveOver K F] (v : Place K F) : v.deg = 1 := haveI : Module.Finite K v.ResidueField := IsCurveOver.finiteResidue v v.deg_eq_one_of_isAlgClosed_of_finite theorem forall_deg_eq_one_of_isAlgClosed [IsAlgClosed K] [IsCurveOver K F] : ∀ w : Place K F, w.deg = 1 := deg_eq_one_of_isAlgClosed end IsCurveOver end AlgebraicCurve